@llm-dev-ops/agentics-cli 2.7.38 → 2.7.39
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/pipeline/auto-chain.d.ts.map +1 -1
- package/dist/pipeline/auto-chain.js +82 -6
- package/dist/pipeline/auto-chain.js.map +1 -1
- package/dist/pipeline/exemplars.d.ts +34 -0
- package/dist/pipeline/exemplars.d.ts.map +1 -0
- package/dist/pipeline/exemplars.js +101 -0
- package/dist/pipeline/exemplars.js.map +1 -0
- package/dist/pipeline/output-validator.d.ts +38 -0
- package/dist/pipeline/output-validator.d.ts.map +1 -0
- package/dist/pipeline/output-validator.js +152 -0
- package/dist/pipeline/output-validator.js.map +1 -0
- package/dist/pipeline/phase2/phases/adr-generator.d.ts.map +1 -1
- package/dist/pipeline/phase2/phases/adr-generator.js +21 -3
- package/dist/pipeline/phase2/phases/adr-generator.js.map +1 -1
- package/dist/pipeline/phase4-adrs/phase4-adrs-coordinator.d.ts.map +1 -1
- package/dist/pipeline/phase4-adrs/phase4-adrs-coordinator.js +17 -5
- package/dist/pipeline/phase4-adrs/phase4-adrs-coordinator.js.map +1 -1
- package/dist/pipeline/ruflo-phase-executor.d.ts.map +1 -1
- package/dist/pipeline/ruflo-phase-executor.js +52 -60
- package/dist/pipeline/ruflo-phase-executor.js.map +1 -1
- package/docs/templates/ADR-Good-Example.md +787 -0
- package/docs/templates/Implementation-Prompts-Good-Example.md +1158 -0
- package/docs/templates/promotion-changelog.md +94 -0
- package/docs/templates/regression-changelog.md +86 -0
- package/docs/templates/sparc-specification-good-example.md +600 -0
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-chain.d.ts","sourceRoot":"","sources":["../../src/pipeline/auto-chain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAYH,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,wBAAwB,CAAC;AAYhC,OAAO,EAgBL,KAAK,2BAA2B,EAEjC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAGL,KAAK,OAAO,IAAI,WAAW,EAE3B,KAAK,YAAY,EAClB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-chain.d.ts","sourceRoot":"","sources":["../../src/pipeline/auto-chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,7 @@ import { detectExecutionMode, commitScenarioFiles, } from './execution-context.j
|
|
|
26
26
|
import { initSwarm, dispatchPhaseAgents, storePhaseArtifacts, reviewPhaseOutput, recordPhaseFailure, shutdownSwarm, invokeRufloCodingSwarm, PHASE_AGENTS, } from './swarm-orchestrator.js';
|
|
27
27
|
import { executeRufloPhaseSwarm, buildPhase2Tasks, buildPhase3Tasks, buildPhase4Tasks, buildPhase5Tasks, buildPhase6Tasks, collectPhase2Artifacts, collectPhase3Artifacts, collectPhase4Artifacts, collectPhase5Artifacts, collectPhase6Artifacts, extractPhase1AgentCode, runPrimaryPhaseExecution, } from './ruflo-phase-executor.js';
|
|
28
28
|
import { gatePhaseInputs, determineBlockedPhases, } from './gate/phase-dependency-gate.js';
|
|
29
|
+
import { validateSparc, validateAdrDir, validateImplementationPrompts, logStructuralFailures, } from './output-validator.js';
|
|
29
30
|
/** Extract path strings from any manifest artifact array (objects with .path or plain strings). */
|
|
30
31
|
function extractArtifactPaths(artifacts) {
|
|
31
32
|
return artifacts.map(a => typeof a === 'string' ? a : a.path);
|
|
@@ -2396,8 +2397,21 @@ async function ensureAdrsExist(runDir, traceId, scenarioQuery) {
|
|
|
2396
2397
|
// Write to BOTH phase4 and phase2 so downstream consumers find them regardless of which path they check
|
|
2397
2398
|
for (const targetDir of [path.join(runDir, 'phase4'), path.join(runDir, 'phase2')]) {
|
|
2398
2399
|
const adrDir = path.join(targetDir, 'adrs');
|
|
2399
|
-
|
|
2400
|
-
|
|
2400
|
+
try {
|
|
2401
|
+
fs.mkdirSync(adrDir, { recursive: true });
|
|
2402
|
+
}
|
|
2403
|
+
catch (mkdirErr) {
|
|
2404
|
+
console.error(` [ADR WRITE FAILED] mkdir ${adrDir}: ${mkdirErr instanceof Error ? mkdirErr.message : String(mkdirErr)}`);
|
|
2405
|
+
throw mkdirErr;
|
|
2406
|
+
}
|
|
2407
|
+
const indexPath = path.join(adrDir, 'adr-index.json');
|
|
2408
|
+
try {
|
|
2409
|
+
fs.writeFileSync(indexPath, JSON.stringify(adrs, null, 2) + '\n', 'utf-8');
|
|
2410
|
+
}
|
|
2411
|
+
catch (writeErr) {
|
|
2412
|
+
console.error(` [ADR WRITE FAILED] index ${indexPath}: ${writeErr instanceof Error ? writeErr.message : String(writeErr)}`);
|
|
2413
|
+
throw writeErr;
|
|
2414
|
+
}
|
|
2401
2415
|
for (const adr of adrs) {
|
|
2402
2416
|
const slug = (adr.title || 'untitled').toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 60);
|
|
2403
2417
|
const md = [
|
|
@@ -2409,7 +2423,14 @@ async function ensureAdrsExist(runDir, traceId, scenarioQuery) {
|
|
|
2409
2423
|
adr.alternatives?.length > 0 ? `\n## Alternatives Considered\n${adr.alternatives.map((a) => `- **${a.option}** ${a.rejected ? '(rejected)' : '(selected)'}: ${a.rationale}`).join('\n')}` : '',
|
|
2410
2424
|
adr.consequences?.length > 0 ? `\n## Consequences\n${adr.consequences.map((c) => `- [${c.type === 'positive' ? '+' : c.type === 'negative' ? '-' : '~'}] ${c.description}`).join('\n')}` : '',
|
|
2411
2425
|
].filter(Boolean).join('\n');
|
|
2412
|
-
|
|
2426
|
+
const adrPath = path.join(adrDir, `${adr.id}-${slug}.md`);
|
|
2427
|
+
try {
|
|
2428
|
+
fs.writeFileSync(adrPath, md + '\n', 'utf-8');
|
|
2429
|
+
}
|
|
2430
|
+
catch (writeErr) {
|
|
2431
|
+
console.error(` [ADR WRITE FAILED] ${adrPath}: ${writeErr instanceof Error ? writeErr.message : String(writeErr)}`);
|
|
2432
|
+
throw writeErr;
|
|
2433
|
+
}
|
|
2413
2434
|
}
|
|
2414
2435
|
}
|
|
2415
2436
|
console.error(` [ADR-028] Generated ${adrs.length} ADRs (phase4/adrs/ + phase2/adrs/)`);
|
|
@@ -2682,6 +2703,21 @@ export async function executeAutoChain(traceId, options = {}) {
|
|
|
2682
2703
|
await reviewPhaseOutput(PHASE_AGENTS[3], traceId, runDir);
|
|
2683
2704
|
persistAgenticsResults(phaseDir, agentResults);
|
|
2684
2705
|
phases.push({ phase: 3, label: 'SPARC + London TDD', status: 'completed', timing, artifacts: artifactPaths, outputDir: phaseDir, agenticsAgents: buildAgentSummary(agentResults, PHASE_AGENTS[3].agenticsServices.length) });
|
|
2706
|
+
// ADR-PIPELINE-101 §harness — structural check on SPARC output.
|
|
2707
|
+
{
|
|
2708
|
+
const sparcCandidates = [
|
|
2709
|
+
path.join(runDir, 'engineering', 'sparc-specification.md'),
|
|
2710
|
+
path.join(runDir, 'plans', 'SPARC_SPECIFICATION.md'),
|
|
2711
|
+
path.join(phaseDir, 'sparc-combined.md'),
|
|
2712
|
+
];
|
|
2713
|
+
const sparcPath = sparcCandidates.find((p) => fs.existsSync(p));
|
|
2714
|
+
if (sparcPath) {
|
|
2715
|
+
logStructuralFailures([validateSparc(sparcPath)], 'Phase 3 (SPARC)');
|
|
2716
|
+
}
|
|
2717
|
+
else {
|
|
2718
|
+
process.stderr.write(` [STRUCTURE FAIL] Phase 3 (SPARC): no SPARC file found at any of ${sparcCandidates.join(' | ')}\n`);
|
|
2719
|
+
}
|
|
2720
|
+
}
|
|
2685
2721
|
copyPlanningArtifacts(runDir, projectRoot);
|
|
2686
2722
|
}
|
|
2687
2723
|
catch (err) {
|
|
@@ -2801,6 +2837,22 @@ export async function executeAutoChain(traceId, options = {}) {
|
|
|
2801
2837
|
await reviewPhaseOutput(PHASE_AGENTS[4], traceId, runDir);
|
|
2802
2838
|
persistAgenticsResults(phaseDir, agentResults);
|
|
2803
2839
|
phases.push({ phase: 4, label: 'ADRs + DDDs', status: 'completed', timing, artifacts: artifactPaths, outputDir: phaseDir, agenticsAgents: buildAgentSummary(agentResults, PHASE_AGENTS[4].agenticsServices.length) });
|
|
2840
|
+
// ADR-PIPELINE-101 §harness — structural check on every emitted ADR.
|
|
2841
|
+
{
|
|
2842
|
+
const adrDirCandidates = [
|
|
2843
|
+
path.join(phaseDir, 'adrs'),
|
|
2844
|
+
path.join(runDir, 'phase4', 'adrs'),
|
|
2845
|
+
path.join(runDir, 'phase2', 'adrs'),
|
|
2846
|
+
path.join(runDir, 'plans', 'adrs'),
|
|
2847
|
+
];
|
|
2848
|
+
const adrDir = adrDirCandidates.find((d) => fs.existsSync(d));
|
|
2849
|
+
if (adrDir) {
|
|
2850
|
+
logStructuralFailures(validateAdrDir(adrDir), 'Phase 4 (ADRs)');
|
|
2851
|
+
}
|
|
2852
|
+
else {
|
|
2853
|
+
process.stderr.write(` [STRUCTURE FAIL] Phase 4 (ADRs): no adrs/ directory found at any of ${adrDirCandidates.join(' | ')}\n`);
|
|
2854
|
+
}
|
|
2855
|
+
}
|
|
2804
2856
|
copyPlanningArtifacts(runDir, projectRoot);
|
|
2805
2857
|
}
|
|
2806
2858
|
catch (err) {
|
|
@@ -2873,7 +2925,13 @@ export async function executeAutoChain(traceId, options = {}) {
|
|
|
2873
2925
|
})];
|
|
2874
2926
|
if (adrs.length > 0) {
|
|
2875
2927
|
const adrDir = path.join(phaseDir, 'adrs');
|
|
2876
|
-
|
|
2928
|
+
try {
|
|
2929
|
+
fs.mkdirSync(adrDir, { recursive: true });
|
|
2930
|
+
}
|
|
2931
|
+
catch (mkdirErr) {
|
|
2932
|
+
console.error(` [ADR WRITE FAILED] mkdir ${adrDir}: ${mkdirErr instanceof Error ? mkdirErr.message : String(mkdirErr)}`);
|
|
2933
|
+
throw mkdirErr;
|
|
2934
|
+
}
|
|
2877
2935
|
for (const adr of adrs) {
|
|
2878
2936
|
const slug = (adr.title || 'untitled').toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 60);
|
|
2879
2937
|
const filename = `${adr.id}-${slug}.md`;
|
|
@@ -2886,9 +2944,23 @@ export async function executeAutoChain(traceId, options = {}) {
|
|
|
2886
2944
|
adr.alternatives?.length > 0 ? `\n## Alternatives Considered\n${adr.alternatives.map((a) => `- **${a.option}** ${a.rejected ? '(rejected)' : '(selected)'}: ${a.rationale}`).join('\n')}` : '',
|
|
2887
2945
|
adr.consequences?.length > 0 ? `\n## Consequences\n${adr.consequences.map((c) => `- [${c.type === 'positive' ? '+' : c.type === 'negative' ? '-' : '~'}] ${c.description}`).join('\n')}` : '',
|
|
2888
2946
|
].filter(Boolean).join('\n');
|
|
2889
|
-
|
|
2947
|
+
const adrPath = path.join(adrDir, filename);
|
|
2948
|
+
try {
|
|
2949
|
+
fs.writeFileSync(adrPath, md + '\n', 'utf-8');
|
|
2950
|
+
}
|
|
2951
|
+
catch (writeErr) {
|
|
2952
|
+
console.error(` [ADR WRITE FAILED] ${adrPath}: ${writeErr instanceof Error ? writeErr.message : String(writeErr)}`);
|
|
2953
|
+
throw writeErr;
|
|
2954
|
+
}
|
|
2955
|
+
}
|
|
2956
|
+
const indexPath = path.join(adrDir, 'adr-index.json');
|
|
2957
|
+
try {
|
|
2958
|
+
fs.writeFileSync(indexPath, JSON.stringify(adrs, null, 2) + '\n', 'utf-8');
|
|
2959
|
+
}
|
|
2960
|
+
catch (writeErr) {
|
|
2961
|
+
console.error(` [ADR WRITE FAILED] index ${indexPath}: ${writeErr instanceof Error ? writeErr.message : String(writeErr)}`);
|
|
2962
|
+
throw writeErr;
|
|
2890
2963
|
}
|
|
2891
|
-
fs.writeFileSync(path.join(adrDir, 'adr-index.json'), JSON.stringify(adrs, null, 2) + '\n', 'utf-8');
|
|
2892
2964
|
console.error(` [RECOVER] Generated ${adrs.length} ADRs from SPARC template`);
|
|
2893
2965
|
}
|
|
2894
2966
|
// Generate DDD
|
|
@@ -4191,6 +4263,10 @@ services when the pilot validates the approach.
|
|
|
4191
4263
|
catch {
|
|
4192
4264
|
implFileCount = 0;
|
|
4193
4265
|
}
|
|
4266
|
+
// ADR-PIPELINE-101 §harness — structural check on implementation prompts.
|
|
4267
|
+
// Logged BEFORE the FATAL gate below so operators see the failure detail
|
|
4268
|
+
// even if the gate then aborts the run.
|
|
4269
|
+
logStructuralFailures([validateImplementationPrompts(promotedPromptsDir, 10)], 'Phase 5a (Implementation Prompts)');
|
|
4194
4270
|
if (!hasValidPlan || implFileCount < 1) {
|
|
4195
4271
|
const missingList = [];
|
|
4196
4272
|
if (!hasValidPlan)
|