@nac3/forge-cli 0.2.0-alpha.3 → 0.2.0-alpha.31

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 (166) hide show
  1. package/dist/bin/yf.d.ts.map +1 -1
  2. package/dist/bin/yf.js +27 -0
  3. package/dist/bin/yf.js.map +1 -1
  4. package/dist/chat/claude.d.ts +22 -15
  5. package/dist/chat/claude.d.ts.map +1 -1
  6. package/dist/chat/claude.js +75 -22
  7. package/dist/chat/claude.js.map +1 -1
  8. package/dist/chat/panel.d.ts.map +1 -1
  9. package/dist/chat/panel.js +791 -17
  10. package/dist/chat/panel.js.map +1 -1
  11. package/dist/chat/server.js +734 -32
  12. package/dist/chat/server.js.map +1 -1
  13. package/dist/chat/spec_extract.d.ts.map +1 -1
  14. package/dist/chat/spec_extract.js +39 -0
  15. package/dist/chat/spec_extract.js.map +1 -1
  16. package/dist/chat/tools/audit_consumers.d.ts +66 -0
  17. package/dist/chat/tools/audit_consumers.d.ts.map +1 -0
  18. package/dist/chat/tools/audit_consumers.js +231 -0
  19. package/dist/chat/tools/audit_consumers.js.map +1 -0
  20. package/dist/chat/tools/git.js +4 -4
  21. package/dist/chat/tools/github.js +3 -3
  22. package/dist/chat/tools/keys.d.ts +9 -0
  23. package/dist/chat/tools/keys.d.ts.map +1 -0
  24. package/dist/chat/tools/keys.js +194 -0
  25. package/dist/chat/tools/keys.js.map +1 -0
  26. package/dist/chat/tools/lifecycle.js +3 -3
  27. package/dist/chat/tools/manual.js +1 -1
  28. package/dist/chat/tools/reader.js +8 -8
  29. package/dist/chat/tools/workflow.d.ts +45 -0
  30. package/dist/chat/tools/workflow.d.ts.map +1 -0
  31. package/dist/chat/tools/workflow.js +404 -0
  32. package/dist/chat/tools/workflow.js.map +1 -0
  33. package/dist/chat/tools.d.ts.map +1 -1
  34. package/dist/chat/tools.js +31 -4
  35. package/dist/chat/tools.js.map +1 -1
  36. package/dist/commands/approve.d.ts +32 -0
  37. package/dist/commands/approve.d.ts.map +1 -0
  38. package/dist/commands/approve.js +198 -0
  39. package/dist/commands/approve.js.map +1 -0
  40. package/dist/commands/block.d.ts +28 -0
  41. package/dist/commands/block.d.ts.map +1 -0
  42. package/dist/commands/block.js +189 -0
  43. package/dist/commands/block.js.map +1 -0
  44. package/dist/commands/bootstrap.d.ts +35 -0
  45. package/dist/commands/bootstrap.d.ts.map +1 -0
  46. package/dist/commands/bootstrap.js +205 -0
  47. package/dist/commands/bootstrap.js.map +1 -0
  48. package/dist/commands/chat.d.ts +3 -0
  49. package/dist/commands/chat.d.ts.map +1 -1
  50. package/dist/commands/chat.js +46 -1
  51. package/dist/commands/chat.js.map +1 -1
  52. package/dist/commands/clarify.d.ts +30 -0
  53. package/dist/commands/clarify.d.ts.map +1 -0
  54. package/dist/commands/clarify.js +671 -0
  55. package/dist/commands/clarify.js.map +1 -0
  56. package/dist/commands/discover.d.ts +30 -0
  57. package/dist/commands/discover.d.ts.map +1 -0
  58. package/dist/commands/discover.js +178 -0
  59. package/dist/commands/discover.js.map +1 -0
  60. package/dist/commands/doctor.js +94 -42
  61. package/dist/commands/doctor.js.map +1 -1
  62. package/dist/commands/keys_setup.d.ts +53 -0
  63. package/dist/commands/keys_setup.d.ts.map +1 -0
  64. package/dist/commands/keys_setup.js +487 -0
  65. package/dist/commands/keys_setup.js.map +1 -0
  66. package/dist/commands/legacy-audit.d.ts +34 -0
  67. package/dist/commands/legacy-audit.d.ts.map +1 -0
  68. package/dist/commands/legacy-audit.js +270 -0
  69. package/dist/commands/legacy-audit.js.map +1 -0
  70. package/dist/commands/license.d.ts.map +1 -1
  71. package/dist/commands/license.js +41 -0
  72. package/dist/commands/license.js.map +1 -1
  73. package/dist/commands/operate.d.ts +22 -0
  74. package/dist/commands/operate.d.ts.map +1 -0
  75. package/dist/commands/operate.js +523 -0
  76. package/dist/commands/operate.js.map +1 -0
  77. package/dist/commands/spec.d.ts +38 -0
  78. package/dist/commands/spec.d.ts.map +1 -0
  79. package/dist/commands/spec.js +256 -0
  80. package/dist/commands/spec.js.map +1 -0
  81. package/dist/commands/support.d.ts +22 -0
  82. package/dist/commands/support.d.ts.map +1 -0
  83. package/dist/commands/support.js +143 -0
  84. package/dist/commands/support.js.map +1 -0
  85. package/dist/commands/triage.d.ts +34 -0
  86. package/dist/commands/triage.d.ts.map +1 -0
  87. package/dist/commands/triage.js +228 -0
  88. package/dist/commands/triage.js.map +1 -0
  89. package/dist/commands/vault-inventory.d.ts +30 -0
  90. package/dist/commands/vault-inventory.d.ts.map +1 -0
  91. package/dist/commands/vault-inventory.js +214 -0
  92. package/dist/commands/vault-inventory.js.map +1 -0
  93. package/dist/commands/vault.d.ts.map +1 -1
  94. package/dist/commands/vault.js +5 -0
  95. package/dist/commands/vault.js.map +1 -1
  96. package/dist/commands/voice.js +1 -1
  97. package/dist/commands/voice.js.map +1 -1
  98. package/dist/commands/workflow-coverage.d.ts +30 -0
  99. package/dist/commands/workflow-coverage.d.ts.map +1 -0
  100. package/dist/commands/workflow-coverage.js +138 -0
  101. package/dist/commands/workflow-coverage.js.map +1 -0
  102. package/dist/core/keys_envelope.d.ts +13 -0
  103. package/dist/core/keys_envelope.d.ts.map +1 -1
  104. package/dist/core/keys_envelope.js.map +1 -1
  105. package/dist/deploy/adapter.d.ts +93 -0
  106. package/dist/deploy/adapter.d.ts.map +1 -0
  107. package/dist/deploy/adapter.js +42 -0
  108. package/dist/deploy/adapter.js.map +1 -0
  109. package/dist/deploy/aws_adapter.d.ts +28 -0
  110. package/dist/deploy/aws_adapter.d.ts.map +1 -0
  111. package/dist/deploy/aws_adapter.js +98 -0
  112. package/dist/deploy/aws_adapter.js.map +1 -0
  113. package/dist/deploy/cloudflare.d.ts +24 -0
  114. package/dist/deploy/cloudflare.d.ts.map +1 -0
  115. package/dist/deploy/cloudflare.js +169 -0
  116. package/dist/deploy/cloudflare.js.map +1 -0
  117. package/dist/license/hito4_client.d.ts +17 -1
  118. package/dist/license/hito4_client.d.ts.map +1 -1
  119. package/dist/license/hito4_client.js +71 -10
  120. package/dist/license/hito4_client.js.map +1 -1
  121. package/dist/license/index.d.ts.map +1 -1
  122. package/dist/license/index.js +7 -0
  123. package/dist/license/index.js.map +1 -1
  124. package/dist/license/sync.d.ts +54 -0
  125. package/dist/license/sync.d.ts.map +1 -0
  126. package/dist/license/sync.js +131 -0
  127. package/dist/license/sync.js.map +1 -0
  128. package/dist/support/reports.d.ts +31 -0
  129. package/dist/support/reports.d.ts.map +1 -0
  130. package/dist/support/reports.js +162 -0
  131. package/dist/support/reports.js.map +1 -0
  132. package/dist/telemetry/usage.d.ts +67 -0
  133. package/dist/telemetry/usage.d.ts.map +1 -0
  134. package/dist/telemetry/usage.js +208 -0
  135. package/dist/telemetry/usage.js.map +1 -0
  136. package/dist/version.d.ts +1 -1
  137. package/dist/version.d.ts.map +1 -1
  138. package/dist/version.js +1 -1
  139. package/dist/version.js.map +1 -1
  140. package/dist/voice/intents.d.ts +1 -1
  141. package/dist/voice/intents.js +0 -0
  142. package/dist/voice/providers/google.d.ts +9 -0
  143. package/dist/voice/providers/google.d.ts.map +1 -1
  144. package/dist/voice/providers/google.js +204 -28
  145. package/dist/voice/providers/google.js.map +1 -1
  146. package/dist/voice/router.d.ts +10 -0
  147. package/dist/voice/router.d.ts.map +1 -1
  148. package/dist/voice/router.js +39 -20
  149. package/dist/voice/router.js.map +1 -1
  150. package/dist/voice/types.d.ts +5 -2
  151. package/dist/voice/types.d.ts.map +1 -1
  152. package/dist/voice/types.js.map +1 -1
  153. package/dist/workflow/state.d.ts +190 -0
  154. package/dist/workflow/state.d.ts.map +1 -0
  155. package/dist/workflow/state.js +119 -0
  156. package/dist/workflow/state.js.map +1 -0
  157. package/package.json +13 -15
  158. package/templates/nextjs-app/README.md +48 -0
  159. package/templates/nextjs-app/next.config.js +8 -0
  160. package/templates/nextjs-app/package.json +33 -0
  161. package/templates/nextjs-app/src/app/globals.css +43 -0
  162. package/templates/nextjs-app/src/app/layout.tsx +29 -0
  163. package/templates/nextjs-app/src/app/page.tsx +63 -0
  164. package/templates/nextjs-app/src/nac/manifest.ts +36 -0
  165. package/templates/nextjs-app/tsconfig.json +21 -0
  166. package/templates/nextjs-app/yujin.forge.json +11 -0
@@ -0,0 +1,523 @@
1
+ /**
2
+ * `yf operate <verb>` -- Phase VI + cross-cutting of
3
+ * PRODUCT_WORKFLOW.md.
4
+ *
5
+ * Verbs (all thin shells -- they persist state + emit
6
+ * scaffolding markers; deeper implementations land in follow-up
7
+ * commits):
8
+ *
9
+ * yf operate deploy-guided step 16 -- guided deploy + smoke
10
+ * yf operate manual-generate step 17 -- generate per-locale manual
11
+ * yf operate metrics step 17 -- observability dashboards setup
12
+ * yf operate iterate <type> step 18 -- classify + route a new requirement
13
+ * yf operate costs cross-cutting 8.2
14
+ * yf operate handoff cross-cutting 8.5
15
+ * yf operate backup-setup cross-cutting 8.6
16
+ * yf operate restore-drill cross-cutting 8.6
17
+ *
18
+ * ASCII-only.
19
+ */
20
+ import path from 'node:path';
21
+ import { promises as fs } from 'node:fs';
22
+ import prompts from 'prompts';
23
+ import { c, header } from '../ui/colors.js';
24
+ import { readWorkflow, patchWorkflowGroup, appendIteration, } from '../workflow/state.js';
25
+ /* =========================================================================
26
+ * step 16 -- yf operate deploy-guided
27
+ * ========================================================================= */
28
+ async function runDeployGuided(opts) {
29
+ header('Yujin Forge -- deploy guided');
30
+ console.log('');
31
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
32
+ const wf = await readWorkflow(projectRoot);
33
+ /* Pre-req: blocks of the MVP path must all be green. */
34
+ const mvp = wf.clarification?.blocks?.mvp_path ?? [];
35
+ const progress = wf.blocks_progress ?? [];
36
+ const notGreen = mvp.filter((bid) => {
37
+ const p = progress.find((pp) => pp.block_id === bid);
38
+ return !p || (p.status !== 'green' && !p.deployed_at);
39
+ });
40
+ if (notGreen.length > 0) {
41
+ console.log(c.error('MVP path no esta verde todavia. Faltan: ') + c.brand(notGreen.join(', ')));
42
+ console.log(c.dim('Para cada uno: ') + c.code('yf block green <id>'));
43
+ process.exitCode = 1;
44
+ return;
45
+ }
46
+ /* Tier-aware adapter pick (alpha.21+). Forge auto-suggests
47
+ * Cloudflare for simple/medium projects and AWS for full /
48
+ * persistent / heavy-parallelism ones. The user can override
49
+ * with --adapter <id>. */
50
+ const { pickDeployAdapter } = await import('../deploy/adapter.js');
51
+ const validOverride = opts.adapter && ['cloudflare', 'aws', 'vercel'].includes(opts.adapter)
52
+ ? opts.adapter : undefined;
53
+ const pick = pickDeployAdapter(wf, validOverride);
54
+ console.log(c.dim('Deploy adapter: ') + c.brand(pick.adapter)
55
+ + c.dim(' (' + pick.reason + ')'));
56
+ console.log(c.dim('Alternativas: ') + c.dim(pick.alternatives.join(', ')));
57
+ /* Probe readiness of the chosen adapter so the user gets an
58
+ * early signal that `wrangler login` / AWS creds / etc are
59
+ * needed. */
60
+ try {
61
+ let adapterInstance;
62
+ if (pick.adapter === 'cloudflare') {
63
+ const { CloudflareAdapter } = await import('../deploy/cloudflare.js');
64
+ adapterInstance = new CloudflareAdapter();
65
+ }
66
+ else if (pick.adapter === 'aws') {
67
+ const { AwsEcsAdapter } = await import('../deploy/aws_adapter.js');
68
+ adapterInstance = new AwsEcsAdapter();
69
+ }
70
+ if (adapterInstance) {
71
+ const ready = await adapterInstance.readyToRun();
72
+ if (ready.ok) {
73
+ console.log(c.dim('Adapter status: ') + c.success('ready'));
74
+ }
75
+ else {
76
+ console.log(c.dim('Adapter status: ') + c.warn('NOT READY -- ') + ready.reason);
77
+ }
78
+ }
79
+ }
80
+ catch (err) {
81
+ console.log(c.dim('Adapter probe: ') + c.warn('failed -- ')
82
+ + (err instanceof Error ? err.message : String(err)));
83
+ }
84
+ console.log('');
85
+ /* Re-check credential families marked needed in vault inventory. */
86
+ const inv = wf.vault_inventory?.families ?? {};
87
+ const neededButUnknown = [];
88
+ for (const [fam, status] of Object.entries(inv)) {
89
+ if (status === 'unknown')
90
+ neededButUnknown.push(fam);
91
+ }
92
+ if (neededButUnknown.length > 0) {
93
+ console.log(c.warn('Familias de credenciales en estado "unknown": '));
94
+ for (const f of neededButUnknown)
95
+ console.log(' - ' + f);
96
+ console.log(c.dim('Sugerido decidir cada una con ') + c.code('yf vault inventory --yes')
97
+ + c.dim(' antes de deploy.'));
98
+ if (!opts.yes) {
99
+ const r = await prompts({
100
+ type: 'confirm',
101
+ name: 'go',
102
+ message: 'Seguir con deploy igual?',
103
+ initial: false,
104
+ });
105
+ if (!r.go)
106
+ return;
107
+ }
108
+ }
109
+ /* Persist a stub deploy state. */
110
+ await patchWorkflowGroup(projectRoot, 'deploy', {
111
+ done_at: new Date().toISOString(),
112
+ pipeline: 'TBD: choose GitHub Actions / Vercel / Netlify / AWS CDK',
113
+ url: 'TBD: production URL once first deploy lands',
114
+ smoke_at: 'TBD: post-deploy smoke timestamp',
115
+ });
116
+ console.log('');
117
+ console.log(c.success('Deploy guidance armado. State persistida en workflow.deploy.'));
118
+ console.log('');
119
+ console.log(c.dim('Pasos siguientes (manuales por ahora; follow-up commit los automatiza):'));
120
+ console.log(' 1. ' + c.code('yf publish --npm') + c.dim(' (si shippeas como npm package)'));
121
+ console.log(' 2. ' + c.code('yf publish --docker') + c.dim(' (si shippeas como container)'));
122
+ console.log(' 3. ' + c.code('yf deploy --aws') + c.dim(' (si va a AWS ECS / Fargate)'));
123
+ console.log(' 4. Smoke check los e2e contra el URL de prod.');
124
+ console.log(' 5. ' + c.code('yf operate manual-generate') + c.dim(' (generar manual para los usuarios)'));
125
+ }
126
+ /* =========================================================================
127
+ * step 17 -- yf operate manual-generate
128
+ * ========================================================================= */
129
+ async function runManualGenerate(opts) {
130
+ header('Yujin Forge -- manual generate');
131
+ console.log('');
132
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
133
+ const wf = await readWorkflow(projectRoot);
134
+ /* Read clarification + design to know what features are
135
+ * being manualised. */
136
+ const blocks = wf.clarification?.blocks?.blocks ?? [];
137
+ if (blocks.length === 0) {
138
+ console.log(c.error('No hay bloques en workflow.clarification.blocks.'));
139
+ console.log(c.dim('Corre primero: ') + c.code('yf clarify blocks'));
140
+ process.exitCode = 1;
141
+ return;
142
+ }
143
+ /* Determine locales from step 8 (operational NFR). Fallback es. */
144
+ const opSummary = wf.clarification?.nfr_operational?.summary ?? '';
145
+ const localesMatch = opSummary.match(/(\d+) locales/);
146
+ const localesCount = localesMatch ? parseInt(localesMatch[1] ?? '1', 10) : 1;
147
+ /* Without the structured doc, default to es + en. */
148
+ const locales = localesCount > 1 ? ['es', 'en'] : ['es'];
149
+ const dir = path.join(projectRoot, 'docs', 'manual');
150
+ await fs.mkdir(dir, { recursive: true });
151
+ const stamp = new Date().toISOString();
152
+ let wrote = 0;
153
+ for (const lang of locales) {
154
+ const fp = path.join(dir, 'manual.' + lang + '.md');
155
+ /* Skip if already exists -- the user may have edited it.
156
+ * Use --yes to overwrite. */
157
+ let exists = false;
158
+ try {
159
+ await fs.access(fp);
160
+ exists = true;
161
+ }
162
+ catch { /* ok */ }
163
+ if (exists && !opts.yes)
164
+ continue;
165
+ const blocksList = blocks
166
+ .map((b) => '- **' + b.name + '** (' + b.id + '): ' + (b.mvp ? 'MVP' : 'optional'))
167
+ .join('\n');
168
+ const body = [
169
+ '# Manual de usuario (' + lang + ')',
170
+ '',
171
+ '*Generado por `yf operate manual-generate` el ' + stamp + '.*',
172
+ '',
173
+ '## Que hace esta app',
174
+ '',
175
+ (wf.clarification?.functional?.summary ?? 'TBD: completar desde workflow.clarification.functional.'),
176
+ '',
177
+ '## Funcionalidades',
178
+ '',
179
+ blocksList,
180
+ '',
181
+ '## Como empezar',
182
+ '',
183
+ 'TBD: completar el quick-start una vez que la primera version este live.',
184
+ '',
185
+ '## Soporte',
186
+ '',
187
+ 'Si algo no funciona, escribi a soporte@<tu-dominio>.',
188
+ '',
189
+ ].join('\n');
190
+ await fs.writeFile(fp, body, 'utf-8');
191
+ wrote++;
192
+ }
193
+ await patchWorkflowGroup(projectRoot, 'postlaunch', {
194
+ manual_at: stamp,
195
+ dashboards_at: wf.postlaunch?.dashboards_at ?? '',
196
+ feedback_channel: wf.postlaunch?.feedback_channel ?? '',
197
+ });
198
+ console.log(c.success('Manual generado en ' + locales.length + ' locale(s).'));
199
+ console.log(c.dim(' Wrote: ' + wrote + ' (skipped existing without --yes).'));
200
+ console.log(c.dim(' Dir: ') + path.relative(projectRoot, dir));
201
+ }
202
+ /* =========================================================================
203
+ * step 17 cont. -- yf operate metrics
204
+ * ========================================================================= */
205
+ async function runMetrics(opts) {
206
+ header('Yujin Forge -- metrics setup');
207
+ console.log('');
208
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
209
+ const wf = await readWorkflow(projectRoot);
210
+ const opSummary = wf.clarification?.nfr_operational?.summary ?? '';
211
+ /* Stub markdown describing what to set up. The actual dashboards
212
+ * config (Grafana JSON / Datadog dashboards / Sentry alerts) is
213
+ * out of scope here but the user gets a checklist. */
214
+ const stamp = new Date().toISOString();
215
+ const checklist = [
216
+ '# Observability dashboards setup',
217
+ '',
218
+ '*Generado el ' + stamp + ' a partir de workflow.clarification.nfr_operational.*',
219
+ '',
220
+ '## A configurar manualmente:',
221
+ '',
222
+ '- Error rate dashboard (Sentry o Datadog) con alerta > umbral.',
223
+ '- Latency p95 dashboard con alerta cuando supera 1s sostenido.',
224
+ '- Cost-per-day tracker (tokens LLM + hosting + APIs).',
225
+ '- Free-tier limit watchdog.',
226
+ '- Custom KPI: ' + (wf.clarification?.functional?.summary ?? 'TBD'),
227
+ '',
228
+ '## Settings extraidas de la operacional clarification',
229
+ '',
230
+ opSummary || '_(workflow.clarification.nfr_operational vacio)_',
231
+ '',
232
+ ].join('\n');
233
+ const fp = path.join(projectRoot, 'docs', 'observability.md');
234
+ await fs.mkdir(path.dirname(fp), { recursive: true });
235
+ await fs.writeFile(fp, checklist, 'utf-8');
236
+ await patchWorkflowGroup(projectRoot, 'postlaunch', {
237
+ manual_at: wf.postlaunch?.manual_at ?? '',
238
+ dashboards_at: stamp,
239
+ feedback_channel: wf.postlaunch?.feedback_channel ?? 'TBD',
240
+ });
241
+ console.log(c.success('Observability checklist en ') + c.brand('docs/observability.md'));
242
+ }
243
+ async function runIterate(typeArg, opts) {
244
+ header('Yujin Forge -- iterate');
245
+ console.log('');
246
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
247
+ const validTypes = ['bug', 'feature_small', 'feature_large', 'nfr_change', 'pivot'];
248
+ if (!validTypes.includes(typeArg)) {
249
+ console.log(c.error('Tipo invalido: "' + typeArg + '". Valid: ' + validTypes.join(', ')));
250
+ process.exitCode = 1;
251
+ return;
252
+ }
253
+ let summary = opts.summary;
254
+ if (!summary) {
255
+ const r = await prompts({
256
+ type: 'text',
257
+ name: 'summary',
258
+ message: 'Resumen del pedido (1-2 frases):',
259
+ });
260
+ summary = r.summary;
261
+ }
262
+ if (!summary || summary.trim() === '') {
263
+ console.log(c.warn('Cancelado (sin resumen).'));
264
+ return;
265
+ }
266
+ const entry = {
267
+ at: new Date().toISOString(),
268
+ type: typeArg,
269
+ summary,
270
+ };
271
+ await appendIteration(projectRoot, entry);
272
+ /* Route based on type per PRODUCT_WORKFLOW step 18. */
273
+ console.log(c.success('Iteration anotada. Routing recomendado:'));
274
+ switch (typeArg) {
275
+ case 'bug':
276
+ console.log(c.dim(' -> ') + c.code('yf block start <id>')
277
+ + c.dim(' (block afectado; mantener tests verdes)'));
278
+ break;
279
+ case 'feature_small':
280
+ console.log(c.dim(' -> ') + c.code('yf spec design --yes')
281
+ + c.dim(' (actualizar design del block afectado)'));
282
+ break;
283
+ case 'feature_large':
284
+ console.log(c.dim(' -> ') + c.code('yf spec arch --yes')
285
+ + c.dim(' (re-evaluar architecture)'));
286
+ break;
287
+ case 'nfr_change':
288
+ console.log(c.dim(' -> ') + c.code('yf clarify <round>')
289
+ + c.dim(' donde corresponda + ') + c.code('yf spec arch --yes'));
290
+ break;
291
+ case 'pivot':
292
+ console.log(c.dim(' -> ') + c.code('yf clarify functional')
293
+ + c.dim(' (vuelta entera al PRD)'));
294
+ break;
295
+ }
296
+ }
297
+ /* =========================================================================
298
+ * cross-cutting 8.2 -- yf operate costs
299
+ * ========================================================================= */
300
+ async function runCosts(opts) {
301
+ header('Yujin Forge -- project costs');
302
+ console.log('');
303
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
304
+ const wf = await readWorkflow(projectRoot);
305
+ console.log(c.dim('Tier: ') + c.brand(wf.tier ?? 'unknown'));
306
+ console.log(c.dim('Bloques en MVP: ') + c.brand(String(wf.clarification?.blocks?.mvp_path?.length ?? 0)));
307
+ console.log(c.dim('Bloques green: ')
308
+ + c.brand(String((wf.blocks_progress ?? []).filter((b) => b.status === 'green').length)));
309
+ console.log('');
310
+ /* Real cost report from ~/.yujin-forge/usage.jsonl. */
311
+ const { computeCosts, formatCosts } = await import('../telemetry/usage.js');
312
+ const days = typeof opts.sinceDays === 'number' && opts.sinceDays >= 0
313
+ ? opts.sinceDays : 30;
314
+ const breakdown = await computeCosts(days);
315
+ if (breakdown.events_total === 0) {
316
+ console.log(c.dim('Sin eventos de uso registrados todavia.'));
317
+ console.log(c.dim('El tracker registra cada llamada a Claude desde alpha.18+.'));
318
+ return;
319
+ }
320
+ for (const line of formatCosts(breakdown)) {
321
+ console.log(line);
322
+ }
323
+ console.log('');
324
+ console.log(c.dim('Override pricing: ~/.yujin-forge/pricing.json (formato en docs/operations/costs.md)'));
325
+ console.log(c.dim('Ver mas dias: ') + c.code('yf operate costs --since-days 90'));
326
+ console.log(c.dim('All-time: ') + c.code('yf operate costs --since-days 0'));
327
+ }
328
+ /* =========================================================================
329
+ * cross-cutting 8.5 -- yf operate handoff
330
+ * ========================================================================= */
331
+ async function runHandoff(opts) {
332
+ header('Yujin Forge -- handoff package');
333
+ console.log('');
334
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
335
+ const wf = await readWorkflow(projectRoot);
336
+ const stamp = new Date().toISOString();
337
+ const fp = path.join(projectRoot, 'docs', 'HANDOFF.md');
338
+ await fs.mkdir(path.dirname(fp), { recursive: true });
339
+ const body = [
340
+ '# Handoff package',
341
+ '',
342
+ '*Generado por `yf operate handoff` el ' + stamp + '.*',
343
+ '*Tier: ' + (wf.tier ?? 'unknown') + '*',
344
+ '',
345
+ '## Que es esta app',
346
+ '',
347
+ (wf.clarification?.functional?.summary ?? 'TBD'),
348
+ '',
349
+ '## Decisiones de arquitectura clave',
350
+ '',
351
+ '- Persistencia + middleware: ver ' + (wf.clarification?.nfr_structural?.doc_path ?? 'docs/clarification/06_structural.md'),
352
+ '- Compliance + retencion: ver ' + (wf.clarification?.nfr_governance?.doc_path ?? 'docs/clarification/07_governance.md'),
353
+ '- Observability + costos: ver ' + (wf.clarification?.nfr_operational?.doc_path ?? 'docs/clarification/08_operational.md'),
354
+ '',
355
+ '## Credenciales activas',
356
+ '',
357
+ 'Inventory en workflow.vault_inventory:',
358
+ '',
359
+ ...Object.entries(wf.vault_inventory?.families ?? {})
360
+ .map(([fam, st]) => '- **' + fam + '**: ' + st),
361
+ '',
362
+ '## CI gates',
363
+ '',
364
+ '- Lint, typecheck, npm test, NAC-3 structural coverage 100%.',
365
+ '- Ver ' + '`.github/workflows/ci.yml`.',
366
+ '',
367
+ '## Como rotar credenciales sin downtime',
368
+ '',
369
+ 'Ver SQ Sec 8.5 (TBD: extender este section per credential family).',
370
+ '',
371
+ '## Como hacer un rollback manual',
372
+ '',
373
+ 'Ver runbook en deploy provider dashboard.',
374
+ '',
375
+ '## Bloques + estado actual',
376
+ '',
377
+ ...((wf.clarification?.blocks?.blocks ?? []).map((b) => {
378
+ const pp = (wf.blocks_progress ?? []).find((x) => x.block_id === b.id);
379
+ return '- **' + b.name + '** (' + b.id + '): ' + (pp?.status ?? 'pending');
380
+ })),
381
+ '',
382
+ ].join('\n');
383
+ await fs.writeFile(fp, body, 'utf-8');
384
+ console.log(c.success('Handoff package en ') + c.brand('docs/HANDOFF.md'));
385
+ console.log(c.dim('Editalo a mano para agregar runbooks especificos antes de transferir.'));
386
+ }
387
+ /* =========================================================================
388
+ * cross-cutting 8.6 -- yf operate backup-setup + restore-drill
389
+ * ========================================================================= */
390
+ async function runBackupSetup(_opts) {
391
+ header('Yujin Forge -- backup setup');
392
+ console.log('');
393
+ console.log(c.warn('Backup automation NOT YET implemented as a managed flow.'));
394
+ console.log(c.dim('Pasos manuales por ahora:'));
395
+ console.log(' 1. En tu DB provider (RDS / PlanetScale / Mongo Atlas / Supabase):');
396
+ console.log(' habilitar daily backups + retention >= 30 days + cross-region.');
397
+ console.log(' 2. En tu object storage (S3 / R2): versionado + lifecycle policy.');
398
+ console.log(' 3. Anotar RTO / RPO en docs/HANDOFF.md.');
399
+ console.log(' 4. Calendarizar restore drill semanal con ') + c.code('yf operate restore-drill');
400
+ console.log('');
401
+ console.log(c.dim('Follow-up commit automatiza esto contra los providers mas comunes.'));
402
+ }
403
+ async function runRestoreDrill(_opts) {
404
+ header('Yujin Forge -- restore drill');
405
+ console.log('');
406
+ console.log(c.warn('Restore drill NOT YET automated.'));
407
+ console.log(c.dim('Pasos manuales recomendados:'));
408
+ console.log(' 1. Restaurar la BD a un environment paralelo.');
409
+ console.log(' 2. Correr la suite e2e contra ese environment.');
410
+ console.log(' 3. Medir tiempo total (RTO) + perdida de datos (RPO).');
411
+ console.log(' 4. Anotar resultado en docs/HANDOFF.md seccion DR.');
412
+ console.log('');
413
+ console.log(c.dim('Follow-up commit lo automatiza.'));
414
+ }
415
+ /* =========================================================================
416
+ * Dispatcher
417
+ * ========================================================================= */
418
+ export function registerOperateCommand(program) {
419
+ const operate = program.command('operate')
420
+ .description('Phase VI + cross-cutting operations (deploy / manual / metrics / iterate / costs / handoff / backup).');
421
+ operate.command('deploy-guided')
422
+ .description('Phase VI step 16: guided deploy with credential + smoke gates (tier-aware adapter picker).')
423
+ .option('--cwd <path>', 'project root')
424
+ .option('--yes', 'continue even with unknown credential families')
425
+ .option('--adapter <id>', 'force a specific deploy adapter (cloudflare | aws | vercel). Default: tier-aware pick.')
426
+ .action(async (opts) => {
427
+ try {
428
+ await runDeployGuided(opts);
429
+ }
430
+ catch (err) {
431
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
432
+ process.exitCode = 1;
433
+ }
434
+ });
435
+ operate.command('manual-generate')
436
+ .description('Phase VI step 17: generate user manual per locale.')
437
+ .option('--cwd <path>', 'project root')
438
+ .option('--yes', 'overwrite existing manuals')
439
+ .action(async (opts) => {
440
+ try {
441
+ await runManualGenerate(opts);
442
+ }
443
+ catch (err) {
444
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
445
+ process.exitCode = 1;
446
+ }
447
+ });
448
+ operate.command('metrics')
449
+ .description('Phase VI step 17: emit observability dashboards setup checklist.')
450
+ .option('--cwd <path>', 'project root')
451
+ .action(async (opts) => {
452
+ try {
453
+ await runMetrics(opts);
454
+ }
455
+ catch (err) {
456
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
457
+ process.exitCode = 1;
458
+ }
459
+ });
460
+ operate.command('iterate <type>')
461
+ .description('Phase VI step 18: classify + route a new requirement (bug / feature_small / feature_large / nfr_change / pivot).')
462
+ .option('--cwd <path>', 'project root')
463
+ .option('--summary <text>', 'one-line summary; opens prompt if omitted')
464
+ .action(async (type, opts) => {
465
+ try {
466
+ await runIterate(type, opts);
467
+ }
468
+ catch (err) {
469
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
470
+ process.exitCode = 1;
471
+ }
472
+ });
473
+ operate.command('costs')
474
+ .description('Cross-cutting 8.2: project cost tracking (Claude tokens + voice minutes).')
475
+ .option('--cwd <path>', 'project root')
476
+ .option('--since-days <n>', 'window in days (0 = all-time, default 30)', (v) => parseInt(v, 10), 30)
477
+ .action(async (opts) => {
478
+ try {
479
+ await runCosts(opts);
480
+ }
481
+ catch (err) {
482
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
483
+ process.exitCode = 1;
484
+ }
485
+ });
486
+ operate.command('handoff')
487
+ .description('Cross-cutting 8.5: write docs/HANDOFF.md package.')
488
+ .option('--cwd <path>', 'project root')
489
+ .action(async (opts) => {
490
+ try {
491
+ await runHandoff(opts);
492
+ }
493
+ catch (err) {
494
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
495
+ process.exitCode = 1;
496
+ }
497
+ });
498
+ operate.command('backup-setup')
499
+ .description('Cross-cutting 8.6: backup automation (manual checklist for now).')
500
+ .option('--cwd <path>', 'project root')
501
+ .action(async (opts) => {
502
+ try {
503
+ await runBackupSetup(opts);
504
+ }
505
+ catch (err) {
506
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
507
+ process.exitCode = 1;
508
+ }
509
+ });
510
+ operate.command('restore-drill')
511
+ .description('Cross-cutting 8.6: DR restore drill (manual checklist for now).')
512
+ .option('--cwd <path>', 'project root')
513
+ .action(async (opts) => {
514
+ try {
515
+ await runRestoreDrill(opts);
516
+ }
517
+ catch (err) {
518
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
519
+ process.exitCode = 1;
520
+ }
521
+ });
522
+ }
523
+ //# sourceMappingURL=operate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operate.js","sourceRoot":"","sources":["../../src/commands/operate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `yf spec rfp|arch|design` -- Phase III of PRODUCT_WORKFLOW.md
3
+ * (steps 10, 11, 12).
4
+ *
5
+ * Generates the three foundational documents that Phase IV gates
6
+ * on:
7
+ *
8
+ * yf spec rfp step 10 -- consolidated RFP / PRD
9
+ * yf spec arch step 11 -- technological architecture
10
+ * yf spec design step 12 -- solution design (per block)
11
+ *
12
+ * Each command:
13
+ * 1. Verifies Phase II is complete (functional + 4 NFR rounds +
14
+ * blocks). For RFP, all 6 are required. For arch + design,
15
+ * RFP must be done too.
16
+ * 2. Reads the markdown clarification docs from
17
+ * docs/clarification/0X_<round>.md.
18
+ * 3. Calls Claude with the document-specific generation prompt.
19
+ * 4. Writes the result to docs/project_<doc>.md.
20
+ * 5. Persists workflow.specs.<doc> with version, doc_path,
21
+ * sha256.
22
+ *
23
+ * Per HITO_4_STRATEGIC_ASSETS.md sec 1, the Tier-1 strategic
24
+ * prompts for these flows are eventually moving server-side to
25
+ * prompts.yujin.app. Today they live client-side as a stub --
26
+ * the system prompt is generic; a follow-up commit replaces it
27
+ * with the curated server-side endpoint when the Yujin server
28
+ * exposes them.
29
+ *
30
+ * ASCII-only.
31
+ */
32
+ import type { Command } from 'commander';
33
+ export interface SpecOptions {
34
+ cwd?: string;
35
+ yes?: boolean;
36
+ }
37
+ export declare function registerSpecCommand(program: Command): void;
38
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AA2ND,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkB1D"}