@dzhechkov/p-replicator 1.6.0 → 1.10.0
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/.dz-manifest.json +92 -32
- package/CHANGELOG.md +176 -0
- package/README.md +106 -4
- package/package.json +4 -4
- package/sbom.json +181 -31
- package/src/commands/doctor.js +43 -31
- package/src/commands/verify.js +27 -2
- package/src/utils.js +27 -0
- package/templates/.claude/commands/myinsights.md +22 -5
- package/templates/.claude/commands/replicate.md +57 -1
- package/templates/.claude/hooks/check-docs-complete.cjs +202 -0
- package/templates/.claude/hooks/check-growth-trace.cjs +191 -0
- package/templates/.claude/hooks/check-ports.cjs +36 -4
- package/templates/.claude/hooks/statusline.cjs +16 -5
- package/templates/.claude/rules/replicate-pipeline.md +14 -4
- package/templates/.claude/rules/skill-interface-protocol.md +9 -0
- package/templates/.claude/skills/brutal-honesty-review/scripts/assess-code.sh +40 -7
- package/templates/.claude/skills/brutal-honesty-review/scripts/assess-tests.sh +38 -11
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/03-generate-p0.md +6 -4
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/08-skill-composition.md +2 -2
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/ddd-hooks-commands.md +40 -4
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle.md +2 -2
- package/templates/.claude/skills/requirements-validator/SKILL.md +52 -0
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/01-intelligence.md +4 -4
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/02-product-customers.md +2 -2
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/025-cjm-prototype.md +9 -1
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/03-market-competition.md +3 -3
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/04-business-finance.md +3 -3
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/05-growth-engine.md +132 -12
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/06-playbook-synthesis.md +1 -1
- package/templates/.claude/skills/sparc-prd-mini/SKILL.md +9 -9
- package/tests/snapshot/baseline.json +25 -23
- package/tests/unit/absence-is-not-emptiness.test.js +255 -0
- package/tests/unit/assess-scripts.test.js +150 -0
- package/tests/unit/check-docs-complete.test.js +292 -0
- package/tests/unit/check-growth-trace.test.js +188 -0
- package/tests/unit/check-ports.test.js +99 -0
- package/tests/unit/generated-guard-templates.test.js +134 -0
- package/tests/unit/growth-axes-and-compliance.test.js +169 -0
- package/tests/unit/growth-gate-conditional.test.js +122 -0
- package/tests/unit/growth-module-b2b-gate.test.js +20 -2
- package/tests/unit/growth-requirements-bridge.test.js +127 -0
- package/tests/unit/guard-forms.test.js +302 -0
- package/tests/unit/insights-docs-tell-the-truth.test.js +84 -0
- package/tests/unit/module-copy-identity.test.js +106 -0
- package/tests/unit/shipped-suite-context.test.js +142 -0
- package/tests/unit/skill-paths-prebaked.test.js +174 -0
- package/tests/unit/sync-templates-guard.test.js +31 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/p-replicator",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "P-Replicator — Claude Code toolkit for AI-assisted product development (Vibe Coding). Full /replicate pipeline, 10 modular skills (880K+ chars), /harvest knowledge extraction, swarm agents, quality gates, security patterns, cross-project learning.",
|
|
5
5
|
"main": "src/cli.js",
|
|
6
6
|
"bin": {
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"sbom.json"
|
|
20
20
|
],
|
|
21
21
|
"scripts": {
|
|
22
|
-
"prepublishOnly": "node ../../../scripts/prepublish-gate.mjs",
|
|
23
|
-
"test": "node --test tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/adr-decision-coverage.test.js tests/e2e/lifecycle.test.js tests/snapshot/templates.test.js",
|
|
24
|
-
"test:unit": "node --test tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/adr-decision-coverage.test.js",
|
|
22
|
+
"prepublishOnly": "node --test tests/snapshot/templates.test.js && node ../../../scripts/prepublish-gate.mjs",
|
|
23
|
+
"test": "node --test tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/adr-decision-coverage.test.js tests/unit/growth-requirements-bridge.test.js tests/unit/check-growth-trace.test.js tests/unit/growth-gate-conditional.test.js tests/unit/module-copy-identity.test.js tests/unit/growth-axes-and-compliance.test.js tests/unit/skill-paths-prebaked.test.js tests/unit/check-docs-complete.test.js tests/unit/absence-is-not-emptiness.test.js tests/unit/guard-forms.test.js tests/unit/generated-guard-templates.test.js tests/unit/shipped-suite-context.test.js tests/unit/assess-scripts.test.js tests/unit/insights-docs-tell-the-truth.test.js tests/e2e/lifecycle.test.js tests/snapshot/templates.test.js",
|
|
24
|
+
"test:unit": "node --test tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/adr-decision-coverage.test.js tests/unit/growth-requirements-bridge.test.js tests/unit/check-growth-trace.test.js tests/unit/growth-gate-conditional.test.js tests/unit/module-copy-identity.test.js tests/unit/growth-axes-and-compliance.test.js tests/unit/skill-paths-prebaked.test.js tests/unit/check-docs-complete.test.js tests/unit/absence-is-not-emptiness.test.js tests/unit/guard-forms.test.js tests/unit/generated-guard-templates.test.js tests/unit/shipped-suite-context.test.js tests/unit/assess-scripts.test.js tests/unit/insights-docs-tell-the-truth.test.js",
|
|
25
25
|
"test:e2e": "node --test tests/e2e/lifecycle.test.js",
|
|
26
26
|
"test:snapshot": "node --test tests/snapshot/templates.test.js",
|
|
27
27
|
"test:doctor": "node bin/cli.js doctor",
|
package/sbom.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"hashes": [
|
|
16
16
|
{
|
|
17
17
|
"alg": "SHA-256",
|
|
18
|
-
"content": "
|
|
18
|
+
"content": "63092c71ea7153d562c26db68f2774f233b7c5d37e78e4e3cdfaa1546c42668d"
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
21
|
},
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"hashes": [
|
|
56
56
|
{
|
|
57
57
|
"alg": "SHA-256",
|
|
58
|
-
"content": "
|
|
58
|
+
"content": "d65437974585200f0db8ef082dfbd0519f61cc29cadf3224732ae7a459a20186"
|
|
59
59
|
}
|
|
60
60
|
]
|
|
61
61
|
},
|
|
@@ -275,7 +275,7 @@
|
|
|
275
275
|
"hashes": [
|
|
276
276
|
{
|
|
277
277
|
"alg": "SHA-256",
|
|
278
|
-
"content": "
|
|
278
|
+
"content": "0cc3dc1f4a07a4e5f3ac3f3a1981dc1766302fbbe3ed5818b04c806d4c476059"
|
|
279
279
|
}
|
|
280
280
|
]
|
|
281
281
|
},
|
|
@@ -295,7 +295,7 @@
|
|
|
295
295
|
"hashes": [
|
|
296
296
|
{
|
|
297
297
|
"alg": "SHA-256",
|
|
298
|
-
"content": "
|
|
298
|
+
"content": "566a8cf554420fbbb734705de283f04d40048ee3eb38f1877304d2cc5e56a47f"
|
|
299
299
|
}
|
|
300
300
|
]
|
|
301
301
|
},
|
|
@@ -345,7 +345,7 @@
|
|
|
345
345
|
"hashes": [
|
|
346
346
|
{
|
|
347
347
|
"alg": "SHA-256",
|
|
348
|
-
"content": "
|
|
348
|
+
"content": "18f5442af9b3a549dfb284cd0d8aef83ba973bd34a3a04e7c656262baebb0e57"
|
|
349
349
|
}
|
|
350
350
|
]
|
|
351
351
|
},
|
|
@@ -355,7 +355,7 @@
|
|
|
355
355
|
"hashes": [
|
|
356
356
|
{
|
|
357
357
|
"alg": "SHA-256",
|
|
358
|
-
"content": "
|
|
358
|
+
"content": "43f6abbf447478bae423bce742cfbdace1725946621925eb2ffb3a3ab5b3379e"
|
|
359
359
|
}
|
|
360
360
|
]
|
|
361
361
|
},
|
|
@@ -455,7 +455,7 @@
|
|
|
455
455
|
"hashes": [
|
|
456
456
|
{
|
|
457
457
|
"alg": "SHA-256",
|
|
458
|
-
"content": "
|
|
458
|
+
"content": "93258a3340f99a0f14b374746ae2934b01d7cefe06d575434868eb98da2d854a"
|
|
459
459
|
}
|
|
460
460
|
]
|
|
461
461
|
},
|
|
@@ -485,7 +485,7 @@
|
|
|
485
485
|
"hashes": [
|
|
486
486
|
{
|
|
487
487
|
"alg": "SHA-256",
|
|
488
|
-
"content": "
|
|
488
|
+
"content": "8862d0dc117815b1c3fc7f6e929996e2458783f1ac443eb70bc2a7ebe63a67c3"
|
|
489
489
|
}
|
|
490
490
|
]
|
|
491
491
|
},
|
|
@@ -539,13 +539,33 @@
|
|
|
539
539
|
}
|
|
540
540
|
]
|
|
541
541
|
},
|
|
542
|
+
{
|
|
543
|
+
"type": "file",
|
|
544
|
+
"name": "templates/.claude/hooks/check-docs-complete.cjs",
|
|
545
|
+
"hashes": [
|
|
546
|
+
{
|
|
547
|
+
"alg": "SHA-256",
|
|
548
|
+
"content": "27c05c2adcedc806e395b30b455243193a4fbd0968ce96e415679e1f78db951a"
|
|
549
|
+
}
|
|
550
|
+
]
|
|
551
|
+
},
|
|
552
|
+
{
|
|
553
|
+
"type": "file",
|
|
554
|
+
"name": "templates/.claude/hooks/check-growth-trace.cjs",
|
|
555
|
+
"hashes": [
|
|
556
|
+
{
|
|
557
|
+
"alg": "SHA-256",
|
|
558
|
+
"content": "91994fc109c8440306c9dd3d5eea176c533eb0818fcdb09bac2b309397d9908a"
|
|
559
|
+
}
|
|
560
|
+
]
|
|
561
|
+
},
|
|
542
562
|
{
|
|
543
563
|
"type": "file",
|
|
544
564
|
"name": "templates/.claude/hooks/check-ports.cjs",
|
|
545
565
|
"hashes": [
|
|
546
566
|
{
|
|
547
567
|
"alg": "SHA-256",
|
|
548
|
-
"content": "
|
|
568
|
+
"content": "1813aa60e4d15c5f6ce54a9b3471c3772efe60c332316183c7ad8f5b619f2169"
|
|
549
569
|
}
|
|
550
570
|
]
|
|
551
571
|
},
|
|
@@ -575,7 +595,7 @@
|
|
|
575
595
|
"hashes": [
|
|
576
596
|
{
|
|
577
597
|
"alg": "SHA-256",
|
|
578
|
-
"content": "
|
|
598
|
+
"content": "465190ab21610357094fd6eba188ba9f7086dc5a933568f40a7f7c715ccd6745"
|
|
579
599
|
}
|
|
580
600
|
]
|
|
581
601
|
},
|
|
@@ -625,7 +645,7 @@
|
|
|
625
645
|
"hashes": [
|
|
626
646
|
{
|
|
627
647
|
"alg": "SHA-256",
|
|
628
|
-
"content": "
|
|
648
|
+
"content": "99289f711c34cfddddbef5328b74749fc63d1f74636c6a4e4d61caa202fad05d"
|
|
629
649
|
}
|
|
630
650
|
]
|
|
631
651
|
},
|
|
@@ -635,7 +655,7 @@
|
|
|
635
655
|
"hashes": [
|
|
636
656
|
{
|
|
637
657
|
"alg": "SHA-256",
|
|
638
|
-
"content": "
|
|
658
|
+
"content": "7669309b0ae4330bc6cf6b26bd9cfc01d7b99a8e70c1f056a52574430db9378e"
|
|
639
659
|
}
|
|
640
660
|
]
|
|
641
661
|
},
|
|
@@ -715,7 +735,7 @@
|
|
|
715
735
|
"hashes": [
|
|
716
736
|
{
|
|
717
737
|
"alg": "SHA-256",
|
|
718
|
-
"content": "
|
|
738
|
+
"content": "2b10d2972b1379adde9a68ddf8bcdb399b7d65075e458a54523ffd8d99ddc746"
|
|
719
739
|
}
|
|
720
740
|
]
|
|
721
741
|
},
|
|
@@ -725,7 +745,7 @@
|
|
|
725
745
|
"hashes": [
|
|
726
746
|
{
|
|
727
747
|
"alg": "SHA-256",
|
|
728
|
-
"content": "
|
|
748
|
+
"content": "d33e760a0739e9291f6087adf189f01eb7c4a1136d9128390dd6e3ad8eadda6f"
|
|
729
749
|
}
|
|
730
750
|
]
|
|
731
751
|
},
|
|
@@ -775,7 +795,7 @@
|
|
|
775
795
|
"hashes": [
|
|
776
796
|
{
|
|
777
797
|
"alg": "SHA-256",
|
|
778
|
-
"content": "
|
|
798
|
+
"content": "e1ae2dd69db0d68fe276c1d0e57bd19921bf98fe91fe054716add76338442891"
|
|
779
799
|
}
|
|
780
800
|
]
|
|
781
801
|
},
|
|
@@ -825,7 +845,7 @@
|
|
|
825
845
|
"hashes": [
|
|
826
846
|
{
|
|
827
847
|
"alg": "SHA-256",
|
|
828
|
-
"content": "
|
|
848
|
+
"content": "683b254e400414b432827bedf4153a122322125eff053da4ccfeb3a62bab2a77"
|
|
829
849
|
}
|
|
830
850
|
]
|
|
831
851
|
},
|
|
@@ -925,7 +945,7 @@
|
|
|
925
945
|
"hashes": [
|
|
926
946
|
{
|
|
927
947
|
"alg": "SHA-256",
|
|
928
|
-
"content": "
|
|
948
|
+
"content": "8398f2493434db101476300e514a34bf8124a51eb732cf81923f9a5b5a3d5db4"
|
|
929
949
|
}
|
|
930
950
|
]
|
|
931
951
|
},
|
|
@@ -965,7 +985,7 @@
|
|
|
965
985
|
"hashes": [
|
|
966
986
|
{
|
|
967
987
|
"alg": "SHA-256",
|
|
968
|
-
"content": "
|
|
988
|
+
"content": "7b01140a304c060fb085ded8711189ac3f259f999df1cb42380d0274191f1b25"
|
|
969
989
|
}
|
|
970
990
|
]
|
|
971
991
|
},
|
|
@@ -1495,7 +1515,7 @@
|
|
|
1495
1515
|
"hashes": [
|
|
1496
1516
|
{
|
|
1497
1517
|
"alg": "SHA-256",
|
|
1498
|
-
"content": "
|
|
1518
|
+
"content": "d2b8e71f4053c642f455a0f245ae18471ab25b7a21e0658f0fe410912a47bf8b"
|
|
1499
1519
|
}
|
|
1500
1520
|
]
|
|
1501
1521
|
},
|
|
@@ -1585,7 +1605,7 @@
|
|
|
1585
1605
|
"hashes": [
|
|
1586
1606
|
{
|
|
1587
1607
|
"alg": "SHA-256",
|
|
1588
|
-
"content": "
|
|
1608
|
+
"content": "0770bd63a6a1eeb34e873cb101e2ba0cf88d507e9bc03242046eaa837b9f587c"
|
|
1589
1609
|
}
|
|
1590
1610
|
]
|
|
1591
1611
|
},
|
|
@@ -1595,7 +1615,7 @@
|
|
|
1595
1615
|
"hashes": [
|
|
1596
1616
|
{
|
|
1597
1617
|
"alg": "SHA-256",
|
|
1598
|
-
"content": "
|
|
1618
|
+
"content": "499bbded50ddd368a62301083e828a42bd0223aa58322b6a952f00086b462972"
|
|
1599
1619
|
}
|
|
1600
1620
|
]
|
|
1601
1621
|
},
|
|
@@ -1605,7 +1625,7 @@
|
|
|
1605
1625
|
"hashes": [
|
|
1606
1626
|
{
|
|
1607
1627
|
"alg": "SHA-256",
|
|
1608
|
-
"content": "
|
|
1628
|
+
"content": "11e2e101c99d42306ac1d0931475c5a8899e929514e41a393b6173e03856cfc3"
|
|
1609
1629
|
}
|
|
1610
1630
|
]
|
|
1611
1631
|
},
|
|
@@ -1615,7 +1635,7 @@
|
|
|
1615
1635
|
"hashes": [
|
|
1616
1636
|
{
|
|
1617
1637
|
"alg": "SHA-256",
|
|
1618
|
-
"content": "
|
|
1638
|
+
"content": "7c2e7164463371239d92f28153777e40ee0d6dad293d59886a4cf5b306fa3627"
|
|
1619
1639
|
}
|
|
1620
1640
|
]
|
|
1621
1641
|
},
|
|
@@ -1625,7 +1645,7 @@
|
|
|
1625
1645
|
"hashes": [
|
|
1626
1646
|
{
|
|
1627
1647
|
"alg": "SHA-256",
|
|
1628
|
-
"content": "
|
|
1648
|
+
"content": "dd08226391d498a82f111f0da665ea7cea1fa8a97683fab11070f879142727f7"
|
|
1629
1649
|
}
|
|
1630
1650
|
]
|
|
1631
1651
|
},
|
|
@@ -1635,7 +1655,7 @@
|
|
|
1635
1655
|
"hashes": [
|
|
1636
1656
|
{
|
|
1637
1657
|
"alg": "SHA-256",
|
|
1638
|
-
"content": "
|
|
1658
|
+
"content": "84658390dc7beb590f70164b391ace915e42926660bc1015e4be300752b74a37"
|
|
1639
1659
|
}
|
|
1640
1660
|
]
|
|
1641
1661
|
},
|
|
@@ -1645,7 +1665,7 @@
|
|
|
1645
1665
|
"hashes": [
|
|
1646
1666
|
{
|
|
1647
1667
|
"alg": "SHA-256",
|
|
1648
|
-
"content": "
|
|
1668
|
+
"content": "3cd76a218aa9f94e0ff8ff2fc257647540674f68df3883f0de5e76e1cea26d9b"
|
|
1649
1669
|
}
|
|
1650
1670
|
]
|
|
1651
1671
|
},
|
|
@@ -1685,7 +1705,7 @@
|
|
|
1685
1705
|
"hashes": [
|
|
1686
1706
|
{
|
|
1687
1707
|
"alg": "SHA-256",
|
|
1688
|
-
"content": "
|
|
1708
|
+
"content": "71f97e269e8b1807550a4ef91b2f0ac4dd892a074781504890d33db8f32685d2"
|
|
1689
1709
|
}
|
|
1690
1710
|
]
|
|
1691
1711
|
},
|
|
@@ -1735,7 +1755,7 @@
|
|
|
1735
1755
|
"hashes": [
|
|
1736
1756
|
{
|
|
1737
1757
|
"alg": "SHA-256",
|
|
1738
|
-
"content": "
|
|
1758
|
+
"content": "333e554a3840fd02e0e230efe4852bb490beded41f6024c65849060780eebdee"
|
|
1739
1759
|
}
|
|
1740
1760
|
]
|
|
1741
1761
|
},
|
|
@@ -1759,6 +1779,16 @@
|
|
|
1759
1779
|
}
|
|
1760
1780
|
]
|
|
1761
1781
|
},
|
|
1782
|
+
{
|
|
1783
|
+
"type": "file",
|
|
1784
|
+
"name": "tests/unit/absence-is-not-emptiness.test.js",
|
|
1785
|
+
"hashes": [
|
|
1786
|
+
{
|
|
1787
|
+
"alg": "SHA-256",
|
|
1788
|
+
"content": "6c7c1c8086461eac16415ebcccea081d3169212826f23e835cf109d741dd6ac3"
|
|
1789
|
+
}
|
|
1790
|
+
]
|
|
1791
|
+
},
|
|
1762
1792
|
{
|
|
1763
1793
|
"type": "file",
|
|
1764
1794
|
"name": "tests/unit/adr-decision-coverage.test.js",
|
|
@@ -1779,6 +1809,16 @@
|
|
|
1779
1809
|
}
|
|
1780
1810
|
]
|
|
1781
1811
|
},
|
|
1812
|
+
{
|
|
1813
|
+
"type": "file",
|
|
1814
|
+
"name": "tests/unit/assess-scripts.test.js",
|
|
1815
|
+
"hashes": [
|
|
1816
|
+
{
|
|
1817
|
+
"alg": "SHA-256",
|
|
1818
|
+
"content": "b16b015dc28cd5b1d85a8ec0ae54768af1787d2d26e9e5b495c8f791aaa2043f"
|
|
1819
|
+
}
|
|
1820
|
+
]
|
|
1821
|
+
},
|
|
1782
1822
|
{
|
|
1783
1823
|
"type": "file",
|
|
1784
1824
|
"name": "tests/unit/autocommit-deletion.test.js",
|
|
@@ -1789,13 +1829,33 @@
|
|
|
1789
1829
|
}
|
|
1790
1830
|
]
|
|
1791
1831
|
},
|
|
1832
|
+
{
|
|
1833
|
+
"type": "file",
|
|
1834
|
+
"name": "tests/unit/check-docs-complete.test.js",
|
|
1835
|
+
"hashes": [
|
|
1836
|
+
{
|
|
1837
|
+
"alg": "SHA-256",
|
|
1838
|
+
"content": "2c6f16a61f0876f637ac492d5fb2af1ea35ad00161fd1468446ea0d08cd97f4b"
|
|
1839
|
+
}
|
|
1840
|
+
]
|
|
1841
|
+
},
|
|
1842
|
+
{
|
|
1843
|
+
"type": "file",
|
|
1844
|
+
"name": "tests/unit/check-growth-trace.test.js",
|
|
1845
|
+
"hashes": [
|
|
1846
|
+
{
|
|
1847
|
+
"alg": "SHA-256",
|
|
1848
|
+
"content": "733d87fe8eca897fcfc5cad9342d4db2085270c21d0d8866d817a9b9418511c2"
|
|
1849
|
+
}
|
|
1850
|
+
]
|
|
1851
|
+
},
|
|
1792
1852
|
{
|
|
1793
1853
|
"type": "file",
|
|
1794
1854
|
"name": "tests/unit/check-ports.test.js",
|
|
1795
1855
|
"hashes": [
|
|
1796
1856
|
{
|
|
1797
1857
|
"alg": "SHA-256",
|
|
1798
|
-
"content": "
|
|
1858
|
+
"content": "d8e2e1f22dadb40fbb03ffbd25ed945fa85fe7b5d49fe0f3597cfc3facc2c118"
|
|
1799
1859
|
}
|
|
1800
1860
|
]
|
|
1801
1861
|
},
|
|
@@ -1829,13 +1889,63 @@
|
|
|
1829
1889
|
}
|
|
1830
1890
|
]
|
|
1831
1891
|
},
|
|
1892
|
+
{
|
|
1893
|
+
"type": "file",
|
|
1894
|
+
"name": "tests/unit/generated-guard-templates.test.js",
|
|
1895
|
+
"hashes": [
|
|
1896
|
+
{
|
|
1897
|
+
"alg": "SHA-256",
|
|
1898
|
+
"content": "928ddb625cc1bbc7dd145992c9a37373da93ae314f39391c67ad7ed064e2c940"
|
|
1899
|
+
}
|
|
1900
|
+
]
|
|
1901
|
+
},
|
|
1902
|
+
{
|
|
1903
|
+
"type": "file",
|
|
1904
|
+
"name": "tests/unit/growth-axes-and-compliance.test.js",
|
|
1905
|
+
"hashes": [
|
|
1906
|
+
{
|
|
1907
|
+
"alg": "SHA-256",
|
|
1908
|
+
"content": "88e4d8c7ae278c46dfce4d89fcbd1dee49c0b545ebc07e459306bfdc70567048"
|
|
1909
|
+
}
|
|
1910
|
+
]
|
|
1911
|
+
},
|
|
1912
|
+
{
|
|
1913
|
+
"type": "file",
|
|
1914
|
+
"name": "tests/unit/growth-gate-conditional.test.js",
|
|
1915
|
+
"hashes": [
|
|
1916
|
+
{
|
|
1917
|
+
"alg": "SHA-256",
|
|
1918
|
+
"content": "bff4149b339294ac822d1a8fe732d21560ea8d70bcb80b10f3491105a4a9b75c"
|
|
1919
|
+
}
|
|
1920
|
+
]
|
|
1921
|
+
},
|
|
1832
1922
|
{
|
|
1833
1923
|
"type": "file",
|
|
1834
1924
|
"name": "tests/unit/growth-module-b2b-gate.test.js",
|
|
1835
1925
|
"hashes": [
|
|
1836
1926
|
{
|
|
1837
1927
|
"alg": "SHA-256",
|
|
1838
|
-
"content": "
|
|
1928
|
+
"content": "05ce46882984905ba41983c34b8d983e9fa9bf5eb4b1af988841a46e78142098"
|
|
1929
|
+
}
|
|
1930
|
+
]
|
|
1931
|
+
},
|
|
1932
|
+
{
|
|
1933
|
+
"type": "file",
|
|
1934
|
+
"name": "tests/unit/growth-requirements-bridge.test.js",
|
|
1935
|
+
"hashes": [
|
|
1936
|
+
{
|
|
1937
|
+
"alg": "SHA-256",
|
|
1938
|
+
"content": "2f560a16f1757df46d5d52e5d29a7aad3e4c327cd07ea9cc69240c7dd1c93f2a"
|
|
1939
|
+
}
|
|
1940
|
+
]
|
|
1941
|
+
},
|
|
1942
|
+
{
|
|
1943
|
+
"type": "file",
|
|
1944
|
+
"name": "tests/unit/guard-forms.test.js",
|
|
1945
|
+
"hashes": [
|
|
1946
|
+
{
|
|
1947
|
+
"alg": "SHA-256",
|
|
1948
|
+
"content": "61a219a7748e0b56bc4207eee107815a4b4111fbebd41b68f6d390130506cd42"
|
|
1839
1949
|
}
|
|
1840
1950
|
]
|
|
1841
1951
|
},
|
|
@@ -1859,6 +1969,26 @@
|
|
|
1859
1969
|
}
|
|
1860
1970
|
]
|
|
1861
1971
|
},
|
|
1972
|
+
{
|
|
1973
|
+
"type": "file",
|
|
1974
|
+
"name": "tests/unit/insights-docs-tell-the-truth.test.js",
|
|
1975
|
+
"hashes": [
|
|
1976
|
+
{
|
|
1977
|
+
"alg": "SHA-256",
|
|
1978
|
+
"content": "d73ebce2f729911cad452897883b3d55d69e19613c7c1fc7c9bcfa3b5569fc1b"
|
|
1979
|
+
}
|
|
1980
|
+
]
|
|
1981
|
+
},
|
|
1982
|
+
{
|
|
1983
|
+
"type": "file",
|
|
1984
|
+
"name": "tests/unit/module-copy-identity.test.js",
|
|
1985
|
+
"hashes": [
|
|
1986
|
+
{
|
|
1987
|
+
"alg": "SHA-256",
|
|
1988
|
+
"content": "69a63e511cef4d6cb7ea5669b61746f2fc8af22273bc76539cb304bd27e49de9"
|
|
1989
|
+
}
|
|
1990
|
+
]
|
|
1991
|
+
},
|
|
1862
1992
|
{
|
|
1863
1993
|
"type": "file",
|
|
1864
1994
|
"name": "tests/unit/pipeline-file-ownership.test.js",
|
|
@@ -1879,6 +2009,26 @@
|
|
|
1879
2009
|
}
|
|
1880
2010
|
]
|
|
1881
2011
|
},
|
|
2012
|
+
{
|
|
2013
|
+
"type": "file",
|
|
2014
|
+
"name": "tests/unit/shipped-suite-context.test.js",
|
|
2015
|
+
"hashes": [
|
|
2016
|
+
{
|
|
2017
|
+
"alg": "SHA-256",
|
|
2018
|
+
"content": "fd6128505f3272aa7349d21d18a2494eaa8e5e2397ee85047f9828471c99d721"
|
|
2019
|
+
}
|
|
2020
|
+
]
|
|
2021
|
+
},
|
|
2022
|
+
{
|
|
2023
|
+
"type": "file",
|
|
2024
|
+
"name": "tests/unit/skill-paths-prebaked.test.js",
|
|
2025
|
+
"hashes": [
|
|
2026
|
+
{
|
|
2027
|
+
"alg": "SHA-256",
|
|
2028
|
+
"content": "efb13ca5d2fa68f3186e5af4142509d260d7cf63c902f59e915110bb550887df"
|
|
2029
|
+
}
|
|
2030
|
+
]
|
|
2031
|
+
},
|
|
1882
2032
|
{
|
|
1883
2033
|
"type": "file",
|
|
1884
2034
|
"name": "tests/unit/sparc-reconciliation.test.js",
|
|
@@ -1925,7 +2075,7 @@
|
|
|
1925
2075
|
"hashes": [
|
|
1926
2076
|
{
|
|
1927
2077
|
"alg": "SHA-256",
|
|
1928
|
-
"content": "
|
|
2078
|
+
"content": "e4fc7687dcf37d17bf2a059d3248c8c00526c104f6a0f6e104fa9ca6e00039ae"
|
|
1929
2079
|
}
|
|
1930
2080
|
]
|
|
1931
2081
|
},
|
package/src/commands/doctor.js
CHANGED
|
@@ -6,7 +6,7 @@ const { execFileSync } = require('child_process');
|
|
|
6
6
|
const {
|
|
7
7
|
green, red, yellow, cyan, bold, dim,
|
|
8
8
|
info, success, warn, error: logError,
|
|
9
|
-
readManifest, fileExists,
|
|
9
|
+
readManifest, fileExists, artifactState,
|
|
10
10
|
MANIFEST_FILE, COMPONENTS,
|
|
11
11
|
} = require('../utils');
|
|
12
12
|
|
|
@@ -29,6 +29,22 @@ function run(options) {
|
|
|
29
29
|
function fail(msg) { console.log(` ${red('\u2717')} ${msg}`); issues++; }
|
|
30
30
|
function hint(msg) { console.log(` ${yellow('!')} ${msg}`); warnings++; }
|
|
31
31
|
|
|
32
|
+
/**
|
|
33
|
+
* One reporter for every component, because a two-way branch cannot say three things.
|
|
34
|
+
*
|
|
35
|
+
* The first version of this change swapped the CONDITION to artifactState and left the else
|
|
36
|
+
* branch intact, so a whitespace-only artifact was reported as "missing" — the exact collapse
|
|
37
|
+
* AR-4 forbids. And settings.json and the hooks were still on fileExists, so a ZERO-BYTE
|
|
38
|
+
* settings.json (no hooks wired at all) and a zero-byte hook both received a checkmark.
|
|
39
|
+
*/
|
|
40
|
+
function reportArtifact(label, filePath, missingNote) {
|
|
41
|
+
const state = artifactState(filePath);
|
|
42
|
+
if (state === 'present') { pass(label); return; }
|
|
43
|
+
if (state === 'empty') { fail(`${label} \u2014 EMPTY, cannot load`); return; }
|
|
44
|
+
fail(`${label} \u2014 missing${missingNote ? ' (' + missingNote + ')' : ''}`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
32
48
|
console.log(bold('P-Replicator \u2014 Health Check'));
|
|
33
49
|
console.log('');
|
|
34
50
|
|
|
@@ -59,11 +75,7 @@ function run(options) {
|
|
|
59
75
|
console.log(bold(`Skills (expected ${EXPECTED_SKILLS.length}):`));
|
|
60
76
|
for (const skill of EXPECTED_SKILLS) {
|
|
61
77
|
const skillPath = path.join(claudeDir, 'skills', skill, 'SKILL.md');
|
|
62
|
-
|
|
63
|
-
pass(skill);
|
|
64
|
-
} else {
|
|
65
|
-
fail(`${skill} \u2014 SKILL.md missing`);
|
|
66
|
-
}
|
|
78
|
+
reportArtifact(skill, skillPath, 'SKILL.md');
|
|
67
79
|
}
|
|
68
80
|
console.log('');
|
|
69
81
|
|
|
@@ -71,11 +83,7 @@ function run(options) {
|
|
|
71
83
|
console.log(bold(`Commands (expected ${EXPECTED_COMMANDS.length}):`));
|
|
72
84
|
for (const cmd of EXPECTED_COMMANDS) {
|
|
73
85
|
const cmdPath = path.join(claudeDir, 'commands', `${cmd}.md`);
|
|
74
|
-
|
|
75
|
-
pass(`/${cmd}`);
|
|
76
|
-
} else {
|
|
77
|
-
fail(`/${cmd} \u2014 ${cmd}.md missing`);
|
|
78
|
-
}
|
|
86
|
+
reportArtifact(`/${cmd}`, cmdPath, undefined);
|
|
79
87
|
}
|
|
80
88
|
console.log('');
|
|
81
89
|
|
|
@@ -83,11 +91,7 @@ function run(options) {
|
|
|
83
91
|
console.log(bold(`Agents (expected ${EXPECTED_AGENTS.length}):`));
|
|
84
92
|
for (const agent of EXPECTED_AGENTS) {
|
|
85
93
|
const agentPath = path.join(claudeDir, 'agents', `${agent}.md`);
|
|
86
|
-
|
|
87
|
-
pass(agent);
|
|
88
|
-
} else {
|
|
89
|
-
fail(`${agent} \u2014 ${agent}.md missing`);
|
|
90
|
-
}
|
|
94
|
+
reportArtifact(agent, agentPath, undefined);
|
|
91
95
|
}
|
|
92
96
|
console.log('');
|
|
93
97
|
|
|
@@ -95,22 +99,14 @@ function run(options) {
|
|
|
95
99
|
console.log(bold(`Rules (expected ${EXPECTED_RULES.length}):`));
|
|
96
100
|
for (const rule of EXPECTED_RULES) {
|
|
97
101
|
const rulePath = path.join(claudeDir, 'rules', `${rule}.md`);
|
|
98
|
-
|
|
99
|
-
pass(rule);
|
|
100
|
-
} else {
|
|
101
|
-
fail(`${rule} \u2014 ${rule}.md missing`);
|
|
102
|
-
}
|
|
102
|
+
reportArtifact(rule, rulePath, undefined);
|
|
103
103
|
}
|
|
104
104
|
console.log('');
|
|
105
105
|
|
|
106
106
|
// ── 6b) Settings (hooks config) ─────────────────────────────────────────
|
|
107
107
|
console.log(bold('Hooks (settings.json):'));
|
|
108
108
|
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
109
|
-
|
|
110
|
-
pass('settings.json');
|
|
111
|
-
} else {
|
|
112
|
-
fail('settings.json — missing (SessionStart + Stop hooks not configured)');
|
|
113
|
-
}
|
|
109
|
+
reportArtifact('settings.json', settingsPath, 'SessionStart + Stop hooks not configured');
|
|
114
110
|
console.log('');
|
|
115
111
|
|
|
116
112
|
// ── 6c) Hook scripts (cross-platform Node, v1.4.1+) ─────────────────────
|
|
@@ -119,11 +115,7 @@ function run(options) {
|
|
|
119
115
|
console.log(bold(`Hook scripts (expected ${hookKeys.length}):`));
|
|
120
116
|
for (const hook of hookKeys) {
|
|
121
117
|
const hookPath = path.join(claudeDir, 'hooks', `${hook}.cjs`);
|
|
122
|
-
|
|
123
|
-
pass(`${hook}.cjs`);
|
|
124
|
-
} else {
|
|
125
|
-
fail(`${hook}.cjs — missing (referenced by settings.json)`);
|
|
126
|
-
}
|
|
118
|
+
reportArtifact(`${hook}.cjs`, hookPath, 'referenced by settings.json');
|
|
127
119
|
}
|
|
128
120
|
console.log('');
|
|
129
121
|
}
|
|
@@ -148,6 +140,26 @@ function run(options) {
|
|
|
148
140
|
}
|
|
149
141
|
console.log('');
|
|
150
142
|
|
|
143
|
+
// ── The insights carrier: THREE states, and none of them fails ───────────
|
|
144
|
+
//
|
|
145
|
+
// A project that has recorded no insight is a NEW project, and a check that refuses a new project
|
|
146
|
+
// is a check people disable — taking the real signal with it. The defect was never the emptiness:
|
|
147
|
+
// it was that ABSENT and EMPTY rendered identically, so a carrier that had never been created
|
|
148
|
+
// looked exactly like one being used and found empty. MEASURED across four real projects on one
|
|
149
|
+
// machine: 11 -> 10 -> 6 -> 0 insights, with every surface reporting OK throughout.
|
|
150
|
+
const insightsIndex = path.join(claudeDir, 'insights', 'index.md');
|
|
151
|
+
const insightsState = artifactState(insightsIndex);
|
|
152
|
+
if (insightsState === 'missing') {
|
|
153
|
+
hint('insights carrier: NOT STARTED — no .claude/insights/index.md. Record one with /myinsights');
|
|
154
|
+
} else if (insightsState === 'empty') {
|
|
155
|
+
hint('insights carrier: EXISTS but holds ZERO entries — nothing is injected at SessionStart');
|
|
156
|
+
} else {
|
|
157
|
+
const entries = (fs.readFileSync(insightsIndex, 'utf-8')
|
|
158
|
+
.match(/^##\s+\d{4}-\d{2}-\d{2}/gm) || []).length;
|
|
159
|
+
pass('insights carrier: ' + entries + ' entr' + (entries === 1 ? 'y' : 'ies') + ' recorded');
|
|
160
|
+
}
|
|
161
|
+
console.log('');
|
|
162
|
+
|
|
151
163
|
// ── 8) Summary ──────────────────────────────────────────────────────────
|
|
152
164
|
console.log(bold('\u2500'.repeat(50)));
|
|
153
165
|
if (issues === 0 && warnings === 0) {
|
package/src/commands/verify.js
CHANGED
|
@@ -4,7 +4,7 @@ const path = require('path');
|
|
|
4
4
|
const {
|
|
5
5
|
green, red, yellow, cyan, bold, dim,
|
|
6
6
|
info, success, error: logError,
|
|
7
|
-
readManifest, fileExists,
|
|
7
|
+
readManifest, fileExists, artifactState,
|
|
8
8
|
COMPONENTS, getItemRelativePath,
|
|
9
9
|
} = require('../utils');
|
|
10
10
|
|
|
@@ -44,8 +44,14 @@ function run(options) {
|
|
|
44
44
|
const label = groupKey === 'commands'
|
|
45
45
|
? `/${itemKey}`
|
|
46
46
|
: `${groupKey}: ${itemKey}`;
|
|
47
|
-
|
|
47
|
+
const state = artifactState(full);
|
|
48
|
+
if (state === 'present') {
|
|
48
49
|
pass(`${label} ${dim('— ' + desc)}`);
|
|
50
|
+
} else if (state === 'empty') {
|
|
51
|
+
// NOT "missing". The cures differ: missing -> run `update`; empty -> something truncated
|
|
52
|
+
// your file, and `update` would silently repair it without you ever learning that. Naming
|
|
53
|
+
// both "missing" moves the silence up one level instead of removing it.
|
|
54
|
+
fail(`${label} — EMPTY, cannot load (${rel})`);
|
|
49
55
|
} else {
|
|
50
56
|
fail(`${label} — missing (${rel})`);
|
|
51
57
|
}
|
|
@@ -91,6 +97,25 @@ function run(options) {
|
|
|
91
97
|
console.log('');
|
|
92
98
|
|
|
93
99
|
// ── Summary ─────────────────────────────────────────────────────────────
|
|
100
|
+
// The insights carrier: three states, none of them failing.
|
|
101
|
+
//
|
|
102
|
+
// FR-5 asks for three SURFACES, and the first pass shipped two — doctor and the statusline —
|
|
103
|
+
// leaving verify producing identical output for absent, empty and populated. Cross-family review
|
|
104
|
+
// caught it. A carrier that never existed must not read like one being used and found empty:
|
|
105
|
+
// that indistinguishability is what let 27 recorded insights become 0 across four real projects.
|
|
106
|
+
const insightsIndex = path.join(targetDir, '.claude', 'insights', 'index.md');
|
|
107
|
+
const insightsState = artifactState(insightsIndex);
|
|
108
|
+
if (insightsState === 'missing') {
|
|
109
|
+
hint('insights carrier: NOT STARTED — no .claude/insights/index.md. Record one with /myinsights');
|
|
110
|
+
} else if (insightsState === 'empty') {
|
|
111
|
+
hint('insights carrier: EXISTS but holds ZERO entries — nothing is injected at SessionStart');
|
|
112
|
+
} else {
|
|
113
|
+
const entries = (require('fs').readFileSync(insightsIndex, 'utf-8')
|
|
114
|
+
.match(/^##\s+\d{4}-\d{2}-\d{2}/gm) || []).length;
|
|
115
|
+
pass(`insights carrier: ${entries} entr${entries === 1 ? 'y' : 'ies'} recorded`);
|
|
116
|
+
}
|
|
117
|
+
console.log('');
|
|
118
|
+
|
|
94
119
|
console.log(bold('─'.repeat(60)));
|
|
95
120
|
if (issues === 0 && warnings === 0) {
|
|
96
121
|
success(bold('All artifacts verified.'));
|