@formlm/cli 0.3.0 → 0.5.1

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 (70) hide show
  1. package/README.md +326 -65
  2. package/dist/commands/app.d.ts.map +1 -1
  3. package/dist/commands/app.js +74 -16
  4. package/dist/commands/app.js.map +1 -1
  5. package/dist/commands/auth.d.ts.map +1 -1
  6. package/dist/commands/auth.js +186 -7
  7. package/dist/commands/auth.js.map +1 -1
  8. package/dist/commands/connect.js +3 -3
  9. package/dist/commands/connect.js.map +1 -1
  10. package/dist/commands/doctor.d.ts +11 -0
  11. package/dist/commands/doctor.d.ts.map +1 -0
  12. package/dist/commands/doctor.js +109 -0
  13. package/dist/commands/doctor.js.map +1 -0
  14. package/dist/commands/expert.d.ts.map +1 -1
  15. package/dist/commands/expert.js +42 -18
  16. package/dist/commands/expert.js.map +1 -1
  17. package/dist/commands/field.d.ts.map +1 -1
  18. package/dist/commands/field.js +9 -11
  19. package/dist/commands/field.js.map +1 -1
  20. package/dist/commands/profile.js +1 -1
  21. package/dist/commands/profile.js.map +1 -1
  22. package/dist/commands/report.d.ts.map +1 -1
  23. package/dist/commands/report.js +39 -12
  24. package/dist/commands/report.js.map +1 -1
  25. package/dist/commands/scale.d.ts.map +1 -1
  26. package/dist/commands/scale.js +4 -1
  27. package/dist/commands/scale.js.map +1 -1
  28. package/dist/commands/share.d.ts.map +1 -1
  29. package/dist/commands/share.js +258 -28
  30. package/dist/commands/share.js.map +1 -1
  31. package/dist/commands/skill.d.ts.map +1 -1
  32. package/dist/commands/skill.js +2 -3
  33. package/dist/commands/skill.js.map +1 -1
  34. package/dist/commands/smart.d.ts.map +1 -1
  35. package/dist/commands/smart.js +337 -59
  36. package/dist/commands/smart.js.map +1 -1
  37. package/dist/commands/snapshot.d.ts +0 -11
  38. package/dist/commands/snapshot.d.ts.map +1 -1
  39. package/dist/commands/snapshot.js +168 -42
  40. package/dist/commands/snapshot.js.map +1 -1
  41. package/dist/config.d.ts +1 -0
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +1 -1
  44. package/dist/config.js.map +1 -1
  45. package/dist/doctor.d.ts +51 -0
  46. package/dist/doctor.d.ts.map +1 -0
  47. package/dist/doctor.js +202 -0
  48. package/dist/doctor.js.map +1 -0
  49. package/dist/exec.d.ts +39 -1
  50. package/dist/exec.d.ts.map +1 -1
  51. package/dist/exec.js +309 -4
  52. package/dist/exec.js.map +1 -1
  53. package/dist/index.js +55 -6
  54. package/dist/index.js.map +1 -1
  55. package/dist/mcp.d.ts.map +1 -1
  56. package/dist/mcp.js +283 -67
  57. package/dist/mcp.js.map +1 -1
  58. package/dist/output.d.ts +23 -1
  59. package/dist/output.d.ts.map +1 -1
  60. package/dist/output.js +69 -7
  61. package/dist/output.js.map +1 -1
  62. package/dist/summary.d.ts +17 -0
  63. package/dist/summary.d.ts.map +1 -0
  64. package/dist/summary.js +64 -0
  65. package/dist/summary.js.map +1 -0
  66. package/dist/utils.d.ts +10 -2
  67. package/dist/utils.d.ts.map +1 -1
  68. package/dist/utils.js +45 -6
  69. package/dist/utils.js.map +1 -1
  70. package/package.json +11 -2
@@ -1,99 +1,377 @@
1
1
  import { Option } from 'commander';
2
+ import * as fs from 'node:fs';
3
+ import * as os from 'node:os';
4
+ import * as path from 'node:path';
2
5
  import { execCommand } from '../exec.js';
3
- import { output } from '../output.js';
4
- import { escapeArg } from '../utils.js';
6
+ import { output, guidance, localFail, isJsonMode } from '../output.js';
7
+ import { escapeArg, absHttpsUrl } from '../utils.js';
8
+ import { getBaseUrl } from '../config.js';
9
+ import { shareTokenFromUrl } from '../summary.js';
10
+ import { runDoctor, isValidLangCode } from '../doctor.js';
5
11
  /**
6
12
  * Smart Pipeline Commands
7
13
  *
8
14
  * Wraps the server-side AssessAgent intelligent pipeline:
9
15
  * - smart plan: AssessAgent.plan() only — generate execution plan + appId
10
16
  * - smart execute: execute a single module (form/scale/connect/report/expert/share)
17
+ * - smart generate: the resumable one-shot convenience over plan + execute×modules
18
+ * (optionally publish + run the quality doctor)
11
19
  *
12
20
  * This is the RECOMMENDED entry point for AI agents (works with any MCP-compatible
13
21
  * platform: Claude / Cursor / Codex CLI / Windsurf / etc., or direct CLI usage)
14
22
  * because it embeds the full SKILL.md domain knowledge, reference data injection,
15
23
  * and multi-step orchestration that newapp.html uses internally.
24
+ *
25
+ * Long batches: prefer plan + execute (per-module resumability). `generate` is the
26
+ * sugar for "build me one app now"; it reports each module's structured status and
27
+ * honours FORMLM_NO_EXIT so a driver loop survives a partial run.
16
28
  */
17
29
  // ── Timeouts ──────────────────────────────────────────────────────────────────
18
30
  // Must match mcp.ts constants to ensure CLI and MCP Server have identical behavior.
19
- const TIMEOUT_PLAN = 120_000; // 2min for smart plan (Phase 1 only, ~10-30s)
20
- const TIMEOUT_EXECUTE = 300_000; // 5min for smart execute (single module, ~30-120s)
31
+ // All overridable via FORMLM_TIMEOUT_PLAN / FORMLM_TIMEOUT_EXECUTE / FORMLM_TIMEOUT_STYLE (ms).
32
+ const TIMEOUT_PLAN = Number(process.env.FORMLM_TIMEOUT_PLAN) || 120_000; // 2min for smart plan (Phase 1 only, ~10-30s)
33
+ const TIMEOUT_EXECUTE = Number(process.env.FORMLM_TIMEOUT_EXECUTE) || 300_000; // 5min for smart execute (single module, ~30-120s)
34
+ const TIMEOUT_STYLE = Number(process.env.FORMLM_TIMEOUT_STYLE) || 600_000; // 10min for connect style apply-all
35
+ const FOREVER = 3650000; // server "permanent" sentinel for share day
36
+ const MODULE_ORDER = ['form', 'scale', 'connect', 'report', 'expert', 'share'];
37
+ function parseJson(data) {
38
+ if (data === null || data === undefined)
39
+ return null;
40
+ if (typeof data !== 'string')
41
+ return data;
42
+ try {
43
+ return JSON.parse(data);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ /**
50
+ * Run `assess smart plan` and return the exec result plus the parsed payload.
51
+ * On --dry-run the created probe app is deleted again immediately: the server has no
52
+ * plan-without-app mode, and this is the documented way to validate a prompt/spec
53
+ * without leaving residue in the account.
54
+ */
55
+ async function runPlan(args) {
56
+ let cmd = `assess smart plan --input "${escapeArg(args.input)}"`;
57
+ if (args.planType)
58
+ cmd += ` --plan-type ${args.planType}`;
59
+ if (args.style)
60
+ cmd += ` --style "${escapeArg(args.style)}"`;
61
+ if (args.questionCount)
62
+ cmd += ` --question-count ${args.questionCount}`;
63
+ if (args.lang)
64
+ cmd += ` --lang ${args.lang}`;
65
+ if (args.dimensions)
66
+ cmd += ` --dimensions "${escapeArg(args.dimensions)}"`;
67
+ if (args.appName)
68
+ cmd += ` --app-name "${escapeArg(args.appName)}"`;
69
+ cmd += ' --json';
70
+ const result = await execCommand(cmd, undefined, TIMEOUT_PLAN);
71
+ const parsed = result.code === 0 ? parseJson(result.data) : null;
72
+ if (result.code === 0 && parsed?.appId && args.dryRun) {
73
+ const removed = await execCommand(`assess app remove --app ${parsed.appId} --json`);
74
+ guidance(`🧪 --dry-run: probe app ${parsed.appId} was ${removed.code === 0 ? 'deleted again' : 'NOT deleted (cleanup failed: ' + removed.message + ')'}`);
75
+ }
76
+ else if (result.code === 0 && parsed?.appId && args.savePlan) {
77
+ writePlanFile(args.savePlan, parsed);
78
+ }
79
+ return { result, parsed };
80
+ }
81
+ /** Persist the full AssessPlan JSON (envelope carries it stringified in data.plan). */
82
+ function writePlanFile(file, parsed) {
83
+ try {
84
+ const fullPlan = typeof parsed?.plan === 'string' ? parsed.plan : JSON.stringify(parsed?.plan ?? parsed);
85
+ fs.writeFileSync(file, fullPlan);
86
+ guidance(`💾 Full plan JSON saved to: ${file}`);
87
+ return file;
88
+ }
89
+ catch (e) {
90
+ guidance(`⚠️ Could not write the plan file "${file}": ${e?.message || e} — resume will need --plan <inline JSON> instead.`);
91
+ return '';
92
+ }
93
+ }
94
+ /**
95
+ * Map a requested validity to the server --form-day value.
96
+ * Server rule: only 1..30 stay finite; anything else is the permanent sentinel.
97
+ * Returns null for an unusable input (non-numeric / negative).
98
+ */
99
+ function mapDays(raw) {
100
+ if (raw === undefined || raw === null || raw === '')
101
+ return { days: FOREVER, normalized: false };
102
+ const s = String(raw).trim().toLowerCase();
103
+ if (s === 'forever')
104
+ return { days: FOREVER, normalized: false };
105
+ const n = Number(s);
106
+ if (!Number.isFinite(n) || n < 0)
107
+ return null;
108
+ if (n === 0)
109
+ return { days: FOREVER, normalized: false }; // explicit permanent, no notice
110
+ if (n > 30)
111
+ return { days: FOREVER, normalized: true }; // server cannot express >30
112
+ return { days: Math.floor(n), normalized: false };
113
+ }
114
+ async function runExecute(args) {
115
+ if (args.clearFirst && args.module !== 'scale') {
116
+ localFail('--clear-first is only supported for --module scale (other modules are already idempotent or have no clear command).');
117
+ }
118
+ if (args.clearFirst) {
119
+ const cleared = await execCommand(`assess scale clear --app ${args.app} --json`);
120
+ if (cleared.code !== 0) {
121
+ localFail(`--clear-first could not clear scale dimensions: [${cleared.code}] ${cleared.message}`);
122
+ }
123
+ guidance('🧹 Existing scale dimensions cleared (--clear-first).');
124
+ }
125
+ let cmd = `assess smart execute --app ${args.app} --module ${args.module}`;
126
+ let planJson = args.plan;
127
+ if (args.planFile) {
128
+ try {
129
+ planJson = fs.readFileSync(args.planFile, 'utf-8');
130
+ }
131
+ catch (e) {
132
+ localFail(`--plan-file unreadable: ${e?.message || e}`);
133
+ }
134
+ }
135
+ if (planJson) {
136
+ // Transport contract: the plan travels as Base64 in ONE argv token (--plan-b64).
137
+ // Inline JSON is NOT safe on this channel — the server's command preprocessing
138
+ // (CliServiceImpl.splitBatchCommands / splitBySemicolon / quote normalisation)
139
+ // cuts the payload at every `, assess …` / `;` / quote inside task text, so the
140
+ // plan silently degenerates into unrelated sub-commands (measured live).
141
+ // Base64 contains no spaces, quotes, commas or semicolons, so it survives intact.
142
+ let encoded;
143
+ try {
144
+ encoded = Buffer.from(JSON.stringify(JSON.parse(planJson)), 'utf-8').toString('base64');
145
+ }
146
+ catch {
147
+ localFail('--plan value is not valid JSON (check the file written by smart plan --save-plan).');
148
+ return undefined;
149
+ }
150
+ cmd += ` --plan-b64 ${encoded}`;
151
+ }
152
+ cmd += ' --json';
153
+ // Style generation is the slowest module — give connect its own budget.
154
+ const timeout = args.module === 'connect' ? TIMEOUT_STYLE : TIMEOUT_EXECUTE;
155
+ return execCommand(cmd, undefined, timeout);
156
+ }
21
157
  export function registerSmartCommand(parent) {
22
- const smart = parent.command('smart').description('Intelligent pipeline — natural language to live app (recommended for AI agents)');
158
+ const smart = parent.command('smart').description('Intelligent pipeline — natural language to live app (recommended for AI agents). Steps: smart plan → smart execute per module; "smart generate" is the one-shot wrapper of those steps.');
23
159
  // ── smart plan ───────────────────────────────────────────────
24
160
  smart
25
161
  .command('plan')
26
- .description('Generate execution plan only (Phase 1). Returns plan JSON + appId. Use with smart execute for step-by-step generation to avoid AI client timeouts.')
162
+ .description('Generate execution plan only (Phase 1). Returns plan JSON + appId. Then run smart execute for each module (plan cached server-side ~10min). Tip: --save-plan keeps the plan on disk so execute can still resume after the cache expires.')
27
163
  .requiredOption('--input <text>', 'Natural language description of the app you want to build')
28
- .addOption(new Option('--plan-type <type>', 'Plan type').choices(['assessment', 'consultation', 'survey', 'exam', 'quiz', 'learn']))
164
+ .addOption(new Option('--plan-type <type>', 'Plan type').choices(['assessment', 'consultation', 'survey', 'exam', 'report', 'learn']))
29
165
  .option('--style <style>', 'Visual style preference')
30
- .addOption(new Option('--question-count <count>', 'Question count range').choices(['10-15', '15-20', '20-30']))
166
+ .addOption(new Option('--question-count <count>', 'Question count range').choices(['5-9', '10-15', '15-20', '20-30', '30-50', '50-100']))
167
+ .option('--lang <lang>', 'BCP-47 language code (e.g. zh / zh-hant / zh-tw / en / ja). Injects an [OUTPUT LANGUAGE] directive that anchors AI output language for the plan AND every module execute — the only language entry point on the CLI/MCP channel (no Accept-Language header available there)')
168
+ .option('--dimensions <names>', 'Pin scoring dimensions (pipe/semicolon separated, e.g. "Natural Finish|Glam|Editorial"). The plan AI must keep these exact names and count — use when an external page/ledger already defines them')
169
+ .option('--app-name <name>', 'Pin the app display name (default: Plan AI chooses). Use when the name must match a ledger/page exactly')
170
+ .option('--save-plan <file>', 'Also write the full plan JSON to this file (for smart execute --plan-file after the server cache expires)')
171
+ .option('--dry-run', 'Validate the prompt/spec and return the would-be plan, then delete the probe app again (the server always creates an app when planning; this cleans it up so probing leaves no residue)')
31
172
  .action(async (opts) => {
32
- let cmd = `assess smart plan --input "${escapeArg(opts.input)}"`;
33
- if (opts.planType)
34
- cmd += ` --plan-type ${opts.planType}`;
35
- if (opts.style)
36
- cmd += ` --style "${escapeArg(opts.style)}"`;
37
- if (opts.questionCount)
38
- cmd += ` --question-count ${opts.questionCount}`;
39
- cmd += ' --json';
40
- const result = await execCommand(cmd, undefined, TIMEOUT_PLAN);
173
+ const { result, parsed } = await runPlan(opts);
41
174
  output(result);
42
- // ── Next Steps guidance ──────
43
- if (result.code === 0 && result.data) {
44
- try {
45
- const parsed = JSON.parse(result.data);
46
- if (parsed.appId && parsed.plan) {
47
- console.log('');
48
- console.log('💡 Next steps — execute modules sequentially:');
49
- const modules = (parsed.tasks || []).map((t) => t.skill);
50
- for (const m of modules) {
51
- console.log(` formlm-cli smart execute --app ${parsed.appId} --module ${m} --plan '${parsed.plan}'`);
52
- }
53
- console.log(` Snapshot: formlm-cli snapshot --app ${parsed.appId}`);
54
- }
175
+ // ── Next Steps guidance (stderr-friendly via guidance()) ──────
176
+ if (result.code === 0 && parsed?.appId) {
177
+ const modules = (parsed.tasks || []).map((t) => t.skill);
178
+ if (opts.dryRun) {
179
+ guidance('');
180
+ guidance('💡 --dry-run: the probe app above was deleted. Re-run without --dry-run to keep it and execute the modules.');
181
+ return;
55
182
  }
56
- catch {
57
- // result.data was not JSON — skip guidance
183
+ guidance('');
184
+ guidance('💡 Next steps — execute modules sequentially (plan cached server-side ~10min, no --plan needed; after expiry use --plan-file):');
185
+ for (const m of modules) {
186
+ guidance(` formlm-cli smart execute --app ${parsed.appId} --module ${m}`);
187
+ }
188
+ guidance(` One-shot: formlm-cli smart generate --input "<same description>" --publish`);
189
+ // Plan-type coverage is not universal: only consultation plans include `expert`.
190
+ // Surface what is missing so callers don't ship pages promising an AI expert
191
+ // that the app does not have (silent exam/assessment gap seen in batch runs).
192
+ const missing = MODULE_ORDER.filter(m => !modules.includes(m));
193
+ if (missing.length > 0) {
194
+ guidance(` ⚠️ Plan does NOT include: ${missing.join(', ')} — smart execute for these will report "No task found".`);
195
+ if (missing.includes('expert')) {
196
+ guidance(` Add an expert deterministically: formlm-cli expert config --app ${parsed.appId} --name "..." --role "..." --kbText "..." --enable true`);
197
+ }
58
198
  }
199
+ guidance(` Snapshot: formlm-cli snapshot --app ${parsed.appId} --summary`);
59
200
  }
60
201
  });
61
202
  // ── smart execute ────────────────────────────────────────────
62
203
  smart
63
204
  .command('execute')
64
- .description('Execute a single module from the plan. Each module completes within ~60s, well within AI client timeouts (~300s).')
205
+ .description('Execute a single module from the plan. Plan is cached server-side (~10min) after smart plan — no --plan needed. After the cache expires, resume an EXISTING app with --plan-file <saved plan JSON> (or --plan <inline JSON>). Each module completes within ~60s.')
65
206
  .requiredOption('--app <appId>', 'App ID')
66
- .requiredOption('--module <name>', 'Module: form / scale / connect / report / expert / share')
67
- .requiredOption('--plan <json>', 'Plan JSON from smart plan (or updated plan from previous smart execute)')
207
+ .requiredOption('--module <name>', `Module: ${MODULE_ORDER.join(' / ')}`)
208
+ .option('--plan <json>', 'Plan JSON inline (fallback when the server cache expired; transmitted Base64-safe as --plan-b64)')
209
+ .option('--plan-file <file>', 'Plan JSON file (written by smart plan --save-plan) — fallback when server cache expired')
210
+ .option('--clear-first', 'For module=scale only: clear existing dimensions before executing, so a retried run REPLACES instead of appending duplicate dimensions')
68
211
  .action(async (opts) => {
69
- let cmd = `assess smart execute --app ${opts.app} --module ${opts.module} --plan "${escapeArg(opts.plan)}" --json`;
70
- const result = await execCommand(cmd, undefined, TIMEOUT_EXECUTE);
212
+ const result = await runExecute(opts);
71
213
  output(result);
72
- // ── Next Steps guidance ──────
73
- if (result.code === 0 && result.data) {
74
- try {
75
- const parsed = JSON.parse(result.data);
76
- if (parsed.appId && parsed.plan) {
77
- const moduleOrder = ['form', 'scale', 'connect', 'report', 'expert', 'share'];
78
- const currentIdx = moduleOrder.indexOf(opts.module);
79
- const nextModule = moduleOrder[currentIdx + 1];
80
- console.log('');
81
- console.log('💡 Next steps:');
82
- if (nextModule) {
83
- console.log(` Execute next: formlm-cli smart execute --app ${parsed.appId} --module ${nextModule} --plan '${parsed.plan}'`);
84
- }
85
- else {
86
- console.log(` ✅ All modules done!`);
87
- console.log(` Editor: https://formlm.me/mypage/builder.html?id=${parsed.appId}`);
88
- console.log(` Data: https://formlm.me/mypage/data.html?id=${parsed.appId}`);
89
- console.log(` Snapshot: formlm-cli snapshot --app ${parsed.appId}`);
90
- }
91
- }
214
+ // ── Structured success signal + Next Steps guidance ──────
215
+ // (script callers should trust data.taskStatus/status, not human text)
216
+ const parsed = result.code === 0 ? parseJson(result.data) : null;
217
+ if (parsed?.appId) {
218
+ if (parsed.taskStatus === 'error') {
219
+ guidance(`⚠️ Module '${opts.module}' ended with status=error: ${parsed.error || 'see output'}`);
220
+ }
221
+ const nextModule = MODULE_ORDER[MODULE_ORDER.indexOf(opts.module) + 1];
222
+ guidance('');
223
+ guidance('💡 Next steps:');
224
+ if (nextModule) {
225
+ guidance(` Execute next: formlm-cli smart execute --app ${parsed.appId} --module ${nextModule}`);
92
226
  }
93
- catch {
94
- // result.data was not JSON — skip guidance
227
+ else {
228
+ guidance(` ✅ All modules done!`);
229
+ guidance(` Verify: formlm-cli doctor --app ${parsed.appId}`);
230
+ guidance(` Publish: formlm-cli share publish --app ${parsed.appId}`);
231
+ guidance(` Snapshot: formlm-cli snapshot --app ${parsed.appId} --summary`);
95
232
  }
96
233
  }
97
234
  });
235
+ // ── smart generate ───────────────────────────────────────────
236
+ smart
237
+ .command('generate')
238
+ .description('One-shot convenience over the pipeline: plan → execute every planned module in order → (optional) publish → (optional) doctor. ' +
239
+ 'Progress and per-module status go to stderr under --json so stdout stays one parseable envelope; the saved plan path is reported for --plan-file resume if a module fails midway. ' +
240
+ 'For full resumability/observability prefer explicit plan + execute; this is the short path.')
241
+ .requiredOption('--input <text>', 'Natural language description of the app you want to build')
242
+ .addOption(new Option('--plan-type <type>', 'Plan type').choices(['assessment', 'consultation', 'survey', 'exam', 'report', 'learn']))
243
+ .option('--style <style>', 'Visual style preference')
244
+ .addOption(new Option('--question-count <count>', 'Question count range').choices(['5-9', '10-15', '15-20', '20-30', '30-50', '50-100']))
245
+ .option('--lang <lang>', 'BCP-47 language code (e.g. zh / zh-hant / en / ja) — anchors the AI output language for the plan and every module')
246
+ .option('--dimensions <names>', 'Pin scoring dimensions (pipe/semicolon separated) so generated dimensions match an existing page/ledger')
247
+ .option('--app-name <name>', 'Pin the app display name')
248
+ .option('--save-plan <file>', 'Where to write the full plan JSON (default: auto-named next to the profile dir). Reported on failure for --plan-file resume')
249
+ .option('--only <modules>', 'Execute only these modules (comma-separated subset of ' + MODULE_ORDER.join('/') + ')')
250
+ .option('--skip <modules>', 'Skip these modules (comma-separated)')
251
+ .option('--publish', 'After all modules, publish the app for anonymous access (share publish --access visitor) and return the fill-in URL + shareToken')
252
+ .option('--access <type>', 'With --publish: visitor (default, anonymous) / all (requires login) / secret (password)', 'visitor')
253
+ .option('--days <n>', 'With --publish: validity in days (1-30), or 0/forever (default)', 'forever')
254
+ .option('--doctor', 'After generating, run the read-only quality audit and include its findings in the result')
255
+ .action(async (opts) => {
256
+ const only = opts.only ? String(opts.only).split(',').map((m) => m.trim()).filter(Boolean) : null;
257
+ const skip = opts.skip ? String(opts.skip).split(',').map((m) => m.trim()).filter(Boolean) : [];
258
+ for (const m of [...(only || []), ...skip]) {
259
+ if (!MODULE_ORDER.includes(m))
260
+ localFail(`Invalid module "${m}". Valid: ${MODULE_ORDER.join(', ')}`);
261
+ }
262
+ if (opts.access && !['visitor', 'all', 'secret', 'owner', 'no'].includes(String(opts.access).trim())) {
263
+ localFail(`Invalid --access "${opts.access}". Valid: visitor / all / secret / owner / no.`);
264
+ }
265
+ // ── Phase 1: plan (always keep a plan file for resume) ──────
266
+ const { result: planResult, parsed: plan } = await runPlan({ ...opts, savePlan: opts.savePlan });
267
+ if (planResult.code !== 0 || !plan?.appId) {
268
+ output(planResult);
269
+ return;
270
+ }
271
+ const appId = plan.appId;
272
+ const savePlan = opts.savePlan
273
+ ? String(opts.savePlan)
274
+ : (writePlanFile(path.join(os.tmpdir(), `formlm-plan-${appId}.json`), plan) || '');
275
+ const planned = (plan.tasks || []).map((t) => t.skill);
276
+ const modules = (only || planned).filter(m => MODULE_ORDER.includes(m) && !skip.includes(m));
277
+ guidance(`📋 Plan ready — appId=${appId}, type=${plan.planType || '?'}, tasks=${planned.join(' → ') || '(none)'}`);
278
+ if (savePlan)
279
+ guidance(`↩️ Resume any module later with: formlm-cli smart execute --app ${appId} --module <m> --plan-file ${savePlan}`);
280
+ const missing = MODULE_ORDER.filter(m => !planned.includes(m));
281
+ if (missing.length > 0)
282
+ guidance(`ℹ️ Not covered by this plan: ${missing.join(', ')}${missing.includes('expert') ? ' (add later with: formlm-cli expert config --app ' + appId + ' ...)' : ''}`);
283
+ // ── Phase 2: execute modules sequentially ──────────────────
284
+ const moduleResults = [];
285
+ let failedAt = null;
286
+ for (const m of modules) {
287
+ guidance(`⏳ Generating module: ${m} (30-120s, do not cancel)…`);
288
+ const r = await runExecute({ app: appId, module: m });
289
+ const p = r.code === 0 ? parseJson(r.data) : null;
290
+ const status = r.code !== 0 ? 'error' : (p?.taskStatus === 'error' ? 'error' : 'success');
291
+ moduleResults.push({
292
+ module: m,
293
+ status,
294
+ code: r.code,
295
+ error: r.code !== 0 ? r.message : (p?.error ?? null),
296
+ });
297
+ guidance(`${status === 'success' ? '✅' : '❌'} ${m}: ${status}${status !== 'success' ? ' — ' + (r.code !== 0 ? r.message : (p?.error || 'see output')) : ''}`);
298
+ if (status !== 'success') {
299
+ failedAt = m;
300
+ guidance(`⏸️ Stopped at module '${m}'. Fix the cause, then resume WITHOUT re-creating the app:`);
301
+ guidance(` formlm-cli smart execute --app ${appId} --module ${m} --plan-file ${savePlan}`);
302
+ guidance(` formlm-cli smart execute --app ${appId} --module <next> --plan-file ${savePlan}`);
303
+ break;
304
+ }
305
+ }
306
+ // ── Phase 3: optional publish ─────────────────────────────
307
+ let publish = null;
308
+ if (!failedAt && opts.publish) {
309
+ const mapped = mapDays(opts.days);
310
+ if (!mapped) {
311
+ localFail(`Invalid --days "${opts.days}". Use 1-30, or 0/forever for permanent.`);
312
+ }
313
+ const day = mapped.days;
314
+ if (mapped.normalized) {
315
+ guidance(`ℹ️ --days ${opts.days} normalized to permanent (the server only honours finite windows of 1..30 days).`);
316
+ }
317
+ guidance('🚀 Publishing…');
318
+ const pub = await execCommand(`assess share set --app ${appId} --form-type ${opts.access} --form-perm 1 --form-day ${day} --json`);
319
+ const urlsRes = pub.code === 0 ? await execCommand(`assess app urls --app ${appId} --json`) : null;
320
+ const urls = urlsRes && urlsRes.code === 0 ? parseJson(urlsRes.data) : null;
321
+ const fillAbs = urls?.shareUrlAbsolute || absHttpsUrl(getBaseUrl(), urls?.shareUrl || '');
322
+ publish = {
323
+ ok: pub.code === 0,
324
+ access: opts.access,
325
+ days: day,
326
+ shareUrl: urls?.shareUrl ?? null,
327
+ shareUrlAbsolute: fillAbs || null,
328
+ shareToken: urls?.shareToken || shareTokenFromUrl(urls?.shareUrl || ''),
329
+ error: pub.code === 0 ? null : pub.message,
330
+ };
331
+ guidance(`${publish.ok ? '✅' : '❌'} Published (access=${opts.access}, ${day === FOREVER ? 'permanent' : day + ' day(s)'})${publish.ok ? ' → ' + (fillAbs || '(no url)') : ' — ' + publish.error}`);
332
+ }
333
+ // ── Phase 4: optional doctor ──────────────────────────────
334
+ let doctor = null;
335
+ if (!failedAt && opts.doctor) {
336
+ const expectLang = opts.lang && isValidLangCode(String(opts.lang)) ? String(opts.lang) : undefined;
337
+ if (opts.lang && !expectLang)
338
+ guidance(`⚠️ --lang "${opts.lang}" is not a BCP-47 code — skipping the doctor language check (other checks still run).`);
339
+ guidance('🩺 Running the read-only quality audit (doctor)…');
340
+ doctor = await runDoctor(appId, { expectLang, deep: false, probe: !!opts.publish });
341
+ }
342
+ const ok = !failedAt && (!publish || publish.ok) && (!doctor || doctor.ok);
343
+ const payload = {
344
+ appId,
345
+ appName: plan.name ?? (opts.appName || null),
346
+ planType: plan.planType ?? null,
347
+ ok,
348
+ modules: moduleResults,
349
+ skipped: skip,
350
+ notInPlan: missing,
351
+ failedAt,
352
+ resumeHint: failedAt
353
+ ? (savePlan
354
+ ? `formlm-cli smart execute --app ${appId} --module ${failedAt} --plan-file ${savePlan}`
355
+ : `formlm-cli smart execute --app ${appId} --module ${failedAt} (plan may still be cached server-side; re-plan is NOT an option — it creates a new app)`)
356
+ : null,
357
+ planFile: savePlan,
358
+ publish,
359
+ doctor: doctor ? {
360
+ ok: doctor.ok,
361
+ failCount: doctor.failCount,
362
+ warnCount: doctor.warnCount,
363
+ findings: doctor.findings,
364
+ } : null,
365
+ };
366
+ const message = failedAt
367
+ ? `stopped at module '${failedAt}'`
368
+ : (publish && !publish.ok ? `published failed: ${publish.error}`
369
+ : (doctor && !doctor.ok ? `doctor found ${doctor.failCount} blocking issue(s)` : 'ok'));
370
+ output({ code: ok ? 0 : 400, message, data: JSON.stringify(payload) });
371
+ if (!isJsonMode() && !ok) {
372
+ // output() already printed the failure line; keep the resume hint visible on stdout too
373
+ console.log(failedAt ? `Resume: ${payload.resumeHint}` : `Doctor: formlm-cli doctor --app ${appId}`);
374
+ }
375
+ });
98
376
  }
99
377
  //# sourceMappingURL=smart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"smart.js","sourceRoot":"","sources":["../../src/commands/smart.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"smart.js","sourceRoot":"","sources":["../../src/commands/smart.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,3 @@
1
1
  import { Command } from 'commander';
2
- /**
3
- * Snapshot Command — Aggregated App State Query
4
- *
5
- * Fetches the current state of ALL 6 modules (form, scale, connect, report, expert, share)
6
- * in a single command, returning a unified JSON snapshot. This is the equivalent of
7
- * newapp.html's "reference data injection" step — it gives the AI agent full context
8
- * about the current app state before generating modification commands.
9
- *
10
- * By default, all modules use --json for consistent structured output.
11
- * Use --md to switch to markdown format (token-efficient for AI consumption).
12
- */
13
2
  export declare function registerSnapshotCommand(parent: Command): void;
14
3
  //# sourceMappingURL=snapshot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA4D7D"}
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqHpC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAmF7D"}