@dzhechkov/p-replicator 1.12.0 → 1.13.1
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 +225 -61
- package/CHANGELOG.md +148 -1
- package/LICENSE +21 -0
- package/MULTIPLATFORM_ROADMAP.md +1 -1
- package/README/eng/01_quickstart.md +2 -2
- package/README/eng/02_user_guide.md +1 -1
- package/README/eng/03_admin_guide.md +2 -2
- package/README/eng/05_architecture.md +1 -1
- package/README/eng/README.md +2 -1
- package/README/ru/01_quickstart.md +2 -2
- package/README/ru/02_user_guide.md +1 -1
- package/README/ru/03_admin_guide.md +2 -2
- package/README/ru/05_architecture.md +1 -1
- package/README/ru/README.md +2 -1
- package/README/ru/html/index.html +8 -8
- package/README.md +132 -9
- package/bin/cli.js +0 -0
- package/package.json +10 -11
- package/sbom.json +470 -60
- package/scripts/check-pipeline-gaps.sh +0 -0
- package/src/commands/init.js +1 -1
- package/src/rule-components.json +5 -1
- package/src/utils.js +32 -3
- package/templates/.claude/agents/product-discoverer.md +38 -0
- package/templates/.claude/agents/replicate-coordinator.md +11 -1
- package/templates/.claude/commands/feature.md +29 -5
- package/templates/.claude/commands/go.md +6 -8
- package/templates/.claude/commands/harvest.md +5 -7
- package/templates/.claude/commands/replicate.md +169 -44
- package/templates/.claude/commands/start.md +28 -7
- package/templates/.claude/hooks/capture-source-path.cjs +795 -0
- package/templates/.claude/hooks/check-canon.cjs +493 -0
- package/templates/.claude/hooks/check-embed-contract.cjs +374 -0
- package/templates/.claude/hooks/check-external-deps.cjs +288 -0
- package/templates/.claude/hooks/check-file-ownership.cjs +424 -0
- package/templates/.claude/hooks/check-handoff-manifest.cjs +367 -0
- package/templates/.claude/hooks/check-job-contract.cjs +501 -0
- package/templates/.claude/hooks/check-look-origin.cjs +240 -0
- package/templates/.claude/hooks/check-look-trace.cjs +385 -0
- package/templates/.claude/hooks/check-metric-source.cjs +296 -0
- package/templates/.claude/hooks/check-model-cost.cjs +470 -0
- package/templates/.claude/hooks/check-ports.cjs +27 -6
- package/templates/.claude/hooks/check-source-version.cjs +312 -0
- package/templates/.claude/hooks/check-swarm-receipts.cjs +197 -0
- package/templates/.claude/hooks/check-webhook-contract.cjs +535 -0
- package/templates/.claude/hooks/statusline.cjs +2 -2
- package/templates/.claude/rules/embeddable-widget.md +73 -0
- package/templates/.claude/rules/feature-lifecycle.md +5 -6
- package/templates/.claude/rules/incoming-webhooks.md +99 -0
- package/templates/.claude/rules/long-running-job.md +73 -0
- package/templates/.claude/rules/model-call-cost.md +85 -0
- package/templates/.claude/rules/replicate-pipeline.md +121 -52
- package/templates/.claude/skills/brutal-honesty-review/SKILL.md +9 -0
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/SKILL.md +4 -0
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/03-generate-p0.md +46 -1
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/04-generate-p1.md +7 -1
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/06-package-deliver.md +20 -2
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/claude-md-strategy.md +7 -0
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/automation-commands.md +17 -0
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle-ent.md +43 -5
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle.md +43 -7
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/start-command.md +19 -1
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/swarm-file-evidence.md +151 -0
- package/templates/.claude/skills/goap-research-ed25519/SKILL.md +37 -22
- package/templates/.claude/skills/goap-research-ed25519/references/negative-results.md +94 -0
- package/templates/.claude/skills/goap-research-ed25519/scripts/check_report_evidence.py +368 -4
- package/templates/.claude/skills/goap-research-ed25519/scripts/ed25519_verifier.py +122 -5
- package/templates/.claude/skills/goap-research-ed25519/scripts/evidence_fetch.py +33 -16
- package/templates/.claude/skills/goap-research-ed25519/scripts/quote_provenance.py +342 -0
- package/templates/.claude/skills/goap-research-ed25519/scripts/test_ed25519_verifier.py +60 -0
- package/templates/.claude/skills/goap-research-ed25519/scripts/test_evidence_provenance.py +139 -6
- package/templates/.claude/skills/goap-research-ed25519/scripts/test_quote_provenance.py +274 -0
- package/templates/.claude/skills/goap-research-ed25519/scripts/test_suite_completeness.py +2 -1
- package/templates/.claude/skills/knowledge-extractor/SKILL.md +4 -0
- package/templates/.claude/skills/pipeline-forge/SKILL.md +18 -23
- package/templates/.claude/skills/pipeline-forge/examples/replicate-analysis.md +7 -2
- package/templates/.claude/skills/pipeline-forge/references/patterns-catalog.md +19 -1
- package/templates/.claude/skills/pipeline-forge/references/self-extracted-patterns.md +17 -6
- package/templates/.claude/skills/pipeline-forge/references/skill-anatomy.md +0 -1
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/025-cjm-prototype.md +21 -1
- package/templates/.claude/skills/sparc-prd-mini/SKILL.md +173 -725
- package/tests/snapshot/baseline.json +60 -38
- package/tests/unit/capture-source-path.test.js +492 -0
- package/tests/unit/check-canon.test.js +403 -0
- package/tests/unit/check-embed-contract.test.js +422 -0
- package/tests/unit/check-external-deps.test.js +363 -0
- package/tests/unit/check-file-ownership.test.js +388 -0
- package/tests/unit/check-handoff-manifest.test.js +410 -0
- package/tests/unit/check-job-contract.test.js +514 -0
- package/tests/unit/check-look-origin.test.js +180 -0
- package/tests/unit/check-look-trace.test.js +420 -0
- package/tests/unit/check-metric-source.test.js +325 -0
- package/tests/unit/check-model-cost.test.js +425 -0
- package/tests/unit/check-ports.test.js +46 -2
- package/tests/unit/check-source-version.test.js +344 -0
- package/tests/unit/check-swarm-receipts.test.js +231 -0
- package/tests/unit/check-webhook-contract.test.js +536 -0
- package/tests/unit/db-port-rule.test.js +8 -2
- package/tests/unit/detection-ladder-registry.test.js +2 -2
- package/tests/unit/generator-swarm-contract.test.js +287 -0
- package/tests/unit/guard-honest-input-meta.test.js +64 -0
- package/tests/unit/honest-failure-rules.test.js +91 -9
- package/tests/unit/look-phase-contract.test.js +231 -0
- package/tests/unit/negative-conclusion-gate.test.js +300 -0
- package/tests/unit/quote-provenance.test.js +122 -0
- package/tests/unit/utils.test.js +40 -3
package/tests/unit/utils.test.js
CHANGED
|
@@ -341,12 +341,12 @@ describe('COMPONENTS.items SSOT', () => {
|
|
|
341
341
|
}
|
|
342
342
|
});
|
|
343
343
|
|
|
344
|
-
test('item counts: 10 skills, 11 commands, 4 agents,
|
|
344
|
+
test('item counts: 10 skills, 11 commands, 4 agents, 13 rules, 1 settings', () => {
|
|
345
345
|
assert.equal(Object.keys(utils.COMPONENTS.skills.items).length, 10, 'skills count');
|
|
346
346
|
assert.equal(Object.keys(utils.COMPONENTS.commands.items).length, 11, 'commands count (post v1.4: + 9 generic commands)');
|
|
347
347
|
assert.equal(Object.keys(utils.COMPONENTS.agents.items).length, 4, 'agents count');
|
|
348
|
-
assert.equal(Object.keys(utils.COMPONENTS.rules.items).length,
|
|
349
|
-
'rules count (+ honest failure rules)');
|
|
348
|
+
assert.equal(Object.keys(utils.COMPONENTS.rules.items).length, 13,
|
|
349
|
+
'rules count (+ honest failure rules, + embeddable-widget, + incoming-webhooks, + long-running-job, + model-call-cost)');
|
|
350
350
|
assert.ok(utils.COMPONENTS.settings, 'settings component group added in v1.4');
|
|
351
351
|
assert.equal(Object.keys(utils.COMPONENTS.settings.items).length, 1, 'settings.json count');
|
|
352
352
|
});
|
|
@@ -635,3 +635,40 @@ describe('COMPONENTS.hooks (v1.5.0)', () => {
|
|
|
635
635
|
`expected >= 6 hook scripts (post v1.5.0), got ${hookCount}`);
|
|
636
636
|
});
|
|
637
637
|
});
|
|
638
|
+
|
|
639
|
+
describe('mergeHookMatchers — identity survives the user respelling of a variable (a1ef0e41)', () => {
|
|
640
|
+
// MEASURED (backlog a1ef0e41): a user who hand-rewrote `$CLAUDE_PROJECT_DIR` into
|
|
641
|
+
// `${CLAUDE_PROJECT_DIR}` got every event hook DOUBLED on the next update, because the
|
|
642
|
+
// byte-equality Set saw two strings for one command. Both spellings expand identically in sh.
|
|
643
|
+
const shipped = (cmd) => [{ matcher: '*', hooks: [{ type: 'command', command: cmd }] }];
|
|
644
|
+
|
|
645
|
+
test('${VAR} respelling of a shipped $VAR hook does not double on merge', () => {
|
|
646
|
+
const user = shipped('node "${CLAUDE_PROJECT_DIR}/.claude/hooks/session-insights.cjs"');
|
|
647
|
+
const tpl = shipped('node "$CLAUDE_PROJECT_DIR/.claude/hooks/session-insights.cjs"');
|
|
648
|
+
const merged = utils.mergeHookMatchers(user, tpl);
|
|
649
|
+
assert.equal(merged[0].hooks.length, 1, 'one command, two spellings — must stay ONE hook');
|
|
650
|
+
// The USER's own spelling survives; the stored command is never rewritten.
|
|
651
|
+
assert.match(merged[0].hooks[0].command, /\$\{CLAUDE_PROJECT_DIR\}/);
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
test('whitespace-run respelling does not double either', () => {
|
|
655
|
+
const user = shipped('node a.cjs --flag');
|
|
656
|
+
const tpl = shipped('node a.cjs --flag');
|
|
657
|
+
assert.equal(utils.mergeHookMatchers(user, tpl)[0].hooks.length, 1);
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
test('genuinely different commands still both survive (dedup must not over-collapse)', () => {
|
|
661
|
+
const user = shipped('node a.cjs');
|
|
662
|
+
const tpl = shipped('node b.cjs');
|
|
663
|
+
assert.equal(utils.mergeHookMatchers(user, tpl)[0].hooks.length, 2);
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
test('MUTATION: byte-equality dedup (the old code) goes red on the respelling case', () => {
|
|
667
|
+
// The RED half in miniature: with canonicalization stripped, the two spellings differ.
|
|
668
|
+
const oldDedup = (a, b) => new Set(a.map((h) => h.command)).has(b.command);
|
|
669
|
+
const userHook = { command: 'node "${X}/y.cjs"' };
|
|
670
|
+
const tplHook = { command: 'node "$X/y.cjs"' };
|
|
671
|
+
assert.equal(oldDedup([userHook], tplHook), false,
|
|
672
|
+
'byte equality cannot see through the respelling — this is the measured doubling');
|
|
673
|
+
});
|
|
674
|
+
});
|