@nac3/forge-cli 0.2.0-alpha.2 → 0.2.0-alpha.21
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.
- package/dist/bin/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +25 -0
- package/dist/bin/yf.js.map +1 -1
- package/dist/chat/claude.d.ts +22 -15
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js +75 -22
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +102 -3
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/server.js +498 -32
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/audit_consumers.d.ts +66 -0
- package/dist/chat/tools/audit_consumers.d.ts.map +1 -0
- package/dist/chat/tools/audit_consumers.js +231 -0
- package/dist/chat/tools/audit_consumers.js.map +1 -0
- package/dist/chat/tools/git.js +4 -4
- package/dist/chat/tools/github.js +3 -3
- package/dist/chat/tools/lifecycle.js +3 -3
- package/dist/chat/tools/manual.js +1 -1
- package/dist/chat/tools/reader.js +8 -8
- package/dist/chat/tools/workflow.d.ts +45 -0
- package/dist/chat/tools/workflow.d.ts.map +1 -0
- package/dist/chat/tools/workflow.js +404 -0
- package/dist/chat/tools/workflow.js.map +1 -0
- package/dist/chat/tools.d.ts.map +1 -1
- package/dist/chat/tools.js +23 -4
- package/dist/chat/tools.js.map +1 -1
- package/dist/commands/approve.d.ts +32 -0
- package/dist/commands/approve.d.ts.map +1 -0
- package/dist/commands/approve.js +198 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/block.d.ts +28 -0
- package/dist/commands/block.d.ts.map +1 -0
- package/dist/commands/block.js +189 -0
- package/dist/commands/block.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +35 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +205 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/chat.d.ts +3 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +46 -1
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/clarify.d.ts +30 -0
- package/dist/commands/clarify.d.ts.map +1 -0
- package/dist/commands/clarify.js +671 -0
- package/dist/commands/clarify.js.map +1 -0
- package/dist/commands/discover.d.ts +30 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +178 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/doctor.js +94 -42
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/keys_setup.d.ts +53 -0
- package/dist/commands/keys_setup.d.ts.map +1 -0
- package/dist/commands/keys_setup.js +487 -0
- package/dist/commands/keys_setup.js.map +1 -0
- package/dist/commands/legacy-audit.d.ts +34 -0
- package/dist/commands/legacy-audit.d.ts.map +1 -0
- package/dist/commands/legacy-audit.js +270 -0
- package/dist/commands/legacy-audit.js.map +1 -0
- package/dist/commands/license.d.ts.map +1 -1
- package/dist/commands/license.js +41 -0
- package/dist/commands/license.js.map +1 -1
- package/dist/commands/operate.d.ts +22 -0
- package/dist/commands/operate.d.ts.map +1 -0
- package/dist/commands/operate.js +483 -0
- package/dist/commands/operate.js.map +1 -0
- package/dist/commands/spec.d.ts +38 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +256 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/triage.d.ts +34 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +228 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/vault-inventory.d.ts +30 -0
- package/dist/commands/vault-inventory.d.ts.map +1 -0
- package/dist/commands/vault-inventory.js +214 -0
- package/dist/commands/vault-inventory.js.map +1 -0
- package/dist/commands/vault.d.ts.map +1 -1
- package/dist/commands/vault.js +5 -0
- package/dist/commands/vault.js.map +1 -1
- package/dist/commands/voice.js +1 -1
- package/dist/commands/voice.js.map +1 -1
- package/dist/commands/workflow-coverage.d.ts +30 -0
- package/dist/commands/workflow-coverage.d.ts.map +1 -0
- package/dist/commands/workflow-coverage.js +138 -0
- package/dist/commands/workflow-coverage.js.map +1 -0
- package/dist/core/keys_envelope.d.ts +13 -0
- package/dist/core/keys_envelope.d.ts.map +1 -1
- package/dist/core/keys_envelope.js.map +1 -1
- package/dist/deploy/adapter.d.ts +93 -0
- package/dist/deploy/adapter.d.ts.map +1 -0
- package/dist/deploy/adapter.js +42 -0
- package/dist/deploy/adapter.js.map +1 -0
- package/dist/deploy/aws_adapter.d.ts +28 -0
- package/dist/deploy/aws_adapter.d.ts.map +1 -0
- package/dist/deploy/aws_adapter.js +65 -0
- package/dist/deploy/aws_adapter.js.map +1 -0
- package/dist/deploy/cloudflare.d.ts +24 -0
- package/dist/deploy/cloudflare.d.ts.map +1 -0
- package/dist/deploy/cloudflare.js +169 -0
- package/dist/deploy/cloudflare.js.map +1 -0
- package/dist/license/hito4_client.d.ts +17 -1
- package/dist/license/hito4_client.d.ts.map +1 -1
- package/dist/license/hito4_client.js +71 -10
- package/dist/license/hito4_client.js.map +1 -1
- package/dist/license/index.d.ts.map +1 -1
- package/dist/license/index.js +7 -0
- package/dist/license/index.js.map +1 -1
- package/dist/license/sync.d.ts +54 -0
- package/dist/license/sync.d.ts.map +1 -0
- package/dist/license/sync.js +131 -0
- package/dist/license/sync.js.map +1 -0
- package/dist/telemetry/usage.d.ts +67 -0
- package/dist/telemetry/usage.d.ts.map +1 -0
- package/dist/telemetry/usage.js +208 -0
- package/dist/telemetry/usage.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/voice/intents.d.ts +1 -1
- package/dist/voice/intents.js +0 -0
- package/dist/voice/providers/google.d.ts.map +1 -1
- package/dist/voice/providers/google.js +157 -27
- package/dist/voice/providers/google.js.map +1 -1
- package/dist/voice/router.d.ts +10 -0
- package/dist/voice/router.d.ts.map +1 -1
- package/dist/voice/router.js +39 -20
- package/dist/voice/router.js.map +1 -1
- package/dist/voice/types.d.ts +5 -2
- package/dist/voice/types.d.ts.map +1 -1
- package/dist/voice/types.js.map +1 -1
- package/dist/workflow/state.d.ts +190 -0
- package/dist/workflow/state.d.ts.map +1 -0
- package/dist/workflow/state.js +119 -0
- package/dist/workflow/state.js.map +1 -0
- package/package.json +13 -15
- package/templates/nextjs-app/README.md +48 -0
- package/templates/nextjs-app/next.config.js +8 -0
- package/templates/nextjs-app/package.json +33 -0
- package/templates/nextjs-app/src/app/globals.css +43 -0
- package/templates/nextjs-app/src/app/layout.tsx +29 -0
- package/templates/nextjs-app/src/app/page.tsx +63 -0
- package/templates/nextjs-app/src/nac/manifest.ts +36 -0
- package/templates/nextjs-app/tsconfig.json +21 -0
- package/templates/nextjs-app/yujin.forge.json +11 -0
|
@@ -0,0 +1,256 @@
|
|
|
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 path from 'node:path';
|
|
33
|
+
import { promises as fs } from 'node:fs';
|
|
34
|
+
import { createHash } from 'node:crypto';
|
|
35
|
+
import { c, header } from '../ui/colors.js';
|
|
36
|
+
import { ClaudeClient } from '../chat/claude.js';
|
|
37
|
+
import { readWorkflow, patchWorkflowGroup, } from '../workflow/state.js';
|
|
38
|
+
const DOC_FILENAME = {
|
|
39
|
+
rfp: 'project_rfp.md',
|
|
40
|
+
arch: 'project_architecture.md',
|
|
41
|
+
design: 'project_design.md',
|
|
42
|
+
};
|
|
43
|
+
const DOC_TITLE = {
|
|
44
|
+
rfp: 'RFP / PRD',
|
|
45
|
+
arch: 'Architecture',
|
|
46
|
+
design: 'Solution Design',
|
|
47
|
+
};
|
|
48
|
+
const CLARIFICATION_FILES = [
|
|
49
|
+
'04_functional.md',
|
|
50
|
+
'05_quantitative.md',
|
|
51
|
+
'06_structural.md',
|
|
52
|
+
'07_governance.md',
|
|
53
|
+
'08_operational.md',
|
|
54
|
+
'09_blocks.md',
|
|
55
|
+
];
|
|
56
|
+
async function readAllClarification(projectRoot) {
|
|
57
|
+
const dir = path.join(projectRoot, 'docs', 'clarification');
|
|
58
|
+
const parts = [];
|
|
59
|
+
for (const name of CLARIFICATION_FILES) {
|
|
60
|
+
try {
|
|
61
|
+
const text = await fs.readFile(path.join(dir, name), 'utf-8');
|
|
62
|
+
parts.push('===== ' + name + ' =====\n' + text);
|
|
63
|
+
}
|
|
64
|
+
catch { /* skip missing files */ }
|
|
65
|
+
}
|
|
66
|
+
return parts.join('\n\n');
|
|
67
|
+
}
|
|
68
|
+
function buildSystemPromptFor(kind) {
|
|
69
|
+
/* TODO(HITO-4): move these to prompts.yujin.app endpoints. */
|
|
70
|
+
const common = [
|
|
71
|
+
'You are Yujin Forge generating a foundational project document.',
|
|
72
|
+
'Read the supplied clarification rounds + workflow state and emit',
|
|
73
|
+
'a single, well-structured markdown document.',
|
|
74
|
+
'Output ASCII-only. Use sections + lists, NOT free prose.',
|
|
75
|
+
'Do not invent facts not present in the clarification rounds. If',
|
|
76
|
+
'something is missing, write "TBD: <what the user must define>".',
|
|
77
|
+
].join(' ');
|
|
78
|
+
switch (kind) {
|
|
79
|
+
case 'rfp':
|
|
80
|
+
return common + '\n\nDocument type: **RFP / PRD**. Structure:\n'
|
|
81
|
+
+ '1. Vision + objetivo del producto\n'
|
|
82
|
+
+ '2. Personas + user stories\n'
|
|
83
|
+
+ '3. Killer features + MVP slice\n'
|
|
84
|
+
+ '4. Bloques + orden\n'
|
|
85
|
+
+ '5. NFR cuantitativas (volumetria, paralelismo, complejidad)\n'
|
|
86
|
+
+ '6. NFR estructurales (persistencia, middleware, modelo objeto)\n'
|
|
87
|
+
+ '7. NFR de gobernanza (compliance, audit, retention)\n'
|
|
88
|
+
+ '8. NFR de operacion (i18n, a11y, monitoring, costos)\n'
|
|
89
|
+
+ '9. Acceptance criteria por bloque\n';
|
|
90
|
+
case 'arch':
|
|
91
|
+
return common + '\n\nDocument type: **Technological architecture**.\n'
|
|
92
|
+
+ 'Structure (driven by NFR decisions from clarification step 5+6+8):\n'
|
|
93
|
+
+ '1. Stack elegido + justificacion\n'
|
|
94
|
+
+ '2. Layering (frontend / backend / data / async)\n'
|
|
95
|
+
+ '3. Topologia de deployment (single instance / multi-region / serverless / edge)\n'
|
|
96
|
+
+ '4. Estrategia async (sync only / queue + workers / event bus / saga)\n'
|
|
97
|
+
+ '5. Persistence model + ERD inicial textual\n'
|
|
98
|
+
+ '6. Middleware stack (concretado del step 6)\n'
|
|
99
|
+
+ '7. Security model (auth, authz, encryption, secrets)\n'
|
|
100
|
+
+ '8. Observability (logs, metrics, traces, alertas del step 8)\n'
|
|
101
|
+
+ '9. Compliance hooks (per step 7 decisions)\n'
|
|
102
|
+
+ '10. Costos esperados (modelado de step 8)\n';
|
|
103
|
+
case 'design':
|
|
104
|
+
return common + '\n\nDocument type: **Solution design per block**.\n'
|
|
105
|
+
+ 'For each block in workflow.clarification.blocks, write a section with:\n'
|
|
106
|
+
+ '1. Data model (tables + relaciones + indices)\n'
|
|
107
|
+
+ '2. API contracts (endpoints + payloads + responses + errores)\n'
|
|
108
|
+
+ '3. Screens / pages (wireframes ascii o links a figma)\n'
|
|
109
|
+
+ '4. State machines (si aplica per step 5)\n'
|
|
110
|
+
+ '5. Sequence diagrams (las 2-3 secuencias mas complejas, textuales)\n'
|
|
111
|
+
+ '6. Edge cases identificados + estrategia\n'
|
|
112
|
+
+ '7. Test cases obligatorios (e2e + structural)\n'
|
|
113
|
+
+ '8. NAC-3 attributes (preview del manifest)\n';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function sha256(text) {
|
|
117
|
+
return createHash('sha256').update(text, 'utf-8').digest('hex');
|
|
118
|
+
}
|
|
119
|
+
async function runSpec(kind, opts) {
|
|
120
|
+
header('Yujin Forge -- spec ' + kind);
|
|
121
|
+
console.log('');
|
|
122
|
+
const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
|
|
123
|
+
const wf = await readWorkflow(projectRoot);
|
|
124
|
+
/* Pre-requisites. */
|
|
125
|
+
const cl = wf.clarification;
|
|
126
|
+
if (!cl?.functional || !cl?.nfr_quantitative || !cl?.nfr_structural
|
|
127
|
+
|| !cl?.nfr_governance || !cl?.nfr_operational || !cl?.blocks) {
|
|
128
|
+
console.log(c.error('Clarification (Phase II) incompleta. Falta al menos una ronda.'));
|
|
129
|
+
console.log(c.dim('Corre: ') + c.code('yf clarify functional') + c.dim(' ... seguir hasta blocks.'));
|
|
130
|
+
process.exitCode = 1;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if ((kind === 'arch' || kind === 'design') && !wf.specs?.rfp) {
|
|
134
|
+
console.log(c.error('RFP debe estar generado primero.'));
|
|
135
|
+
console.log(c.dim('Corre: ') + c.code('yf spec rfp'));
|
|
136
|
+
process.exitCode = 1;
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const existing = wf.specs?.[kind];
|
|
140
|
+
if (existing && !opts.yes) {
|
|
141
|
+
console.log(c.warn('Ya existe ') + c.brand(DOC_FILENAME[kind])
|
|
142
|
+
+ c.warn(' (version ' + existing.version + ').'));
|
|
143
|
+
console.log(c.dim('Para regenerar, corre con ') + c.code('--yes'));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
/* Build the context. */
|
|
147
|
+
const clarificationDump = await readAllClarification(projectRoot);
|
|
148
|
+
if (clarificationDump.trim() === '') {
|
|
149
|
+
console.log(c.error('No se encontraron docs en docs/clarification/. Re-corre las rondas.'));
|
|
150
|
+
process.exitCode = 1;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
/* If generating arch or design, also feed the RFP. */
|
|
154
|
+
let priorDocs = '';
|
|
155
|
+
if (kind === 'arch' || kind === 'design') {
|
|
156
|
+
try {
|
|
157
|
+
const rfpText = await fs.readFile(path.join(projectRoot, 'docs', wf.specs.rfp.doc_path.replace(/^docs\//, '')), 'utf-8');
|
|
158
|
+
priorDocs += '\n\n===== EXISTING RFP =====\n' + rfpText;
|
|
159
|
+
}
|
|
160
|
+
catch { /* may not exist if doc_path was relative differently */ }
|
|
161
|
+
}
|
|
162
|
+
if (kind === 'design' && wf.specs?.arch) {
|
|
163
|
+
try {
|
|
164
|
+
const archText = await fs.readFile(path.join(projectRoot, 'docs', wf.specs.arch.doc_path.replace(/^docs\//, '')), 'utf-8');
|
|
165
|
+
priorDocs += '\n\n===== EXISTING ARCHITECTURE =====\n' + archText;
|
|
166
|
+
}
|
|
167
|
+
catch { /* skip */ }
|
|
168
|
+
}
|
|
169
|
+
const userMessage = [
|
|
170
|
+
'Project root: ' + projectRoot,
|
|
171
|
+
'Tier: ' + (wf.tier ?? 'unknown'),
|
|
172
|
+
'Intent: ' + JSON.stringify(wf.intent ?? {}, null, 2),
|
|
173
|
+
'',
|
|
174
|
+
'===== CLARIFICATION ROUNDS =====',
|
|
175
|
+
clarificationDump,
|
|
176
|
+
priorDocs,
|
|
177
|
+
'',
|
|
178
|
+
'Generate the document now. Output the FULL markdown body only.',
|
|
179
|
+
'No preamble, no chatter, no closing remarks. Start with the first',
|
|
180
|
+
'H2 / heading and end with the last content line.',
|
|
181
|
+
].join('\n');
|
|
182
|
+
console.log(c.dim('Llamando Claude para generar ' + DOC_FILENAME[kind] + ' ...'));
|
|
183
|
+
console.log(c.dim('(prompt strategic asset; en HITO 4 esto se mueve a prompts.yujin.app)'));
|
|
184
|
+
console.log('');
|
|
185
|
+
const claude = new ClaudeClient();
|
|
186
|
+
let body;
|
|
187
|
+
try {
|
|
188
|
+
const resp = await claude.chat({
|
|
189
|
+
system: buildSystemPromptFor(kind),
|
|
190
|
+
messages: [{ role: 'user', content: userMessage }],
|
|
191
|
+
maxTokens: 8192,
|
|
192
|
+
});
|
|
193
|
+
body = resp.text.trim();
|
|
194
|
+
if (body === '')
|
|
195
|
+
throw new Error('Claude returned empty body');
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
console.error(c.error('Generacion fallo: ') + String(err instanceof Error ? err.message : err));
|
|
199
|
+
process.exitCode = 1;
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const docsDir = path.join(projectRoot, 'docs');
|
|
203
|
+
await fs.mkdir(docsDir, { recursive: true });
|
|
204
|
+
const filePath = path.join(docsDir, DOC_FILENAME[kind]);
|
|
205
|
+
const previousVersion = existing?.version ?? 0;
|
|
206
|
+
const newVersion = previousVersion + 1;
|
|
207
|
+
const stamp = new Date().toISOString();
|
|
208
|
+
const header_md = '# ' + DOC_TITLE[kind] + ' -- ' + (wf.intent?.operation ?? 'project') + '\n\n'
|
|
209
|
+
+ '*Version ' + newVersion + ' generated by Yujin Forge on ' + stamp + '.*\n'
|
|
210
|
+
+ '*Tier: ' + wf.tier + '. To re-generate: `yf spec ' + kind + ' --yes`.*\n\n';
|
|
211
|
+
const full = header_md + body + '\n';
|
|
212
|
+
await fs.writeFile(filePath, full, 'utf-8');
|
|
213
|
+
const sha = sha256(full);
|
|
214
|
+
const relPath = path.relative(projectRoot, filePath);
|
|
215
|
+
await patchWorkflowGroup(projectRoot, 'specs', {
|
|
216
|
+
[kind]: {
|
|
217
|
+
done_at: stamp,
|
|
218
|
+
version: newVersion,
|
|
219
|
+
doc_path: relPath,
|
|
220
|
+
sha256: sha,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
console.log(c.success('Generado: ') + c.brand(relPath) + c.dim(' (' + full.length + ' chars, sha256:' + sha.slice(0, 12) + '...)'));
|
|
224
|
+
console.log('');
|
|
225
|
+
switch (kind) {
|
|
226
|
+
case 'rfp':
|
|
227
|
+
console.log(c.dim('Siguiente: ') + c.code('yf spec arch'));
|
|
228
|
+
break;
|
|
229
|
+
case 'arch':
|
|
230
|
+
console.log(c.dim('Siguiente: ') + c.code('yf spec design'));
|
|
231
|
+
break;
|
|
232
|
+
case 'design':
|
|
233
|
+
console.log(c.dim('Phase III completa. Siguiente: ') + c.code('yf approve rfp arch design'));
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
export function registerSpecCommand(program) {
|
|
238
|
+
const spec = program.command('spec')
|
|
239
|
+
.description('Phase III steps 10-12: generate RFP + Architecture + Solution Design.');
|
|
240
|
+
for (const kind of ['rfp', 'arch', 'design']) {
|
|
241
|
+
spec.command(kind)
|
|
242
|
+
.description('Generate the ' + DOC_TITLE[kind] + ' doc into docs/' + DOC_FILENAME[kind])
|
|
243
|
+
.option('--cwd <path>', 'project root (default: current directory)')
|
|
244
|
+
.option('--yes', 'overwrite existing version')
|
|
245
|
+
.action(async (opts) => {
|
|
246
|
+
try {
|
|
247
|
+
await runSpec(kind, opts);
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
251
|
+
process.exitCode = 1;
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf triage` -- Phase I step 1 of PRODUCT_WORKFLOW.md.
|
|
3
|
+
*
|
|
4
|
+
* Asks the user 5 questions, classifies the project into one of
|
|
5
|
+
* three complexity tiers (Simple / Medium / Full), and persists
|
|
6
|
+
* the decision to yujin.forge.json::workflow. The result drives
|
|
7
|
+
* which subsequent phases apply (see PRODUCT_WORKFLOW.md sec 1).
|
|
8
|
+
*
|
|
9
|
+
* Questions:
|
|
10
|
+
* 1. Output type (landing / blog / CRUD app / SaaS / regulated system)
|
|
11
|
+
* 2. Volumetria 12m (numeric: expected concurrent users at 12 months)
|
|
12
|
+
* 3. Industry context (general / health / finance / education / government)
|
|
13
|
+
* 4. Region (LATAM / US / EU / global)
|
|
14
|
+
* 5. Team maintaining (solo / pair / team)
|
|
15
|
+
*
|
|
16
|
+
* Classification rules:
|
|
17
|
+
* Simple = output in {landing, blog, demo} OR volumetria < 50 AND
|
|
18
|
+
* industry = general AND team = solo
|
|
19
|
+
* Full = industry in {health, finance, government} OR volumetria > 5000
|
|
20
|
+
* OR output = regulated_system OR (region = EU AND volumetria > 100)
|
|
21
|
+
* Medium = everything else
|
|
22
|
+
*
|
|
23
|
+
* User can override the auto-tier in the final confirmation.
|
|
24
|
+
*
|
|
25
|
+
* ASCII-only.
|
|
26
|
+
*/
|
|
27
|
+
import type { Command } from 'commander';
|
|
28
|
+
export interface TriageOptions {
|
|
29
|
+
cwd?: string;
|
|
30
|
+
yes?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function runTriage(opts: TriageOptions): Promise<void>;
|
|
33
|
+
export declare function registerTriageCommand(program: Command): void;
|
|
34
|
+
//# sourceMappingURL=triage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/commands/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAsED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6HlE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc5D"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf triage` -- Phase I step 1 of PRODUCT_WORKFLOW.md.
|
|
3
|
+
*
|
|
4
|
+
* Asks the user 5 questions, classifies the project into one of
|
|
5
|
+
* three complexity tiers (Simple / Medium / Full), and persists
|
|
6
|
+
* the decision to yujin.forge.json::workflow. The result drives
|
|
7
|
+
* which subsequent phases apply (see PRODUCT_WORKFLOW.md sec 1).
|
|
8
|
+
*
|
|
9
|
+
* Questions:
|
|
10
|
+
* 1. Output type (landing / blog / CRUD app / SaaS / regulated system)
|
|
11
|
+
* 2. Volumetria 12m (numeric: expected concurrent users at 12 months)
|
|
12
|
+
* 3. Industry context (general / health / finance / education / government)
|
|
13
|
+
* 4. Region (LATAM / US / EU / global)
|
|
14
|
+
* 5. Team maintaining (solo / pair / team)
|
|
15
|
+
*
|
|
16
|
+
* Classification rules:
|
|
17
|
+
* Simple = output in {landing, blog, demo} OR volumetria < 50 AND
|
|
18
|
+
* industry = general AND team = solo
|
|
19
|
+
* Full = industry in {health, finance, government} OR volumetria > 5000
|
|
20
|
+
* OR output = regulated_system OR (region = EU AND volumetria > 100)
|
|
21
|
+
* Medium = everything else
|
|
22
|
+
*
|
|
23
|
+
* User can override the auto-tier in the final confirmation.
|
|
24
|
+
*
|
|
25
|
+
* ASCII-only.
|
|
26
|
+
*/
|
|
27
|
+
import path from 'node:path';
|
|
28
|
+
import prompts from 'prompts';
|
|
29
|
+
import { c, header } from '../ui/colors.js';
|
|
30
|
+
import { writeWorkflow, readWorkflow, } from '../workflow/state.js';
|
|
31
|
+
function classify(a) {
|
|
32
|
+
const simpleOutputs = ['landing', 'blog'];
|
|
33
|
+
const regulated = ['health', 'finance', 'government'];
|
|
34
|
+
if (simpleOutputs.includes(a.output)
|
|
35
|
+
|| (a.volumetria < 50 && a.industry === 'general' && a.team === 'solo')) {
|
|
36
|
+
return {
|
|
37
|
+
tier: 'simple',
|
|
38
|
+
reason: a.output === 'landing' ? 'landing page'
|
|
39
|
+
: a.output === 'blog' ? 'blog'
|
|
40
|
+
: 'small single-user project (< 50 users / 12m, general industry, solo team)',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (regulated.includes(a.industry)
|
|
44
|
+
|| a.volumetria > 5000
|
|
45
|
+
|| a.output === 'regulated'
|
|
46
|
+
|| (a.region === 'eu' && a.volumetria > 100)) {
|
|
47
|
+
const reasons = [];
|
|
48
|
+
if (regulated.includes(a.industry))
|
|
49
|
+
reasons.push('regulated industry (' + a.industry + ')');
|
|
50
|
+
if (a.volumetria > 5000)
|
|
51
|
+
reasons.push('volumetria > 5000');
|
|
52
|
+
if (a.output === 'regulated')
|
|
53
|
+
reasons.push('output = regulated system');
|
|
54
|
+
if (a.region === 'eu' && a.volumetria > 100)
|
|
55
|
+
reasons.push('EU + > 100 users (GDPR compliance)');
|
|
56
|
+
return {
|
|
57
|
+
tier: 'full',
|
|
58
|
+
reason: reasons.join(' + '),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
tier: 'medium',
|
|
63
|
+
reason: 'CRUD/SaaS app with moderate volumetria, non-regulated industry',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function describeAlcance(tier) {
|
|
67
|
+
switch (tier) {
|
|
68
|
+
case 'simple':
|
|
69
|
+
return [
|
|
70
|
+
' Phase I (intake) -> Phase II step 9 (blocks) -> Phase V (build) -> Phase VI (ship)',
|
|
71
|
+
' Skips: full clarification rounds, RFP+arch+design docs, approval gate',
|
|
72
|
+
].join('\n');
|
|
73
|
+
case 'medium':
|
|
74
|
+
return [
|
|
75
|
+
' Phase I + Phase II + Phase III (compact) + Phase IV gate + Phase V + Phase VI',
|
|
76
|
+
' Light RFP+arch+design; explicit approval before build starts',
|
|
77
|
+
].join('\n');
|
|
78
|
+
case 'full':
|
|
79
|
+
return [
|
|
80
|
+
' ALL 18 steps, all 4 NFR rounds, full RFP+arch+design,',
|
|
81
|
+
' hard approval gate, NAC-3 compliance auditing per block',
|
|
82
|
+
].join('\n');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export async function runTriage(opts) {
|
|
86
|
+
header('Yujin Forge -- triage');
|
|
87
|
+
console.log('');
|
|
88
|
+
const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
|
|
89
|
+
const existing = await readWorkflow(projectRoot);
|
|
90
|
+
if (existing.tier && !opts.yes) {
|
|
91
|
+
console.log(c.dim('Triage previo: ') + c.brand(existing.tier)
|
|
92
|
+
+ c.dim(' (' + (existing.tier_reason ?? 'no reason') + ')'));
|
|
93
|
+
console.log(c.dim('Para volver a clasificar, corre `yf triage --yes`.'));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
console.log(c.dim('5 preguntas para clasificar la complejidad del proyecto.'));
|
|
97
|
+
console.log(c.dim('La clasificacion determina que fases del workflow se aplican.'));
|
|
98
|
+
console.log('');
|
|
99
|
+
const answers = await prompts([
|
|
100
|
+
{
|
|
101
|
+
type: 'select',
|
|
102
|
+
name: 'output',
|
|
103
|
+
message: 'Tipo de output:',
|
|
104
|
+
choices: [
|
|
105
|
+
{ title: 'Landing page', value: 'landing' },
|
|
106
|
+
{ title: 'Blog / sitio de contenido', value: 'blog' },
|
|
107
|
+
{ title: 'App CRUD con auth (multi-user)', value: 'crud' },
|
|
108
|
+
{ title: 'SaaS multi-tenant', value: 'saas' },
|
|
109
|
+
{ title: 'Sistema regulado / compliance critica', value: 'regulated' },
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'number',
|
|
114
|
+
name: 'volumetria',
|
|
115
|
+
message: 'Usuarios concurrentes esperados a 12 meses (entero):',
|
|
116
|
+
initial: 100,
|
|
117
|
+
min: 0,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'select',
|
|
121
|
+
name: 'industry',
|
|
122
|
+
message: 'Industria:',
|
|
123
|
+
choices: [
|
|
124
|
+
{ title: 'General', value: 'general' },
|
|
125
|
+
{ title: 'Salud (HIPAA / privacidad medica)', value: 'health' },
|
|
126
|
+
{ title: 'Finanzas (PCI / regulacion bancaria)', value: 'finance' },
|
|
127
|
+
{ title: 'Educacion', value: 'education' },
|
|
128
|
+
{ title: 'Gobierno / sector publico', value: 'government' },
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: 'select',
|
|
133
|
+
name: 'region',
|
|
134
|
+
message: 'Region de usuarios:',
|
|
135
|
+
choices: [
|
|
136
|
+
{ title: 'LATAM', value: 'latam' },
|
|
137
|
+
{ title: 'US', value: 'us' },
|
|
138
|
+
{ title: 'EU (aplican GDPR)', value: 'eu' },
|
|
139
|
+
{ title: 'Global', value: 'global' },
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'select',
|
|
144
|
+
name: 'team',
|
|
145
|
+
message: 'Equipo que mantiene:',
|
|
146
|
+
choices: [
|
|
147
|
+
{ title: 'Solo (vos)', value: 'solo' },
|
|
148
|
+
{ title: 'En pareja (2)', value: 'pair' },
|
|
149
|
+
{ title: 'Equipo (3 o mas)', value: 'team' },
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
]);
|
|
153
|
+
if (!answers.output || answers.volumetria === undefined || !answers.industry
|
|
154
|
+
|| !answers.region || !answers.team) {
|
|
155
|
+
console.log(c.warn('Triage abortado (faltan respuestas).'));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const { tier, reason } = classify(answers);
|
|
159
|
+
console.log('');
|
|
160
|
+
console.log(c.brand('Tier propuesto: ') + c.brand(tier.toUpperCase()));
|
|
161
|
+
console.log(c.dim(' Razon: ') + reason);
|
|
162
|
+
console.log('');
|
|
163
|
+
console.log(c.brand('Alcance del workflow para este tier:'));
|
|
164
|
+
console.log(describeAlcance(tier));
|
|
165
|
+
console.log('');
|
|
166
|
+
const confirm = await prompts({
|
|
167
|
+
type: 'select',
|
|
168
|
+
name: 'choice',
|
|
169
|
+
message: 'Confirmar tier?',
|
|
170
|
+
choices: [
|
|
171
|
+
{ title: 'Confirmar ' + tier, value: 'confirm' },
|
|
172
|
+
{ title: 'Override a SIMPLE (forzar workflow minimo)', value: 'simple' },
|
|
173
|
+
{ title: 'Override a MEDIUM', value: 'medium' },
|
|
174
|
+
{ title: 'Override a FULL (forzar workflow completo)', value: 'full' },
|
|
175
|
+
{ title: 'Cancelar', value: 'cancel' },
|
|
176
|
+
],
|
|
177
|
+
});
|
|
178
|
+
let finalTier;
|
|
179
|
+
let finalReason;
|
|
180
|
+
switch (confirm.choice) {
|
|
181
|
+
case 'confirm':
|
|
182
|
+
finalTier = tier;
|
|
183
|
+
finalReason = reason;
|
|
184
|
+
break;
|
|
185
|
+
case 'simple':
|
|
186
|
+
finalTier = 'simple';
|
|
187
|
+
finalReason = 'user override after auto: ' + tier;
|
|
188
|
+
break;
|
|
189
|
+
case 'medium':
|
|
190
|
+
finalTier = 'medium';
|
|
191
|
+
finalReason = 'user override after auto: ' + tier;
|
|
192
|
+
break;
|
|
193
|
+
case 'full':
|
|
194
|
+
finalTier = 'full';
|
|
195
|
+
finalReason = 'user override after auto: ' + tier;
|
|
196
|
+
break;
|
|
197
|
+
default:
|
|
198
|
+
console.log(c.warn('Triage cancelado.'));
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
await writeWorkflow(projectRoot, {
|
|
202
|
+
tier: finalTier,
|
|
203
|
+
tier_reason: finalReason,
|
|
204
|
+
tier_decided_at: new Date().toISOString(),
|
|
205
|
+
});
|
|
206
|
+
console.log('');
|
|
207
|
+
console.log(c.success('Triage persistido. Tier: ' + c.brand(finalTier)));
|
|
208
|
+
console.log(c.dim(' Estado guardado en yujin.forge.json'));
|
|
209
|
+
console.log('');
|
|
210
|
+
console.log(c.dim('Siguiente paso: ') + c.code('yf discover'));
|
|
211
|
+
}
|
|
212
|
+
export function registerTriageCommand(program) {
|
|
213
|
+
program
|
|
214
|
+
.command('triage')
|
|
215
|
+
.description('Phase I step 1: classify project complexity (Simple / Medium / Full).')
|
|
216
|
+
.option('--cwd <path>', 'project root (default: current directory)')
|
|
217
|
+
.option('--yes', 'overwrite a prior triage decision without prompting')
|
|
218
|
+
.action(async (opts) => {
|
|
219
|
+
try {
|
|
220
|
+
await runTriage(opts);
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
224
|
+
process.exitCode = 1;
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/commands/triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf vault inventory` -- Phase I step 2 of PRODUCT_WORKFLOW.md.
|
|
3
|
+
*
|
|
4
|
+
* Walks the 13 credential families the workflow defines and per
|
|
5
|
+
* each asks the user "needed for this project?". Per-family
|
|
6
|
+
* status persists to workflow.vault_inventory.families. Families
|
|
7
|
+
* marked `skipped` become deferred debt the deploy step (16)
|
|
8
|
+
* surfaces back.
|
|
9
|
+
*
|
|
10
|
+
* Differs from `yf vault list`: that one shows what credentials
|
|
11
|
+
* are PRESENT in the vault today. This one captures what the
|
|
12
|
+
* project will NEED, marked per-family with one of:
|
|
13
|
+
*
|
|
14
|
+
* configured = at least one slot of this family is already
|
|
15
|
+
* in the vault OR provider_keys.json
|
|
16
|
+
* skipped = user marked "not needed for this project" or
|
|
17
|
+
* "deal with later"
|
|
18
|
+
* unknown = not asked yet (the default until inventory runs)
|
|
19
|
+
*
|
|
20
|
+
* Wired into the workflow gate at step 16 (`yf deploy guided`).
|
|
21
|
+
*
|
|
22
|
+
* ASCII-only.
|
|
23
|
+
*/
|
|
24
|
+
import type { Command } from 'commander';
|
|
25
|
+
export interface VaultInventoryOptions {
|
|
26
|
+
cwd?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function runVaultInventory(opts: VaultInventoryOptions): Promise<void>;
|
|
29
|
+
export declare function registerVaultInventoryCommand(vaultProgram: Command): void;
|
|
30
|
+
//# sourceMappingURL=vault-inventory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-inventory.d.ts","sourceRoot":"","sources":["../../src/commands/vault-inventory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAmHD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuElF;AAED,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI,CAYzE"}
|