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

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 (162) 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 +692 -17
  10. package/dist/chat/panel.js.map +1 -1
  11. package/dist/chat/server.js +630 -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/lifecycle.js +3 -3
  23. package/dist/chat/tools/manual.js +1 -1
  24. package/dist/chat/tools/reader.js +8 -8
  25. package/dist/chat/tools/workflow.d.ts +45 -0
  26. package/dist/chat/tools/workflow.d.ts.map +1 -0
  27. package/dist/chat/tools/workflow.js +404 -0
  28. package/dist/chat/tools/workflow.js.map +1 -0
  29. package/dist/chat/tools.d.ts.map +1 -1
  30. package/dist/chat/tools.js +23 -4
  31. package/dist/chat/tools.js.map +1 -1
  32. package/dist/commands/approve.d.ts +32 -0
  33. package/dist/commands/approve.d.ts.map +1 -0
  34. package/dist/commands/approve.js +198 -0
  35. package/dist/commands/approve.js.map +1 -0
  36. package/dist/commands/block.d.ts +28 -0
  37. package/dist/commands/block.d.ts.map +1 -0
  38. package/dist/commands/block.js +189 -0
  39. package/dist/commands/block.js.map +1 -0
  40. package/dist/commands/bootstrap.d.ts +35 -0
  41. package/dist/commands/bootstrap.d.ts.map +1 -0
  42. package/dist/commands/bootstrap.js +205 -0
  43. package/dist/commands/bootstrap.js.map +1 -0
  44. package/dist/commands/chat.d.ts +3 -0
  45. package/dist/commands/chat.d.ts.map +1 -1
  46. package/dist/commands/chat.js +46 -1
  47. package/dist/commands/chat.js.map +1 -1
  48. package/dist/commands/clarify.d.ts +30 -0
  49. package/dist/commands/clarify.d.ts.map +1 -0
  50. package/dist/commands/clarify.js +671 -0
  51. package/dist/commands/clarify.js.map +1 -0
  52. package/dist/commands/discover.d.ts +30 -0
  53. package/dist/commands/discover.d.ts.map +1 -0
  54. package/dist/commands/discover.js +178 -0
  55. package/dist/commands/discover.js.map +1 -0
  56. package/dist/commands/doctor.js +94 -42
  57. package/dist/commands/doctor.js.map +1 -1
  58. package/dist/commands/keys_setup.d.ts +53 -0
  59. package/dist/commands/keys_setup.d.ts.map +1 -0
  60. package/dist/commands/keys_setup.js +487 -0
  61. package/dist/commands/keys_setup.js.map +1 -0
  62. package/dist/commands/legacy-audit.d.ts +34 -0
  63. package/dist/commands/legacy-audit.d.ts.map +1 -0
  64. package/dist/commands/legacy-audit.js +270 -0
  65. package/dist/commands/legacy-audit.js.map +1 -0
  66. package/dist/commands/license.d.ts.map +1 -1
  67. package/dist/commands/license.js +41 -0
  68. package/dist/commands/license.js.map +1 -1
  69. package/dist/commands/operate.d.ts +22 -0
  70. package/dist/commands/operate.d.ts.map +1 -0
  71. package/dist/commands/operate.js +523 -0
  72. package/dist/commands/operate.js.map +1 -0
  73. package/dist/commands/spec.d.ts +38 -0
  74. package/dist/commands/spec.d.ts.map +1 -0
  75. package/dist/commands/spec.js +256 -0
  76. package/dist/commands/spec.js.map +1 -0
  77. package/dist/commands/support.d.ts +22 -0
  78. package/dist/commands/support.d.ts.map +1 -0
  79. package/dist/commands/support.js +143 -0
  80. package/dist/commands/support.js.map +1 -0
  81. package/dist/commands/triage.d.ts +34 -0
  82. package/dist/commands/triage.d.ts.map +1 -0
  83. package/dist/commands/triage.js +228 -0
  84. package/dist/commands/triage.js.map +1 -0
  85. package/dist/commands/vault-inventory.d.ts +30 -0
  86. package/dist/commands/vault-inventory.d.ts.map +1 -0
  87. package/dist/commands/vault-inventory.js +214 -0
  88. package/dist/commands/vault-inventory.js.map +1 -0
  89. package/dist/commands/vault.d.ts.map +1 -1
  90. package/dist/commands/vault.js +5 -0
  91. package/dist/commands/vault.js.map +1 -1
  92. package/dist/commands/voice.js +1 -1
  93. package/dist/commands/voice.js.map +1 -1
  94. package/dist/commands/workflow-coverage.d.ts +30 -0
  95. package/dist/commands/workflow-coverage.d.ts.map +1 -0
  96. package/dist/commands/workflow-coverage.js +138 -0
  97. package/dist/commands/workflow-coverage.js.map +1 -0
  98. package/dist/core/keys_envelope.d.ts +13 -0
  99. package/dist/core/keys_envelope.d.ts.map +1 -1
  100. package/dist/core/keys_envelope.js.map +1 -1
  101. package/dist/deploy/adapter.d.ts +93 -0
  102. package/dist/deploy/adapter.d.ts.map +1 -0
  103. package/dist/deploy/adapter.js +42 -0
  104. package/dist/deploy/adapter.js.map +1 -0
  105. package/dist/deploy/aws_adapter.d.ts +28 -0
  106. package/dist/deploy/aws_adapter.d.ts.map +1 -0
  107. package/dist/deploy/aws_adapter.js +98 -0
  108. package/dist/deploy/aws_adapter.js.map +1 -0
  109. package/dist/deploy/cloudflare.d.ts +24 -0
  110. package/dist/deploy/cloudflare.d.ts.map +1 -0
  111. package/dist/deploy/cloudflare.js +169 -0
  112. package/dist/deploy/cloudflare.js.map +1 -0
  113. package/dist/license/hito4_client.d.ts +17 -1
  114. package/dist/license/hito4_client.d.ts.map +1 -1
  115. package/dist/license/hito4_client.js +71 -10
  116. package/dist/license/hito4_client.js.map +1 -1
  117. package/dist/license/index.d.ts.map +1 -1
  118. package/dist/license/index.js +7 -0
  119. package/dist/license/index.js.map +1 -1
  120. package/dist/license/sync.d.ts +54 -0
  121. package/dist/license/sync.d.ts.map +1 -0
  122. package/dist/license/sync.js +131 -0
  123. package/dist/license/sync.js.map +1 -0
  124. package/dist/support/reports.d.ts +31 -0
  125. package/dist/support/reports.d.ts.map +1 -0
  126. package/dist/support/reports.js +162 -0
  127. package/dist/support/reports.js.map +1 -0
  128. package/dist/telemetry/usage.d.ts +67 -0
  129. package/dist/telemetry/usage.d.ts.map +1 -0
  130. package/dist/telemetry/usage.js +208 -0
  131. package/dist/telemetry/usage.js.map +1 -0
  132. package/dist/version.d.ts +1 -1
  133. package/dist/version.d.ts.map +1 -1
  134. package/dist/version.js +1 -1
  135. package/dist/version.js.map +1 -1
  136. package/dist/voice/intents.d.ts +1 -1
  137. package/dist/voice/intents.js +0 -0
  138. package/dist/voice/providers/google.d.ts +9 -0
  139. package/dist/voice/providers/google.d.ts.map +1 -1
  140. package/dist/voice/providers/google.js +204 -28
  141. package/dist/voice/providers/google.js.map +1 -1
  142. package/dist/voice/router.d.ts +10 -0
  143. package/dist/voice/router.d.ts.map +1 -1
  144. package/dist/voice/router.js +39 -20
  145. package/dist/voice/router.js.map +1 -1
  146. package/dist/voice/types.d.ts +5 -2
  147. package/dist/voice/types.d.ts.map +1 -1
  148. package/dist/voice/types.js.map +1 -1
  149. package/dist/workflow/state.d.ts +190 -0
  150. package/dist/workflow/state.d.ts.map +1 -0
  151. package/dist/workflow/state.js +119 -0
  152. package/dist/workflow/state.js.map +1 -0
  153. package/package.json +13 -15
  154. package/templates/nextjs-app/README.md +48 -0
  155. package/templates/nextjs-app/next.config.js +8 -0
  156. package/templates/nextjs-app/package.json +33 -0
  157. package/templates/nextjs-app/src/app/globals.css +43 -0
  158. package/templates/nextjs-app/src/app/layout.tsx +29 -0
  159. package/templates/nextjs-app/src/app/page.tsx +63 -0
  160. package/templates/nextjs-app/src/nac/manifest.ts +36 -0
  161. package/templates/nextjs-app/tsconfig.json +21 -0
  162. package/templates/nextjs-app/yujin.forge.json +11 -0
@@ -0,0 +1,198 @@
1
+ /**
2
+ * `yf approve <doc...>` -- Phase IV step 13 of PRODUCT_WORKFLOW.md.
3
+ *
4
+ * The unbreakable gate. Forge refuses to proceed to Phase V
5
+ * (build) until the user has explicitly approved the 3 spec
6
+ * documents (RFP + arch + design) by their current sha256.
7
+ *
8
+ * Usage:
9
+ * yf approve rfp approve one doc
10
+ * yf approve rfp arch design approve all three (batch)
11
+ * yf approve --list show approval state
12
+ * yf approve --revoke <doc> revoke an approval
13
+ *
14
+ * Approval persists workflow.approvals.<doc> = {
15
+ * approved_at: ISO,
16
+ * version_sha256: sha of the spec file at approval time
17
+ * }
18
+ *
19
+ * If the doc file changes after approval, Forge detects the sha
20
+ * mismatch + treats the approval as stale -- user must re-approve.
21
+ *
22
+ * ASCII-only.
23
+ */
24
+ import path from 'node:path';
25
+ import { promises as fs } from 'node:fs';
26
+ import { createHash } from 'node:crypto';
27
+ import prompts from 'prompts';
28
+ import { c, header } from '../ui/colors.js';
29
+ import { readWorkflow, patchWorkflowGroup, } from '../workflow/state.js';
30
+ const ALL_DOCS = ['rfp', 'arch', 'design'];
31
+ function sha256(text) {
32
+ return createHash('sha256').update(text, 'utf-8').digest('hex');
33
+ }
34
+ async function listState(projectRoot) {
35
+ const wf = await readWorkflow(projectRoot);
36
+ console.log(c.brand('Approval state:'));
37
+ console.log('');
38
+ for (const k of ALL_DOCS) {
39
+ const spec = wf.specs?.[k];
40
+ const apr = wf.approvals?.[k];
41
+ if (!spec) {
42
+ console.log(' ' + c.dim(k.padEnd(8)) + c.warn(' -- spec not generated yet'));
43
+ continue;
44
+ }
45
+ if (!apr) {
46
+ console.log(' ' + c.brand(k.padEnd(8)) + c.warn(' -- NOT approved (' + spec.doc_path + ', v' + spec.version + ')'));
47
+ continue;
48
+ }
49
+ const stale = apr.version_sha256 !== spec.sha256;
50
+ if (stale) {
51
+ console.log(' ' + c.brand(k.padEnd(8)) + c.warn(' -- STALE (approved sha != current sha, re-approval needed)'));
52
+ }
53
+ else {
54
+ console.log(' ' + c.brand(k.padEnd(8)) + c.success(' -- approved at ' + apr.approved_at));
55
+ }
56
+ }
57
+ console.log('');
58
+ }
59
+ async function approveOne(projectRoot, kind) {
60
+ const wf = await readWorkflow(projectRoot);
61
+ const spec = wf.specs?.[kind];
62
+ if (!spec) {
63
+ console.log(c.error('Spec "' + kind + '" no generado todavia. Corre primero ') + c.code('yf spec ' + kind));
64
+ return false;
65
+ }
66
+ /* Re-read the file to ensure the current sha matches what was
67
+ * stored when the spec ran. If the user edited the file by hand
68
+ * between spec generation and approve, we want them to know. */
69
+ const abs = path.join(projectRoot, spec.doc_path);
70
+ let body;
71
+ try {
72
+ body = await fs.readFile(abs, 'utf-8');
73
+ }
74
+ catch (err) {
75
+ console.log(c.error('No se pudo leer ' + spec.doc_path + ': ' + String(err instanceof Error ? err.message : err)));
76
+ return false;
77
+ }
78
+ const currentSha = sha256(body);
79
+ if (currentSha !== spec.sha256) {
80
+ console.log(c.warn(' ' + kind + ': el archivo cambio desde la generacion.'));
81
+ console.log(c.dim(' Stored sha: ' + spec.sha256.slice(0, 16) + '...'));
82
+ console.log(c.dim(' Current sha: ' + currentSha.slice(0, 16) + '...'));
83
+ const confirm = await prompts({
84
+ type: 'select',
85
+ name: 'choice',
86
+ message: ' Aprobar la version CURRENT (con tus ediciones)?',
87
+ choices: [
88
+ { title: 'Si, aprobar version actual', value: 'yes' },
89
+ { title: 'No, re-generar antes de aprobar', value: 'regenerate' },
90
+ { title: 'Cancelar', value: 'cancel' },
91
+ ],
92
+ });
93
+ if (confirm.choice !== 'yes') {
94
+ if (confirm.choice === 'regenerate') {
95
+ console.log(c.dim(' Corre: ') + c.code('yf spec ' + kind + ' --yes'));
96
+ }
97
+ return false;
98
+ }
99
+ /* Update workflow.specs.<kind>.sha256 to match. */
100
+ await patchWorkflowGroup(projectRoot, 'specs', {
101
+ [kind]: { ...spec, sha256: currentSha, done_at: new Date().toISOString() },
102
+ });
103
+ }
104
+ await patchWorkflowGroup(projectRoot, 'approvals', {
105
+ [kind]: {
106
+ approved_at: new Date().toISOString(),
107
+ version_sha256: currentSha,
108
+ },
109
+ });
110
+ console.log(c.success(' Aprobado: ') + c.brand(kind));
111
+ return true;
112
+ }
113
+ async function revokeOne(projectRoot, kind) {
114
+ const wf = await readWorkflow(projectRoot);
115
+ if (!wf.approvals?.[kind]) {
116
+ console.log(c.warn(kind + ' no estaba aprobado.'));
117
+ return;
118
+ }
119
+ /* Patch with explicit removal -- set to undefined. The
120
+ * patchWorkflowGroup helper preserves siblings; to remove we
121
+ * overwrite the whole approvals object. */
122
+ const next = { ...(wf.approvals ?? {}) };
123
+ delete next[kind];
124
+ await patchWorkflowGroup(projectRoot, 'approvals', next);
125
+ console.log(c.success('Revocado: ') + c.brand(kind));
126
+ }
127
+ export async function runApprove(targets, opts) {
128
+ header('Yujin Forge -- approve');
129
+ console.log('');
130
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
131
+ if (opts.list) {
132
+ await listState(projectRoot);
133
+ return;
134
+ }
135
+ if (opts.revoke) {
136
+ const r = opts.revoke;
137
+ if (!ALL_DOCS.includes(r)) {
138
+ console.log(c.error('Doc invalido: ' + r + '. Valid: ' + ALL_DOCS.join(', ')));
139
+ process.exitCode = 1;
140
+ return;
141
+ }
142
+ await revokeOne(projectRoot, r);
143
+ return;
144
+ }
145
+ if (targets.length === 0) {
146
+ console.log(c.error('Especifica que aprobar: ') + c.code('yf approve rfp arch design'));
147
+ console.log(c.dim('o solo uno: ') + c.code('yf approve rfp'));
148
+ console.log(c.dim('o lista: ') + c.code('yf approve --list'));
149
+ process.exitCode = 1;
150
+ return;
151
+ }
152
+ let allOk = true;
153
+ for (const t of targets) {
154
+ if (!ALL_DOCS.includes(t)) {
155
+ console.log(c.error('Doc invalido: ' + t + '. Valid: ' + ALL_DOCS.join(', ')));
156
+ allOk = false;
157
+ continue;
158
+ }
159
+ const ok = await approveOne(projectRoot, t);
160
+ if (!ok)
161
+ allOk = false;
162
+ }
163
+ console.log('');
164
+ /* Re-check the entire 3-doc set for status. */
165
+ const wf = await readWorkflow(projectRoot);
166
+ const fullApproved = ALL_DOCS.every((k) => {
167
+ const sp = wf.specs?.[k];
168
+ const ap = wf.approvals?.[k];
169
+ return sp && ap && ap.version_sha256 === sp.sha256;
170
+ });
171
+ if (fullApproved) {
172
+ console.log(c.success('Phase IV gate: PASSED. Los 3 docs estan aprobados + sha-locked.'));
173
+ console.log(c.dim('Siguiente paso: ') + c.code('yf bootstrap'));
174
+ }
175
+ else {
176
+ if (allOk) {
177
+ console.log(c.warn('Approbations parciales. Para destrabar Phase V hacen falta los 3 docs aprobados.'));
178
+ console.log(c.dim('Estado: ') + c.code('yf approve --list'));
179
+ }
180
+ }
181
+ }
182
+ export function registerApproveCommand(program) {
183
+ program.command('approve [docs...]')
184
+ .description('Phase IV step 13: explicit approval gate for RFP + arch + design.')
185
+ .option('--cwd <path>', 'project root (default: current directory)')
186
+ .option('--list', 'show approval state for the 3 docs')
187
+ .option('--revoke <doc>', 'revoke approval for a single doc')
188
+ .action(async (docs, opts) => {
189
+ try {
190
+ await runApprove(docs ?? [], opts);
191
+ }
192
+ catch (err) {
193
+ console.error(c.error(err instanceof Error ? err.message : String(err)));
194
+ process.exitCode = 1;
195
+ }
196
+ });
197
+ }
198
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,QAAQ,GAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAQtD,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,WAAmB;IAC1C,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAI,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;YAC9E,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;YACrH,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,KAAK,IAAI,CAAC,MAAM,CAAC;QACjD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;QACnH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,WAAmB,EAAE,IAAa;IAC1D,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,GAAG,uCAAuC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC;QAC5G,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;oEAEgE;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnH,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,0CAA0C,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;YAC5B,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,mDAAmD;YAC5D,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,4BAA4B,EAAO,KAAK,EAAE,KAAK,EAAS;gBACjE,EAAE,KAAK,EAAE,iCAAiC,EAAE,KAAK,EAAE,YAAY,EAAE;gBACjE,EAAE,KAAK,EAAE,UAAU,EAA0B,KAAK,EAAE,QAAQ,EAAM;aACnE;SACF,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,mDAAmD;QACnD,MAAM,kBAAkB,CAAC,WAAW,EAAE,OAAO,EAAE;YAC7C,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;SACrC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE;QACjD,CAAC,IAAI,CAAC,EAAE;YACN,WAAW,EAAK,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACxC,cAAc,EAAE,UAAU;SAC3B;KACoC,CAAC,CAAC;IAEzC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,WAAmB,EAAE,IAAa;IACzD,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IACD;;+CAE2C;IAC3C,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,MAAM,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,IAA0C,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAiB,EAAE,IAAoB;IACtE,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEtE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAAC,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACxD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAiB,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,GAAG,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAY,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,GAAG,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/E,KAAK,GAAG,KAAK,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAY,CAAC,CAAC;QACvD,IAAI,CAAC,EAAE;YAAE,KAAK,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,+CAA+C;IAC/C,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACxC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,cAAc,KAAK,EAAE,CAAC,MAAM,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC,CAAC;YACxG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;SACjC,WAAW,CAAC,mEAAmE,CAAC;SAChF,MAAM,CAAC,cAAc,EAAK,2CAA2C,CAAC;SACtE,MAAM,CAAC,QAAQ,EAAY,oCAAoC,CAAC;SAChE,MAAM,CAAC,gBAAgB,EAAI,kCAAkC,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,IAAc,EAAE,IAAoB,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `yf block <verb> <block_id>` -- Phase V step 15 of
3
+ * PRODUCT_WORKFLOW.md.
4
+ *
5
+ * Drives the iterative build cycle one block at a time. Each
6
+ * block runs through: pending -> in_progress -> green (tests
7
+ * verdes + green-gate) -> deployed.
8
+ *
9
+ * Verbs:
10
+ * yf block list show all blocks + status
11
+ * yf block start <id> mark block in_progress
12
+ * yf block green <id> mark block tests-green
13
+ * yf block deploy <id> mark block deployed
14
+ * yf block fail <id> mark block failed (for retry)
15
+ *
16
+ * Each transition writes to workflow.blocks_progress[*] and
17
+ * checks the dependency graph: a block can only enter
18
+ * in_progress when all its declared dependencies are
19
+ * "green" or "deployed".
20
+ *
21
+ * ASCII-only.
22
+ */
23
+ import type { Command } from 'commander';
24
+ export interface BlockOptions {
25
+ cwd?: string;
26
+ }
27
+ export declare function registerBlockCommand(program: Command): void;
28
+ //# sourceMappingURL=block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../src/commands/block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAoID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC3D"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * `yf block <verb> <block_id>` -- Phase V step 15 of
3
+ * PRODUCT_WORKFLOW.md.
4
+ *
5
+ * Drives the iterative build cycle one block at a time. Each
6
+ * block runs through: pending -> in_progress -> green (tests
7
+ * verdes + green-gate) -> deployed.
8
+ *
9
+ * Verbs:
10
+ * yf block list show all blocks + status
11
+ * yf block start <id> mark block in_progress
12
+ * yf block green <id> mark block tests-green
13
+ * yf block deploy <id> mark block deployed
14
+ * yf block fail <id> mark block failed (for retry)
15
+ *
16
+ * Each transition writes to workflow.blocks_progress[*] and
17
+ * checks the dependency graph: a block can only enter
18
+ * in_progress when all its declared dependencies are
19
+ * "green" or "deployed".
20
+ *
21
+ * ASCII-only.
22
+ */
23
+ import path from 'node:path';
24
+ import { c, header } from '../ui/colors.js';
25
+ import { readWorkflow, writeWorkflow, } from '../workflow/state.js';
26
+ const STATUS_SYMBOLS = {
27
+ pending: '[ ]',
28
+ in_progress: '[~]',
29
+ green: '[+]',
30
+ failed: '[!]',
31
+ };
32
+ async function listBlocks(projectRoot) {
33
+ const wf = await readWorkflow(projectRoot);
34
+ const blocks = wf.clarification?.blocks?.blocks ?? [];
35
+ const progress = wf.blocks_progress ?? [];
36
+ if (blocks.length === 0) {
37
+ console.log(c.warn('No hay bloques. Corre primero ') + c.code('yf clarify blocks'));
38
+ return;
39
+ }
40
+ console.log(c.brand('Bloques:'));
41
+ console.log('');
42
+ for (const b of blocks) {
43
+ const st = progress.find((p) => p.block_id === b.id)?.status ?? 'pending';
44
+ const symbol = STATUS_SYMBOLS[st];
45
+ const dep = b.dependencies.length > 0 ? ' deps: ' + b.dependencies.join(',') : '';
46
+ const mvp = b.mvp ? ' MVP' : '';
47
+ const eff = '(' + b.effort + ')';
48
+ console.log(' ' + c.dim(symbol) + ' ' + c.brand(b.id.padEnd(20)) + c.dim(b.name) + c.dim(' ' + eff) + c.dim(dep) + c.warn(mvp));
49
+ }
50
+ console.log('');
51
+ const summary = {
52
+ pending: progress.filter((p) => p.status === 'pending').length,
53
+ in_progress: progress.filter((p) => p.status === 'in_progress').length,
54
+ green: progress.filter((p) => p.status === 'green').length,
55
+ failed: progress.filter((p) => p.status === 'failed').length,
56
+ };
57
+ console.log(c.dim('Resumen: ')
58
+ + c.dim(`pending=${summary.pending} `)
59
+ + c.dim(`in_progress=${summary.in_progress} `)
60
+ + c.success(`green=${summary.green} `)
61
+ + c.error(`failed=${summary.failed}`));
62
+ }
63
+ async function patchProgress(projectRoot, blockId, patch) {
64
+ const wf = await readWorkflow(projectRoot);
65
+ const blocks = wf.clarification?.blocks?.blocks ?? [];
66
+ const targetBlock = blocks.find((b) => b.id === blockId);
67
+ if (!targetBlock) {
68
+ throw new Error('block id "' + blockId + '" not found in workflow.clarification.blocks');
69
+ }
70
+ const progress = [...(wf.blocks_progress ?? [])];
71
+ const idx = progress.findIndex((p) => p.block_id === blockId);
72
+ const next = {
73
+ block_id: blockId,
74
+ status: 'pending',
75
+ ...(idx >= 0 ? progress[idx] : {}),
76
+ ...patch,
77
+ };
78
+ if (idx >= 0)
79
+ progress[idx] = next;
80
+ else
81
+ progress.push(next);
82
+ await writeWorkflow(projectRoot, { blocks_progress: progress });
83
+ }
84
+ async function startBlock(projectRoot, blockId) {
85
+ const wf = await readWorkflow(projectRoot);
86
+ const blocks = wf.clarification?.blocks?.blocks ?? [];
87
+ const target = blocks.find((b) => b.id === blockId);
88
+ if (!target) {
89
+ console.log(c.error('block "' + blockId + '" no existe en workflow.clarification.blocks'));
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ /* Check dependencies. */
94
+ const progress = wf.blocks_progress ?? [];
95
+ for (const dep of target.dependencies) {
96
+ const depProgress = progress.find((p) => p.block_id === dep);
97
+ if (!depProgress || (depProgress.status !== 'green' && !depProgress.deployed_at)) {
98
+ console.log(c.error('Dependency "' + dep + '" no esta green todavia.'));
99
+ console.log(c.dim('Termina ' + dep + ' primero o corre `yf block list`.'));
100
+ process.exitCode = 1;
101
+ return;
102
+ }
103
+ }
104
+ await patchProgress(projectRoot, blockId, { status: 'in_progress' });
105
+ console.log(c.success('Block ') + c.brand(blockId) + c.success(' marcado in_progress.'));
106
+ console.log(c.dim('Ciclo de bloque: implement -> e2e tests con NAC-3 coverage 100%'));
107
+ console.log(c.dim(' -> a11y check -> green-gate -> `yf block green ' + blockId + '`'));
108
+ }
109
+ async function greenBlock(projectRoot, blockId) {
110
+ /* SQ Sec 14 requires that any block transitioning to green has:
111
+ * - lint + typecheck green
112
+ * - tests green
113
+ * - NAC-3 manifest coverage 100%
114
+ * - a11y check passed
115
+ * We do not run those here -- the user (or CI) just confirms.
116
+ * In a follow-up commit we hook this into `yf coverage structural`
117
+ * to refuse green if structural coverage < 100%. */
118
+ await patchProgress(projectRoot, blockId, {
119
+ status: 'green',
120
+ tests_green_at: new Date().toISOString(),
121
+ });
122
+ console.log(c.success('Block ') + c.brand(blockId) + c.success(' marcado green.'));
123
+ console.log(c.dim('Siguiente bloque: ') + c.code('yf block list'));
124
+ }
125
+ async function deployBlock(projectRoot, blockId) {
126
+ const wf = await readWorkflow(projectRoot);
127
+ const progress = wf.blocks_progress ?? [];
128
+ const current = progress.find((p) => p.block_id === blockId);
129
+ if (!current || current.status !== 'green') {
130
+ console.log(c.error('Block "' + blockId + '" debe estar green antes de deploy.'));
131
+ process.exitCode = 1;
132
+ return;
133
+ }
134
+ await patchProgress(projectRoot, blockId, { deployed_at: new Date().toISOString() });
135
+ console.log(c.success('Block ') + c.brand(blockId) + c.success(' marcado deployed.'));
136
+ }
137
+ async function failBlock(projectRoot, blockId) {
138
+ await patchProgress(projectRoot, blockId, { status: 'failed' });
139
+ console.log(c.warn('Block ') + c.brand(blockId) + c.warn(' marcado failed. Para reintentar: ')
140
+ + c.code('yf block start ' + blockId));
141
+ }
142
+ export function registerBlockCommand(program) {
143
+ const block = program.command('block')
144
+ .description('Phase V step 15: iterative block-by-block build cycle.');
145
+ block.command('list')
146
+ .description('Show all blocks + status.')
147
+ .option('--cwd <path>', 'project root')
148
+ .action(async (opts) => {
149
+ const root = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
150
+ try {
151
+ await listBlocks(root);
152
+ }
153
+ catch (err) {
154
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
155
+ process.exitCode = 1;
156
+ }
157
+ });
158
+ for (const verb of ['start', 'green', 'deploy', 'fail']) {
159
+ block.command(verb + ' <block_id>')
160
+ .description('Mark block as ' + verb + '.')
161
+ .option('--cwd <path>', 'project root')
162
+ .action(async (blockId, opts) => {
163
+ const root = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
164
+ header('Yujin Forge -- block ' + verb);
165
+ console.log('');
166
+ try {
167
+ switch (verb) {
168
+ case 'start':
169
+ await startBlock(root, blockId);
170
+ break;
171
+ case 'green':
172
+ await greenBlock(root, blockId);
173
+ break;
174
+ case 'deploy':
175
+ await deployBlock(root, blockId);
176
+ break;
177
+ case 'fail':
178
+ await failBlock(root, blockId);
179
+ break;
180
+ }
181
+ }
182
+ catch (err) {
183
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
184
+ process.exitCode = 1;
185
+ }
186
+ });
187
+ }
188
+ }
189
+ //# sourceMappingURL=block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/commands/block.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `yf bootstrap` -- Phase V step 14 of PRODUCT_WORKFLOW.md.
3
+ *
4
+ * Once Phase IV (approve) passes the three spec gates, this
5
+ * command initialises the project for the iterative build cycle:
6
+ *
7
+ * * Reads workflow.specs + workflow.clarification.blocks
8
+ * * Scaffolds the project shell (delegates to template engine
9
+ * if the project is brand-new; no-ops if code already exists)
10
+ * * Installs NAC-3 compliance baseline (5 attrs on the shell +
11
+ * manifest stub)
12
+ * * Sets CI gates (lint + typecheck + tests + visual + a11y +
13
+ * NAC-3 manifest check)
14
+ * * Sets up test scaffolding per layer (unit / integration /
15
+ * e2e / visual / a11y)
16
+ * * Sets up observability hooks (logger + optional Sentry)
17
+ * * Initialises blocks_progress = [{ block_id, status: pending }]
18
+ * for every block in workflow.clarification.blocks
19
+ *
20
+ * For alpha.15 the bootstrap is a thin shell -- it sets the
21
+ * workflow state + writes scaffolding markers + the actual
22
+ * heavy lifting (templates, CI config generation, observability
23
+ * wiring) lands incrementally in follow-up commits.
24
+ *
25
+ * ASCII-only.
26
+ */
27
+ import type { Command } from 'commander';
28
+ export interface BootstrapOptions {
29
+ cwd?: string;
30
+ yes?: boolean;
31
+ stack?: string;
32
+ }
33
+ export declare function runBootstrap(opts: BootstrapOptions): Promise<void>;
34
+ export declare function registerBootstrapCommand(program: Command): void;
35
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqBD,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6IxE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc/D"}