ultimate-pi 0.18.1 → 0.19.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/.agents/skills/harness-debate-plan/SKILL.md +1 -1
- package/.agents/skills/harness-decisions/SKILL.md +1 -2
- package/.agents/skills/harness-governor/SKILL.md +6 -5
- package/.agents/skills/web-retrieval/SKILL.md +163 -0
- package/.agents/skills/wiki-autoresearch/SKILL.md +6 -6
- package/.pi/PACKAGING.md +4 -4
- package/.pi/SYSTEM.md +75 -123
- package/.pi/agents/harness/incident-recorder.md +0 -1
- package/.pi/agents/harness/planning/decompose.md +0 -2
- package/.pi/agents/harness/planning/execution-plan-author.md +0 -2
- package/.pi/agents/harness/planning/hypothesis-validator.md +0 -2
- package/.pi/agents/harness/planning/hypothesis.md +0 -2
- package/.pi/agents/harness/planning/implementation-researcher.md +1 -3
- package/.pi/agents/harness/planning/plan-adversary.md +0 -2
- package/.pi/agents/harness/planning/plan-evaluator.md +1 -3
- package/.pi/agents/harness/planning/planning-context.md +0 -2
- package/.pi/agents/harness/planning/review-integrator.md +0 -2
- package/.pi/agents/harness/planning/sprint-contract-auditor.md +0 -2
- package/.pi/agents/harness/planning/stack-researcher.md +5 -3
- package/.pi/agents/harness/reviewing/adversary.md +0 -2
- package/.pi/agents/harness/reviewing/evaluator.md +0 -2
- package/.pi/agents/harness/reviewing/tie-breaker.md +0 -2
- package/.pi/agents/harness/running/executor.md +0 -2
- package/.pi/agents/harness/sentrux-bootstrap.md +0 -1
- package/.pi/agents/harness/sentrux-steward.md +0 -2
- package/.pi/agents/harness/trace-librarian.md +0 -1
- package/.pi/agents/harness/web-retrieval/web-answerer.md +35 -0
- package/.pi/agents/harness/web-retrieval/web-criteria-verifier.md +28 -0
- package/.pi/agents/harness/web-retrieval/web-gap-analyzer.md +31 -0
- package/.pi/agents/harness/web-retrieval/web-query-expander-fast.md +34 -0
- package/.pi/agents/harness/web-retrieval/web-query-expander.md +60 -0
- package/.pi/agents/harness/web-retrieval/web-summarizer.md +18 -0
- package/.pi/extensions/agt-kill-switch.ts +57 -0
- package/.pi/extensions/agt-prompt-guard.ts +32 -0
- package/.pi/extensions/custom-footer.ts +46 -145
- package/.pi/extensions/custom-header.ts +1 -1
- package/.pi/extensions/custom-system-prompt.ts +1 -1
- package/.pi/extensions/debate-orchestrator.ts +6 -6
- package/.pi/extensions/harness-ask-user.ts +7 -7
- package/.pi/extensions/harness-debate-tools.ts +26 -42
- package/.pi/extensions/harness-lens.ts +94 -0
- package/.pi/extensions/harness-plan-approval.ts +11 -11
- package/.pi/extensions/harness-run-context.ts +1070 -876
- package/.pi/extensions/harness-subagent-governance.ts +8 -0
- package/.pi/extensions/harness-subagent-submit.ts +34 -163
- package/.pi/extensions/harness-subagents.ts +3 -3
- package/.pi/extensions/harness-telemetry.ts +2 -2
- package/.pi/extensions/harness-web-guard.ts +2 -1
- package/.pi/extensions/harness-web-tools.ts +691 -53
- package/.pi/extensions/policy-gate.ts +25 -5
- package/.pi/extensions/sentrux-rules-sync.ts +1 -1
- package/.pi/extensions/subagent-governance.ts +92 -0
- package/.pi/extensions/trace-recorder.ts +1 -1
- package/.pi/extensions/{ultimate-pi-vcc.ts → vcc-compaction.ts} +1 -1
- package/.pi/harness/README.md +6 -2
- package/.pi/harness/agents.manifest.json +46 -25
- package/.pi/harness/agents.policy.yaml +309 -0
- package/.pi/harness/docs/adrs/0030-inhouse-vcc-compaction.md +1 -1
- package/.pi/harness/docs/adrs/0035-plan-phase-review-gate.md +1 -1
- package/.pi/harness/docs/adrs/0045-harness-lens-minimal-contract.md +49 -0
- package/.pi/harness/docs/adrs/0046-agt-policy-engine.md +51 -0
- package/.pi/harness/docs/adrs/0047-agt-layered-security.md +39 -0
- package/.pi/harness/docs/adrs/0048-tool-call-hook-order.md +25 -0
- package/.pi/harness/docs/adrs/0049-agents-policy-manifest.md +36 -0
- package/.pi/harness/docs/adrs/0050-agentic-web-retrieval-stack.md +46 -0
- package/.pi/harness/docs/adrs/README.md +5 -0
- package/.pi/harness/docs/harness-web-search.md +97 -0
- package/.pi/harness/env.harness.template +9 -1
- package/.pi/harness/evolution/README.md +1 -2
- package/.pi/harness/examples/agents.policy.project.yaml +19 -0
- package/.pi/harness/examples/policies/custom-deny-bash.yaml +9 -0
- package/.pi/harness/examples/web-heuristic-angles.project.yaml +22 -0
- package/.pi/harness/policies/bash-denylists.yaml +5 -0
- package/.pi/harness/policies/defaults.yaml +51 -0
- package/.pi/harness/policies/orchestrator.yaml +18 -0
- package/.pi/harness/policies/phases.yaml +10 -0
- package/.pi/harness/policies/roles.yaml +5 -0
- package/.pi/harness/policies/web-guard.yaml +5 -0
- package/.pi/harness/policies/workflow-sequences.yaml +9 -0
- package/.pi/harness/sentrux/architecture.manifest.json +26 -4
- package/.pi/harness/specs/observation.schema.json +2 -1
- package/.pi/harness/web-heuristic-angles.json +278 -0
- package/.pi/harness/web-heuristic-angles.yaml +182 -0
- package/.pi/lib/agents-policy.d.mts +70 -0
- package/.pi/lib/agents-policy.mjs +331 -0
- package/.pi/lib/agents-policy.ts +19 -0
- package/.pi/lib/agt/audit-run-sink.ts +52 -0
- package/.pi/lib/agt/build-evaluation-context.ts +285 -0
- package/.pi/lib/agt/config.ts +28 -0
- package/.pi/lib/agt/delegation.ts +69 -0
- package/.pi/lib/agt/evaluate-policy.ts +56 -0
- package/.pi/lib/agt/identity-registry.ts +41 -0
- package/.pi/lib/agt/index.ts +55 -0
- package/.pi/lib/agt/kill-switch-state.ts +11 -0
- package/.pi/lib/agt/legacy-evaluate.ts +101 -0
- package/.pi/lib/agt/policy-engine.ts +154 -0
- package/.pi/lib/agt/rings.ts +21 -0
- package/.pi/lib/agt/sre-hooks.ts +45 -0
- package/.pi/lib/agt/trust-run-store.ts +26 -0
- package/.pi/lib/agt/workflow-history.ts +29 -0
- package/.pi/lib/agt-governance-active.ts +14 -0
- package/.pi/lib/agt-tool-guard.ts +78 -0
- package/.pi/lib/ask-user/dialog.ts +314 -0
- package/.pi/{extensions/lib → lib}/debate-bus-core.ts +10 -10
- package/.pi/{extensions/lib → lib}/debate-bus-state.ts +1 -1
- package/.pi/{extensions/lib → lib}/extension-load-guard.ts +13 -2
- package/.pi/lib/harness-agt-tool-guard.ts +5 -0
- package/.pi/{extensions/lib → lib}/harness-artifact-gate.ts +1 -1
- package/.pi/lib/harness-debate-core-deps.ts +14 -0
- package/.pi/lib/harness-debate-workflow-deps.ts +43 -0
- package/.pi/lib/harness-lens/.gitattributes +1 -0
- package/.pi/lib/harness-lens/clients/edit-autopatch.ts +88 -0
- package/.pi/lib/harness-lens/clients/file-kinds.ts +380 -0
- package/.pi/lib/harness-lens/clients/file-time.ts +215 -0
- package/.pi/lib/harness-lens/clients/file-utils.ts +484 -0
- package/.pi/lib/harness-lens/clients/format-service.ts +276 -0
- package/.pi/lib/harness-lens/clients/formatters.ts +1000 -0
- package/.pi/lib/harness-lens/clients/git-guard.ts +31 -0
- package/.pi/lib/harness-lens/clients/indent-retarget.ts +90 -0
- package/.pi/lib/harness-lens/clients/installer/index.ts +2368 -0
- package/.pi/lib/harness-lens/clients/latency-logger.ts +80 -0
- package/.pi/lib/harness-lens/clients/lens-config.ts +43 -0
- package/.pi/lib/harness-lens/clients/lens-events.ts +164 -0
- package/.pi/lib/harness-lens/clients/lsp/aggregation.ts +91 -0
- package/.pi/lib/harness-lens/clients/lsp/client.ts +1466 -0
- package/.pi/lib/harness-lens/clients/lsp/config.ts +216 -0
- package/.pi/lib/harness-lens/clients/lsp/edits.ts +297 -0
- package/.pi/lib/harness-lens/clients/lsp/index.ts +1355 -0
- package/.pi/lib/harness-lens/clients/lsp/interactive-install.ts +424 -0
- package/.pi/lib/harness-lens/clients/lsp/language.ts +223 -0
- package/.pi/lib/harness-lens/clients/lsp/launch.ts +939 -0
- package/.pi/lib/harness-lens/clients/lsp/lsp-index.ts +11 -0
- package/.pi/lib/harness-lens/clients/lsp/path-utils.ts +12 -0
- package/.pi/lib/harness-lens/clients/lsp/server-strategies.ts +81 -0
- package/.pi/lib/harness-lens/clients/lsp/server.ts +1971 -0
- package/.pi/lib/harness-lens/clients/path-utils.ts +182 -0
- package/.pi/lib/harness-lens/clients/pipeline.ts +360 -0
- package/.pi/lib/harness-lens/clients/project-profile.ts +117 -0
- package/.pi/lib/harness-lens/clients/runtime-agent-end.ts +112 -0
- package/.pi/lib/harness-lens/clients/runtime-config.ts +33 -0
- package/.pi/lib/harness-lens/clients/runtime-coordinator.ts +186 -0
- package/.pi/lib/harness-lens/clients/runtime-tool-result.ts +171 -0
- package/.pi/lib/harness-lens/clients/safe-spawn.ts +339 -0
- package/.pi/lib/harness-lens/clients/secrets-scanner.ts +214 -0
- package/.pi/lib/harness-lens/clients/tool-policy.ts +2072 -0
- package/.pi/lib/harness-lens/clients/types.ts +59 -0
- package/.pi/lib/harness-lens/clients/widget-state.ts +283 -0
- package/.pi/lib/harness-lens/index.ts +532 -0
- package/.pi/lib/harness-lens/tools/lsp-diagnostics.ts +706 -0
- package/.pi/lib/harness-lens/tools/lsp-navigation.ts +1246 -0
- package/.pi/{extensions/lib → lib}/harness-posthog.ts +3 -0
- package/.pi/lib/harness-run-context-responses.ts +9 -0
- package/.pi/lib/harness-run-context.ts +0 -2
- package/.pi/{extensions/lib/spawn-policy.ts → lib/harness-spawn-policy.ts} +1 -0
- package/.pi/{extensions/lib → lib}/harness-spawn-topology.ts +1 -1
- package/.pi/lib/harness-subagent-auth.ts +81 -0
- package/.pi/{extensions/lib → lib}/harness-subagent-precheck.ts +10 -7
- package/.pi/{extensions/lib → lib}/harness-subagent-submit-pipeline.ts +3 -3
- package/.pi/lib/harness-subagent-submit-register.ts +163 -0
- package/.pi/{extensions/lib → lib}/harness-subagent-submit-registry.ts +1 -37
- package/.pi/{extensions/lib → lib}/harness-subagents-bridge.ts +74 -14
- package/.pi/{extensions/lib → lib}/harness-subprocess-bootstrap.ts +1 -1
- package/.pi/lib/harness-web/artifacts.ts +200 -0
- package/.pi/lib/harness-web/cache.ts +369 -0
- package/.pi/{extensions/lib → lib}/harness-web/run-cli.ts +42 -2
- package/.pi/{extensions/lib → lib}/plan-approval/create-plan.ts +2 -2
- package/.pi/{extensions/lib → lib}/plan-approval/format-plan.ts +2 -2
- package/.pi/{extensions/lib → lib}/plan-approval/plan-review.ts +162 -201
- package/.pi/{extensions/lib → lib}/plan-approval/render.ts +1 -1
- package/.pi/{extensions/lib → lib}/plan-approval/resolve-disk.ts +2 -2
- package/.pi/{extensions/lib → lib}/plan-approval/types.ts +1 -1
- package/.pi/{extensions/lib → lib}/plan-approval/validate.ts +3 -3
- package/.pi/{extensions/lib → lib}/plan-debate-envelope.ts +1 -1
- package/.pi/{extensions/lib → lib}/plan-debate-gate.ts +1 -1
- package/.pi/{extensions/lib → lib}/plan-debate-lane.ts +1 -4
- package/.pi/{extensions/lib → lib}/plan-messenger.ts +1 -1
- package/.pi/prompts/harness-plan.md +2 -1
- package/.pi/prompts/harness-setup.md +40 -65
- package/.pi/scripts/README.md +2 -5
- package/.pi/scripts/gen-web-heuristic-angles-json.mjs +24 -0
- package/.pi/scripts/generate-agents-policy-yaml.mjs +148 -0
- package/.pi/scripts/harness-agents-manifest.mjs +60 -3
- package/.pi/scripts/harness-agt-doctor.ts +36 -0
- package/.pi/scripts/harness-cli-verify.sh +14 -2
- package/.pi/scripts/harness-verify.mjs +191 -39
- package/.pi/scripts/harness-web-policy-guard.mjs +3 -3
- package/.pi/scripts/harness-web.py +218 -15
- package/.pi/scripts/harness_web/deep_search.py +55 -0
- package/.pi/scripts/harness_web/evidence_bundle.py +47 -0
- package/.pi/scripts/harness_web/find_similar.py +88 -0
- package/.pi/scripts/harness_web/heuristic_angles_shipped.py +85 -0
- package/.pi/scripts/harness_web/heuristic_config.py +251 -0
- package/.pi/scripts/harness_web/highlights.py +47 -0
- package/.pi/scripts/harness_web/multi_search.py +59 -0
- package/.pi/scripts/harness_web/output.py +24 -0
- package/.pi/scripts/harness_web/query_angles.py +116 -0
- package/.pi/scripts/harness_web/rank.py +163 -0
- package/.pi/scripts/harness_web/scrape.py +30 -0
- package/.pi/scripts/tests/test_harness_web_heuristic_config.py +132 -0
- package/.pi/scripts/tests/test_harness_web_query_angles.py +45 -0
- package/.pi/scripts/tests/test_harness_web_rank.py +56 -0
- package/.pi/scripts/validate-plan-dag.mjs +65 -74
- package/.pi/scripts/vendor-pi-vcc-settings.stub.ts +2 -2
- package/.pi/scripts/vendor-sync-pi-vcc.sh +1 -1
- package/.pi/skills/architecture/broker-domain/SKILL.md +65 -0
- package/.pi/skills/architecture/cqrs/SKILL.md +63 -0
- package/.pi/skills/architecture/event-driven/SKILL.md +60 -0
- package/.pi/skills/architecture/hexagonal-ports-adapters/SKILL.md +66 -0
- package/.pi/skills/architecture/layered/SKILL.md +68 -0
- package/.pi/skills/architecture/microkernel/SKILL.md +62 -0
- package/.pi/skills/architecture/microservices/SKILL.md +64 -0
- package/.pi/skills/architecture/modular-monolith/SKILL.md +65 -0
- package/.pi/skills/architecture/orchestration-driven-soa/SKILL.md +61 -0
- package/.pi/skills/architecture/pipeline/SKILL.md +63 -0
- package/.pi/skills/architecture/service-based/SKILL.md +64 -0
- package/.pi/skills/architecture/service-mesh/SKILL.md +60 -0
- package/.pi/skills/architecture/space-based/SKILL.md +60 -0
- package/.pi/skills/ast-grep/SKILL.md +40 -321
- package/.pi/skills/delivery/debugging-discipline/SKILL.md +36 -0
- package/.pi/skills/delivery/documentation-update/SKILL.md +33 -0
- package/.pi/skills/delivery/requirements-to-implementation/SKILL.md +34 -0
- package/.pi/skills/delivery/risk-based-verification/SKILL.md +43 -0
- package/.pi/skills/delivery/tradeoff-analysis/SKILL.md +34 -0
- package/.pi/skills/engineering/api-contract-design/SKILL.md +38 -0
- package/.pi/skills/engineering/cohesion-coupling/SKILL.md +43 -0
- package/.pi/skills/engineering/complexity-control/SKILL.md +31 -0
- package/.pi/skills/engineering/defensive-programming/SKILL.md +38 -0
- package/.pi/skills/engineering/dependency-management/SKILL.md +29 -0
- package/.pi/skills/engineering/domain-modeling/SKILL.md +32 -0
- package/.pi/skills/engineering/error-handling/SKILL.md +37 -0
- package/.pi/skills/engineering/legacy-code-seams/SKILL.md +35 -0
- package/.pi/skills/engineering/naming-and-intent/SKILL.md +29 -0
- package/.pi/skills/engineering/refactoring-safe-evolution/SKILL.md +35 -0
- package/.pi/skills/engineering/routine-function-design/SKILL.md +34 -0
- package/.pi/skills/engineering/small-change-discipline/SKILL.md +35 -0
- package/.pi/skills/lsp-navigation/SKILL.md +89 -0
- package/.pi/skills/quality/code-review-self-check/SKILL.md +35 -0
- package/.pi/skills/quality/privacy-data-handling/SKILL.md +26 -0
- package/.pi/skills/quality/security-review/SKILL.md +34 -0
- package/.pi/skills/quality/test-strategy/SKILL.md +33 -0
- package/.pi/skills/quality/testability-design/SKILL.md +33 -0
- package/.pi/skills/systems/concurrency-safety/SKILL.md +32 -0
- package/.pi/skills/systems/data-modeling-migrations/SKILL.md +31 -0
- package/.pi/skills/systems/observability-instrumentation/SKILL.md +32 -0
- package/.pi/skills/systems/performance-measurement/SKILL.md +35 -0
- package/.pi/skills/systems/reliability-design/SKILL.md +32 -0
- package/.sentrux/rules.toml +20 -4
- package/AGENTS.md +7 -2
- package/CHANGELOG.md +20 -0
- package/README.md +3 -12
- package/THIRD_PARTY_NOTICES.md +12 -21
- package/package.json +17 -7
- package/vendor/pi-subagents/src/agents.ts +45 -1
- package/vendor/pi-subagents/src/subagents.ts +866 -811
- package/vendor/pi-vcc/src/core/brief.ts +68 -99
- package/vendor/pi-vcc/src/core/settings.ts +2 -2
- package/.agents/skills/caveman/SKILL.md +0 -67
- package/.agents/skills/scrapling-web/SKILL.md +0 -98
- package/.pi/agents/harness/meta-optimizer.md +0 -36
- package/.pi/extensions/00-posthog-network-bootstrap.ts +0 -11
- package/.pi/extensions/lib/ask-user/dialog.ts +0 -260
- package/.pi/extensions/lib/harness-subagent-auth.ts +0 -207
- package/.pi/extensions/lib/harness-subagent-policy.ts +0 -236
- package/.pi/extensions/pi-model-router-harness.ts +0 -42
- package/.pi/harness/evolution/meta-optimizer.mjs +0 -99
- package/.pi/harness/specs/router-tuning-proposal.schema.json +0 -114
- package/.pi/model-router.example.json +0 -36
- package/.pi/prompts/harness-critic.md +0 -10
- package/.pi/prompts/harness-eval.md +0 -10
- package/.pi/prompts/harness-router-tune.md +0 -52
- package/.pi/scripts/harness-generate-model-router.mjs +0 -327
- package/.pi/scripts/harness-model-router-routing.test.mjs +0 -97
- package/.pi/scripts/harness-sync-model-router.mjs +0 -97
- package/.pi/scripts/harness_web/__pycache__/__init__.cpython-314.pyc +0 -0
- package/.pi/scripts/harness_web/__pycache__/config.cpython-314.pyc +0 -0
- package/.pi/scripts/harness_web/__pycache__/output.cpython-314.pyc +0 -0
- package/.pi/scripts/harness_web/__pycache__/scrape.cpython-314.pyc +0 -0
- package/.pi/scripts/harness_web/__pycache__/search.cpython-314.pyc +0 -0
- package/.pi/scripts/harness_web/__pycache__/search_ddg.cpython-314.pyc +0 -0
- package/.pi/scripts/harness_web/__pycache__/search_searxng.cpython-314.pyc +0 -0
- package/.pi/scripts/vendor-sync-pi-model-router.sh +0 -47
- package/vendor/pi-model-router/.prettierignore +0 -4
- package/vendor/pi-model-router/.prettierrc +0 -5
- package/vendor/pi-model-router/AGENTS.md +0 -39
- package/vendor/pi-model-router/LICENSE +0 -21
- package/vendor/pi-model-router/README.md +0 -99
- package/vendor/pi-model-router/UPSTREAM_PIN.md +0 -10
- package/vendor/pi-model-router/docs/ARCHITECTURE.md +0 -54
- package/vendor/pi-model-router/extensions/commands.ts +0 -720
- package/vendor/pi-model-router/extensions/config.ts +0 -348
- package/vendor/pi-model-router/extensions/constants.ts +0 -1
- package/vendor/pi-model-router/extensions/index.ts +0 -478
- package/vendor/pi-model-router/extensions/provider.ts +0 -580
- package/vendor/pi-model-router/extensions/routing.ts +0 -564
- package/vendor/pi-model-router/extensions/state.ts +0 -52
- package/vendor/pi-model-router/extensions/types.ts +0 -95
- package/vendor/pi-model-router/extensions/ui.ts +0 -144
- package/vendor/pi-model-router/model-router.example.json +0 -48
- package/vendor/pi-model-router/package.json +0 -48
- package/vendor/pi-model-router/tsconfig.json +0 -16
- /package/.pi/{prompts → harness/docs}/planning-rubrics.md +0 -0
- /package/.pi/{extensions/lib → lib}/ask-user/fallback.ts +0 -0
- /package/.pi/{extensions/lib → lib}/ask-user/render.ts +0 -0
- /package/.pi/{extensions/lib → lib}/ask-user/schema.ts +0 -0
- /package/.pi/{extensions/lib → lib}/ask-user/types.ts +0 -0
- /package/.pi/{extensions/lib → lib}/ask-user/validate-core.mjs +0 -0
- /package/.pi/{extensions/lib → lib}/ask-user/validate.ts +0 -0
- /package/.pi/{extensions/lib → lib}/harness-cocoindex-refresh.ts +0 -0
- /package/.pi/{extensions/lib → lib}/harness-paths.ts +0 -0
- /package/.pi/{extensions/lib → lib}/harness-spawn-budget.ts +0 -0
- /package/.pi/{extensions/lib → lib}/harness-vcc-settings.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-approval/dialog.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-approval/schema.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-approval-readiness.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-debate-eligibility.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-debate-focus.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-debate-id.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-debate-lanes.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-debate-round-status.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-debate-write-guard.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-review-gate.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-review-integrator-rules.ts +0 -0
- /package/.pi/{extensions/lib → lib}/plan-scope-guard.ts +0 -0
- /package/.pi/{extensions/lib → lib}/posthog-client.ts +0 -0
- /package/.pi/{extensions/lib → lib}/posthog-node.d.ts +0 -0
|
@@ -88,49 +88,31 @@ function computeCriticalPath(workItems) {
|
|
|
88
88
|
return path;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
function validateMinimumShape(packet, ep, phases, workItems) {
|
|
92
92
|
const errors = [];
|
|
93
|
-
const ep = packet.execution_plan;
|
|
94
|
-
if (!ep) {
|
|
95
|
-
errors.push("execution_plan required");
|
|
96
|
-
return { status: "fail", errors, report: null };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
93
|
const risk = packet.risk_level ?? "med";
|
|
100
94
|
const min = MINIMUMS[risk] ?? MINIMUMS.med;
|
|
101
|
-
const phases = ep.phases ?? [];
|
|
102
|
-
const workItems = ep.work_items ?? [];
|
|
103
|
-
const conflicts = [];
|
|
104
|
-
|
|
105
|
-
if (phases.length < min.phases) {
|
|
106
|
-
errors.push(`need >= ${min.phases} phases for risk ${risk}`);
|
|
107
|
-
}
|
|
108
|
-
if (workItems.length < min.work_items) {
|
|
109
|
-
errors.push(`need >= ${min.work_items} work_items for risk ${risk}`);
|
|
110
|
-
}
|
|
111
95
|
const ac = packet.acceptance_checks ?? [];
|
|
112
|
-
if (
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
if ((ep.risk_register ?? []).length < min.risks) {
|
|
116
|
-
|
|
117
|
-
|
|
96
|
+
if (phases.length < min.phases) errors.push(`need >= ${min.phases} phases for risk ${risk}`);
|
|
97
|
+
if (workItems.length < min.work_items) errors.push(`need >= ${min.work_items} work_items for risk ${risk}`);
|
|
98
|
+
if (ac.length < min.acceptance_checks) errors.push(`need >= ${min.acceptance_checks} acceptance_checks`);
|
|
99
|
+
if ((ep.risk_register ?? []).length < min.risks) errors.push(`need >= ${min.risks} risks for risk ${risk}`);
|
|
100
|
+
return errors;
|
|
101
|
+
}
|
|
118
102
|
|
|
103
|
+
function validatePhaseAndWorkItemLinks(phases, workItems) {
|
|
104
|
+
const errors = [];
|
|
119
105
|
const phaseIds = new Set(phases.map((p) => p.phase_id));
|
|
120
|
-
const phaseIndex = new Map(phases.map((p, i) => [p.phase_id, i]));
|
|
121
106
|
const wiIds = new Set(workItems.map((w) => w.work_item_id));
|
|
122
|
-
|
|
123
107
|
for (const p of phases) {
|
|
124
108
|
if (!p.exit_criteria?.length) errors.push(`phase ${p.phase_id} missing exit_criteria`);
|
|
125
109
|
if (!p.work_item_ids?.length) errors.push(`phase ${p.phase_id} has no work items`);
|
|
110
|
+
for (const wid of p.work_item_ids ?? []) {
|
|
111
|
+
if (!wiIds.has(wid)) errors.push(`phase ${p.phase_id} references missing ${wid}`);
|
|
112
|
+
}
|
|
126
113
|
}
|
|
127
|
-
|
|
128
|
-
const wiInPhase = new Set();
|
|
129
114
|
for (const w of workItems) {
|
|
130
|
-
if (!phaseIds.has(w.phase_id)) {
|
|
131
|
-
errors.push(`work_item ${w.work_item_id} unknown phase_id`);
|
|
132
|
-
}
|
|
133
|
-
wiInPhase.add(w.work_item_id);
|
|
115
|
+
if (!phaseIds.has(w.phase_id)) errors.push(`work_item ${w.work_item_id} unknown phase_id`);
|
|
134
116
|
for (const d of w.depends_on ?? []) {
|
|
135
117
|
if (!wiIds.has(d)) errors.push(`work_item ${w.work_item_id} depends_on missing ${d}`);
|
|
136
118
|
}
|
|
@@ -138,17 +120,23 @@ export function validateExecutionPlan(packet, projectRoot = ROOT) {
|
|
|
138
120
|
errors.push(`work_item ${w.work_item_id} needs files[] or non_code: true`);
|
|
139
121
|
}
|
|
140
122
|
}
|
|
123
|
+
return errors;
|
|
124
|
+
}
|
|
141
125
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
126
|
+
function isReachable(workItems, from, to, seen = new Set()) {
|
|
127
|
+
if (from === to) return true;
|
|
128
|
+
if (seen.has(from)) return false;
|
|
129
|
+
seen.add(from);
|
|
130
|
+
const w = workItems.find((x) => x.work_item_id === from);
|
|
131
|
+
for (const d of w?.depends_on ?? []) {
|
|
132
|
+
if (isReachable(workItems, d, to, seen)) return true;
|
|
146
133
|
}
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
147
136
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
// File conflicts
|
|
137
|
+
function findFileConflicts(phases, workItems) {
|
|
138
|
+
const conflicts = [];
|
|
139
|
+
const phaseIndex = new Map(phases.map((p, i) => [p.phase_id, i]));
|
|
152
140
|
for (let i = 0; i < workItems.length; i++) {
|
|
153
141
|
for (let j = i + 1; j < workItems.length; j++) {
|
|
154
142
|
const a = workItems[i];
|
|
@@ -156,42 +144,34 @@ export function validateExecutionPlan(packet, projectRoot = ROOT) {
|
|
|
156
144
|
const filesA = new Set(a.files ?? []);
|
|
157
145
|
const overlap = (b.files ?? []).filter((f) => filesA.has(f));
|
|
158
146
|
if (overlap.length === 0) continue;
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
return false;
|
|
168
|
-
};
|
|
169
|
-
if (!reachable(a.work_item_id, b.work_item_id) && !reachable(b.work_item_id, a.work_item_id)) {
|
|
170
|
-
if ((phaseIndex.get(a.phase_id) ?? 0) === (phaseIndex.get(b.phase_id) ?? 0)) {
|
|
171
|
-
conflicts.push(
|
|
172
|
-
`file overlap ${overlap.join(",")} between ${a.work_item_id} and ${b.work_item_id} without dependency`,
|
|
173
|
-
);
|
|
174
|
-
}
|
|
147
|
+
const ordered =
|
|
148
|
+
isReachable(workItems, a.work_item_id, b.work_item_id) ||
|
|
149
|
+
isReachable(workItems, b.work_item_id, a.work_item_id);
|
|
150
|
+
const samePhase = (phaseIndex.get(a.phase_id) ?? 0) === (phaseIndex.get(b.phase_id) ?? 0);
|
|
151
|
+
if (!ordered && samePhase) {
|
|
152
|
+
conflicts.push(
|
|
153
|
+
`file overlap ${overlap.join(",")} between ${a.work_item_id} and ${b.work_item_id} without dependency`,
|
|
154
|
+
);
|
|
175
155
|
}
|
|
176
156
|
}
|
|
177
157
|
}
|
|
158
|
+
return conflicts;
|
|
159
|
+
}
|
|
178
160
|
|
|
161
|
+
function validateCriticalPath(ep, workItems) {
|
|
179
162
|
const computedCp = computeCriticalPath(workItems);
|
|
180
163
|
const authorCp = ep.schedule_metadata?.critical_path_work_item_ids ?? [];
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
`critical_path mismatch author=${authorCp.join("→")} computed=${computedCp.join("→")}`,
|
|
188
|
-
);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
164
|
+
const same =
|
|
165
|
+
authorCp.length === computedCp.length &&
|
|
166
|
+
authorCp.every((id, i) => id === computedCp[i]);
|
|
167
|
+
if (computedCp.length < 3 || !authorCp.length || same) return [];
|
|
168
|
+
return [`critical_path mismatch author=${authorCp.join("→")} computed=${computedCp.join("→")}`];
|
|
169
|
+
}
|
|
191
170
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
171
|
+
function validateAcceptanceCheckLinks(packet, workItems) {
|
|
172
|
+
const errors = [];
|
|
173
|
+
const ac = packet.acceptance_checks ?? [];
|
|
174
|
+
const acIds = new Set(ac.map((c) => (typeof c === "string" ? c : c.id)).filter(Boolean));
|
|
195
175
|
for (const w of workItems) {
|
|
196
176
|
for (const acid of w.acceptance_check_ids ?? []) {
|
|
197
177
|
if (!acIds.has(acid)) errors.push(`${w.work_item_id} references orphan ${acid}`);
|
|
@@ -201,14 +181,25 @@ export function validateExecutionPlan(packet, projectRoot = ROOT) {
|
|
|
201
181
|
const used = workItems.some((w) => (w.acceptance_check_ids ?? []).includes(acid));
|
|
202
182
|
if (!used) errors.push(`orphan acceptance check ${acid}`);
|
|
203
183
|
}
|
|
184
|
+
return errors;
|
|
185
|
+
}
|
|
204
186
|
|
|
187
|
+
export function validateExecutionPlan(packet, projectRoot = ROOT) {
|
|
188
|
+
const ep = packet.execution_plan;
|
|
189
|
+
if (!ep) return { status: "fail", errors: ["execution_plan required"], report: null };
|
|
190
|
+
const phases = ep.phases ?? [];
|
|
191
|
+
const workItems = ep.work_items ?? [];
|
|
192
|
+
const { order, cycles } = topoSort(workItems);
|
|
193
|
+
const errors = [
|
|
194
|
+
...validateMinimumShape(packet, ep, phases, workItems),
|
|
195
|
+
...validatePhaseAndWorkItemLinks(phases, workItems),
|
|
196
|
+
...(cycles.length ? [`cycle detected: ${JSON.stringify(cycles[0])}`] : []),
|
|
197
|
+
...validateCriticalPath(ep, workItems),
|
|
198
|
+
...validateAcceptanceCheckLinks(packet, workItems),
|
|
199
|
+
];
|
|
200
|
+
const conflicts = findFileConflicts(phases, workItems);
|
|
205
201
|
const status = errors.length === 0 && conflicts.length === 0 ? "pass" : "fail";
|
|
206
|
-
const report = {
|
|
207
|
-
status,
|
|
208
|
-
topological_order: order,
|
|
209
|
-
cycles,
|
|
210
|
-
conflicts: [...conflicts, ...errors],
|
|
211
|
-
};
|
|
202
|
+
const report = { status, topological_order: order, cycles, conflicts: [...conflicts, ...errors] };
|
|
212
203
|
return { status, errors: [...errors, ...conflicts], report };
|
|
213
204
|
}
|
|
214
205
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ultimate-pi harness settings (env-only). Re-exported for vendored pi-vcc layout.
|
|
3
3
|
*/
|
|
4
|
-
export type { PiVccSettings } from "../../../../.pi/
|
|
4
|
+
export type { PiVccSettings } from "../../../../.pi/lib/harness-vcc-settings.js";
|
|
5
5
|
export {
|
|
6
6
|
loadSettings,
|
|
7
7
|
scaffoldSettings,
|
|
8
|
-
} from "../../../../.pi/
|
|
8
|
+
} from "../../../../.pi/lib/harness-vcc-settings.js";
|
|
@@ -29,7 +29,7 @@ cat >"$VEND/UPSTREAM_PIN.md" <<EOF
|
|
|
29
29
|
- **License:** MIT (see upstream repository)
|
|
30
30
|
- **Pinned upstream commit:** \`$COMMIT\`
|
|
31
31
|
- **Local changes:**
|
|
32
|
-
- \`src/core/settings.ts\` re-exports env-only [\`harness-vcc-settings\`](../../.pi/
|
|
32
|
+
- \`src/core/settings.ts\` re-exports env-only [\`harness-vcc-settings\`](../../.pi/lib/harness-vcc-settings.ts) (\`HARNESS_VCC_COMPACTION\`, \`HARNESS_VCC_DEBUG\`)
|
|
33
33
|
- No \`scaffoldSettings\` / no \`PI_VCC_CONFIG_PATH\`
|
|
34
34
|
- Compaction \`details.compactor\` is \`ultimate-pi-vcc\`
|
|
35
35
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: broker-domain
|
|
3
|
+
description: "Use when implementing the Broker-Domain pattern: event-brokered integration around cohesive domain services, separating broker concerns from domain behavior, with explicit event contracts and bounded context ownership."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Broker-Domain Pattern
|
|
7
|
+
|
|
8
|
+
Use this skill when event-driven integration is needed but domain logic must stay inside cohesive domain boundaries.
|
|
9
|
+
|
|
10
|
+
## Fit
|
|
11
|
+
|
|
12
|
+
Use when multiple domains coordinate through events and you need to avoid both a god orchestrator and an anemic event-bus blob.
|
|
13
|
+
Avoid when a simple in-process call or single workflow orchestrator is clearer.
|
|
14
|
+
|
|
15
|
+
## Agent Workflow
|
|
16
|
+
|
|
17
|
+
1. Read `graphify-out/GRAPH_REPORT.md`.
|
|
18
|
+
2. Run `graphify query "Broker-Domain pattern event broker domain services bounded contexts"`.
|
|
19
|
+
3. Identify domain services and event broker responsibilities separately.
|
|
20
|
+
4. Keep event routing/transport out of domain decisions.
|
|
21
|
+
5. Implement one domain event flow end to end.
|
|
22
|
+
6. Add contract, idempotency, and ownership checks.
|
|
23
|
+
|
|
24
|
+
## Target Shape
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
codebase/domains/
|
|
28
|
+
orders/
|
|
29
|
+
domain/
|
|
30
|
+
application/
|
|
31
|
+
events # domain-owned event contracts
|
|
32
|
+
billing/
|
|
33
|
+
...
|
|
34
|
+
codebase/broker/
|
|
35
|
+
bus
|
|
36
|
+
subscriptions
|
|
37
|
+
serializers
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Implementation Rules
|
|
41
|
+
|
|
42
|
+
- Domains publish and consume meaningful business events.
|
|
43
|
+
- Broker code owns transport, serialization, subscription wiring, retries, and delivery mechanics.
|
|
44
|
+
- Domain code must not depend on broker vendor APIs.
|
|
45
|
+
- Event contracts belong to the producing domain and are versioned.
|
|
46
|
+
- Consumers translate external events into local application actions.
|
|
47
|
+
|
|
48
|
+
## Migration Steps
|
|
49
|
+
|
|
50
|
+
1. Select one cross-domain interaction.
|
|
51
|
+
2. Define producer-owned event contract.
|
|
52
|
+
3. Add broker adapter that maps domain event to transport message.
|
|
53
|
+
4. Add consumer subscription that calls local application service.
|
|
54
|
+
5. Add idempotency and dead-letter handling.
|
|
55
|
+
6. Remove direct cross-domain call if the event path replaces it safely.
|
|
56
|
+
|
|
57
|
+
## Verification
|
|
58
|
+
|
|
59
|
+
- `graphify explain "broker"` should show broker-to-domain adapter edges, not domain-to-vendor lock-in.
|
|
60
|
+
- Test event contract compatibility and duplicate delivery.
|
|
61
|
+
- Check no domain imports broker implementation packages.
|
|
62
|
+
|
|
63
|
+
## Output Contract
|
|
64
|
+
|
|
65
|
+
Return: domains, broker responsibilities, event contracts, migrated interaction, failure handling, and verification.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cqrs
|
|
3
|
+
description: "Use when implementing CQRS: separate command and query models, explicit write invariants, optimized read projections, consistency boundaries, projection rebuilds, and tests for command/query behavior."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CQRS
|
|
7
|
+
|
|
8
|
+
Use this skill when reads and writes need different models, scaling, permissions, or performance profiles.
|
|
9
|
+
|
|
10
|
+
## Fit
|
|
11
|
+
|
|
12
|
+
Use for complex domains with strong write invariants and read-heavy/query-specific views.
|
|
13
|
+
Avoid when simple CRUD is adequate; CQRS can double code paths and consistency work.
|
|
14
|
+
|
|
15
|
+
## Agent Workflow
|
|
16
|
+
|
|
17
|
+
1. Read `graphify-out/GRAPH_REPORT.md`.
|
|
18
|
+
2. Run `graphify query "CQRS command query responsibility segregation projections events"`.
|
|
19
|
+
3. Identify commands that change state and queries that read views.
|
|
20
|
+
4. Separate write model from read model incrementally.
|
|
21
|
+
5. Define consistency and projection rebuild rules.
|
|
22
|
+
6. Add tests for commands, projections, and stale reads.
|
|
23
|
+
|
|
24
|
+
## Target Shape
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
codebase/<bounded-context>/
|
|
28
|
+
commands/
|
|
29
|
+
handlers/
|
|
30
|
+
model/
|
|
31
|
+
queries/
|
|
32
|
+
handlers/
|
|
33
|
+
projections/
|
|
34
|
+
events/ # optional but common
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Implementation Rules
|
|
38
|
+
|
|
39
|
+
- Commands express intent and enforce invariants through the write model.
|
|
40
|
+
- Queries never mutate state.
|
|
41
|
+
- Read models are optimized for consumers and may be denormalized.
|
|
42
|
+
- Projection lag and stale-read behavior must be explicit.
|
|
43
|
+
- Do not expose write entities directly as read DTOs.
|
|
44
|
+
- Keep command and query contracts versioned if external.
|
|
45
|
+
|
|
46
|
+
## Migration Steps
|
|
47
|
+
|
|
48
|
+
1. Pick one painful read or one complex command.
|
|
49
|
+
2. Create command handler and query handler folders.
|
|
50
|
+
3. Move invariant logic into command handler/write model.
|
|
51
|
+
4. Create a read projection or query representation.
|
|
52
|
+
5. Wire projection update from transaction, event, or scheduled rebuild.
|
|
53
|
+
6. Add tests for stale/missing projection behavior.
|
|
54
|
+
|
|
55
|
+
## Verification
|
|
56
|
+
|
|
57
|
+
- Use graphify to confirm query handlers do not call command mutation paths.
|
|
58
|
+
- Test command invariants independently from query projection shape.
|
|
59
|
+
- Test projection rebuild from durable source.
|
|
60
|
+
|
|
61
|
+
## Output Contract
|
|
62
|
+
|
|
63
|
+
Return: command/query split, consistency model, projection path, migration patch, and verification evidence.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: event-driven
|
|
3
|
+
description: "Use when implementing event-driven architecture: domain/integration events, producers, consumers, broker or mediator topology, eventual consistency, idempotency, ordering, retries, and observable asynchronous flows."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Event-Driven Architecture
|
|
7
|
+
|
|
8
|
+
Use this skill when agents need to decouple producers and consumers with events safely.
|
|
9
|
+
|
|
10
|
+
## Fit
|
|
11
|
+
|
|
12
|
+
Use for asynchronous workflows, multi-consumer reactions, integration boundaries, audit trails, and high-throughput decoupling.
|
|
13
|
+
Avoid when immediate consistency and simple request/response are enough.
|
|
14
|
+
|
|
15
|
+
## Agent Workflow
|
|
16
|
+
|
|
17
|
+
1. Read `graphify-out/GRAPH_REPORT.md`.
|
|
18
|
+
2. Run `graphify query "event-driven architecture broker mediator topology eventual consistency"`.
|
|
19
|
+
3. Identify facts worth publishing, not commands disguised as events.
|
|
20
|
+
4. Choose broker/choreography or mediator/orchestration intentionally.
|
|
21
|
+
5. Implement one event path end to end.
|
|
22
|
+
6. Add idempotency, retry, and observability before expanding.
|
|
23
|
+
|
|
24
|
+
## Target Shape
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
codebase/events/
|
|
28
|
+
contracts/ # event schemas and versions
|
|
29
|
+
event-bus # publish/subscribe port
|
|
30
|
+
handlers/ # consumers
|
|
31
|
+
outbox/ # reliable publish if DB-backed
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Implementation Rules
|
|
35
|
+
|
|
36
|
+
- Events are past-tense facts: `OrderPlaced`, not `PlaceOrder`.
|
|
37
|
+
- Event schemas are versioned and backward-compatible.
|
|
38
|
+
- Consumers are idempotent and handle duplicate/out-of-order delivery.
|
|
39
|
+
- Use an outbox/inbox pattern when database state and publishing must be reliable.
|
|
40
|
+
- Prefer correlation IDs and causation IDs for traceability.
|
|
41
|
+
- Do not hide core business invariants in eventually consistent consumers.
|
|
42
|
+
|
|
43
|
+
## Migration Steps
|
|
44
|
+
|
|
45
|
+
1. Name one event from a real business fact.
|
|
46
|
+
2. Define schema, version, producer, and consumers.
|
|
47
|
+
3. Publish after the owning transaction commits.
|
|
48
|
+
4. Add one consumer with idempotency storage.
|
|
49
|
+
5. Add retry/dead-letter behavior.
|
|
50
|
+
6. Add tests for duplicate, missing, and stale events.
|
|
51
|
+
|
|
52
|
+
## Verification
|
|
53
|
+
|
|
54
|
+
- `graphify explain "<event name>"` should show producer and consumers.
|
|
55
|
+
- Contract-test event schema compatibility.
|
|
56
|
+
- Test retry and idempotency paths.
|
|
57
|
+
|
|
58
|
+
## Output Contract
|
|
59
|
+
|
|
60
|
+
Return: event catalog, topology choice, producer/consumer patch, consistency guarantees, failure handling, and verification.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hexagonal-ports-adapters
|
|
3
|
+
description: "Use when implementing hexagonal architecture / ports and adapters: domain core isolated from delivery and infrastructure mechanisms, inbound and outbound ports, adapters for external interfaces, dependency inversion, and testable business logic."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Hexagonal Architecture / Ports and Adapters
|
|
7
|
+
|
|
8
|
+
Use this skill to make business logic independent of delivery mechanisms and infrastructure.
|
|
9
|
+
|
|
10
|
+
## Fit
|
|
11
|
+
|
|
12
|
+
Use when domain logic is valuable, tests are brittle due to delivery/infrastructure coupling, or adapters change often.
|
|
13
|
+
Avoid if the system is a tiny CRUD wrapper where abstraction would be ceremony.
|
|
14
|
+
|
|
15
|
+
## Agent Workflow
|
|
16
|
+
|
|
17
|
+
1. Read `graphify-out/GRAPH_REPORT.md`.
|
|
18
|
+
2. Run `graphify query "hexagonal architecture ports adapters domain operational coupling"`.
|
|
19
|
+
3. Identify the core domain/application use case.
|
|
20
|
+
4. Define inbound and outbound ports around it.
|
|
21
|
+
5. Move delivery/infrastructure-specific code to adapters.
|
|
22
|
+
6. Test the core through ports without infrastructure.
|
|
23
|
+
|
|
24
|
+
## Target Shape
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
codebase/
|
|
28
|
+
core/
|
|
29
|
+
domain/
|
|
30
|
+
application/
|
|
31
|
+
ports/
|
|
32
|
+
inbound-port
|
|
33
|
+
outbound-port
|
|
34
|
+
adapters/
|
|
35
|
+
inbound/external-interface/
|
|
36
|
+
inbound/operator-interface/
|
|
37
|
+
outbound/persistence/
|
|
38
|
+
outbound/messaging/
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Implementation Rules
|
|
42
|
+
|
|
43
|
+
- Core owns domain and application behavior.
|
|
44
|
+
- Inbound adapters translate external requests into use-case calls.
|
|
45
|
+
- Outbound adapters implement core-defined ports for persistence, messaging, time, IDs, and external APIs.
|
|
46
|
+
- Dependencies point inward: adapters reference core, core does not reference adapters.
|
|
47
|
+
- Use dependency injection/composition at the edge.
|
|
48
|
+
|
|
49
|
+
## Migration Steps
|
|
50
|
+
|
|
51
|
+
1. Pick one use case entangled with delivery or persistence infrastructure.
|
|
52
|
+
2. Extract its input/output contracts and port interfaces into core.
|
|
53
|
+
3. Move business decisions into application/domain.
|
|
54
|
+
4. Wrap existing persistence/integration code as an outbound adapter.
|
|
55
|
+
5. Wire adapters in the composition root.
|
|
56
|
+
6. Add core tests with fake outbound ports.
|
|
57
|
+
|
|
58
|
+
## Verification
|
|
59
|
+
|
|
60
|
+
- `graphify explain "core"` should show no outbound adapter or infrastructure references.
|
|
61
|
+
- Search core paths for delivery, persistence, messaging, filesystem, environment, or platform dependencies.
|
|
62
|
+
- Test core without starting external infrastructure.
|
|
63
|
+
|
|
64
|
+
## Output Contract
|
|
65
|
+
|
|
66
|
+
Return: core boundary, ports, adapters, composition root change, tests, and remaining coupling.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: layered
|
|
3
|
+
description: "Use when designing, refactoring, or validating a codebase as layered architecture: delivery/interface, application/use-case, domain, and infrastructure/data layers with one-way dependency rules and minimal cross-layer coupling."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Layered Architecture
|
|
7
|
+
|
|
8
|
+
Use this skill to help an agent implement layered architecture, not just describe it.
|
|
9
|
+
|
|
10
|
+
## Fit
|
|
11
|
+
|
|
12
|
+
Use when the system is mostly CRUD, workflow-oriented, or policy-heavy and benefits from clear dependency direction.
|
|
13
|
+
Avoid when independent deployment, high autonomous scaling, or highly asynchronous collaboration is the main driver.
|
|
14
|
+
|
|
15
|
+
## Agent Workflow
|
|
16
|
+
|
|
17
|
+
1. Read `graphify-out/GRAPH_REPORT.md` before source files.
|
|
18
|
+
2. Run `graphify query "layered architecture dependencies presentation application domain infrastructure"`.
|
|
19
|
+
3. Infer the actual layers from packages, modules, and graph communities.
|
|
20
|
+
4. Define allowed dependencies before moving code.
|
|
21
|
+
5. Make the smallest refactor that improves directionality.
|
|
22
|
+
6. Add a fitness check that prevents backsliding.
|
|
23
|
+
|
|
24
|
+
## Target Shape
|
|
25
|
+
|
|
26
|
+
Typical dependency direction:
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
presentation/api -> application/use-cases -> domain -> infrastructure interfaces
|
|
30
|
+
infrastructure adapters -> domain/application ports
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Prefer these directories when introducing structure:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
codebase/
|
|
37
|
+
delivery/ # external-interface adapters
|
|
38
|
+
application/ # use cases, commands, queries, units of work
|
|
39
|
+
domain/ # entities, value objects, policies, domain services
|
|
40
|
+
infrastructure/ # persistence, network, messaging, filesystem, platform adapters
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Implementation Rules
|
|
44
|
+
|
|
45
|
+
- Domain code must not reference delivery mechanisms, persistence tooling, messaging systems, clocks, environment, or global configuration.
|
|
46
|
+
- Application code orchestrates use cases and owns transaction boundaries.
|
|
47
|
+
- Delivery/interface code maps external contracts to application inputs; it does not hold business rules.
|
|
48
|
+
- Infrastructure implements interfaces/ports declared inward.
|
|
49
|
+
- Shared utilities must be boring, stable, and dependency-free; do not create a junk drawer.
|
|
50
|
+
|
|
51
|
+
## Migration Steps
|
|
52
|
+
|
|
53
|
+
1. Pick one vertical use case.
|
|
54
|
+
2. Move business decisions from entrypoint handlers into `domain/`.
|
|
55
|
+
3. Create an application use-case routine around it.
|
|
56
|
+
4. Place infrastructure behind explicit interfaces.
|
|
57
|
+
5. Leave old entrypoints as thin adapters.
|
|
58
|
+
6. Repeat by use case, not by sweeping folders.
|
|
59
|
+
|
|
60
|
+
## Verification
|
|
61
|
+
|
|
62
|
+
- Use `graphify explain "<domain symbol>"` to confirm it has no outbound delivery/infrastructure edges.
|
|
63
|
+
- Search domain paths for forbidden references to delivery, persistence, messaging, environment, or platform mechanisms.
|
|
64
|
+
- Add dependency-boundary tests with the repo's existing verification tooling.
|
|
65
|
+
|
|
66
|
+
## Output Contract
|
|
67
|
+
|
|
68
|
+
Return: inferred layers, violations, minimal migration patch, verification run, and remaining risks.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: microkernel
|
|
3
|
+
description: "Use when building plugin or extension architecture: a stable core kernel with explicit extension points, plugin contracts, registration, isolation, versioning, and compatibility checks."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Microkernel / Plugin Architecture
|
|
7
|
+
|
|
8
|
+
Use this skill when the codebase needs a small core and independently variable plugins.
|
|
9
|
+
|
|
10
|
+
## Fit
|
|
11
|
+
|
|
12
|
+
Use for CLIs, editors, rules engines, integrations, workflow engines, agent tools, and product variants.
|
|
13
|
+
Avoid when variation is low or plugin isolation would add more complexity than it removes.
|
|
14
|
+
|
|
15
|
+
## Agent Workflow
|
|
16
|
+
|
|
17
|
+
1. Read `graphify-out/GRAPH_REPORT.md`.
|
|
18
|
+
2. Run `graphify query "microkernel plugin extension points core adapters"`.
|
|
19
|
+
3. Identify stable core responsibilities versus variable behavior.
|
|
20
|
+
4. Define extension contracts before extracting plugins.
|
|
21
|
+
5. Move one variable feature behind a plugin boundary.
|
|
22
|
+
6. Add compatibility and registration checks.
|
|
23
|
+
|
|
24
|
+
## Target Shape
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
codebase/kernel/
|
|
28
|
+
contracts # plugin interfaces, capabilities, lifecycle
|
|
29
|
+
registry # discovery, validation, ordering
|
|
30
|
+
runtime # core orchestration
|
|
31
|
+
codebase/plugins/
|
|
32
|
+
<plugin-name>/
|
|
33
|
+
entrypoint # manifest + implementation
|
|
34
|
+
tests/
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Implementation Rules
|
|
38
|
+
|
|
39
|
+
- Kernel owns orchestration, lifecycle, contracts, capability negotiation, and safe defaults.
|
|
40
|
+
- Plugins own optional behavior only; they must not mutate kernel internals.
|
|
41
|
+
- Plugin APIs are versioned and narrow.
|
|
42
|
+
- Registration validates name, version, capabilities, dependencies, and conflicts.
|
|
43
|
+
- Side effects are exposed through kernel-provided services, not global imports.
|
|
44
|
+
|
|
45
|
+
## Migration Steps
|
|
46
|
+
|
|
47
|
+
1. Name the extension point.
|
|
48
|
+
2. Create contract and manifest types.
|
|
49
|
+
3. Implement an in-process registry.
|
|
50
|
+
4. Wrap one existing variation as the first built-in plugin.
|
|
51
|
+
5. Replace direct branching with registry dispatch.
|
|
52
|
+
6. Add contract tests reused by every plugin.
|
|
53
|
+
|
|
54
|
+
## Verification
|
|
55
|
+
|
|
56
|
+
- `graphify explain "registry"` should show kernel-to-plugin direction, not plugin-to-kernel internals.
|
|
57
|
+
- Add tests for plugin registration, invalid manifests, lifecycle failures, and version mismatch.
|
|
58
|
+
- Search for plugin imports of kernel private paths.
|
|
59
|
+
|
|
60
|
+
## Output Contract
|
|
61
|
+
|
|
62
|
+
Return: kernel boundary, extension points, plugin contract, migrated plugin, compatibility tests, and known limitations.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: microservices
|
|
3
|
+
description: "Use when designing, extracting, or repairing microservices: independently deployable bounded-context services with owned data, explicit contracts, observability, resilience, distributed workflow choices, and operational readiness checks."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Microservices Architecture
|
|
7
|
+
|
|
8
|
+
Use this skill only when service independence is worth distributed-system cost.
|
|
9
|
+
|
|
10
|
+
## Fit
|
|
11
|
+
|
|
12
|
+
Use when services need independent deployability, independent scaling, domain autonomy, and separate data ownership.
|
|
13
|
+
Avoid when boundaries are unclear, teams cannot operate services, or a modular monolith would solve the problem.
|
|
14
|
+
|
|
15
|
+
## Agent Workflow
|
|
16
|
+
|
|
17
|
+
1. Read `graphify-out/GRAPH_REPORT.md`.
|
|
18
|
+
2. Run `graphify query "microservices bounded context data isolation choreography orchestration sagas"`.
|
|
19
|
+
3. Identify bounded contexts and fracture planes.
|
|
20
|
+
4. Choose one extraction candidate with high cohesion and low coupling.
|
|
21
|
+
5. Define API/events/data ownership before moving code.
|
|
22
|
+
6. Add production-readiness controls with the first extraction.
|
|
23
|
+
|
|
24
|
+
## Target Shape
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
services/
|
|
28
|
+
orders/
|
|
29
|
+
code/
|
|
30
|
+
contract/ # API specs, event schemas
|
|
31
|
+
migrations/
|
|
32
|
+
deploy/
|
|
33
|
+
billing/
|
|
34
|
+
...
|
|
35
|
+
shared/ # generated clients/contracts only; no shared domain model
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Implementation Rules
|
|
39
|
+
|
|
40
|
+
- Each service owns its data; no cross-service table writes.
|
|
41
|
+
- Contracts are explicit: API schema, event schema, or generated client.
|
|
42
|
+
- Distributed workflows use choreography, orchestration, or saga intentionally.
|
|
43
|
+
- Every network call has timeout, retry policy, circuit breaker/backoff as appropriate, and observability.
|
|
44
|
+
- Avoid shared domain libraries; share contracts, not internals.
|
|
45
|
+
- Extraction must include deployment, rollback, monitoring, and incident path.
|
|
46
|
+
|
|
47
|
+
## Migration Steps
|
|
48
|
+
|
|
49
|
+
1. Prove the boundary with a modular monolith facade first when possible.
|
|
50
|
+
2. Create service contract and data ownership doc.
|
|
51
|
+
3. Duplicate or migrate data behind an anti-corruption layer.
|
|
52
|
+
4. Route one use case through the new service.
|
|
53
|
+
5. Add contract tests and consumer-driven compatibility checks.
|
|
54
|
+
6. Add traces, metrics, logs, health checks, and rollback.
|
|
55
|
+
|
|
56
|
+
## Verification
|
|
57
|
+
|
|
58
|
+
- `graphify explain "<service>"` should show contract edges, not private code sharing.
|
|
59
|
+
- Test API compatibility, idempotency, failure, timeout, and degraded dependency behavior.
|
|
60
|
+
- Verify no direct database access across service boundaries.
|
|
61
|
+
|
|
62
|
+
## Output Contract
|
|
63
|
+
|
|
64
|
+
Return: service boundary, contracts, data ownership, extraction patch, resilience controls, verification, and ops risks.
|