pumuki 6.3.13 → 6.3.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +95 -7
- package/VERSION +1 -1
- package/bin/pumuki-mcp-enterprise.js +5 -0
- package/bin/pumuki-pre-write.js +11 -0
- package/docs/API_REFERENCE.md +2 -1
- package/docs/INSTALLATION.md +101 -54
- package/docs/MCP_SERVERS.md +167 -74
- package/docs/PUMUKI_FULL_VALIDATION_CHECKLIST.md +46 -45
- package/docs/PUMUKI_OPENSPEC_SDD_ROADMAP.md +55 -0
- package/docs/README.md +5 -0
- package/docs/REFRACTOR_PROGRESS.md +102 -3
- package/docs/USAGE.md +115 -8
- package/docs/validation/README.md +2 -0
- package/docs/validation/phase12-go-no-go-report.md +73 -0
- package/docs/validation/post-phase12-next-lot-decision.md +75 -0
- package/integrations/config/skillsRuleSet.ts +53 -6
- package/integrations/evidence/buildEvidence.ts +42 -3
- package/integrations/evidence/generateEvidence.test.ts +59 -0
- package/integrations/evidence/readEvidence.test.ts +61 -0
- package/integrations/evidence/schema.test.ts +81 -0
- package/integrations/evidence/schema.ts +11 -0
- package/integrations/evidence/writeEvidence.test.ts +18 -0
- package/integrations/evidence/writeEvidence.ts +11 -0
- package/integrations/git/resolveGitRefs.ts +2 -2
- package/integrations/git/runPlatformGate.ts +64 -0
- package/integrations/git/runPlatformGateEvidence.ts +13 -0
- package/integrations/git/stageRunners.ts +10 -1
- package/integrations/lifecycle/artifacts.ts +57 -4
- package/integrations/lifecycle/cli.ts +248 -12
- package/integrations/lifecycle/constants.ts +1 -0
- package/integrations/lifecycle/gitService.ts +1 -0
- package/integrations/lifecycle/install.ts +24 -1
- package/integrations/lifecycle/openSpecBootstrap.ts +190 -0
- package/integrations/lifecycle/state.ts +57 -0
- package/integrations/lifecycle/uninstall.ts +3 -1
- package/integrations/lifecycle/update.ts +11 -0
- package/integrations/mcp/enterpriseServer.cli.ts +12 -0
- package/integrations/mcp/enterpriseServer.ts +762 -0
- package/integrations/mcp/index.ts +1 -0
- package/integrations/sdd/index.ts +11 -0
- package/integrations/sdd/openSpecCli.ts +180 -0
- package/integrations/sdd/policy.ts +190 -0
- package/integrations/sdd/sessionStore.ts +152 -0
- package/integrations/sdd/types.ts +69 -0
- package/package.json +10 -4
- package/scripts/framework-menu-runner-path-lib.ts +10 -3
- package/scripts/framework-menu.ts +86 -5
- package/scripts/package-install-smoke-gate-lib.ts +6 -1
- package/scripts/package-install-smoke-lifecycle-lib.ts +3 -0
|
@@ -13,15 +13,83 @@ export * from './framework-menu-builders';
|
|
|
13
13
|
export { buildMenuGateParams } from './framework-menu-gate-lib';
|
|
14
14
|
export { formatActiveSkillsBundles } from './framework-menu-skills-lib';
|
|
15
15
|
|
|
16
|
+
type MenuMode = 'consumer' | 'advanced';
|
|
17
|
+
|
|
18
|
+
const CONSUMER_ACTION_IDS = new Set(['1', '2', '3', '7', '8', '27']);
|
|
19
|
+
|
|
20
|
+
const MENU_HELP: Readonly<Record<string, string>> = {
|
|
21
|
+
'1': 'Evalua solo los cambios staged (PRE_COMMIT).',
|
|
22
|
+
'2': 'Evalua upstream..HEAD (PRE_PUSH).',
|
|
23
|
+
'3': 'Evalua baseRef..HEAD (CI).',
|
|
24
|
+
'4': 'Ejecuta gate de iOS en modo CI.',
|
|
25
|
+
'5': 'Ejecuta gate de backend en modo CI.',
|
|
26
|
+
'6': 'Ejecuta gate de frontend en modo CI.',
|
|
27
|
+
'7': 'Muestra bundles activos de skills con version y hash.',
|
|
28
|
+
'8': 'Lee el .ai_evidence.json actual.',
|
|
29
|
+
'9': 'Genera reporte de estado de sesion del adapter.',
|
|
30
|
+
'10': 'Recolecta artefactos CI del consumidor.',
|
|
31
|
+
'11': 'Genera reporte de auth/check de CI del consumidor.',
|
|
32
|
+
'12': 'Ejecuta lint de workflows del consumidor.',
|
|
33
|
+
'13': 'Genera support bundle de startup-failure.',
|
|
34
|
+
'14': 'Genera borrador de ticket de soporte.',
|
|
35
|
+
'15': 'Genera reporte de startup-unblock status.',
|
|
36
|
+
'16': 'Genera reporte real-session del adapter.',
|
|
37
|
+
'17': 'Ejecuta docs hygiene check.',
|
|
38
|
+
'18': 'Verifica freshness de skills lock.',
|
|
39
|
+
'19': 'Ejecuta startup triage bundle del consumidor.',
|
|
40
|
+
'20': 'Genera reporte A/B del mock consumer.',
|
|
41
|
+
'21': 'Genera reporte de blockers readiness (phase5).',
|
|
42
|
+
'22': 'Genera adapter readiness report.',
|
|
43
|
+
'23': 'Genera execution closure status (phase5).',
|
|
44
|
+
'24': 'Ejecuta cierre phase5 one-shot.',
|
|
45
|
+
'25': 'Genera external handoff report (phase5).',
|
|
46
|
+
'26': 'Limpia artefactos locales de validacion.',
|
|
47
|
+
'27': 'Salir.',
|
|
48
|
+
};
|
|
49
|
+
|
|
16
50
|
const printActiveSkillsBundles = (): void => {
|
|
17
51
|
const rendered = loadAndFormatActiveSkillsBundles(process.cwd());
|
|
18
52
|
output.write(`\n${rendered}\n`);
|
|
19
53
|
};
|
|
20
54
|
|
|
55
|
+
const resolveInitialMenuMode = (): MenuMode => {
|
|
56
|
+
if (process.env.PUMUKI_MENU_MODE === 'advanced') {
|
|
57
|
+
return 'advanced';
|
|
58
|
+
}
|
|
59
|
+
return 'consumer';
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const filterVisibleActions = (
|
|
63
|
+
actions: ReadonlyArray<MenuAction>,
|
|
64
|
+
mode: MenuMode
|
|
65
|
+
): ReadonlyArray<MenuAction> => {
|
|
66
|
+
if (mode === 'advanced') {
|
|
67
|
+
return actions;
|
|
68
|
+
}
|
|
69
|
+
return actions.filter((action) => CONSUMER_ACTION_IDS.has(action.id));
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const printMenu = (actions: ReadonlyArray<MenuAction>, mode: MenuMode): void => {
|
|
73
|
+
const title = mode === 'advanced' ? 'Pumuki Framework Menu (Advanced)' : 'Pumuki Framework Menu (Consumer)';
|
|
74
|
+
output.write(`\n${title}\n`);
|
|
75
|
+
if (mode === 'consumer') {
|
|
76
|
+
output.write('A. Switch to advanced menu\n');
|
|
77
|
+
} else {
|
|
78
|
+
output.write('C. Switch to consumer menu\n');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (const action of actions) {
|
|
82
|
+
const help = MENU_HELP[action.id];
|
|
83
|
+
const suffix = help ? ` - ${help}` : '';
|
|
84
|
+
output.write(`${action.id}. ${action.label}${suffix}\n`);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
21
88
|
const menu = async (): Promise<void> => {
|
|
22
89
|
const rl = createInterface({ input, output });
|
|
23
90
|
|
|
24
91
|
try {
|
|
92
|
+
let mode: MenuMode = resolveInitialMenuMode();
|
|
25
93
|
const prompts = createFrameworkMenuPrompts(rl);
|
|
26
94
|
const actions: ReadonlyArray<MenuAction> = createFrameworkMenuActions({
|
|
27
95
|
prompts,
|
|
@@ -32,15 +100,28 @@ const menu = async (): Promise<void> => {
|
|
|
32
100
|
});
|
|
33
101
|
|
|
34
102
|
while (true) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
103
|
+
const visibleActions = filterVisibleActions(actions, mode);
|
|
104
|
+
printMenu(visibleActions, mode);
|
|
105
|
+
const option = (await rl.question('\nSelect option: ')).trim();
|
|
106
|
+
const normalized = option.toUpperCase();
|
|
107
|
+
|
|
108
|
+
if (mode === 'consumer' && normalized === 'A') {
|
|
109
|
+
mode = 'advanced';
|
|
110
|
+
continue;
|
|
38
111
|
}
|
|
39
112
|
|
|
40
|
-
|
|
41
|
-
|
|
113
|
+
if (mode === 'advanced' && normalized === 'C') {
|
|
114
|
+
mode = 'consumer';
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const selected = visibleActions.find((action) => action.id === option);
|
|
42
119
|
|
|
43
120
|
if (!selected) {
|
|
121
|
+
if (mode === 'consumer' && actions.some((action) => action.id === option)) {
|
|
122
|
+
output.write('Option available in advanced menu. Select A to switch.\n');
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
44
125
|
output.write('Invalid option.\n');
|
|
45
126
|
continue;
|
|
46
127
|
}
|
|
@@ -24,11 +24,16 @@ export const runGateStep = (
|
|
|
24
24
|
step: SmokeGateStep,
|
|
25
25
|
expectation: SmokeExpectation
|
|
26
26
|
): { outcome: string; exitCode: number } => {
|
|
27
|
+
const gateEnv: NodeJS.ProcessEnv = {
|
|
28
|
+
PUMUKI_SDD_BYPASS: '1',
|
|
29
|
+
...(step.label === 'ci' ? { GITHUB_BASE_REF: 'main' } : {}),
|
|
30
|
+
};
|
|
31
|
+
|
|
27
32
|
const result = runCommand({
|
|
28
33
|
cwd: workspace.consumerRepo,
|
|
29
34
|
executable: step.command,
|
|
30
35
|
args: step.args,
|
|
31
|
-
env:
|
|
36
|
+
env: gateEnv,
|
|
32
37
|
});
|
|
33
38
|
|
|
34
39
|
pushCommandLog(workspace.commandLog, result);
|
|
@@ -31,6 +31,9 @@ export const runLifecycleInstallStep = (workspace: SmokeWorkspace): void => {
|
|
|
31
31
|
cwd: workspace.consumerRepo,
|
|
32
32
|
executable: 'npx',
|
|
33
33
|
args: ['--yes', 'pumuki', 'install'],
|
|
34
|
+
env: {
|
|
35
|
+
PUMUKI_SKIP_OPENSPEC_BOOTSTRAP: '1',
|
|
36
|
+
},
|
|
34
37
|
});
|
|
35
38
|
pushCommandLog(workspace.commandLog, result);
|
|
36
39
|
assertNoFatalOutput(result, 'pumuki lifecycle install');
|