@cleocode/core 2026.4.4 → 2026.4.6
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/discovery.d.ts +69 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1643 -2349
- package/dist/index.js.map +4 -4
- package/dist/init.d.ts +51 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/internal.d.ts +9 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/lifecycle/default-chain.d.ts +8 -2
- package/dist/lifecycle/default-chain.d.ts.map +1 -1
- package/dist/lifecycle/index.d.ts +1 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/stage-guidance.d.ts +140 -0
- package/dist/lifecycle/stage-guidance.d.ts.map +1 -0
- package/dist/orchestration/protocol-validators.d.ts +122 -3
- package/dist/orchestration/protocol-validators.d.ts.map +1 -1
- package/dist/paths.d.ts +91 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/scaffold.d.ts +31 -1
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/skills/dispatch.d.ts +1 -1
- package/dist/skills/skill-paths.d.ts +9 -6
- package/dist/skills/skill-paths.d.ts.map +1 -1
- package/dist/validation/protocols/_shared.d.ts +40 -0
- package/dist/validation/protocols/_shared.d.ts.map +1 -0
- package/dist/validation/protocols/architecture-decision.d.ts +23 -0
- package/dist/validation/protocols/architecture-decision.d.ts.map +1 -0
- package/dist/validation/protocols/artifact-publish.d.ts +22 -0
- package/dist/validation/protocols/artifact-publish.d.ts.map +1 -0
- package/dist/validation/protocols/consensus.d.ts +11 -17
- package/dist/validation/protocols/consensus.d.ts.map +1 -1
- package/dist/validation/protocols/contribution.d.ts +12 -17
- package/dist/validation/protocols/contribution.d.ts.map +1 -1
- package/dist/validation/protocols/decomposition.d.ts +18 -21
- package/dist/validation/protocols/decomposition.d.ts.map +1 -1
- package/dist/validation/protocols/implementation.d.ts +9 -17
- package/dist/validation/protocols/implementation.d.ts.map +1 -1
- package/dist/validation/protocols/provenance.d.ts +23 -0
- package/dist/validation/protocols/provenance.d.ts.map +1 -0
- package/dist/validation/protocols/release.d.ts +25 -0
- package/dist/validation/protocols/release.d.ts.map +1 -0
- package/dist/validation/protocols/research.d.ts +9 -17
- package/dist/validation/protocols/research.d.ts.map +1 -1
- package/dist/validation/protocols/specification.d.ts +7 -17
- package/dist/validation/protocols/specification.d.ts.map +1 -1
- package/dist/validation/protocols/testing.d.ts +22 -0
- package/dist/validation/protocols/testing.d.ts.map +1 -0
- package/dist/validation/protocols/validation.d.ts +22 -0
- package/dist/validation/protocols/validation.d.ts.map +1 -0
- package/package.json +7 -7
- package/src/__tests__/injection-mvi-tiers.test.js +54 -90
- package/src/__tests__/injection-mvi-tiers.test.js.map +1 -1
- package/src/discovery.ts +235 -0
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js +3 -1
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js.map +1 -1
- package/src/index.ts +16 -0
- package/src/init.ts +196 -0
- package/src/internal.ts +31 -1
- package/src/lifecycle/default-chain.ts +11 -2
- package/src/lifecycle/index.ts +10 -0
- package/src/lifecycle/stage-guidance.ts +282 -0
- package/src/metrics/__tests__/provider-detection.test.js +19 -7
- package/src/metrics/__tests__/provider-detection.test.js.map +1 -1
- package/src/metrics/__tests__/provider-detection.test.ts +19 -7
- package/src/orchestration/__tests__/protocol-validators.test.js +228 -8
- package/src/orchestration/__tests__/protocol-validators.test.js.map +1 -1
- package/src/orchestration/__tests__/protocol-validators.test.ts +259 -7
- package/src/orchestration/protocol-validators.ts +419 -4
- package/src/paths.ts +110 -0
- package/src/scaffold.ts +240 -4
- package/src/skills/dispatch.ts +6 -6
- package/src/skills/skill-paths.ts +27 -23
- package/src/validation/protocols/_shared.ts +88 -0
- package/src/validation/protocols/architecture-decision.ts +52 -0
- package/src/validation/protocols/artifact-publish.ts +49 -0
- package/src/validation/protocols/consensus.ts +44 -74
- package/src/validation/protocols/contribution.ts +28 -65
- package/src/validation/protocols/decomposition.ts +37 -64
- package/src/validation/protocols/implementation.ts +25 -65
- package/src/validation/protocols/protocols-markdown/architecture-decision.md +303 -0
- package/src/validation/protocols/protocols-markdown/artifact-publish.md +600 -0
- package/src/validation/protocols/protocols-markdown/consensus.md +322 -0
- package/src/validation/protocols/protocols-markdown/contribution.md +388 -0
- package/src/validation/protocols/protocols-markdown/decomposition.md +421 -0
- package/src/validation/protocols/protocols-markdown/implementation.md +357 -0
- package/src/validation/protocols/protocols-markdown/provenance.md +613 -0
- package/src/validation/protocols/protocols-markdown/release.md +783 -0
- package/src/validation/protocols/protocols-markdown/research.md +261 -0
- package/src/validation/protocols/protocols-markdown/specification.md +300 -0
- package/src/validation/protocols/protocols-markdown/testing.md +287 -0
- package/src/validation/protocols/protocols-markdown/validation.md +242 -0
- package/src/validation/protocols/provenance.ts +50 -0
- package/src/validation/protocols/release.ts +44 -0
- package/src/validation/protocols/research.ts +25 -87
- package/src/validation/protocols/specification.ts +27 -89
- package/src/validation/protocols/testing.ts +46 -0
- package/src/validation/protocols/validation.ts +46 -0
- package/dist/validation/protocols/release-protocol.d.ts +0 -27
- package/dist/validation/protocols/release-protocol.d.ts.map +0 -1
- package/dist/validation/protocols/testing-protocol.d.ts +0 -27
- package/dist/validation/protocols/testing-protocol.d.ts.map +0 -1
- package/dist/validation/protocols/validation-protocol.d.ts +0 -27
- package/dist/validation/protocols/validation-protocol.d.ts.map +0 -1
- package/schemas/agent-configs.schema.json +0 -120
- package/schemas/agent-registry.schema.json +0 -132
- package/schemas/archive.schema.json +0 -450
- package/schemas/brain-decision.schema.json +0 -69
- package/schemas/brain-learning.schema.json +0 -57
- package/schemas/brain-pattern.schema.json +0 -72
- package/schemas/critical-path.schema.json +0 -246
- package/schemas/deps-cache.schema.json +0 -97
- package/schemas/doctor-output.schema.json +0 -283
- package/schemas/error.schema.json +0 -161
- package/schemas/global-config.schema.json +0 -219
- package/schemas/grade.schema.json +0 -49
- package/schemas/log.schema.json +0 -250
- package/schemas/metrics.schema.json +0 -328
- package/schemas/migrations.schema.json +0 -150
- package/schemas/nexus-registry.schema.json +0 -90
- package/schemas/operation-constitution.schema.json +0 -438
- package/schemas/output.schema.json +0 -164
- package/schemas/projects-registry.schema.json +0 -107
- package/schemas/protocol-frontmatter.schema.json +0 -72
- package/schemas/rcasd-consensus-report.schema.json +0 -10
- package/schemas/rcasd-evidence.schema.json +0 -42
- package/schemas/rcasd-gate-result.schema.json +0 -46
- package/schemas/rcasd-hitl-resolution.schema.json +0 -10
- package/schemas/rcasd-index.schema.json +0 -10
- package/schemas/rcasd-manifest.schema.json +0 -10
- package/schemas/rcasd-research-output.schema.json +0 -10
- package/schemas/rcasd-spec-frontmatter.schema.json +0 -10
- package/schemas/rcasd-stage-transition.schema.json +0 -38
- package/schemas/releases.schema.json +0 -267
- package/schemas/skills-manifest.schema.json +0 -91
- package/schemas/spec-index.schema.json +0 -196
- package/schemas/system-flow-atlas.schema.json +0 -125
- package/src/conduit/__tests__/dual-api-e2e.test.d.ts.map +0 -1
- package/src/conduit/__tests__/dual-api-e2e.test.js +0 -178
- package/src/conduit/__tests__/dual-api-e2e.test.js.map +0 -1
- package/src/conduit/__tests__/dual-api-e2e.test.ts +0 -212
- package/src/validation/protocols/release-protocol.ts +0 -80
- package/src/validation/protocols/testing-protocol.ts +0 -93
- package/src/validation/protocols/validation-protocol.ts +0 -93
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
PROTOCOL_EXIT_CODES,
|
|
15
15
|
PROTOCOL_TYPES,
|
|
16
16
|
type ProtocolType,
|
|
17
|
+
validateArchitectureDecisionProtocol,
|
|
17
18
|
validateArtifactPublishProtocol,
|
|
18
19
|
validateConsensusProtocol,
|
|
19
20
|
validateContributionProtocol,
|
|
@@ -24,6 +25,8 @@ import {
|
|
|
24
25
|
validateReleaseProtocol,
|
|
25
26
|
validateResearchProtocol,
|
|
26
27
|
validateSpecificationProtocol,
|
|
28
|
+
validateTestingProtocol,
|
|
29
|
+
validateValidationProtocol,
|
|
27
30
|
} from '../protocol-validators.js';
|
|
28
31
|
|
|
29
32
|
// ============================================================
|
|
@@ -399,15 +402,253 @@ describe('Provenance Protocol', () => {
|
|
|
399
402
|
});
|
|
400
403
|
});
|
|
401
404
|
|
|
405
|
+
// ============================================================
|
|
406
|
+
// 10. ARCHITECTURE DECISION RECORD PROTOCOL (exit code 84)
|
|
407
|
+
// ============================================================
|
|
408
|
+
|
|
409
|
+
describe('Architecture Decision Record Protocol', () => {
|
|
410
|
+
const adrEntry = (
|
|
411
|
+
overrides: Partial<ManifestEntryInput & { consensus_manifest_id?: string }> = {},
|
|
412
|
+
) => ({
|
|
413
|
+
...validEntry('decision'),
|
|
414
|
+
consensus_manifest_id: 'manifest_consensus_2026_04_07',
|
|
415
|
+
...overrides,
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
it('passes a complete ADR entry', () => {
|
|
419
|
+
const result = validateArchitectureDecisionProtocol(adrEntry(), {
|
|
420
|
+
status: 'proposed',
|
|
421
|
+
adrContent: '## Context\n## Options Evaluated\n## Decision\n## Rationale\n## Consequences\n',
|
|
422
|
+
persistedInDb: true,
|
|
423
|
+
});
|
|
424
|
+
expect(result.valid).toBe(true);
|
|
425
|
+
expect(result.protocol).toBe('architecture-decision');
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
it('fails without a consensus manifest link (ADR-001)', () => {
|
|
429
|
+
const result = validateArchitectureDecisionProtocol(
|
|
430
|
+
adrEntry({ consensus_manifest_id: undefined }),
|
|
431
|
+
);
|
|
432
|
+
expect(result.valid).toBe(false);
|
|
433
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-001' }));
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
it('fails when accepted without HITL review (ADR-003)', () => {
|
|
437
|
+
const result = validateArchitectureDecisionProtocol(adrEntry(), {
|
|
438
|
+
status: 'accepted',
|
|
439
|
+
hitlReviewed: false,
|
|
440
|
+
adrContent: '## Context\n## Options\n## Decision\n## Rationale\n## Consequences\n',
|
|
441
|
+
persistedInDb: true,
|
|
442
|
+
});
|
|
443
|
+
expect(result.valid).toBe(false);
|
|
444
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-003' }));
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
it('fails when required sections are missing (ADR-004)', () => {
|
|
448
|
+
const result = validateArchitectureDecisionProtocol(adrEntry(), {
|
|
449
|
+
status: 'proposed',
|
|
450
|
+
adrContent: '## Context only',
|
|
451
|
+
persistedInDb: true,
|
|
452
|
+
});
|
|
453
|
+
expect(result.valid).toBe(false);
|
|
454
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-004' }));
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
it('fails superseded ADR without downstream flag (ADR-005)', () => {
|
|
458
|
+
const result = validateArchitectureDecisionProtocol(adrEntry(), {
|
|
459
|
+
status: 'superseded',
|
|
460
|
+
downstreamFlagged: false,
|
|
461
|
+
adrContent: '## Context\n## Options\n## Decision\n## Rationale\n## Consequences\n',
|
|
462
|
+
persistedInDb: true,
|
|
463
|
+
});
|
|
464
|
+
expect(result.valid).toBe(false);
|
|
465
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-005' }));
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
it('fails when not persisted in SQLite (ADR-006)', () => {
|
|
469
|
+
const result = validateArchitectureDecisionProtocol(adrEntry(), {
|
|
470
|
+
status: 'proposed',
|
|
471
|
+
persistedInDb: false,
|
|
472
|
+
adrContent: '## Context\n## Options\n## Decision\n## Rationale\n## Consequences\n',
|
|
473
|
+
});
|
|
474
|
+
expect(result.valid).toBe(false);
|
|
475
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-006' }));
|
|
476
|
+
});
|
|
477
|
+
|
|
478
|
+
it('fails with wrong agent_type (ADR-007)', () => {
|
|
479
|
+
const result = validateArchitectureDecisionProtocol(adrEntry({ agent_type: 'specification' }));
|
|
480
|
+
expect(result.valid).toBe(false);
|
|
481
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-007' }));
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
// ============================================================
|
|
486
|
+
// 11. VALIDATION PROTOCOL (exit code 80)
|
|
487
|
+
// ============================================================
|
|
488
|
+
|
|
489
|
+
describe('Validation Protocol', () => {
|
|
490
|
+
it('passes a complete validation entry', () => {
|
|
491
|
+
const result = validateValidationProtocol(validEntry('validation'), {
|
|
492
|
+
specMatchConfirmed: true,
|
|
493
|
+
testSuitePassed: true,
|
|
494
|
+
protocolComplianceChecked: true,
|
|
495
|
+
});
|
|
496
|
+
expect(result.valid).toBe(true);
|
|
497
|
+
expect(result.protocol).toBe('validation');
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
it('fails when spec-match not confirmed (VALID-001)', () => {
|
|
501
|
+
const result = validateValidationProtocol(validEntry('validation'), {
|
|
502
|
+
specMatchConfirmed: false,
|
|
503
|
+
});
|
|
504
|
+
expect(result.valid).toBe(false);
|
|
505
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'VALID-001' }));
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
it('fails when test suite failed (VALID-002)', () => {
|
|
509
|
+
const result = validateValidationProtocol(validEntry('validation'), {
|
|
510
|
+
testSuitePassed: false,
|
|
511
|
+
});
|
|
512
|
+
expect(result.valid).toBe(false);
|
|
513
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'VALID-002' }));
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
it('fails without key_findings (VALID-005)', () => {
|
|
517
|
+
const result = validateValidationProtocol(validEntry('validation', { key_findings: [] }));
|
|
518
|
+
expect(result.valid).toBe(false);
|
|
519
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'VALID-005' }));
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
it('fails with wrong agent_type (VALID-006)', () => {
|
|
523
|
+
const result = validateValidationProtocol(validEntry('implementation'));
|
|
524
|
+
expect(result.valid).toBe(false);
|
|
525
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'VALID-006' }));
|
|
526
|
+
});
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
// ============================================================
|
|
530
|
+
// 12. TESTING PROTOCOL (project-agnostic IVT loop)
|
|
531
|
+
// ============================================================
|
|
532
|
+
|
|
533
|
+
describe('Testing Protocol', () => {
|
|
534
|
+
it('passes a complete testing entry with any framework', () => {
|
|
535
|
+
const result = validateTestingProtocol(validEntry('testing'), {
|
|
536
|
+
framework: 'vitest',
|
|
537
|
+
testsRun: 42,
|
|
538
|
+
testsPassed: 42,
|
|
539
|
+
testsFailed: 0,
|
|
540
|
+
ivtLoopConverged: true,
|
|
541
|
+
});
|
|
542
|
+
expect(result.valid).toBe(true);
|
|
543
|
+
expect(result.protocol).toBe('testing');
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
it('is project-agnostic — accepts any supported framework', () => {
|
|
547
|
+
const frameworks = [
|
|
548
|
+
'vitest',
|
|
549
|
+
'jest',
|
|
550
|
+
'pytest',
|
|
551
|
+
'go-test',
|
|
552
|
+
'cargo-test',
|
|
553
|
+
'rspec',
|
|
554
|
+
'bats',
|
|
555
|
+
'other',
|
|
556
|
+
] as const;
|
|
557
|
+
for (const framework of frameworks) {
|
|
558
|
+
const result = validateTestingProtocol(validEntry('testing'), {
|
|
559
|
+
framework,
|
|
560
|
+
testsRun: 1,
|
|
561
|
+
testsPassed: 1,
|
|
562
|
+
testsFailed: 0,
|
|
563
|
+
ivtLoopConverged: true,
|
|
564
|
+
});
|
|
565
|
+
expect(result.valid).toBe(true);
|
|
566
|
+
}
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
it('fails without a detected framework (TEST-001)', () => {
|
|
570
|
+
const result = validateTestingProtocol(validEntry('testing'), {
|
|
571
|
+
testsRun: 10,
|
|
572
|
+
testsPassed: 10,
|
|
573
|
+
testsFailed: 0,
|
|
574
|
+
ivtLoopConverged: true,
|
|
575
|
+
});
|
|
576
|
+
expect(result.valid).toBe(false);
|
|
577
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'TEST-001' }));
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
it('fails when tests failed (TEST-004)', () => {
|
|
581
|
+
const result = validateTestingProtocol(validEntry('testing'), {
|
|
582
|
+
framework: 'vitest',
|
|
583
|
+
testsRun: 10,
|
|
584
|
+
testsPassed: 8,
|
|
585
|
+
testsFailed: 2,
|
|
586
|
+
ivtLoopConverged: false,
|
|
587
|
+
});
|
|
588
|
+
expect(result.valid).toBe(false);
|
|
589
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'TEST-004' }));
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
it('fails when IVT loop has not converged (TEST-005)', () => {
|
|
593
|
+
const result = validateTestingProtocol(validEntry('testing'), {
|
|
594
|
+
framework: 'vitest',
|
|
595
|
+
ivtLoopConverged: false,
|
|
596
|
+
});
|
|
597
|
+
expect(result.valid).toBe(false);
|
|
598
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'TEST-005' }));
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
it('warns on coverage below threshold (non-blocking)', () => {
|
|
602
|
+
const result = validateTestingProtocol(validEntry('testing'), {
|
|
603
|
+
framework: 'vitest',
|
|
604
|
+
testsRun: 10,
|
|
605
|
+
testsPassed: 10,
|
|
606
|
+
testsFailed: 0,
|
|
607
|
+
ivtLoopConverged: true,
|
|
608
|
+
coveragePercent: 70,
|
|
609
|
+
coverageThreshold: 80,
|
|
610
|
+
});
|
|
611
|
+
expect(result.violations).toContainEqual(
|
|
612
|
+
expect.objectContaining({ requirement: 'TEST-004', severity: 'warning' }),
|
|
613
|
+
);
|
|
614
|
+
});
|
|
615
|
+
|
|
616
|
+
it('fails with wrong agent_type (TEST-007)', () => {
|
|
617
|
+
const result = validateTestingProtocol(validEntry('implementation'), {
|
|
618
|
+
framework: 'vitest',
|
|
619
|
+
ivtLoopConverged: true,
|
|
620
|
+
});
|
|
621
|
+
expect(result.valid).toBe(false);
|
|
622
|
+
expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'TEST-007' }));
|
|
623
|
+
});
|
|
624
|
+
});
|
|
625
|
+
|
|
402
626
|
// ============================================================
|
|
403
627
|
// UNIFIED DISPATCHER
|
|
404
628
|
// ============================================================
|
|
405
629
|
|
|
406
630
|
describe('validateProtocol (unified dispatcher)', () => {
|
|
407
|
-
it('dispatches to all
|
|
631
|
+
it('dispatches to all 12 protocols', () => {
|
|
408
632
|
for (const protocol of PROTOCOL_TYPES) {
|
|
409
|
-
|
|
410
|
-
const
|
|
633
|
+
// Map protocol name to expected agent_type
|
|
634
|
+
const agentTypeMap: Record<ProtocolType, string> = {
|
|
635
|
+
research: 'research',
|
|
636
|
+
consensus: 'analysis',
|
|
637
|
+
'architecture-decision': 'decision',
|
|
638
|
+
specification: 'specification',
|
|
639
|
+
decomposition: 'decomposition',
|
|
640
|
+
implementation: 'implementation',
|
|
641
|
+
contribution: 'contribution',
|
|
642
|
+
validation: 'validation',
|
|
643
|
+
testing: 'testing',
|
|
644
|
+
release: 'release',
|
|
645
|
+
'artifact-publish': 'artifact-publish',
|
|
646
|
+
provenance: 'provenance',
|
|
647
|
+
};
|
|
648
|
+
const entry = {
|
|
649
|
+
...validEntry(agentTypeMap[protocol]),
|
|
650
|
+
consensus_manifest_id: 'mf_consensus_test',
|
|
651
|
+
};
|
|
411
652
|
// All should not throw without strict mode
|
|
412
653
|
const result = validateProtocol(protocol, entry);
|
|
413
654
|
expect(result.protocol).toBe(protocol);
|
|
@@ -420,7 +661,7 @@ describe('validateProtocol (unified dispatcher)', () => {
|
|
|
420
661
|
});
|
|
421
662
|
|
|
422
663
|
it('uses correct exit codes for each protocol', () => {
|
|
423
|
-
//
|
|
664
|
+
// Pipeline codes 60-67 + dedicated codes for cross-cutting protocols
|
|
424
665
|
const exitCodes = new Set(Object.values(PROTOCOL_EXIT_CODES));
|
|
425
666
|
expect(exitCodes.has(ExitCode.PROTOCOL_MISSING)).toBe(true); // 60
|
|
426
667
|
expect(exitCodes.has(ExitCode.INVALID_RETURN_MESSAGE)).toBe(true); // 61
|
|
@@ -430,6 +671,10 @@ describe('validateProtocol (unified dispatcher)', () => {
|
|
|
430
671
|
expect(exitCodes.has(ExitCode.HANDOFF_REQUIRED)).toBe(true); // 65
|
|
431
672
|
expect(exitCodes.has(ExitCode.RESUME_FAILED)).toBe(true); // 66
|
|
432
673
|
expect(exitCodes.has(ExitCode.CONCURRENT_SESSION)).toBe(true); // 67
|
|
674
|
+
expect(exitCodes.has(ExitCode.LIFECYCLE_GATE_FAILED)).toBe(true); // 80 (validation)
|
|
675
|
+
expect(exitCodes.has(ExitCode.PROVENANCE_REQUIRED)).toBe(true); // 84 (ADR)
|
|
676
|
+
expect(exitCodes.has(ExitCode.ARTIFACT_PUBLISH_FAILED)).toBe(true); // 88
|
|
677
|
+
expect(exitCodes.has(ExitCode.ATTESTATION_INVALID)).toBe(true); // 94
|
|
433
678
|
});
|
|
434
679
|
|
|
435
680
|
it('strict mode throws with correct exit code per protocol', () => {
|
|
@@ -441,7 +686,11 @@ describe('validateProtocol (unified dispatcher)', () => {
|
|
|
441
686
|
{ protocol: 'implementation', expectedCode: ExitCode.AUTONOMOUS_BOUNDARY },
|
|
442
687
|
{ protocol: 'contribution', expectedCode: ExitCode.HANDOFF_REQUIRED },
|
|
443
688
|
{ protocol: 'release', expectedCode: ExitCode.RESUME_FAILED },
|
|
444
|
-
{ protocol: '
|
|
689
|
+
{ protocol: 'testing', expectedCode: ExitCode.CONCURRENT_SESSION },
|
|
690
|
+
{ protocol: 'validation', expectedCode: ExitCode.LIFECYCLE_GATE_FAILED },
|
|
691
|
+
{ protocol: 'architecture-decision', expectedCode: ExitCode.PROVENANCE_REQUIRED },
|
|
692
|
+
{ protocol: 'artifact-publish', expectedCode: ExitCode.ARTIFACT_PUBLISH_FAILED },
|
|
693
|
+
{ protocol: 'provenance', expectedCode: ExitCode.ATTESTATION_INVALID },
|
|
445
694
|
];
|
|
446
695
|
|
|
447
696
|
for (const { protocol, expectedCode } of testCases) {
|
|
@@ -457,14 +706,17 @@ describe('validateProtocol (unified dispatcher)', () => {
|
|
|
457
706
|
}
|
|
458
707
|
});
|
|
459
708
|
|
|
460
|
-
it('PROTOCOL_TYPES contains all
|
|
461
|
-
expect(PROTOCOL_TYPES).toHaveLength(
|
|
709
|
+
it('PROTOCOL_TYPES contains all 12 protocols', () => {
|
|
710
|
+
expect(PROTOCOL_TYPES).toHaveLength(12);
|
|
462
711
|
expect(PROTOCOL_TYPES).toContain('research');
|
|
463
712
|
expect(PROTOCOL_TYPES).toContain('consensus');
|
|
713
|
+
expect(PROTOCOL_TYPES).toContain('architecture-decision');
|
|
464
714
|
expect(PROTOCOL_TYPES).toContain('specification');
|
|
465
715
|
expect(PROTOCOL_TYPES).toContain('decomposition');
|
|
466
716
|
expect(PROTOCOL_TYPES).toContain('implementation');
|
|
467
717
|
expect(PROTOCOL_TYPES).toContain('contribution');
|
|
718
|
+
expect(PROTOCOL_TYPES).toContain('validation');
|
|
719
|
+
expect(PROTOCOL_TYPES).toContain('testing');
|
|
468
720
|
expect(PROTOCOL_TYPES).toContain('release');
|
|
469
721
|
expect(PROTOCOL_TYPES).toContain('artifact-publish');
|
|
470
722
|
expect(PROTOCOL_TYPES).toContain('provenance');
|