@ritualai/cli 0.7.12 → 0.7.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/commands/status.js +190 -0
  2. package/dist/commands/status.js.map +1 -0
  3. package/dist/index.js +29 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/stale-bundle-warning.js +85 -0
  6. package/dist/lib/stale-bundle-warning.js.map +1 -0
  7. package/dist/lib/status-formatter.js +162 -0
  8. package/dist/lib/status-formatter.js.map +1 -0
  9. package/package.json +1 -1
  10. package/skills/claude-code/ritual/.ritual-bundle.json +2 -2
  11. package/skills/claude-code/ritual/manifest.json +7 -2
  12. package/skills/claude-code/ritual/references/build-flow.md +206 -9
  13. package/skills/claude-code/ritual/references/ui-ux-checklist.md +198 -0
  14. package/skills/codex/ritual/.ritual-bundle.json +2 -2
  15. package/skills/codex/ritual/manifest.json +7 -2
  16. package/skills/codex/ritual/references/build-flow.md +206 -9
  17. package/skills/codex/ritual/references/ui-ux-checklist.md +198 -0
  18. package/skills/cursor/ritual/.ritual-bundle.json +2 -2
  19. package/skills/cursor/ritual/manifest.json +7 -2
  20. package/skills/cursor/ritual/references/build-flow.md +206 -9
  21. package/skills/cursor/ritual/references/ui-ux-checklist.md +198 -0
  22. package/skills/gemini/ritual/.ritual-bundle.json +2 -2
  23. package/skills/gemini/ritual/manifest.json +7 -2
  24. package/skills/gemini/ritual/references/build-flow.md +206 -9
  25. package/skills/gemini/ritual/references/ui-ux-checklist.md +198 -0
  26. package/skills/kiro/ritual/.ritual-bundle.json +2 -2
  27. package/skills/kiro/ritual/manifest.json +7 -2
  28. package/skills/kiro/ritual/references/build-flow.md +206 -9
  29. package/skills/kiro/ritual/references/ui-ux-checklist.md +198 -0
  30. package/skills/vscode/ritual/.ritual-bundle.json +2 -2
  31. package/skills/vscode/ritual/manifest.json +7 -2
  32. package/skills/vscode/ritual/references/build-flow.md +206 -9
  33. package/skills/vscode/ritual/references/ui-ux-checklist.md +198 -0
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.statusCommand = statusCommand;
4
+ const config_1 = require("../lib/config");
5
+ const api_client_1 = require("../lib/api-client");
6
+ const project_config_1 = require("../lib/project-config");
7
+ const status_formatter_1 = require("../lib/status-formatter");
8
+ async function statusCommand(explorationIdArg, options) {
9
+ const token = await (0, config_1.getValidAccessToken)();
10
+ if (token.kind === 'not-signed-in') {
11
+ console.error(' ✗ Not signed in. Run `ritual login` first.');
12
+ process.exit(1);
13
+ }
14
+ if (token.kind === 're-auth-required') {
15
+ console.error(` ✗ Session expired (${token.reason}). Run \`ritual login\` to re-auth.`);
16
+ process.exit(1);
17
+ }
18
+ const api = new api_client_1.ApiClient({
19
+ issuer: token.creds.issuer,
20
+ accessToken: token.accessToken,
21
+ });
22
+ if (options.watch) {
23
+ await runWatchLoop(api, explorationIdArg);
24
+ }
25
+ else {
26
+ await runOnce(api, explorationIdArg);
27
+ }
28
+ }
29
+ async function runOnce(api, explorationIdArg) {
30
+ const inputs = await fetchStatus(api, explorationIdArg);
31
+ if (!inputs) {
32
+ // Already printed a friendly error in fetchStatus.
33
+ process.exit(1);
34
+ }
35
+ console.log((0, status_formatter_1.formatStatus)(inputs));
36
+ }
37
+ /**
38
+ * --watch loop. Renders the status snapshot every 5s, in-place using
39
+ * ANSI cursor controls. Exits on:
40
+ * - terminal run states (`completed` / `failed` / `cancelled`)
41
+ * - the user pressing Ctrl+C
42
+ * - 3 consecutive fetch errors (no point thrashing if the API is down)
43
+ *
44
+ * Cadence locked at 5s — short enough to feel live, polite enough not
45
+ * to hammer the API on a long-running poll.
46
+ */
47
+ async function runWatchLoop(api, explorationIdArg) {
48
+ let lastRenderedLines = 0;
49
+ let consecutiveErrors = 0;
50
+ const POLL_MS = 5000;
51
+ const stop = (code) => {
52
+ process.stdout.write('\n');
53
+ process.exit(code);
54
+ };
55
+ process.on('SIGINT', () => stop(130));
56
+ // First render: print fresh, no clear.
57
+ while (true) {
58
+ let inputs = null;
59
+ try {
60
+ inputs = await fetchStatus(api, explorationIdArg);
61
+ consecutiveErrors = 0;
62
+ }
63
+ catch (err) {
64
+ consecutiveErrors += 1;
65
+ if (consecutiveErrors >= 3) {
66
+ console.error(`\n ✗ Repeated errors fetching status (${err.message}). Exiting watch.`);
67
+ process.exit(1);
68
+ }
69
+ }
70
+ if (inputs) {
71
+ const rendered = (0, status_formatter_1.formatStatus)(inputs);
72
+ if (lastRenderedLines > 0) {
73
+ // Move cursor up by the previous render's line count + clear from there.
74
+ process.stdout.write(`\x1b[${lastRenderedLines}A\x1b[0J`);
75
+ }
76
+ process.stdout.write(rendered + '\n');
77
+ lastRenderedLines = rendered.split('\n').length + 1;
78
+ // Exit if run reached a terminal state.
79
+ const status = inputs.run?.status?.toLowerCase();
80
+ if (status === 'completed' || status === 'completed_with_errors') {
81
+ process.stdout.write('\n ✓ Run finished. Exiting watch.\n');
82
+ process.exit(0);
83
+ }
84
+ if (status === 'failed') {
85
+ process.stdout.write('\n ✗ Run failed. Exiting watch.\n');
86
+ process.exit(1);
87
+ }
88
+ if (status === 'cancelled') {
89
+ process.stdout.write('\n · Run cancelled. Exiting watch.\n');
90
+ process.exit(0);
91
+ }
92
+ }
93
+ await sleep(POLL_MS);
94
+ }
95
+ }
96
+ async function fetchStatus(api, explorationIdArg) {
97
+ let explorationId;
98
+ if (explorationIdArg) {
99
+ explorationId = explorationIdArg;
100
+ }
101
+ else {
102
+ // Auto-resolve from .ritual/config.json.
103
+ const project = (0, project_config_1.loadProjectConfig)(process.cwd());
104
+ if (!project) {
105
+ console.error(' ✗ No `.ritual/config.json` in this directory. Either:\n' +
106
+ ' ritual init — bind a workspace to this repo, OR\n' +
107
+ ' ritual status <exploration-id> — fetch a specific exploration');
108
+ return null;
109
+ }
110
+ const picked = await pickCurrentExploration(api, project.workspaceId);
111
+ if (!picked) {
112
+ console.error(` ✗ No active or recent explorations found in workspace ${project.workspaceName}.`);
113
+ return null;
114
+ }
115
+ explorationId = picked;
116
+ }
117
+ // Fetch exploration shell + agentic-status + run in parallel.
118
+ const [exp, agenticStatus, runs] = await Promise.all([
119
+ api
120
+ .get(`/explorations/${encodeURIComponent(explorationId)}`)
121
+ .catch((err) => {
122
+ if (err.status === 404) {
123
+ console.error(` ✗ Exploration ${explorationId} not found.`);
124
+ return null;
125
+ }
126
+ throw err;
127
+ }),
128
+ api
129
+ .get(`/explorations/${encodeURIComponent(explorationId)}/agentic-status`)
130
+ .catch(() => null),
131
+ api
132
+ .get(`/agentic-runs?exploration_id=${encodeURIComponent(explorationId)}&status=running`)
133
+ .catch(() => []),
134
+ ]);
135
+ if (!exp)
136
+ return null;
137
+ const run = runs && runs.length > 0
138
+ ? { id: runs[0].agentic_run_id, status: runs[0].status }
139
+ : null;
140
+ return {
141
+ exploration: {
142
+ id: exp.id,
143
+ name: exp.name,
144
+ step: exp.step,
145
+ updatedAt: exp.updatedAt,
146
+ },
147
+ progress: agenticStatus?.progress ?? null,
148
+ run,
149
+ };
150
+ }
151
+ /**
152
+ * Pick the "current" exploration for `ritual status` with no arg.
153
+ *
154
+ * Ranking:
155
+ * 1. Any exploration with a RUNNING agentic run → return its id.
156
+ * 2. Else most-recently-updated where step != COMPLETED.
157
+ * 3. Else most-recently-updated full stop.
158
+ *
159
+ * Multiple RUNNING runs is uncommon. For v1 we pick whichever the API
160
+ * returns first (most-recently-started in practice); a multi-run picker
161
+ * can land in MVP-2 with `ritual status --runs`.
162
+ */
163
+ async function pickCurrentExploration(api, workspaceId) {
164
+ const exps = await api.get(`/explorations?workspaceId=${encodeURIComponent(workspaceId)}&withImplementationStatus=true`);
165
+ if (!exps || exps.length === 0)
166
+ return null;
167
+ // Probe for a RUNNING run across explorations. Sorted by updatedAt
168
+ // desc first so the most recently-touched exploration gets the
169
+ // first run-probe — usually the right answer in one call.
170
+ const sorted = [...exps].sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
171
+ for (const e of sorted.slice(0, 5)) {
172
+ try {
173
+ const runs = await api.get(`/agentic-runs?exploration_id=${encodeURIComponent(e.id)}&status=running`);
174
+ if (runs && runs.length > 0)
175
+ return e.id;
176
+ }
177
+ catch {
178
+ // fall through — never block on a probe failure
179
+ }
180
+ }
181
+ // No RUNNING runs — pick most-recently-updated non-completed.
182
+ const nonComplete = sorted.find((e) => e.step !== 'COMPLETED');
183
+ if (nonComplete)
184
+ return nonComplete.id;
185
+ return sorted[0]?.id ?? null;
186
+ }
187
+ function sleep(ms) {
188
+ return new Promise((resolve) => setTimeout(resolve, ms));
189
+ }
190
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -8,8 +8,24 @@ const whoami_1 = require("./commands/whoami");
8
8
  const refresh_1 = require("./commands/refresh");
9
9
  const init_1 = require("./commands/init");
10
10
  const doctor_1 = require("./commands/doctor");
11
+ // 2026-05-15 (PR D) — `ritual status [--watch]` instant snapshot of
12
+ // an in-flight agentic run. Auto-resolves the current exploration
13
+ // from `.ritual/config.json` so the user doesn't have to remember
14
+ // IDs; --watch polls every 5s and redraws in place. Paired with the
15
+ // SKILL Step 8 reframe ("you're unblocked; runs continue server-
16
+ // side") to break the mental model where users feel obligated to
17
+ // stare at the polling loop.
18
+ const status_1 = require("./commands/status");
11
19
  const graph_1 = require("./commands/graph");
12
20
  const package_info_1 = require("./lib/package-info");
21
+ // 2026-05-15 (PR C) — pre-flight one-line stderr warning when the
22
+ // project's SKILL bundles drift from the installed CLI. Catches the
23
+ // "upgraded the CLI, forgot to refresh skills" gap immediately
24
+ // without making the user run `ritual doctor` first. See Eiman's
25
+ // 2026-05-14 #319 dev-URL-leak case — fix had shipped in CLI 0.7.11
26
+ // but her bundle on disk was older, so the leak persisted until she
27
+ // happened to re-run `ritual init`.
28
+ const stale_bundle_warning_1 = require("./lib/stale-bundle-warning");
13
29
  const program = new commander_1.Command();
14
30
  program
15
31
  .name('ritual')
@@ -53,6 +69,13 @@ program
53
69
  .command('refresh')
54
70
  .description('Force-refresh the cached access token using the stored refresh token')
55
71
  .action(refresh_1.refreshCommand);
72
+ program
73
+ .command('status')
74
+ .description('Show the current agentic run status. With --watch, polls every 5s and redraws in place. ' +
75
+ 'With no exploration ID, auto-resolves the workspace\'s currently-active run.')
76
+ .argument('[exploration-id]', 'Specific exploration to inspect (defaults to the current run)')
77
+ .option('--watch', 'Poll every 5s and redraw in place; exits on terminal state or Ctrl+C')
78
+ .action((explorationId, opts) => (0, status_1.statusCommand)(explorationId, { watch: opts.watch }));
56
79
  program
57
80
  .command('doctor')
58
81
  .description('Sanity check the CLI environment: credentials, endpoints, detected agents')
@@ -69,6 +92,12 @@ graph
69
92
  .option('--workspace <id>', 'Override the workspaceId. Default reads from .ritual/config.json (set by `ritual init`).')
70
93
  .option('--limit <n>', 'Number of recent implementations to show (default 5, max 25)')
71
94
  .action(graph_1.graphStatusCommand);
95
+ // Pre-flight: warn ONCE (best-effort, never throws) if the project's
96
+ // SKILL bundles drift from the installed CLI. Skipped during `init`,
97
+ // `doctor`, `--version`, `--help` — see stale-bundle-warning.ts for
98
+ // the rationale. Must run before parseAsync so the warning prints
99
+ // above the command output rather than interleaved.
100
+ (0, stale_bundle_warning_1.printStaleBundleWarning)(process.argv.slice(2));
72
101
  program.parseAsync(process.argv).catch((err) => {
73
102
  console.error(`\n ✗ ${err.message}\n`);
74
103
  process.exit(1);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,4CAAgD;AAChD,8CAAkD;AAClD,8CAAkD;AAClD,gDAAoD;AACpD,0CAA8C;AAC9C,8CAAkD;AAClD,4CAAsD;AACtD,qDAA4D;AAE5D,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACL,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CACX,yDAAyD;IACxD,yDAAyD,CAC1D;KACA,OAAO,CAAC,IAAA,qCAAsB,GAAE,CAAC,CAAC;AAEpC,oEAAoE;AACpE,+DAA+D;AAC/D,OAAO;KACL,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kFAAkF,CAAC;KAC/F,MAAM,CAAC,cAAc,EAAE,wDAAwD,CAAC;KAChF,MAAM,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAC9C,MAAM,CACN,gBAAgB,EAChB,kFAAkF,CAClF;KACA,MAAM,CAAC,kBAAkB,EAAE,2CAA2C,CAAC;KACvE,MAAM,CAAC,OAAO,EAAE,iFAAiF,CAAC;KAClG,MAAM,CACN,gBAAgB,EAChB,wHAAwH,CACxH;KACA,MAAM,CACN,kBAAkB,EAClB,kMAAkM,CAClM;KACA,MAAM,CACN,OAAO,EACP,wFAAwF,CACxF;KACA,MAAM,CACN,eAAe,EACf,oOAAoO,CACpO;KACA,MAAM,CAAC,kBAAW,CAAC,CAAC;AAEtB,OAAO;KACL,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CACN,gBAAgB,EAChB,iGAAiG,CACjG;KACA,MAAM,CACN,kBAAkB,EAClB,4EAA4E,CAC5E;KACA,MAAM,CAAC,OAAO,EAAE,iFAAiF,CAAC;KAClG,MAAM,CACN,kBAAkB,EAClB,oIAAoI,CACpI;KACA,MAAM,CACN,OAAO,EACP,wFAAwF,CACxF;KACA,MAAM,CAAC,oBAAY,CAAC,CAAC;AAEvB,OAAO;KACL,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iFAAiF,CAAC;KAC9F,MAAM,CACN,OAAO,EACP,6IAA6I,CAC7I;KACA,MAAM,CAAC,sBAAa,CAAC,CAAC;AAExB,OAAO;KACL,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6DAA6D,CAAC;KAC1E,MAAM,CAAC,sBAAa,CAAC,CAAC;AAExB,OAAO;KACL,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,sEAAsE,CAAC;KACnF,MAAM,CAAC,wBAAc,CAAC,CAAC;AAEzB,OAAO;KACL,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,sBAAa,CAAC,CAAC;AAExB,iEAAiE;AACjE,+DAA+D;AAC/D,kDAAkD;AAClD,MAAM,KAAK,GAAG,OAAO;KACnB,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,oEAAoE,CAAC,CAAC;AAEpF,KAAK;KACH,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mEAAmE,CAAC;KAChF,MAAM,CACN,kBAAkB,EAClB,0FAA0F,CAC1F;KACA,MAAM,CAAC,aAAa,EAAE,8DAA8D,CAAC;KACrF,MAAM,CAAC,0BAAkB,CAAC,CAAC;AAE7B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IACrD,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.printStaleBundleWarning = printStaleBundleWarning;
4
+ exports.shouldSkipWarning = shouldSkipWarning;
5
+ exports.buildWarningLine = buildWarningLine;
6
+ const skill_bundles_1 = require("./skill-bundles");
7
+ const package_info_1 = require("./package-info");
8
+ /**
9
+ * Pre-flight warning when the project's Ritual SKILL bundles drift
10
+ * from the installed CLI version.
11
+ *
12
+ * Why this exists (PR C, 2026-05-15): `ritual doctor` already reports
13
+ * drift, but users don't routinely run it. Eiman hit a CLI bug
14
+ * (#319 — dev URL leak in `/ritual init` output) that was already
15
+ * fixed in 0.7.11 — but her SKILL bundle on disk was older, so the
16
+ * fix only landed when she happened to re-run `ritual init`. A
17
+ * one-line stderr warning at every CLI entry catches the
18
+ * "upgraded the CLI, forgot to refresh skills" gap immediately.
19
+ *
20
+ * Design constraints:
21
+ * - Best-effort: never throws, never blocks. Filesystem races,
22
+ * unreadable manifests, missing dirs all silently no-op.
23
+ * - Skip during `init` (the fix command itself) and `doctor`
24
+ * (which already prints the same info, in more detail).
25
+ * - Skip during `--version` / `-V` / `--help` / `-h` — those exit
26
+ * immediately and a multi-line warning would feel out of place.
27
+ * - Single line when one bundle drifts, single summary line when
28
+ * multiple. Concise; the user doesn't need the doctor-style
29
+ * per-provider breakdown to know what to do.
30
+ * - Writes to stderr so it doesn't pollute scriptable stdout.
31
+ *
32
+ * The fix command is always `ritual init --skills-only` whether the
33
+ * bundle is stamped-and-drifted or pre-stamp-unknown — same code
34
+ * path, same outcome.
35
+ */
36
+ function printStaleBundleWarning(argv) {
37
+ if (shouldSkipWarning(argv))
38
+ return;
39
+ let stale;
40
+ try {
41
+ const bundles = (0, skill_bundles_1.findLocalSkillBundles)(process.cwd(), (0, package_info_1.readPackageVersionSafe)());
42
+ stale = (0, skill_bundles_1.findStaleBundles)(bundles);
43
+ }
44
+ catch {
45
+ return;
46
+ }
47
+ if (stale.length === 0)
48
+ return;
49
+ const line = buildWarningLine(stale);
50
+ process.stderr.write(line);
51
+ }
52
+ const SKIP_COMMANDS = new Set(['init', 'doctor']);
53
+ const SKIP_FLAGS = new Set(['--version', '-V', '--help', '-h']);
54
+ /**
55
+ * Skip rules — kept narrow so any new command opts in automatically:
56
+ * - `init` skips: the warning would print right before the user's
57
+ * fix command runs.
58
+ * - `doctor` skips: it already renders bundle drift in detail.
59
+ * - `--version` / `--help` skips: short-circuit invocations.
60
+ *
61
+ * Note we look at the FIRST non-flag positional only — `ritual graph
62
+ * status` should still warn, since that's an arbitrary subcommand
63
+ * that has no special relationship to skill bundles.
64
+ */
65
+ function shouldSkipWarning(argv) {
66
+ for (const a of argv) {
67
+ if (SKIP_FLAGS.has(a))
68
+ return true;
69
+ }
70
+ const firstPositional = argv.find((a) => !a.startsWith('-'));
71
+ if (firstPositional && SKIP_COMMANDS.has(firstPositional))
72
+ return true;
73
+ return false;
74
+ }
75
+ function buildWarningLine(stale) {
76
+ if (stale.length === 1) {
77
+ const s = stale[0];
78
+ const detail = s.drift.kind === 'drift'
79
+ ? `bundle ${s.drift.bundleVersion} vs CLI ${s.drift.cliVersion}`
80
+ : 'pre-0.7.11 bundle, no version stamp';
81
+ return `⚠ Ritual SKILL bundle is out of date (${detail}). Run \`ritual init --skills-only\` to refresh.\n\n`;
82
+ }
83
+ return `⚠ ${stale.length} Ritual SKILL bundles need refresh. Run \`ritual init --skills-only\`.\n\n`;
84
+ }
85
+ //# sourceMappingURL=stale-bundle-warning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale-bundle-warning.js","sourceRoot":"","sources":["../../src/lib/stale-bundle-warning.ts"],"names":[],"mappings":";;AA+BA,0DAcC;AAgBD,8CAOC;AAED,4CAYC;AAlFD,mDAA0E;AAC1E,iDAAwD;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,SAAgB,uBAAuB,CAAC,IAAc;IACrD,IAAI,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO;IAEpC,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,IAAA,qCAAqB,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAA,qCAAsB,GAAE,CAAC,CAAC;QAC/E,KAAK,GAAG,IAAA,gCAAgB,EAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;IACR,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE/B,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAClD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;AAEhE;;;;;;;;;;GAUG;AACH,SAAgB,iBAAiB,CAAC,IAAc;IAC/C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IACpC,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,IAAI,eAAe,IAAI,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IACvE,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAgB,gBAAgB,CAC/B,KAA0C;IAE1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,MAAM,GACX,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;YACvB,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,aAAa,WAAW,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE;YAChE,CAAC,CAAC,qCAAqC,CAAC;QAC1C,OAAO,yCAAyC,MAAM,sDAAsD,CAAC;IAC9G,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,MAAM,4EAA4E,CAAC;AACtG,CAAC"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ /**
3
+ * Pure formatter for `ritual status` output.
4
+ *
5
+ * Kept as a side-effect-free function so it can be unit-tested in
6
+ * isolation without HTTP / filesystem / clock mocks. The command
7
+ * orchestration in `commands/status.ts` does the fetching; this just
8
+ * turns shapes into strings.
9
+ *
10
+ * Design choices (locked in `backlog_ritual_status_and_unblocked_framing.md`):
11
+ *
12
+ * - Run line first. "RUNNING for 17m 41s" is the headline; exploration
13
+ * name is a footer parenthetical, not the lead.
14
+ * - Pace + ETA computed only when `completedQuestions >= 3` so the
15
+ * average doesn't get whiplashed by the first question's latency.
16
+ * - Activity / last-write age is the real "is it actually moving?"
17
+ * signal — climbing past ~3 min without `completedQuestions`
18
+ * advancing is actionable info, not a snapshot lie.
19
+ *
20
+ * The shape this formatter consumes is the merged view (live progress
21
+ * from `Exploration.agenticProgress` + run id from
22
+ * `GET /agentic-runs?explorationId=...&status=RUNNING&limit=1`), never
23
+ * the raw `AgenticJob` row whose `totalQuestions` / `progress.steps`
24
+ * fields can sit unwritten for entire runs (bug filed
25
+ * 2026-05-15 — see `backlog_ritual_status_and_unblocked_framing.md`).
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.formatStatus = formatStatus;
29
+ exports.humanizeDuration = humanizeDuration;
30
+ function formatStatus(input) {
31
+ const now = (input.now ?? new Date()).getTime();
32
+ const lines = [];
33
+ if (input.run && input.progress) {
34
+ lines.push(...formatRunSection(input.run, input.progress, input.exploration, now));
35
+ }
36
+ else if (input.progress) {
37
+ lines.push(...formatNoRunButProgress(input.progress, input.exploration, now));
38
+ }
39
+ else {
40
+ lines.push(...formatNoProgress(input.exploration));
41
+ }
42
+ lines.push('');
43
+ lines.push(`(Exploration: ${input.exploration.name})`);
44
+ lines.push(` ${input.exploration.id} · step: ${input.exploration.step}`);
45
+ return lines.join('\n');
46
+ }
47
+ function formatRunSection(run, progress, exploration, now) {
48
+ const runShort = truncateId(run.id);
49
+ const ageSec = progress.startedAt
50
+ ? Math.round((now - new Date(progress.startedAt).getTime()) / 1000)
51
+ : null;
52
+ const runLine = ageSec != null
53
+ ? `Run ${runShort} · ${run.status.toUpperCase()} for ${humanizeDuration(ageSec)}`
54
+ : `Run ${runShort} · ${run.status.toUpperCase()}`;
55
+ const phaseLine = formatPhaseLine(progress);
56
+ const questionsLine = formatQuestionsLine(progress);
57
+ const activityLine = formatActivityLine(exploration.updatedAt, now);
58
+ const paceLine = formatPaceLine(progress, now);
59
+ const nextLine = formatNextLine(progress);
60
+ const out = [runLine, phaseLine];
61
+ if (questionsLine)
62
+ out.push(questionsLine);
63
+ out.push(activityLine);
64
+ if (paceLine)
65
+ out.push(paceLine);
66
+ if (nextLine)
67
+ out.push(nextLine);
68
+ return out;
69
+ }
70
+ function formatNoRunButProgress(progress, exploration, now) {
71
+ // No active run, but agenticProgress on the exploration shows past
72
+ // activity. Either the run completed or it never started. Either
73
+ // way, the last-snapshot view is what's useful.
74
+ const out = [`Run (no active run)`];
75
+ out.push(formatPhaseLine(progress));
76
+ const questionsLine = formatQuestionsLine(progress);
77
+ if (questionsLine)
78
+ out.push(questionsLine);
79
+ out.push(formatActivityLine(exploration.updatedAt, now));
80
+ return out;
81
+ }
82
+ function formatNoProgress(exploration) {
83
+ return [
84
+ `Run (no run started yet)`,
85
+ `Phase —`,
86
+ `Step ${exploration.step}`,
87
+ ];
88
+ }
89
+ function formatPhaseLine(progress) {
90
+ const phase = progress.phase ?? '—';
91
+ const pct = typeof progress.percent === 'number' ? ` (${progress.percent}%)` : '';
92
+ return `Phase ${phase}${pct}`;
93
+ }
94
+ function formatQuestionsLine(progress) {
95
+ const total = progress.totalQuestions;
96
+ const done = progress.completedQuestions;
97
+ const failed = progress.failedQuestions ?? 0;
98
+ if (typeof total !== 'number' || typeof done !== 'number')
99
+ return null;
100
+ if (total === 0)
101
+ return null;
102
+ const failedSegment = failed > 0 ? ` · ${failed} failed` : ` · 0 failed`;
103
+ return `Questions ${done} / ${total}${failedSegment}`;
104
+ }
105
+ function formatActivityLine(updatedAt, now) {
106
+ const ageSec = Math.max(0, Math.round((now - new Date(updatedAt).getTime()) / 1000));
107
+ return `Activity last DB write ${humanizeDuration(ageSec)} ago`;
108
+ }
109
+ function formatPaceLine(progress, now) {
110
+ const done = progress.completedQuestions ?? 0;
111
+ const total = progress.totalQuestions ?? 0;
112
+ if (done < 3)
113
+ return `Pace warming up — check back in 30s`;
114
+ if (!progress.startedAt || total <= done)
115
+ return null;
116
+ const elapsedSec = (now - new Date(progress.startedAt).getTime()) / 1000;
117
+ if (elapsedSec <= 0)
118
+ return null;
119
+ const secPerQ = elapsedSec / done;
120
+ const remainingSec = Math.round(secPerQ * (total - done));
121
+ return `Pace ~${Math.round(secPerQ)}s/question · ETA ~${humanizeDuration(remainingSec)} remaining`;
122
+ }
123
+ function formatNextLine(progress) {
124
+ const phase = (progress.phase ?? '').toLowerCase();
125
+ const nextByPhase = {
126
+ discovery: 'Accepting questions',
127
+ accepting: 'Answering',
128
+ answering: 'Recommendations (auto-advances when questions are done)',
129
+ submitting: 'Recommendations',
130
+ recommendations: 'Build brief (after admin review)',
131
+ complete: '—',
132
+ failed: '—',
133
+ };
134
+ const next = nextByPhase[phase];
135
+ return next ? `Next ${next}` : null;
136
+ }
137
+ function humanizeDuration(seconds) {
138
+ if (seconds < 0)
139
+ seconds = 0;
140
+ if (seconds < 60)
141
+ return `${seconds}s`;
142
+ const m = Math.floor(seconds / 60);
143
+ const s = seconds % 60;
144
+ if (m < 60) {
145
+ return s === 0 ? `${m}m` : `${m}m ${s}s`;
146
+ }
147
+ const h = Math.floor(m / 60);
148
+ const remM = m % 60;
149
+ return remM === 0 ? `${h}h` : `${h}h ${remM}m`;
150
+ }
151
+ function truncateId(id) {
152
+ // "ba4d2b42-…" form — first 8 chars + ellipsis. Matches the agent-
153
+ // facing copy in the SKILL so users can pattern-match against IDs
154
+ // they've seen elsewhere. UUIDs slice cleanly at 8 (no trailing
155
+ // hyphen); for non-UUID inputs we strip a trailing dash so we
156
+ // don't render "r1-aaaa--…" with double hyphens.
157
+ if (id.length <= 8)
158
+ return id;
159
+ const head = id.slice(0, 8).replace(/-+$/, '');
160
+ return `${head}-…`;
161
+ }
162
+ //# sourceMappingURL=status-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-formatter.js","sourceRoot":"","sources":["../../src/lib/status-formatter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;;AA4BH,oCAiBC;AAyGD,4CAWC;AArID,SAAgB,YAAY,CAAC,KAAmB;IAC/C,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACpF,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,EAAE,cAAc,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAE5E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CACxB,GAAmC,EACnC,QAA+C,EAC/C,WAAkC,EAClC,GAAW;IAEX,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS;QAChC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;QACnE,CAAC,CAAC,IAAI,CAAC;IACR,MAAM,OAAO,GAAG,MAAM,IAAI,IAAI;QAC7B,CAAC,CAAC,cAAc,QAAQ,QAAQ,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,gBAAgB,CAAC,MAAM,CAAC,EAAE;QAC1F,CAAC,CAAC,cAAc,QAAQ,QAAQ,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;IAE5D,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,kBAAkB,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE1C,MAAM,GAAG,GAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3C,IAAI,aAAa;QAAE,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvB,IAAI,QAAQ;QAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,QAAQ;QAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,sBAAsB,CAC9B,QAA+C,EAC/C,WAAkC,EAClC,GAAW;IAEX,mEAAmE;IACnE,iEAAiE;IACjE,gDAAgD;IAChD,MAAM,GAAG,GAAa,CAAC,4BAA4B,CAAC,CAAC;IACrD,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpC,MAAM,aAAa,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,aAAa;QAAE,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,gBAAgB,CAAC,WAA6B;IACtD,OAAO;QACN,iCAAiC;QACjC,cAAc;QACd,cAAc,WAAW,CAAC,IAAI,EAAE;KAChC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAA+C;IACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC;IACpC,MAAM,GAAG,GAAG,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,OAAO,cAAc,KAAK,GAAG,GAAG,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAAC,QAA+C;IAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,kBAAkB,CAAC;IACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,IAAI,CAAC,CAAC;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvE,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,MAAM,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC;IAC7E,OAAO,cAAc,IAAI,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB,EAAE,GAAW;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACrF,OAAO,4BAA4B,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;AACnE,CAAC;AAED,SAAS,cAAc,CACtB,QAA+C,EAC/C,GAAW;IAEX,MAAM,IAAI,GAAG,QAAQ,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,IAAI,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,2CAA2C,CAAC;IACjE,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IACzE,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1D,OAAO,eAAe,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,uBAAuB,gBAAgB,CAAC,YAAY,CAAC,YAAY,CAAC;AAC5G,CAAC;AAED,SAAS,cAAc,CAAC,QAA+C;IACtE,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,WAAW,GAA2B;QAC3C,SAAS,EAAE,qBAAqB;QAChC,SAAS,EAAE,WAAW;QACtB,SAAS,EAAE,yDAAyD;QACpE,UAAU,EAAE,iBAAiB;QAC7B,eAAe,EAAE,kCAAkC;QACnD,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,GAAG;KACX,CAAC;IACF,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAe;IAC/C,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC;IAC7B,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;IACpB,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC;AAChD,CAAC;AAED,SAAS,UAAU,CAAC,EAAU;IAC7B,mEAAmE;IACnE,kEAAkE;IAClE,gEAAgE;IAChE,8DAA8D;IAC9D,iDAAiD;IACjD,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,GAAG,IAAI,IAAI,CAAC;AACpB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ritualai/cli",
3
- "version": "0.7.12",
3
+ "version": "0.7.14",
4
4
  "description": "Ritual CLI — scaffold AI coding agent skills + register MCP servers. Connects Claude Code, Cursor, Windsurf, Kiro, Gemini CLI, VS Code/Copilot, and Codex to Ritual Cloud.",
5
5
  "private": false,
6
6
  "license": "Apache-2.0",
@@ -1,4 +1,4 @@
1
1
  {
2
- "cliVersion": "0.7.12",
3
- "builtAt": "2026-05-14T13:31:40.197Z"
2
+ "cliVersion": "0.7.14",
3
+ "builtAt": "2026-05-15T16:06:46.162Z"
4
4
  }
@@ -21,8 +21,8 @@
21
21
  },
22
22
  {
23
23
  "path": "references/build-flow.md",
24
- "lines": 1519,
25
- "bytes": 88142
24
+ "lines": 2466,
25
+ "bytes": 148766
26
26
  },
27
27
  {
28
28
  "path": "references/cli-output-contract.md",
@@ -53,5 +53,10 @@
53
53
  "path": "references/scoring-fallback.md",
54
54
  "lines": 126,
55
55
  "bytes": 6494
56
+ },
57
+ {
58
+ "path": "references/ui-ux-checklist.md",
59
+ "lines": 198,
60
+ "bytes": 12167
56
61
  }
57
62
  ]