@event4u/agent-config 7.4.0 → 8.0.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/.claude-plugin/marketplace.json +11 -1
- package/AGENTS.md +9 -9
- package/CHANGELOG.md +373 -0
- package/README.md +35 -5
- package/dist/agent-src/commands/analytics/prune.md +1 -1
- package/dist/agent-src/commands/analytics/show.md +1 -1
- package/dist/agent-src/commands/analyze/decision.md +2 -2
- package/dist/agent-src/commands/analyze/incident.md +2 -2
- package/dist/agent-src/commands/analyze/near-miss.md +2 -2
- package/dist/agent-src/commands/analyze/postmortem.md +2 -2
- package/dist/agent-src/commands/analyze/premortem.md +2 -2
- package/dist/agent-src/commands/cost-report.md +25 -0
- package/dist/agent-src/commands/evals/analyze.json +30 -0
- package/dist/agent-src/commands/evals/mission-upgrade.json +30 -0
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/knowledge/forget.md +1 -1
- package/dist/agent-src/commands/knowledge/ingest.md +1 -1
- package/dist/agent-src/commands/knowledge/list.md +1 -1
- package/dist/agent-src/commands/memory/load.md +12 -11
- package/dist/agent-src/commands/memory/promote.md +30 -0
- package/dist/agent-src/commands/memory/propose.md +16 -2
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/module/explore.md +11 -7
- package/dist/agent-src/commands/optimize-project.md +243 -0
- package/dist/agent-src/commands/optimize.md +5 -0
- package/dist/agent-src/commands/pr/create.md +37 -8
- package/dist/agent-src/commands/prediction-pool.md +2 -2
- package/dist/agent-src/commands/profile/activate.md +3 -3
- package/dist/agent-src/commands/profile/deactivate.md +2 -2
- package/dist/agent-src/commands/profile/show.md +3 -3
- package/dist/agent-src/commands/research/deep.md +5 -0
- package/dist/agent-src/commands/research/report.md +2 -1
- package/dist/agent-src/commands/review-changes.md +14 -7
- package/dist/agent-src/commands/roadmap/create.md +88 -10
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +15 -2
- package/dist/agent-src/commands/roadmap/process-phase.md +18 -6
- package/dist/agent-src/commands/roadmap/process-step.md +4 -0
- package/dist/agent-src/commands/roadmap.md +1 -1
- package/dist/agent-src/commands/security-audit-config.md +1 -1
- package/dist/agent-src/commands/sync-agent-settings.md +1 -1
- package/dist/agent-src/commands/sync-gitignore/fix.md +42 -6
- package/dist/agent-src/commands/team-knowledge/bootstrap.md +106 -0
- package/dist/agent-src/commands/team-knowledge/consolidate.md +105 -0
- package/dist/agent-src/commands/team-knowledge.md +64 -0
- package/dist/agent-src/contexts/authority/commit-mechanics.md +8 -0
- package/dist/agent-src/contexts/authority/destructive-mechanics.md +11 -0
- package/dist/agent-src/contexts/authority/scope-mechanics.md +25 -0
- package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +43 -0
- package/dist/agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
- package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +2 -2
- package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +14 -4
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +11 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +32 -8
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +107 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +71 -15
- package/dist/agent-src/contexts/execution/subagent-steering.md +41 -1
- package/dist/agent-src/contexts/override-system.md +1 -1
- package/dist/agent-src/personas/brand-strategist.md +0 -1
- package/dist/agent-src/personas/data-integrity.md +66 -0
- package/dist/agent-src/personas/design-director.md +0 -1
- package/dist/agent-src/personas/performance-engineer.md +66 -0
- package/dist/agent-src/personas/production-validator.md +73 -0
- package/dist/agent-src/rules/agent-authority.md +3 -4
- package/dist/agent-src/rules/analysis-skill-routing.md +3 -5
- package/dist/agent-src/rules/architecture.md +2 -4
- package/dist/agent-src/rules/artifact-drafting-protocol.md +35 -6
- package/dist/agent-src/rules/artifact-engagement-recording.md +11 -4
- package/dist/agent-src/rules/ask-when-uncertain.md +10 -14
- package/dist/agent-src/rules/augment-edit-discipline.md +3 -5
- package/dist/agent-src/rules/autonomous-execution.md +3 -5
- package/dist/agent-src/rules/brand-consistency.md +3 -5
- package/dist/agent-src/rules/brand-source-of-truth.md +3 -5
- package/dist/agent-src/rules/cli-output-handling.md +4 -6
- package/dist/agent-src/rules/command-suggestion-policy.md +3 -5
- package/dist/agent-src/rules/commit-conventions.md +3 -5
- package/dist/agent-src/rules/commit-policy.md +8 -10
- package/dist/agent-src/rules/content-quoting-floor.md +88 -0
- package/dist/agent-src/rules/context-hygiene.md +3 -5
- package/dist/agent-src/rules/copilot-routing.md +4 -6
- package/dist/agent-src/rules/decision-revisit-gate.md +120 -0
- package/dist/agent-src/rules/delegation-policy.md +10 -6
- package/dist/agent-src/rules/design-fidelity.md +3 -5
- package/dist/agent-src/rules/devcontainer-routing.md +4 -6
- package/dist/agent-src/rules/direct-answers.md +13 -17
- package/dist/agent-src/rules/docker-commands.md +3 -5
- package/dist/agent-src/rules/domain-adoption-policy.md +3 -5
- package/dist/agent-src/rules/domain-safety-disclaimer.md +3 -5
- package/dist/agent-src/rules/domain-safety-pii.md +7 -8
- package/dist/agent-src/rules/domain-safety-retention.md +3 -5
- package/dist/agent-src/rules/downstream-changes.md +3 -4
- package/dist/agent-src/rules/engineering-safety-floor.md +3 -5
- package/dist/agent-src/rules/external-reference-deep-dive.md +3 -5
- package/dist/agent-src/rules/fast-path-marker-visibility.md +3 -5
- package/dist/agent-src/rules/finance-safety-floor.md +3 -6
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -5
- package/dist/agent-src/rules/git-history-discipline.md +3 -5
- package/dist/agent-src/rules/guidelines.md +2 -4
- package/dist/agent-src/rules/icon-consistency.md +4 -5
- package/dist/agent-src/rules/image-likeness-and-rights.md +3 -5
- package/dist/agent-src/rules/improve-before-implement.md +5 -5
- package/dist/agent-src/rules/invite-challenge.md +3 -5
- package/dist/agent-src/rules/language-and-tone.md +13 -15
- package/dist/agent-src/rules/laravel-routing.md +3 -5
- package/dist/agent-src/rules/laravel-translations.md +3 -5
- package/dist/agent-src/rules/legal-safety-floor.md +5 -7
- package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -5
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +4 -7
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +3 -5
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +2 -4
- package/dist/agent-src/rules/media-governance-routing.md +3 -5
- package/dist/agent-src/rules/media-sync-ground-truth.md +3 -5
- package/dist/agent-src/rules/minimal-safe-diff.md +5 -5
- package/dist/agent-src/rules/missing-tool-handling.md +3 -5
- package/dist/agent-src/rules/model-recommendation.md +4 -6
- package/dist/agent-src/rules/no-attribution-footers.md +3 -5
- package/dist/agent-src/rules/no-cheap-questions.md +5 -8
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +3 -6
- package/dist/agent-src/rules/no-pr-progress-comments.md +3 -6
- package/dist/agent-src/rules/no-roadmap-references.md +3 -5
- package/dist/agent-src/rules/non-destructive-by-default.md +11 -13
- package/dist/agent-src/rules/notes-first-reasoning.md +3 -5
- package/dist/agent-src/rules/onboarding-gate.md +4 -6
- package/dist/agent-src/rules/output-discipline.md +3 -5
- package/dist/agent-src/rules/package-ci-checks.md +3 -5
- package/dist/agent-src/rules/persona-governance.md +2 -4
- package/dist/agent-src/rules/php-coding.md +3 -5
- package/dist/agent-src/rules/preservation-guard.md +2 -4
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -5
- package/dist/agent-src/rules/reviewer-awareness.md +5 -6
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +3 -5
- package/dist/agent-src/rules/roadmap-progress-sync.md +5 -5
- package/dist/agent-src/rules/role-mode-adherence.md +2 -4
- package/dist/agent-src/rules/rule-type-governance.md +3 -5
- package/dist/agent-src/rules/runtime-safety.md +2 -4
- package/dist/agent-src/rules/scope-control.md +10 -11
- package/dist/agent-src/rules/security-sensitive-stop.md +4 -5
- package/dist/agent-src/rules/size-enforcement.md +2 -4
- package/dist/agent-src/rules/skill-improvement-trigger.md +3 -5
- package/dist/agent-src/rules/skill-quality.md +3 -5
- package/dist/agent-src/rules/slash-command-routing-policy.md +3 -5
- package/dist/agent-src/rules/source-confidentiality.md +3 -5
- package/dist/agent-src/rules/source-discovery-gate.md +3 -5
- package/dist/agent-src/rules/source-of-truth.md +3 -5
- package/dist/agent-src/rules/strategy-safety-floor.md +3 -5
- package/dist/agent-src/rules/symfony-routing.md +4 -6
- package/dist/agent-src/rules/telegraph-speak.md +4 -5
- package/dist/agent-src/rules/think-before-action.md +7 -4
- package/dist/agent-src/rules/token-budget-discipline.md +29 -5
- package/dist/agent-src/rules/token-efficiency.md +3 -5
- package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -5
- package/dist/agent-src/rules/tool-safety.md +2 -4
- package/dist/agent-src/rules/ui-audit-gate.md +3 -6
- package/dist/agent-src/rules/untrusted-input-defense.md +11 -10
- package/dist/agent-src/rules/upstream-proposal.md +4 -6
- package/dist/agent-src/rules/user-interaction.md +7 -5
- package/dist/agent-src/rules/user-interrupt-priority.md +17 -8
- package/dist/agent-src/rules/verify-before-complete.md +12 -22
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +3 -3
- package/dist/agent-src/scripts/update_roadmap_progress.ts +197 -7
- package/dist/agent-src/skills/adr-create/SKILL.md +52 -42
- package/dist/agent-src/skills/adversarial-review/SKILL.md +1 -1
- package/dist/agent-src/skills/agent-docs-writing/SKILL.md +18 -0
- package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
- package/dist/agent-src/skills/ai-council/SKILL.md +14 -1
- package/dist/agent-src/skills/blade-ui/SKILL.md +4 -0
- package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +0 -3
- package/dist/agent-src/skills/brand/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-identity/SKILL.md +3 -3
- package/dist/agent-src/skills/brand-strategy/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +5 -4
- package/dist/agent-src/skills/canvas-design/SKILL.md +6 -0
- package/dist/agent-src/skills/check-refs/SKILL.md +7 -4
- package/dist/agent-src/skills/code-review/SKILL.md +5 -0
- package/dist/agent-src/skills/complexity-first-planning/SKILL.md +6 -5
- package/dist/agent-src/skills/condense-memory/SKILL.md +11 -11
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/context-document/SKILL.md +17 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -3
- package/dist/agent-src/skills/decision-record/SKILL.md +6 -0
- package/dist/agent-src/skills/decision-review/SKILL.md +5 -3
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +6 -1
- package/dist/agent-src/skills/design-intelligence/SKILL.md +45 -2
- package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
- package/dist/agent-src/skills/design-review/SKILL.md +23 -11
- package/dist/agent-src/skills/design-system-capture/SKILL.md +41 -0
- package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +62 -0
- package/dist/agent-src/skills/design-tokens/SKILL.md +11 -4
- package/dist/agent-src/skills/design-variations/SKILL.md +127 -0
- package/dist/agent-src/skills/design-variations/evals/triggers.json +17 -0
- package/dist/agent-src/skills/emit-tickets/SKILL.md +4 -4
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +6 -0
- package/dist/agent-src/skills/fe-design/SKILL.md +20 -0
- package/dist/agent-src/skills/flux/SKILL.md +4 -0
- package/dist/agent-src/skills/html-deck/SKILL.md +123 -0
- package/dist/agent-src/skills/html-deck/evals/triggers.json +17 -0
- package/dist/agent-src/skills/html-deck/templates/deck-shell.html +77 -0
- package/dist/agent-src/skills/iconography/SKILL.md +1 -0
- package/dist/agent-src/skills/image-editing/evals/triggers.json +13 -13
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +136 -0
- package/dist/agent-src/skills/judge-artifact-completeness/calibration/fixtures.json +149 -0
- package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +17 -0
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/architecture-score.json +73 -0
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/pr-review-score.json +65 -0
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/roadmap-score.json +73 -0
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +73 -0
- package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -0
- package/dist/agent-src/skills/judge-injection-defense/SKILL.md +99 -0
- package/dist/agent-src/skills/judge-injection-defense/calibration/fixtures.json +24 -0
- package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +17 -0
- package/dist/agent-src/skills/judge-injection-defense/fixtures/behavioral-fixtures.json +63 -0
- package/dist/agent-src/skills/judge-injection-defense/fixtures/coverage-report.md +53 -0
- package/dist/agent-src/skills/judge-injection-defense/fixtures/perturbation-taxonomy.json +110 -0
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +134 -0
- package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +17 -0
- package/dist/agent-src/skills/laravel/SKILL.md +0 -1
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +46 -0
- package/dist/agent-src/skills/lint-skills/SKILL.md +6 -6
- package/dist/agent-src/skills/logo-generation/SKILL.md +1 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
- package/dist/agent-src/skills/md-language-check/SKILL.md +3 -3
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +66 -1
- package/dist/agent-src/skills/migration-architect/SKILL.md +1 -0
- package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +2 -2
- package/dist/agent-src/skills/performance-analysis/SKILL.md +2 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +4 -4
- package/dist/agent-src/skills/premortem/SKILL.md +0 -3
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +16 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +18 -0
- package/dist/agent-src/skills/react-shadcn-ui/reference/registry.md +59 -0
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +3 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +5 -1
- package/dist/agent-src/skills/release-comms/SKILL.md +47 -46
- package/dist/agent-src/skills/roadmap-management/SKILL.md +25 -0
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +33 -3
- package/dist/agent-src/skills/root-cause-frameworks/SKILL.md +0 -3
- package/dist/agent-src/skills/script-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/security-audit/SKILL.md +1 -0
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -0
- package/dist/agent-src/skills/source-discovery/SKILL.md +22 -3
- package/dist/agent-src/skills/sql-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +33 -14
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +11 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +8 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +30 -1
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -0
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
- package/dist/agent-src/skills/typography-system/SKILL.md +4 -3
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -0
- package/dist/agent-src/skills/wireframe/SKILL.md +118 -0
- package/dist/agent-src/skills/wireframe/evals/triggers.json +17 -0
- package/dist/agent-src/templates/agent-settings.md +22 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/command.md +2 -2
- package/dist/agent-src/templates/contexts/knowledge-pages.md +116 -0
- package/dist/agent-src/templates/hooks/pre-commit-frontmatter +1 -1
- package/dist/agent-src/templates/roadmaps.md +70 -2
- package/dist/agent-src/templates/rule.md +1 -1
- package/dist/agent-src/templates/scripts/README.md +3 -3
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +109 -0
- package/dist/agent-src/templates/tickets.md +8 -8
- package/dist/cli/commands/recordTriggerEval.test.js +1 -1
- package/dist/cli/commands/recordTriggerEval.test.js.map +1 -1
- package/dist/cli/initRouting.js +4 -2
- package/dist/cli/initRouting.js.map +1 -1
- package/dist/cli/registry.js +1 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +802 -258
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +8 -8
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +46 -28
- package/dist/discovery/trust-report.md +12 -11
- package/dist/discovery/workspaces.json +32 -18
- package/dist/install/preflight.js +173 -0
- package/dist/install/preflight.js.map +1 -0
- package/dist/mcp/registry-manifest.json +4 -4
- package/dist/router.json +1 -1
- package/dist/server/routes/settings.js +4 -0
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/schemas/settings.js +6 -1
- package/dist/server/schemas/settings.js.map +1 -1
- package/docs/CLAIMS.md +108 -0
- package/docs/MIGRATION.md +3 -3
- package/docs/architecture.md +6 -6
- package/docs/benchmark.md +133 -2
- package/docs/benchmark.pinned.yml +31 -0
- package/docs/capability-matrix.md +1 -0
- package/docs/catalog.md +92 -74
- package/docs/command-flows.md +16 -4
- package/docs/comparison.yaml +35 -0
- package/docs/contracts/agents-layout.md +148 -0
- package/docs/contracts/brand-token-consumption.md +5 -0
- package/docs/contracts/capability-boundary.md +5 -0
- package/docs/contracts/command-category-governance.md +5 -0
- package/docs/contracts/command-clusters.md +1 -0
- package/docs/contracts/command-surface-tiers.md +1 -1
- package/docs/contracts/conformance.md +84 -0
- package/docs/contracts/creative-pack-boundary.md +5 -0
- package/docs/contracts/discovery-manifest.schema.json +5 -4
- package/docs/contracts/file-ownership-matrix.json +4605 -985
- package/docs/contracts/governance-enforcement-projection.md +5 -0
- package/docs/contracts/gui-wizard.md +1 -1
- package/docs/contracts/hook-architecture-v1.md +2 -2
- package/docs/contracts/implement-ticket-flow.md +1 -1
- package/docs/contracts/kernel-membership.md +13 -0
- package/docs/contracts/mcp-tool-inventory.md +23 -23
- package/docs/contracts/no-runtime-boundary.md +6 -1
- package/docs/contracts/review-lens-schema.md +5 -0
- package/docs/contracts/rule-router.md +102 -8
- package/docs/contracts/skill-bundled-assets.md +1 -1
- package/docs/contracts/skill-dry-run.md +1 -1
- package/docs/contracts/subagent-boundary.md +5 -0
- package/docs/contracts/ticket-bundle-format.md +9 -4
- package/docs/contracts/tier-3-contrib-plugin.md +2 -2
- package/docs/contracts/write-engine.md +3 -0
- package/docs/customization.md +87 -15
- package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +1 -1
- package/docs/decisions/ADR-109-subagent-v1-contract.md +246 -0
- package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +105 -0
- package/docs/decisions/INDEX.md +2 -0
- package/docs/distribution/awesome-list-submission.md +46 -0
- package/docs/distribution/launch-story-draft.md +58 -0
- package/docs/end-to-end-walkthroughs.md +2 -2
- package/docs/getting-started.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +24 -0
- package/docs/guidelines/agent-infra/corpus-grounding-authoring.md +1 -1
- package/docs/guidelines/agent-infra/linked-projects-onboarding-gate.md +2 -2
- package/docs/guidelines/agent-infra/missing-tool-handling.md +3 -3
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +1 -1
- package/docs/guidelines/code-clarity.md +19 -0
- package/docs/guidelines/design-antipatterns-triggers.json +2 -1
- package/docs/guidelines/design-antipatterns.md +35 -0
- package/docs/guidelines/design-canon.md +62 -0
- package/docs/guidelines/design-modes.md +6 -0
- package/docs/guidelines/php/general.md +9 -1
- package/docs/guidelines/php/php-coding-patterns.md +7 -0
- package/docs/guides/cross-repo-retrieval.md +1 -1
- package/docs/guides/frontend-design-corpus-refresh.md +2 -2
- package/docs/guides/local-analytics.md +4 -4
- package/docs/guides/skill-discovery.md +1 -1
- package/docs/guides/skill-preview.md +1 -1
- package/docs/hook-payload-capture.md +6 -6
- package/docs/install-friction-report.md +66 -0
- package/docs/installation.md +1 -1
- package/docs/maintainers/optional-media-deps.md +50 -0
- package/docs/mcp-server.md +11 -12
- package/docs/media/proof-demo.cast +14 -0
- package/docs/media/proof-demo.gif +0 -0
- package/docs/migration/consumer-template-consumption-model.md +1 -1
- package/docs/migration/divergences/bench-stats-float-precision.md +1 -1
- package/docs/migration/node-floor.md +1 -1
- package/docs/migration/yaml-roundtrip-spike.md +1 -1
- package/docs/personas.md +16 -5
- package/docs/positioning-evidence.md +86 -0
- package/docs/proof.md +86 -0
- package/docs/skills-catalog.md +1 -1
- package/docs/troubleshooting.md +8 -8
- package/docs/wedge/production-validator/README.md +57 -0
- package/docs/wedge/production-validator/production-validator.md +56 -0
- package/docs/wizard.md +2 -2
- package/package.json +1 -1
- package/src/config/agent-settings.template.yml +71 -4
- package/src/config/agents-paths.yml +254 -0
- package/src/config/budgets.yml +16 -0
- package/src/config/discovery/packs.yml +1 -0
- package/src/config/discovery/unassigned-artefacts.yml +2 -0
- package/src/config/gitignore-block.txt +25 -0
- package/src/config/host-capabilities.yml +31 -0
- package/src/config/profiles/balanced.ini +4 -0
- package/src/config/profiles/full.ini +4 -0
- package/src/config/profiles/minimal.ini +4 -0
- package/src/scripts/_cli/cmd_conformance.ts +716 -0
- package/src/scripts/_cli/cmd_doctor.ts +23 -2
- package/src/scripts/_cli/cmd_fleet.ts +401 -0
- package/src/scripts/_cli/cmd_preflight.ts +159 -0
- package/src/scripts/_dispatch.bash +10 -0
- package/src/scripts/_lib/knowledge_events.ts +193 -0
- package/src/scripts/_lib/subagent_steering.ts +115 -3
- package/src/scripts/_lib/text_similarity.ts +75 -0
- package/src/scripts/ai-video/test-pipeline.sh +1 -1
- package/src/scripts/ai_council/clients.ts +19 -3
- package/src/scripts/append_contested.ts +112 -0
- package/src/scripts/audit_auto_rules.ts +11 -1
- package/src/scripts/audit_mcp_tools.ts +25 -11
- package/src/scripts/bench_ab_v2_run.ts +527 -40
- package/src/scripts/bench_ab_v2_stats.ts +6 -0
- package/src/scripts/bench_matrix.ts +266 -0
- package/src/scripts/bootstrap_knowledge.ts +267 -0
- package/src/scripts/build_discovery_manifest.ts +42 -2
- package/src/scripts/build_proof.ts +214 -0
- package/src/scripts/check_always_budget.ts +3 -0
- package/src/scripts/check_augment_description_cap.ts +2 -2
- package/src/scripts/check_claims.ts +270 -0
- package/src/scripts/check_comparison.ts +79 -0
- package/src/scripts/check_generated_artefact_headers.ts +109 -0
- package/src/scripts/check_generator_output_coverage.ts +142 -0
- package/src/scripts/check_gitignore_freshness.ts +127 -0
- package/src/scripts/check_knowledge_pages.ts +210 -0
- package/src/scripts/check_knowledge_sharing.ts +162 -0
- package/src/scripts/check_media_deps.ts +91 -0
- package/src/scripts/check_memory_contradiction.ts +280 -0
- package/src/scripts/check_memory_similarity.ts +134 -0
- package/src/scripts/check_quality_regression.ts +56 -10
- package/src/scripts/check_references.ts +3 -1
- package/src/scripts/check_release_pr_shape.ts +4 -0
- package/src/scripts/check_site_links.ts +135 -0
- package/src/scripts/check_skill_gaps.ts +99 -0
- package/src/scripts/check_token_quality_golden.ts +197 -11
- package/src/scripts/check_tracked_but_ignored.ts +67 -0
- package/src/scripts/cluster_near_miss_patterns.ts +0 -0
- package/src/scripts/compile_router.ts +30 -3
- package/src/scripts/condense.ts +350 -14
- package/src/scripts/consolidate_knowledge_events.ts +192 -0
- package/src/scripts/degrade_to_pointer.ts +136 -0
- package/src/scripts/design_slop_rules.test.ts +208 -0
- package/src/scripts/design_slop_rules.ts +530 -0
- package/src/scripts/emit_knowledge_event.ts +158 -0
- package/src/scripts/export_replay_corpus.ts +187 -0
- package/src/scripts/external_sources_denylist.json +14 -3
- package/src/scripts/fold_intake.ts +281 -0
- package/src/scripts/generate_capability_matrix.ts +9 -1
- package/src/scripts/generate_knowledge_index.ts +222 -0
- package/src/scripts/hook_manifest.yaml +40 -17
- package/src/scripts/hooks/design_slop_hook.ts +181 -0
- package/src/scripts/hooks/dispatch_hook.ts +18 -0
- package/src/scripts/hot_context_hook.ts +372 -0
- package/src/scripts/install +47 -0
- package/src/scripts/install-hooks.sh +17 -0
- package/src/scripts/inventory_meta_layers.ts +11 -0
- package/src/scripts/janitor.ts +258 -0
- package/src/scripts/lint_agent_security.ts +1 -0
- package/src/scripts/lint_agents_layout.ts +74 -15
- package/src/scripts/lint_bench_ab.ts +4 -1
- package/src/scripts/lint_confusables.ts +197 -0
- package/src/scripts/lint_design_slop.ts +245 -0
- package/src/scripts/lint_featured_skills.ts +0 -0
- package/src/scripts/lint_framework_leakage_allowlist.json +26 -3
- package/src/scripts/lint_knowledge_scale.ts +250 -0
- package/src/scripts/lint_legal_pack.ts +67 -0
- package/src/scripts/lint_persona_governance.ts +8 -3
- package/src/scripts/lint_regression.ts +15 -0
- package/src/scripts/lint_roadmap_blockers.ts +202 -0
- package/src/scripts/lint_roadmap_complexity.ts +81 -2
- package/src/scripts/lint_subagent_determinism.ts +125 -0
- package/src/scripts/measure_augment_budget.ts +46 -6
- package/src/scripts/measure_patterns.ts +4 -3
- package/src/scripts/measure_skill_reduction.ts +6 -6
- package/src/scripts/migration_status.ts +6 -2
- package/src/scripts/mine_missing_guardrails.ts +189 -0
- package/src/scripts/parity/phase_gate.ts +1 -1
- package/src/scripts/parity/replay.ts +21 -0
- package/src/scripts/project_thin_rules.ts +120 -16
- package/src/scripts/release.ts +39 -1
- package/src/scripts/render_benchmark_composite.ts +378 -0
- package/src/scripts/roadmap_progress_hook.ts +101 -43
- package/src/scripts/schemas/skill.schema.json +27 -0
- package/src/scripts/schemas/subagent.schema.json +106 -0
- package/src/scripts/skill_linter.ts +1 -0
- package/src/scripts/smoke/kernel.sh +5 -4
- package/src/scripts/surface-tiers.yml +1 -0
- package/src/scripts/sync_gitignore.ts +4 -0
- package/src/scripts/update_skill_candidates.ts +172 -0
- package/src/scripts/validate_frontmatter.ts +1 -0
|
@@ -46,6 +46,12 @@ const COMPARISONS: Array<[string, string, string]> = [
|
|
|
46
46
|
// renders ONLY when a `package-recursive` arm is present — existing runs
|
|
47
47
|
// (no such arm) are byte-identical, golden parity preserved.
|
|
48
48
|
['package-recursive', 'package', 'recursion novel lift (D₂ − D₁)'],
|
|
49
|
+
// Cost-factor sweep (2026-07): trimmed rule-subset arms vs vanilla — how
|
|
50
|
+
// much of the weak-host lift survives at a fraction of the loaded-context
|
|
51
|
+
// cost. Arm-guarded like the rows above: rendered only when present.
|
|
52
|
+
['rules-kernel-dc', 'vanilla', 'kernel+downstream rules lift'],
|
|
53
|
+
['rules-balanced', 'vanilla', 'balanced-profile rules lift'],
|
|
54
|
+
['package', 'rules-kernel-dc', 'full package residual over kernel+downstream'],
|
|
49
55
|
];
|
|
50
56
|
|
|
51
57
|
// ── CPython math.erf / math.comb ports ────────────────────────────────────
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Bench matrix runner — road-to-flow-learnings Phase 3.
|
|
4
|
+
*
|
|
5
|
+
* Declares one matrix (task-family × host × arm) in a YAML file and expands
|
|
6
|
+
* it into the EXISTING `bench_ab_v2_run.ts` invocations — no new runner, no
|
|
7
|
+
* new science. The paired design is preserved by construction: all arms of a
|
|
8
|
+
* cell run inside ONE runner invocation (pairing happens per task inside the
|
|
9
|
+
* runner), so a cell = (host × family) and the arm axis rides along.
|
|
10
|
+
*
|
|
11
|
+
* Matrix YAML shape:
|
|
12
|
+
*
|
|
13
|
+
* families: [trapE, capH] # archetype values from the corpus
|
|
14
|
+
* hosts: [claude, codex]
|
|
15
|
+
* arms: [vanilla, package]
|
|
16
|
+
* seeds: 3
|
|
17
|
+
* model: claude-haiku-4-5
|
|
18
|
+
* budget: 1.0
|
|
19
|
+
*
|
|
20
|
+
* `--expand` (default) prints the deterministic invocation plan — one line
|
|
21
|
+
* per cell — and never spends. `--run` executes the cells sequentially
|
|
22
|
+
* (live API spend; operator-gated).
|
|
23
|
+
*
|
|
24
|
+
* Exit: 0 ok · 1 a live cell failed · 2 config error.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { spawnSync } from 'node:child_process';
|
|
28
|
+
import * as fs from 'node:fs';
|
|
29
|
+
import * as path from 'node:path';
|
|
30
|
+
import process from 'node:process';
|
|
31
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
32
|
+
|
|
33
|
+
import { parse as parseYaml } from 'yaml';
|
|
34
|
+
|
|
35
|
+
import { ARMS, CODEX_VALID_ARMS } from './bench_ab_v2_run.js';
|
|
36
|
+
|
|
37
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
38
|
+
export const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
39
|
+
const DEFAULT_CORPUS = path.join(REPO_ROOT, 'internal', 'bench', 'corpora', 'ab-trackb-v2.yaml');
|
|
40
|
+
const RUNNER = path.join(REPO_ROOT, 'src', 'scripts', 'bench_ab_v2_run.ts');
|
|
41
|
+
|
|
42
|
+
type Dict = Record<string, unknown>;
|
|
43
|
+
|
|
44
|
+
const VALID_HOSTS = ['claude', 'codex'] as const;
|
|
45
|
+
|
|
46
|
+
export interface MatrixSpec {
|
|
47
|
+
readonly families: readonly string[];
|
|
48
|
+
readonly hosts: readonly string[];
|
|
49
|
+
readonly arms: readonly string[];
|
|
50
|
+
readonly seeds: number;
|
|
51
|
+
readonly model: string;
|
|
52
|
+
readonly budget: number;
|
|
53
|
+
readonly timeout: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export class MatrixConfigError extends Error {}
|
|
57
|
+
|
|
58
|
+
function strList(obj: Dict, key: string): string[] {
|
|
59
|
+
const raw = obj[key];
|
|
60
|
+
if (!Array.isArray(raw) || raw.length === 0 || !raw.every((v) => typeof v === 'string')) {
|
|
61
|
+
throw new MatrixConfigError(`\`${key}\` must be a non-empty string list`);
|
|
62
|
+
}
|
|
63
|
+
return raw as string[];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Parse + validate the matrix YAML against the runner's own registries. */
|
|
67
|
+
export function parseMatrixSpec(text: string): MatrixSpec {
|
|
68
|
+
let raw: unknown;
|
|
69
|
+
try {
|
|
70
|
+
raw = parseYaml(text);
|
|
71
|
+
} catch (exc) {
|
|
72
|
+
throw new MatrixConfigError(`matrix config does not parse: ${(exc as Error).message}`);
|
|
73
|
+
}
|
|
74
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
75
|
+
throw new MatrixConfigError('matrix config must be a mapping');
|
|
76
|
+
}
|
|
77
|
+
const obj = raw as Dict;
|
|
78
|
+
const spec: MatrixSpec = {
|
|
79
|
+
families: strList(obj, 'families'),
|
|
80
|
+
hosts: strList(obj, 'hosts'),
|
|
81
|
+
arms: strList(obj, 'arms'),
|
|
82
|
+
seeds: typeof obj['seeds'] === 'number' ? (obj['seeds'] as number) : 3,
|
|
83
|
+
model: typeof obj['model'] === 'string' ? (obj['model'] as string) : 'claude-haiku-4-5',
|
|
84
|
+
budget: typeof obj['budget'] === 'number' ? (obj['budget'] as number) : 1.0,
|
|
85
|
+
timeout: typeof obj['timeout'] === 'number' ? (obj['timeout'] as number) : 180,
|
|
86
|
+
};
|
|
87
|
+
for (const h of spec.hosts) {
|
|
88
|
+
if (!VALID_HOSTS.includes(h as (typeof VALID_HOSTS)[number])) {
|
|
89
|
+
throw new MatrixConfigError(`unknown host '${h}' (valid: ${VALID_HOSTS.join(', ')})`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const a of spec.arms) {
|
|
93
|
+
if (!(a in ARMS)) {
|
|
94
|
+
throw new MatrixConfigError(`unknown arm '${a}' (valid: ${Object.keys(ARMS).join(', ')})`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (spec.hosts.includes('codex')) {
|
|
98
|
+
for (const a of spec.arms) {
|
|
99
|
+
if (!CODEX_VALID_ARMS.includes(a)) {
|
|
100
|
+
throw new MatrixConfigError(
|
|
101
|
+
`arm '${a}' is not valid for host codex (valid: ${CODEX_VALID_ARMS.join(', ')})`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (!Number.isInteger(spec.seeds) || spec.seeds < 1) {
|
|
107
|
+
throw new MatrixConfigError('`seeds` must be a positive integer');
|
|
108
|
+
}
|
|
109
|
+
return spec;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Group corpus task ids by archetype (the family axis). */
|
|
113
|
+
export function familyTaskIds(corpusText: string): Map<string, string[]> {
|
|
114
|
+
const corpus = parseYaml(corpusText, { version: '1.1' }) as Dict | null;
|
|
115
|
+
const tasks = Array.isArray(corpus?.['tasks']) ? (corpus?.['tasks'] as Dict[]) : [];
|
|
116
|
+
const out = new Map<string, string[]>();
|
|
117
|
+
for (const t of tasks) {
|
|
118
|
+
const family = String(t['archetype'] ?? '');
|
|
119
|
+
const id = String(t['id'] ?? '');
|
|
120
|
+
if (!family || !id) continue;
|
|
121
|
+
const list = out.get(family) ?? [];
|
|
122
|
+
list.push(id);
|
|
123
|
+
out.set(family, list);
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** One expanded cell — a single runner invocation covering all matrix arms. */
|
|
129
|
+
export interface MatrixCell {
|
|
130
|
+
readonly host: string;
|
|
131
|
+
readonly family: string;
|
|
132
|
+
readonly taskIds: readonly string[];
|
|
133
|
+
readonly argv: readonly string[];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Deterministic expansion: cells in (host, family) document order. Throws
|
|
138
|
+
* {@link MatrixConfigError} when a family matches zero corpus tasks — a
|
|
139
|
+
* silent empty cell would read as coverage that never ran.
|
|
140
|
+
*/
|
|
141
|
+
export function expandMatrix(spec: MatrixSpec, corpusText: string, mode: 'dry-run' | 'live'): MatrixCell[] {
|
|
142
|
+
const byFamily = familyTaskIds(corpusText);
|
|
143
|
+
const cells: MatrixCell[] = [];
|
|
144
|
+
for (const host of spec.hosts) {
|
|
145
|
+
for (const family of spec.families) {
|
|
146
|
+
const taskIds = byFamily.get(family) ?? [];
|
|
147
|
+
if (taskIds.length === 0) {
|
|
148
|
+
throw new MatrixConfigError(
|
|
149
|
+
`family '${family}' matches no corpus task (known: ${[...byFamily.keys()].join(', ')})`,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
cells.push({
|
|
153
|
+
host,
|
|
154
|
+
family,
|
|
155
|
+
taskIds,
|
|
156
|
+
argv: [
|
|
157
|
+
RUNNER,
|
|
158
|
+
'--arms', spec.arms.join(','),
|
|
159
|
+
'--tasks', taskIds.join(','),
|
|
160
|
+
'--seeds', String(spec.seeds),
|
|
161
|
+
'--model', spec.model,
|
|
162
|
+
'--budget', String(spec.budget),
|
|
163
|
+
'--timeout', String(spec.timeout),
|
|
164
|
+
'--host', host,
|
|
165
|
+
'--mode', mode,
|
|
166
|
+
],
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return cells;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** One line per cell — the snapshot-tested plan format. */
|
|
174
|
+
export function planLines(cells: readonly MatrixCell[]): string[] {
|
|
175
|
+
return cells.map(
|
|
176
|
+
(c) =>
|
|
177
|
+
`cell host=${c.host} family=${c.family} tasks=${c.taskIds.length} :: ` +
|
|
178
|
+
`bench_ab_v2_run ${c.argv.slice(1).join(' ')}`,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const USAGE =
|
|
183
|
+
'usage: bench_matrix [-h] --config matrix.yaml [--corpus PATH] [--expand | --run]\n';
|
|
184
|
+
|
|
185
|
+
export function main(argv: string[] | null = null): number {
|
|
186
|
+
const args = argv !== null ? Array.from(argv) : process.argv.slice(2);
|
|
187
|
+
let configPath: string | null = null;
|
|
188
|
+
let corpusPath = DEFAULT_CORPUS;
|
|
189
|
+
let run = false;
|
|
190
|
+
let i = 0;
|
|
191
|
+
while (i < args.length) {
|
|
192
|
+
const a = args[i] as string;
|
|
193
|
+
if (a === '-h' || a === '--help') {
|
|
194
|
+
process.stdout.write(USAGE);
|
|
195
|
+
return 0;
|
|
196
|
+
}
|
|
197
|
+
if (a === '--run') {
|
|
198
|
+
run = true;
|
|
199
|
+
} else if (a === '--expand') {
|
|
200
|
+
run = false;
|
|
201
|
+
} else if (a === '--config' || a.startsWith('--config=')) {
|
|
202
|
+
configPath = a.includes('=') ? a.slice(a.indexOf('=') + 1) : String(args[(i += 1)] ?? '');
|
|
203
|
+
} else if (a === '--corpus' || a.startsWith('--corpus=')) {
|
|
204
|
+
corpusPath = a.includes('=') ? a.slice(a.indexOf('=') + 1) : String(args[(i += 1)] ?? '');
|
|
205
|
+
} else {
|
|
206
|
+
process.stderr.write(USAGE);
|
|
207
|
+
process.stderr.write(`bench_matrix: error: unrecognized argument ${a}\n`);
|
|
208
|
+
return 2;
|
|
209
|
+
}
|
|
210
|
+
i += 1;
|
|
211
|
+
}
|
|
212
|
+
if (!configPath || !fs.existsSync(configPath)) {
|
|
213
|
+
process.stderr.write(USAGE);
|
|
214
|
+
process.stderr.write('bench_matrix: error: --config path missing or not found\n');
|
|
215
|
+
return 2;
|
|
216
|
+
}
|
|
217
|
+
if (!fs.existsSync(corpusPath)) {
|
|
218
|
+
process.stderr.write(`bench_matrix: error: corpus not found: ${corpusPath}\n`);
|
|
219
|
+
return 2;
|
|
220
|
+
}
|
|
221
|
+
let cells: MatrixCell[];
|
|
222
|
+
try {
|
|
223
|
+
const spec = parseMatrixSpec(fs.readFileSync(configPath, 'utf-8'));
|
|
224
|
+
cells = expandMatrix(spec, fs.readFileSync(corpusPath, 'utf-8'), run ? 'live' : 'dry-run');
|
|
225
|
+
} catch (exc) {
|
|
226
|
+
if (exc instanceof MatrixConfigError) {
|
|
227
|
+
process.stderr.write(`bench_matrix: error: ${exc.message}\n`);
|
|
228
|
+
return 2;
|
|
229
|
+
}
|
|
230
|
+
throw exc;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
for (const line of planLines(cells)) {
|
|
234
|
+
process.stdout.write(`${line}\n`);
|
|
235
|
+
}
|
|
236
|
+
if (!run) {
|
|
237
|
+
process.stdout.write(`bench_matrix: EXPAND — ${cells.length} cell(s). No spend.\n`);
|
|
238
|
+
return 0;
|
|
239
|
+
}
|
|
240
|
+
// Live execution: sequential by design — the runner already parallelises
|
|
241
|
+
// nothing internally, and live bench spend must stay easy to abort.
|
|
242
|
+
for (const [idx, cell] of cells.entries()) {
|
|
243
|
+
process.stderr.write(`bench_matrix: [${idx + 1}/${cells.length}] host=${cell.host} family=${cell.family}\n`);
|
|
244
|
+
const proc = spawnSync(process.execPath, ['--import', 'tsx', ...cell.argv], {
|
|
245
|
+
stdio: 'inherit',
|
|
246
|
+
cwd: REPO_ROOT,
|
|
247
|
+
});
|
|
248
|
+
if (proc.status !== 0) {
|
|
249
|
+
process.stderr.write(
|
|
250
|
+
`bench_matrix: cell failed (exit ${proc.status}) — aborting remaining cells\n`,
|
|
251
|
+
);
|
|
252
|
+
return 1;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
process.stdout.write(`bench_matrix: ${cells.length} cell(s) complete.\n`);
|
|
256
|
+
return 0;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// --- CLI entry ---
|
|
260
|
+
|
|
261
|
+
const _isCliEntry =
|
|
262
|
+
process.argv[1] !== undefined &&
|
|
263
|
+
import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
|
|
264
|
+
if (_isCliEntry || process.argv[1] === _HERE) {
|
|
265
|
+
process.exitCode = main(process.argv.slice(2));
|
|
266
|
+
}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Project familiarization bootstrap — road-to-knowledge-system Phase 6.
|
|
4
|
+
* Deterministic, static-analysis-only seed for a fresh consumer project:
|
|
5
|
+
* scans directory NAMES and known config FILENAMES only — never reads file
|
|
6
|
+
* CONTENTS beyond the project's own manifest files, so secrets/PII/business
|
|
7
|
+
* logic can never leak into the staged output by construction (the same
|
|
8
|
+
* exclusion-by-construction principle as PII-safe log schemas: a script that
|
|
9
|
+
* cannot read arbitrary file bodies has no redaction pass to fail).
|
|
10
|
+
*
|
|
11
|
+
* Every detected fact carries an evidence pointer (the path that proves it).
|
|
12
|
+
* Every inferential line (a suggestion the human still has to confirm) is
|
|
13
|
+
* marked `[HUMAN: verify]` — this script never invents a claim.
|
|
14
|
+
*
|
|
15
|
+
* Output goes to a GITIGNORED staging directory, never directly to
|
|
16
|
+
* `agents/knowledge/`. The `/team-knowledge bootstrap` command reviews the
|
|
17
|
+
* staged pages with the user before moving anything into the tracked tree.
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* bootstrap_knowledge.ts [--dir <repo-root>] [--staging-dir <dir>]
|
|
21
|
+
*
|
|
22
|
+
* Exit codes: 0 = staged, 1 = usage error.
|
|
23
|
+
*/
|
|
24
|
+
import * as fs from 'node:fs';
|
|
25
|
+
import * as path from 'node:path';
|
|
26
|
+
import process from 'node:process';
|
|
27
|
+
import { fileURLToPath } from 'node:url';
|
|
28
|
+
|
|
29
|
+
const PROG = 'bootstrap_knowledge.ts';
|
|
30
|
+
const DEFAULT_STAGING_DIR = path.join('agents', '.bootstrap-staging');
|
|
31
|
+
|
|
32
|
+
// Directory names never worth surfacing as "project structure" — build
|
|
33
|
+
// output, dependency caches, and VCS internals.
|
|
34
|
+
const NOISE_DIRS = new Set([
|
|
35
|
+
'node_modules', 'vendor', '.git', 'dist', 'build', '.next', '.nuxt',
|
|
36
|
+
'coverage', '.venv', 'venv', '__pycache__', '.turbo', '.cache',
|
|
37
|
+
]);
|
|
38
|
+
|
|
39
|
+
interface ManifestSignal {
|
|
40
|
+
ecosystem: string;
|
|
41
|
+
file: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const MANIFEST_FILES: ManifestSignal[] = [
|
|
45
|
+
{ ecosystem: 'Node/JS/TS', file: 'package.json' },
|
|
46
|
+
{ ecosystem: 'PHP/Composer', file: 'composer.json' },
|
|
47
|
+
{ ecosystem: 'Python', file: 'pyproject.toml' },
|
|
48
|
+
{ ecosystem: 'Python (legacy)', file: 'requirements.txt' },
|
|
49
|
+
{ ecosystem: 'Go', file: 'go.mod' },
|
|
50
|
+
{ ecosystem: 'Ruby', file: 'Gemfile' },
|
|
51
|
+
{ ecosystem: 'Rust', file: 'Cargo.toml' },
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
// Per standards-from-config's own detection list — existence only, never content.
|
|
55
|
+
const STANDARDS_CONFIG_FILES = [
|
|
56
|
+
'.editorconfig', '.eslintrc.json', '.eslintrc.js', 'eslint.config.js',
|
|
57
|
+
'.prettierrc', '.prettierrc.json', 'biome.json', 'tsconfig.json',
|
|
58
|
+
'pint.json', '.php-cs-fixer.dist.php', 'phpcs.xml',
|
|
59
|
+
'ruff.toml', 'setup.cfg', '.rubocop.yml', '.golangci.yml',
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
const TEST_CONFIG_FILES = [
|
|
63
|
+
'jest.config.js', 'jest.config.ts', 'vitest.config.ts', 'vitest.config.js',
|
|
64
|
+
'phpunit.xml', 'phpunit.xml.dist', 'pytest.ini', 'pest.config.php',
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
export interface DetectedFact {
|
|
68
|
+
label: string;
|
|
69
|
+
evidence: string; // the file/dir path proving this fact
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface BootstrapResult {
|
|
73
|
+
manifests: DetectedFact[];
|
|
74
|
+
topLevelDirs: DetectedFact[];
|
|
75
|
+
standardsConfigs: DetectedFact[];
|
|
76
|
+
testConfigs: DetectedFact[];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function exists(p: string): boolean {
|
|
80
|
+
try {
|
|
81
|
+
fs.accessSync(p);
|
|
82
|
+
return true;
|
|
83
|
+
} catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Pure detection over a given root — filenames and directory names only, never file content. */
|
|
89
|
+
export function detect(root: string): BootstrapResult {
|
|
90
|
+
const manifests: DetectedFact[] = [];
|
|
91
|
+
for (const m of MANIFEST_FILES) {
|
|
92
|
+
if (exists(path.join(root, m.file))) manifests.push({ label: m.ecosystem, evidence: m.file });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
let topLevelDirs: DetectedFact[] = [];
|
|
96
|
+
try {
|
|
97
|
+
topLevelDirs = fs
|
|
98
|
+
.readdirSync(root, { withFileTypes: true })
|
|
99
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith('.') && !NOISE_DIRS.has(e.name))
|
|
100
|
+
.map((e) => ({ label: e.name, evidence: `${e.name}/` }))
|
|
101
|
+
.sort((a, b) => (a.label < b.label ? -1 : a.label > b.label ? 1 : 0));
|
|
102
|
+
} catch {
|
|
103
|
+
topLevelDirs = [];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const standardsConfigs = STANDARDS_CONFIG_FILES.filter((f) => exists(path.join(root, f))).map((f) => ({
|
|
107
|
+
label: f,
|
|
108
|
+
evidence: f,
|
|
109
|
+
}));
|
|
110
|
+
|
|
111
|
+
const testConfigs = TEST_CONFIG_FILES.filter((f) => exists(path.join(root, f))).map((f) => ({
|
|
112
|
+
label: f,
|
|
113
|
+
evidence: f,
|
|
114
|
+
}));
|
|
115
|
+
|
|
116
|
+
return { manifests, topLevelDirs, standardsConfigs, testConfigs };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function renderStructurePage(result: BootstrapResult): string {
|
|
120
|
+
const lines: string[] = [
|
|
121
|
+
'---',
|
|
122
|
+
'type: concept',
|
|
123
|
+
'---',
|
|
124
|
+
'',
|
|
125
|
+
'# Project Structure',
|
|
126
|
+
'',
|
|
127
|
+
'_Staged by `src/scripts/bootstrap_knowledge.ts` — review before committing._',
|
|
128
|
+
'',
|
|
129
|
+
'## Detected package manifests',
|
|
130
|
+
'',
|
|
131
|
+
];
|
|
132
|
+
if (result.manifests.length === 0) {
|
|
133
|
+
lines.push('- No known manifest file found. `[HUMAN: verify]` — name the ecosystem.');
|
|
134
|
+
} else {
|
|
135
|
+
for (const m of result.manifests) lines.push(`- ${m.label} (\`${m.evidence}\`)`);
|
|
136
|
+
}
|
|
137
|
+
lines.push('', '## Top-level directories', '');
|
|
138
|
+
if (result.topLevelDirs.length === 0) {
|
|
139
|
+
lines.push('- None detected.');
|
|
140
|
+
} else {
|
|
141
|
+
for (const d of result.topLevelDirs) {
|
|
142
|
+
lines.push(`- \`${d.evidence}\` — \`[HUMAN: verify]\` purpose/ownership`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
lines.push('');
|
|
146
|
+
return lines.join('\n');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function renderStandardsPage(result: BootstrapResult): string {
|
|
150
|
+
const lines: string[] = [
|
|
151
|
+
'---',
|
|
152
|
+
'type: concept',
|
|
153
|
+
'---',
|
|
154
|
+
'',
|
|
155
|
+
'# Coding Standards (config-derived seed)',
|
|
156
|
+
'',
|
|
157
|
+
'_Staged by `src/scripts/bootstrap_knowledge.ts` — this lists WHICH config',
|
|
158
|
+
'files exist, not their content. Run `standards-from-config` for the full',
|
|
159
|
+
'pointer+digest derivation before relying on this page._',
|
|
160
|
+
'',
|
|
161
|
+
];
|
|
162
|
+
if (result.standardsConfigs.length === 0) {
|
|
163
|
+
lines.push('- No recognized lint/format config found. `[HUMAN: verify]`.');
|
|
164
|
+
} else {
|
|
165
|
+
for (const c of result.standardsConfigs) lines.push(`- \`${c.evidence}\` present — \`[HUMAN: verify]\` derive the actual rule via \`standards-from-config\``);
|
|
166
|
+
}
|
|
167
|
+
lines.push('', '## Test framework', '');
|
|
168
|
+
if (result.testConfigs.length === 0) {
|
|
169
|
+
lines.push('- No recognized test config found. `[HUMAN: verify]`.');
|
|
170
|
+
} else {
|
|
171
|
+
for (const t of result.testConfigs) lines.push(`- \`${t.evidence}\` present`);
|
|
172
|
+
}
|
|
173
|
+
lines.push('');
|
|
174
|
+
return lines.join('\n');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const MODULES_PAGE = [
|
|
178
|
+
'---',
|
|
179
|
+
'type: concept',
|
|
180
|
+
'---',
|
|
181
|
+
'',
|
|
182
|
+
'# Module Structure',
|
|
183
|
+
'',
|
|
184
|
+
'_Staged by `src/scripts/bootstrap_knowledge.ts` as an EMPTY seed — module',
|
|
185
|
+
'boundaries require reading actual code, which this deterministic bootstrap',
|
|
186
|
+
'never does. Run `module-detect-on-the-fly` to fill this in, or delete this',
|
|
187
|
+
'page if the project has no module system._',
|
|
188
|
+
'',
|
|
189
|
+
'`[HUMAN: verify]` — run module-detect-on-the-fly and fill this page in.',
|
|
190
|
+
'',
|
|
191
|
+
].join('\n');
|
|
192
|
+
|
|
193
|
+
const API_CONVENTIONS_PAGE = [
|
|
194
|
+
'---',
|
|
195
|
+
'type: procedure',
|
|
196
|
+
'---',
|
|
197
|
+
'',
|
|
198
|
+
'# API Conventions',
|
|
199
|
+
'',
|
|
200
|
+
'_Staged by `src/scripts/bootstrap_knowledge.ts` as an EMPTY seed — API shapes',
|
|
201
|
+
'are learned from real request/response observation (`api_shape_learned`',
|
|
202
|
+
'events), which this deterministic bootstrap never fabricates._',
|
|
203
|
+
'',
|
|
204
|
+
'`[HUMAN: verify]` — this page fills in as `api_shape_learned` events',
|
|
205
|
+
'consolidate, or via manual documentation.',
|
|
206
|
+
'',
|
|
207
|
+
].join('\n');
|
|
208
|
+
|
|
209
|
+
const COMMON_MISTAKES_PAGE = [
|
|
210
|
+
'---',
|
|
211
|
+
'type: session',
|
|
212
|
+
'---',
|
|
213
|
+
'',
|
|
214
|
+
'# Common Mistakes',
|
|
215
|
+
'',
|
|
216
|
+
'_Staged by `src/scripts/bootstrap_knowledge.ts` as an EMPTY seed — this fills',
|
|
217
|
+
'in from `mistake_made` events as the team works, never fabricated up front._',
|
|
218
|
+
'',
|
|
219
|
+
].join('\n');
|
|
220
|
+
|
|
221
|
+
export function stagePages(root: string, stagingDir: string): void {
|
|
222
|
+
const result = detect(root);
|
|
223
|
+
fs.mkdirSync(path.join(stagingDir, 'concepts'), { recursive: true });
|
|
224
|
+
fs.mkdirSync(path.join(stagingDir, 'procedures'), { recursive: true });
|
|
225
|
+
fs.mkdirSync(path.join(stagingDir, 'sessions'), { recursive: true });
|
|
226
|
+
|
|
227
|
+
fs.writeFileSync(path.join(stagingDir, 'concepts', 'structure.md'), renderStructurePage(result), 'utf8');
|
|
228
|
+
fs.writeFileSync(path.join(stagingDir, 'concepts', 'standards.md'), renderStandardsPage(result), 'utf8');
|
|
229
|
+
fs.writeFileSync(path.join(stagingDir, 'concepts', 'modules.md'), MODULES_PAGE, 'utf8');
|
|
230
|
+
fs.writeFileSync(path.join(stagingDir, 'procedures', 'api-conventions.md'), API_CONVENTIONS_PAGE, 'utf8');
|
|
231
|
+
fs.writeFileSync(path.join(stagingDir, 'sessions', 'common-mistakes.md'), COMMON_MISTAKES_PAGE, 'utf8');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function printUsage(): void {
|
|
235
|
+
process.stdout.write(`usage: ${PROG} [--dir DIR] [--staging-dir DIR]\n`);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export function main(argv: string[]): number {
|
|
239
|
+
let dir = process.cwd();
|
|
240
|
+
let stagingDir = DEFAULT_STAGING_DIR;
|
|
241
|
+
|
|
242
|
+
for (let i = 0; i < argv.length; i++) {
|
|
243
|
+
const arg = argv[i];
|
|
244
|
+
if (arg === '-h' || arg === '--help') {
|
|
245
|
+
printUsage();
|
|
246
|
+
return 0;
|
|
247
|
+
} else if (arg === '--dir') {
|
|
248
|
+
dir = argv[++i] ?? dir;
|
|
249
|
+
} else if (arg === '--staging-dir') {
|
|
250
|
+
stagingDir = argv[++i] ?? stagingDir;
|
|
251
|
+
} else {
|
|
252
|
+
process.stderr.write(`${PROG}: error: unrecognized argument: ${arg}\n`);
|
|
253
|
+
printUsage();
|
|
254
|
+
return 1;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
stagePages(dir, stagingDir);
|
|
259
|
+
process.stdout.write(
|
|
260
|
+
`${PROG}: staged 5 template page(s) under ${stagingDir}/ — review before moving into agents/knowledge/.\n`,
|
|
261
|
+
);
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1] ?? '')) {
|
|
266
|
+
process.exit(main(process.argv.slice(2)));
|
|
267
|
+
}
|
|
@@ -152,7 +152,7 @@ const _TRUST_REQ = ['level', 'confidence', 'human_review_required'] as const;
|
|
|
152
152
|
const _INSTALL_REQ = ['default', 'removable'] as const;
|
|
153
153
|
const _LIFECYCLE_VALUES = ['active', 'experimental', 'deprecated', 'archived'] as const;
|
|
154
154
|
const _TRUST_VALUES = ['core', 'professional', 'experimental', 'advisory', 'restricted'] as const;
|
|
155
|
-
const _CATEGORY_VALUES = ['skill', 'rule', 'command', 'template'] as const;
|
|
155
|
+
const _CATEGORY_VALUES = ['skill', 'rule', 'command', 'template', 'subagent'] as const;
|
|
156
156
|
|
|
157
157
|
// build_discovery_manifest._FRONTMATTER_RE (imported from validate_frontmatter
|
|
158
158
|
// in Python; the literal pattern is `^---\n(.*?)\n---\n` with re.DOTALL).
|
|
@@ -164,6 +164,7 @@ const _CATEGORY_SCHEMA: Record<string, string> = {
|
|
|
164
164
|
skill: 'skill',
|
|
165
165
|
rule: 'rule',
|
|
166
166
|
command: 'command',
|
|
167
|
+
subagent: 'subagent',
|
|
167
168
|
};
|
|
168
169
|
|
|
169
170
|
// --- Filesystem helpers reproducing pathlib semantics ------------------------
|
|
@@ -414,6 +415,14 @@ function* _iter_artefacts(): Generator<[string, string]> {
|
|
|
414
415
|
}
|
|
415
416
|
yield [p, 'template'];
|
|
416
417
|
}
|
|
418
|
+
// ADR-109: subagents are the 5th discovery category. Appended last so the
|
|
419
|
+
// existing skills→rules→commands→templates ordering is undisturbed. They
|
|
420
|
+
// carry the minimal subagent-v1 schema (no workspaces/packs/install); the
|
|
421
|
+
// `_classify` subagent branch derives the manifest payload (default-off,
|
|
422
|
+
// packs:[]) — static projection only, never runtime-dispatched.
|
|
423
|
+
for (const p of _collect('subagents', '*.md')) {
|
|
424
|
+
yield [p, 'subagent'];
|
|
425
|
+
}
|
|
417
426
|
}
|
|
418
427
|
|
|
419
428
|
function _trusted(p: string): boolean {
|
|
@@ -450,10 +459,41 @@ function _classify(
|
|
|
450
459
|
fm: JsonObject | null,
|
|
451
460
|
wsIds: Set<string>,
|
|
452
461
|
packIds: Set<string>,
|
|
462
|
+
category?: string,
|
|
453
463
|
): [JsonObject | null, string | null] {
|
|
454
464
|
if (fm === null) {
|
|
455
465
|
return [null, 'missing or unparseable frontmatter'];
|
|
456
466
|
}
|
|
467
|
+
// ADR-109 (Option B): subagents do NOT carry workspaces/packs/install — their
|
|
468
|
+
// schema is deliberately minimal and they are default-off, opt-in-by-name
|
|
469
|
+
// (never pack-scoped). Derive the manifest payload from the subagent-v1
|
|
470
|
+
// fields instead of the pack/workspace contract. `packs: []` is legitimate
|
|
471
|
+
// ("recommended for no one"); manifest consumers guard against empty packs.
|
|
472
|
+
if (category === 'subagent') {
|
|
473
|
+
const lc = fm['lifecycle'];
|
|
474
|
+
if (!(_LIFECYCLE_VALUES as readonly Json[]).includes(lc)) {
|
|
475
|
+
return [null, `lifecycle: invalid value '${String(lc)}'`];
|
|
476
|
+
}
|
|
477
|
+
const trust = fm['trust'];
|
|
478
|
+
if (!_isObject(trust) || _TRUST_REQ.some((k) => !(k in trust))) {
|
|
479
|
+
return [null, `trust: missing required key(s) ${_pyTupleRepr(_TRUST_REQ)}`];
|
|
480
|
+
}
|
|
481
|
+
if (!(_TRUST_VALUES as readonly Json[]).includes(trust['level'])) {
|
|
482
|
+
return [null, `trust.level: invalid '${String(trust['level'])}'`];
|
|
483
|
+
}
|
|
484
|
+
const payload: JsonObject = {
|
|
485
|
+
workspaces: [],
|
|
486
|
+
packs: [],
|
|
487
|
+
lifecycle: lc,
|
|
488
|
+
trust: {
|
|
489
|
+
level: trust['level'],
|
|
490
|
+
confidence: trust['confidence'],
|
|
491
|
+
human_review_required: trust['human_review_required'],
|
|
492
|
+
},
|
|
493
|
+
install: { default: false, removable: true },
|
|
494
|
+
};
|
|
495
|
+
return [payload, null];
|
|
496
|
+
}
|
|
457
497
|
const missing = _FM_KEYS.filter((k) => !(k in fm));
|
|
458
498
|
if (missing.length > 0) {
|
|
459
499
|
return [null, `missing required key(s): ${missing.join(', ')}`];
|
|
@@ -596,7 +636,7 @@ function _build(strict: boolean): [JsonObject, JsonObject[]] {
|
|
|
596
636
|
continue;
|
|
597
637
|
}
|
|
598
638
|
const fm = _parse(p, category);
|
|
599
|
-
const [payload, reason] = _classify(fm, wsIds, packIds);
|
|
639
|
+
const [payload, reason] = _classify(fm, wsIds, packIds, category);
|
|
600
640
|
if (reason !== null) {
|
|
601
641
|
unassigned.push({ path: rel, category, reason });
|
|
602
642
|
continue;
|