#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 tab-scoped:reviewtab uses{myAppId} 리뷰({myAppId} Reviewin English), andbacklogtab uses{myAppId} λ°±λ‘κ·Έ({myAppId} Backlogin English). - 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. - The expanded search input fills remaining header space with
flexlayout to reduce awkward header wrapping. - Top controls are tab-scoped:
ReviewsandBacklogboth showFilterandNotes. - In
Backlog,Expand reviewsis available inside the filter panel. - Top navigation state is synced to query parameters, so refresh keeps the same UI state:
tab(review|backlog)q(search text)tags(multi-select tags, comma-separated)exclude(all|active|excluded)min100(1when100+ charsis enabled)orig(1whenOriginaltoggle is enabled)priority(all|must|should|couldinBacklog)effort(all|high|medium|lowinBacklog)page(Reviewspagination page number, 1-based; omitted on page 1)
- The status row under the header is shown in both tabs:
- left: active filter chips (
No filterwhen empty) - right: selected/filtered count over total (
Reviews x/yorBacklog x/y)
- left: active filter chips (
Backlogshows one unified backlog table across all apps (not per-app grouped sections).- In
Backlog, identical backlog items are merged into a single row even when they come from different apps. - In
Backlog, near-duplicate backlog rows (same normalized title/action) are also merged during backlog normalization. - In
Backlog, default backlog sorting is:Priority(MUST > SHOULD > COULD) βStatus(Not Started > In Progress > Done) βEffort(High > Medium > Low) βReview count(total count, high to low). - In
Backlog, each row now includesStatus(Not Started | In Progress | Done) and status can be changed inline. Statususes color-coded states for quick scanning:Not Started(red),In Progress(yellow),Done(green).- Inline selectors in the backlog table are color-coded for both
Priority(MUST/SHOULD/COULD) andEffort(High/Medium/Low). - The app list in each backlog row is rendered as a single-line text with ellipsis (
...) when it overflows. - In
Backlog, use the same filter panel UX asReviewsto filter rows byPriority / Effort. - In the
Backlogtable, there is no separate review-detail column; use the chevron button next toReview countto expand/collapse review rows. Review countis displayed asactive/total(for example,2/8).- The
totalside ofReview countis calculated as the number of unique reviews (reviewId-based dedupe), not raw quote line count. - In expanded review rows, the Korean sentence is shown by default (without
KR:prefix), andSee detailsreveals the review ID, metadata, and original text. - Expanded review rows render prioritized 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.
- Synthetic backlog input now filters out low-signal reviews (e.g., short generic praise without request/issue) and keeps actionable reviews first.
- Backlog
actiontext is generated as a concrete checklist (up to 3 items) inferred from matched review patterns, not only a generic count sentence. - Backlog
actiontext no longer appends count suffixes like(리뷰 N건)or(evidence N reviews); use theReview countcolumn instead. - In
Reviews, hashtag filter supports multi-select (#β€οΈ,#Requests,#Satisfaction,#Dissatisfaction), andAll tagsclears tag filters. - In
Reviews, app filter is available in the filter panel (All apps+ per-app buttons). - In
Reviews, state filter is tri-state:All/Active/Inactive(default:All). - In
Reviews, app sections are ordered by latest review registration date first, then higher app rating. - In
Reviews, app sections are always expanded; collapse/close interaction is not provided. - In
Reviews, review cards are ordered by latest registration date first, with higher rating as the secondary sort. - In
Reviews, cards are paginated (50 cards per page) withPrev/Nextcontrols in the top status row;Prevscrolls to page bottom, andNextscrolls to the top of the review-card section. - In
Reviews, bookmark controls are shown when no non-app filters are active (search/tag/state/100+ charsclear; app-only filter is allowed). Bookmark storage is scoped by app filter, so each app-filter view keeps its own bookmark. The bookmark update control is an icon button: it appears filled on the bookmarked page and outlined on other pages. The summary label shows progress (Bookmark {page}/{total}), and when bookmarked page reaches the last page it showsBookmark {total}/{total} Β· Done.Go to bookmarkjumps back to the saved bookmark page. - In
Reviews, when bookmark is on the last page, active chips includeReview status: Done(κ²ν μν: μλ£). - In
Reviews, you can toggle100+ charsto focus on longer reviews. Reset filtersclears search/app/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. - 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
Backlogtab 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 remain editable even when the card is
Inactive(no click blocking by state). - Top-right controls include a
Notesbutton; the right sidebar provides full note CRUD (create/select/edit/delete) with free-form titles and content. - The header action button
β λ°±λ‘κ·Έ μμ±is available in bothReviewsandBacklogtabs. - In the notes panel, notes are managed from a dedicated list UI (not a backlog selector).
- The notes editor has separate
TitleandContentfields per note. - Note
Createpersists immediately. - Note
Savepersists only the currently active note (Savebutton below the content field, orCtrl/Cmd + Swhile the notes panel is open). - Note
Deleteremoves the currently active note and persists immediately. - In
Backlog, backlog rows are editable directly from the page:- add/remove backlog items
- table columns are ordered as
Priority β Backlog Item β Status β Effort β Review count (active/total) β Actions - update each row's
Priority / Status / Effortdirectly from inline selectors - inline selectors use vivid red/yellow/green text colors with bold labels for clearer state separation (no state fill)
Statuslabels use the same vivid red/yellow/green text-only style- clicking a backlog table row opens the editor directly (except inline controls such as selectors/toggles/buttons)
- row action buttons are icon-only and pinned to the far right (
Deletefirst, thenEdit) - deleting a backlog row uses a centered custom confirmation modal (not the browser confirm dialog)
- review selection is done in a centered modal with pagination and open/close animation (active reviews only)
- the review-picker modal keeps a fixed height regardless of result count, and only the list area scrolls
- editor summary shows both
selected countandsaved total count; if saved reviews are inactive, a guidance message is shown - in the backlog editor
Reviewslist, each linked review can be toggledActive β Inactivedirectly (persisted immediately topreview-state) - setting a review to
Inactivekeeps the backlog linkage; use unlink (Γ) to remove it from evidence - backlog editor body renders selected reviews as compact review text items (text only, no app name/ID chips)
- backlog editor header actions are
Delete,Apply, and close (β);Deleteappears left ofApply - in backlog editor,
Applysaves immediately (persistent save), includingStatus - report-table edits outside the backlog editor (row delete, inline priority/status/effort changes, quick-add from
Reviews) are also auto-persisted
- In
Reviews, each review card has a single quick-add selector; selecting a backlog item toggles linkage immediately (attachwhen not linked,unlinkwhen already linked). - In that quick-add selector, already linked backlog items are marked with
β(without priority labels), and the card shows a right-aligned linked-status text in the format(N linked: title, title). - The quick-add selector is rendered on a dedicated backlog row under the card action row (separate from tag/status controls).
- When a review is added to backlog from
Reviews, that review is automatically switched toActive. - The quick-add selector auto-refreshes backlog options without page reload: it revalidates on selector focus/open, on tab visibility restore, and periodically while the page is visible.
- 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 notes are persisted to
data/{myAppId}/reports/preview-state.json(both update immediately). preview-state.jsonis treated as a full-state snapshot for review cards (not diff-only overrides).preview-state.jsonnow uses v4 schema (reviews.tags,reviews.excluded,notes.{id}.title,notes.{id}.content).- 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(unified backlogitemsdata includingstatus; reviews are stored as scoped IDs insourceToken::reviewIdformat)- 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 user 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) -
/v/:appIdreadscompetitor-raw-actionable.ko.jsonon the server and returns embeddedhtmldirectly (no client-side bundle bootstrap) -
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
-
Serves backlog editing API:
GET /api/backlog/:appIdPUT /api/backlog/:appId- request/response
items[].evidenceReviewIdsmust use scoped IDs (sourceToken::reviewId) - persistence file:
data/{myAppId}/reports/backlog.ko.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