#Report Commands
#report:translate
Translate collected review JSON files to Korean.
npm run report:translate -- --my-app <owner> ...node dist/translateReviews.js ...
#CLI Options
--my-app(required)--registered-apps-path--input-dir(default:data/{myAppId}/reviews)--output-dir(default:data/{myAppId}/reviews-ko)--target-lang(default:ko)--provider(google-web|none, defaultgoogle-web)--overwrite(defaultfalse)--concurrency(default4)--output text|json
#Example
npm run report:translate -- --my-app golden-horizon
#Output
data/{myAppId}/reviews-ko/{competitor}.jsondata/{myAppId}/reviews-ko/.translation-cache.json
#report:render-html
Render actionable markdown report to a shared-viewer bundle JSON.
npm run report:render-html -- --my-app <owner> ...npm run report:render-html -- --allnode dist/renderReportHtml.js ...- Default output is JSON bundle only. Legacy per-app HTML file is optional (
--with-html). - HTML document title (
<title>and H1) is fixed to{myAppId} 리뷰 리포트(or{myAppId} Review Reportfor English reports). - Generated HTML top bar includes a
Homebutton (/) at the top-left. - Filters are managed in a separate panel opened from the top bar
Filterbutton. - On narrow screens, the filter panel opens as a bottom sheet.
- On narrow screens, the notes panel also opens as a bottom sheet instead of a right drawer.
- Search is shown as a
🔎button by default and expands to the input field on tap/click. - Top controls are tab-scoped:
ReviewsshowsFilterandNotes, whileReportsshowsExpand evidence,Priorityfilter, and the sameNotesbutton/sidebar. - Top navigation state is synced to query parameters, so refresh keeps the same UI state:
tab(reviews|reports, aliasesreview/raw,report/backlog)q(search text)tags(multi-select tags, comma-separated)exclude(all|active|excluded)min100(1when100+ charsis enabled)orig(1whenOriginaltoggle is enabled)page(current page inReviews)priority(all|must|should|couldinReports)
- In
Reports, the secondary status row is hidden so the navigation area stays single-row (theReports N/Ncount label is not shown). Reportsshows one unified backlog table across all apps (not per-app grouped sections).- In
Reports, identical backlog items are merged into a single row even when they come from different apps. - The app list in each backlog row is rendered as a single-line text with ellipsis (
...) when it overflows. - In
Reports, you can filter rows by priority (All / MUST / SHOULD / COULD). - In the
Reportstable, there is no separateEvidencecolumn; use the chevron button next toEvidence countto expand/collapse evidence rows. Evidence countis calculated as the number of unique reviews (reviewId-based dedupe), not raw quote line count.- In expanded evidence rows, the Korean sentence is shown by default (without
KR:prefix), andSee detailsreveals the review ID, metadata, and original text. - Expanded evidence rows render prioritized evidence reviews only (top 8 max per backlog row).
- Backlog themes are now derived dynamically from each app's review text (token-frequency heuristic), instead of using a fixed hardcoded theme list.
- In
Reviews, hashtag filter supports multi-select (#❤️,#Requests,#Satisfaction,#Dissatisfaction), andAll tagsclears tag filters. - In
Reviews, state filter is tri-state:All/Active/Inactive(default:All). - In
Reviews, you can toggle100+ charsto focus on longer reviews. Reset filtersclears search/state/tag/length filters in one click.- In the filter panel,
Reset all to inactivesets every review toInactivein bulk and clears all hashtags. - The review filter sidebar/bottom sheet header shows
filtered reviews / total reviewsin real time. Reviewstab supports pagination with a fixed page size of100 items/page.- Pagination is applied to the current search/filter result set, and the pagination area shows
filtered reviews / total reviews. - Each app row in the
Reviewstab also showsfiltered reviews / total reviewson the right. - The context block below the title switches by tab, so each tab shows only relevant context.
- In the
Reportstab context, a compact text summary is shown (backlog counts and hashtag-based priority rule) without stat/meta cards. - In the
Reviewstab context block, a plain text summary is shown (app count, hashtag definition, active-state definition) without cards. - Review cards include
#❤️ / #Requests / #Satisfaction / #Dissatisfactionhashtag toggles andInactive/Active. - Curated quotes are shown in one
Selected Reviews (Hashtag-based)section instead of separate category sections. - In review cards,
Originaltext open/close uses a smooth expand/collapse animation. - Hashtags can be edited only when the card is
Active. - Top-right controls include a
Notesbutton; in the right sidebar you can switch the app selector to manage app-level notes. - In the notes panel, use the app selector to switch the currently active app for note editing.
- The notes sidebar shows only store links (App Store / Google Play) for the selected app.
- Notes are not auto-saved; use
Save(orCtrl/Cmd + S) to persist note changes. - Reviews view is hydrated from full review datasets (
data/{myAppId}/reviews-ko/*.json, fallbackreviews/*.json) per app:- preselected report quotes start as
Active - non-selected reviews are included as
Inactiveby default for manual curation
- preselected report quotes start as
- In preview mode, card states and app notes are persisted to
data/{myAppId}/reports/preview-state.json(card state updates immediately; notes persist on explicit save). preview-state.jsonis treated as a full-state snapshot for review cards (not diff-only overrides).preview-state.jsonnow uses v2 schema only (reviews.tags,reviews.excluded,appNotes). Olderfavorite/notesfields are no longer used.- If
data/{myAppId}/icon.pngexists, HTML includes icon meta tags (icon,og:image,twitter:image) automatically.
#CLI Options
--my-app(required unless--allis set)--all(defaultfalse): batch render all apps that have review JSON (data/{appId}/reviews-ko/*.jsonor fallbackreviews/*.json)--registered-apps-path--input(optional): source file (.mdor.json). If omitted, source apps are derived from raw review JSON.--output(default:data/{myAppId}/reports/competitor-raw-actionable.ko.json)--with-html(defaultfalse): also write legacy HTML file--html-output(used with--with-html, default:data/{myAppId}/reports/competitor-raw-actionable.ko.html)--allcannot be combined with--my-app,--input,--output, or--html-output
#Example
npm run report:render-html -- --my-app aurora-eos
npm run report:render-html -- --all
#Output
data/{myAppId}/reports/competitor-raw-actionable.ko.json(shared-viewer bundle payload)data/{myAppId}/reports/backlog.ko.json(per-app backlog data; stores normalized backlog rows withreviewId-only evidence references)- Optional legacy output with
--with-html:data/{myAppId}/reports/competitor-raw-actionable.ko.html
#report:init-backlog
Initialize backlog.ko.json per app (separate from preview-state initialization).
npm run report:init-backlog -- --my-app <owner> ...npm run report:init-backlog -- --allnode dist/initReportBacklog.js ...- Keeps existing backlog by default and only initializes missing backlog files.
- Uses
report:render-htmlinternally to create or normalize backlog data.
#CLI Options
--my-app(required unless--allis set)--all(defaultfalse): initialize all renderable apps underdata/--registered-apps-path--data-dir(default:data/)--input(single-app only): optional report source (.md/.json) passed toreport:render-html--force(defaultfalse): regenerate backlog even ifbacklog.ko.jsonalready exists--dry-run(defaultfalse)--allcannot be combined with--my-appor--input
#Example
npm run report:init-backlog -- --my-app aurora-eos
npm run report:init-backlog -- --my-app aurora-eos --force
npm run report:init-backlog -- --all
#Output
data/{myAppId}/reports/backlog.ko.json
#report:init-state
Initialize preview-state.json from report bundle defaults.
npm run report:init-state -- --my-app <owner> ...npm run report:init-state -- --allnode dist/initReportState.js ...- Seeds all review states into
data/{myAppId}/reports/preview-state.jsonusing:reviewDefaults[reviewId].excluded(Active/Inactive default)reviewDefaults[reviewId].tags(default hashtags)
- This command is intended for initial migration/reset. After initialization, manage card states in preview UI.
report:render-htmlwrites report bundles (and optional legacy HTML) and does not resetpreview-state.json.
#CLI Options
--my-app(required unless--allis set)--all(defaultfalse): initialize all apps that havedata/{appId}/reports/competitor-raw-actionable.ko.json--registered-apps-path--data-dir(default:data/)--input(default:data/{myAppId}/reports/competitor-raw-actionable.ko.json)--output(default:data/{myAppId}/reports/preview-state.json)--keep-notes(defaulttrue): keep existing app notes while re-initializing review states--allcannot be combined with--my-app,--input, or--output
#Example
npm run report:init-state -- --my-app aurora-eos
npm run report:init-state -- --all
#Output
data/{myAppId}/reports/preview-state.json
#report:preview
Run localhost preview server.
-
Dashboard mode: home lists app ids and generated report files (
.md,.json, optional legacy.html) -
Recommended flow: keep per-app data as JSON bundles and open
/v/:appId(shared viewer). -
Dashboard primary
View Reportlink opens shared viewer route (/v/:appId) -
Dashboard mode can display app icons when
data/{appId}/icon.pngexists -
Report page header also uses
data/{appId}/icon.png; when missing, UI falls back toappIdtext -
Dashboard background fills the full viewport height (no abrupt cut when content is short).
-
Single-file mode: serve one legacy HTML file with
--file -
Serves preview state API for raw-review card management:
GET /api/preview-state/:appIdPUT /api/preview-state/:appId- persistence file:
data/{myAppId}/reports/preview-state.json
-
npm run report:preview -- [options] -
node dist/previewReport.js ...
#CLI Options
--my-app(optional): dashboard filter--registered-apps-path--file: single-file mode path--data-dir(default:data/)--host(default:127.0.0.1)--port(default:4173)
#Examples
npm run report:preview -- --port 4173
npm run report:preview -- --my-app aurora-eos --port 4173
npm run report:preview -- --file data/aurora-eos/reports/competitor-raw-actionable.ko.html --port 4173 # legacy mode