@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
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* A4 — Ablation-mining (learning-loop #1). Correlate rule *absence* with failure
|
|
4
|
+
* across INDEPENDENT runs (distinct `work_id`) and surface *missing-guardrail*
|
|
5
|
+
* candidates for the human to promote via `learning-to-rule-or-skill`.
|
|
6
|
+
*
|
|
7
|
+
* Read-only over `audit-log-v1` (`agents/runtime/state/audit/*.jsonl`). Raw
|
|
8
|
+
* counts only — NO auto-promotion, NO mutation. Correlation, not causation:
|
|
9
|
+
* every candidate carries the confounding caveat. A candidate is a *question*
|
|
10
|
+
* for a human, never an answer.
|
|
11
|
+
*
|
|
12
|
+
* Signal (per phase P, rule R):
|
|
13
|
+
* - `success_with_rule` = success lines in P where R ∈ rules_applied
|
|
14
|
+
* - `failure_without_rule` = blocked/error lines in P where R ∉ rules_applied
|
|
15
|
+
* R is a candidate when its absence co-occurs with failure often enough
|
|
16
|
+
* (`failure_without_rule` ≥ --min-count, over ≥2 distinct failing work_ids)
|
|
17
|
+
* AND R is otherwise a success-associated rule in P (`success_with_rule` ≥ 1).
|
|
18
|
+
*
|
|
19
|
+
* Exit 0 always (an empty audit log is a valid state, not an error).
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from 'node:fs';
|
|
22
|
+
import * as path from 'node:path';
|
|
23
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
24
|
+
|
|
25
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
26
|
+
export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
27
|
+
export const DEFAULT_AUDIT_DIR = path.join(ROOT, 'agents', 'runtime', 'state', 'audit');
|
|
28
|
+
export const SCHEMA_VERSION = 1;
|
|
29
|
+
const FAILURE_OUTCOMES = new Set(['blocked', 'error']);
|
|
30
|
+
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
+
type Rec = Record<string, any>;
|
|
33
|
+
|
|
34
|
+
/** Read audit-log-v1 phase records from `*.jsonl` (or one `<month>.jsonl`). */
|
|
35
|
+
export function loadRecords(auditDir: string, month: string | null = null): Rec[] {
|
|
36
|
+
const out: Rec[] = [];
|
|
37
|
+
let files: string[];
|
|
38
|
+
if (month) {
|
|
39
|
+
files = [path.join(auditDir, `${month}.jsonl`)];
|
|
40
|
+
} else {
|
|
41
|
+
let names: string[] = [];
|
|
42
|
+
try {
|
|
43
|
+
names = fs.readdirSync(auditDir);
|
|
44
|
+
} catch {
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
files = names.filter((n) => n.endsWith('.jsonl')).sort().map((n) => path.join(auditDir, n));
|
|
48
|
+
}
|
|
49
|
+
for (const p of files) {
|
|
50
|
+
let text: string;
|
|
51
|
+
try {
|
|
52
|
+
text = fs.readFileSync(p, 'utf-8');
|
|
53
|
+
} catch {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
for (const raw of text.split('\n')) {
|
|
57
|
+
const line = raw.trim();
|
|
58
|
+
if (!line) continue;
|
|
59
|
+
let rec: Rec;
|
|
60
|
+
try {
|
|
61
|
+
rec = JSON.parse(line) as Rec;
|
|
62
|
+
} catch {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (rec.schema_version !== SCHEMA_VERSION) continue;
|
|
66
|
+
if (rec.type === 'supersede' || rec.type === 'note') continue;
|
|
67
|
+
if (typeof rec.phase !== 'string' || typeof rec.outcome !== 'string') continue;
|
|
68
|
+
if (!Array.isArray(rec.rules_applied)) continue;
|
|
69
|
+
out.push(rec);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface Candidate {
|
|
76
|
+
phase: string;
|
|
77
|
+
rule: string;
|
|
78
|
+
success_with_rule: number;
|
|
79
|
+
failure_without_rule: number;
|
|
80
|
+
failure_work_ids: string[];
|
|
81
|
+
success_without_rule: number;
|
|
82
|
+
failure_with_rule: number;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function mineCandidates(records: Rec[], minCount: number): Candidate[] {
|
|
86
|
+
const phases = new Set<string>();
|
|
87
|
+
const rules = new Set<string>();
|
|
88
|
+
for (const r of records) {
|
|
89
|
+
phases.add(r.phase as string);
|
|
90
|
+
for (const rule of r.rules_applied as string[]) rules.add(rule);
|
|
91
|
+
}
|
|
92
|
+
const out: Candidate[] = [];
|
|
93
|
+
for (const phase of [...phases].sort()) {
|
|
94
|
+
const inPhase = records.filter((r) => r.phase === phase);
|
|
95
|
+
for (const rule of [...rules].sort()) {
|
|
96
|
+
let succWith = 0;
|
|
97
|
+
let succWithout = 0;
|
|
98
|
+
let failWith = 0;
|
|
99
|
+
const failWithoutIds = new Set<string>();
|
|
100
|
+
for (const r of inPhase) {
|
|
101
|
+
const has = (r.rules_applied as string[]).includes(rule);
|
|
102
|
+
const isSuccess = r.outcome === 'success';
|
|
103
|
+
const isFailure = FAILURE_OUTCOMES.has(r.outcome as string);
|
|
104
|
+
if (isSuccess && has) succWith += 1;
|
|
105
|
+
else if (isSuccess && !has) succWithout += 1;
|
|
106
|
+
else if (isFailure && has) failWith += 1;
|
|
107
|
+
else if (isFailure && !has) {
|
|
108
|
+
failWithoutIds.add(typeof r.work_id === 'string' ? r.work_id : (r.id as string));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const failWithout = failWithoutIds.size;
|
|
112
|
+
// Candidate: absence co-occurs with failure across ≥2 distinct runs,
|
|
113
|
+
// and the rule is otherwise success-associated in this phase.
|
|
114
|
+
if (failWithout >= minCount && failWithout >= 2 && succWith >= 1) {
|
|
115
|
+
out.push({
|
|
116
|
+
phase,
|
|
117
|
+
rule,
|
|
118
|
+
success_with_rule: succWith,
|
|
119
|
+
failure_without_rule: failWithout,
|
|
120
|
+
failure_work_ids: [...failWithoutIds].sort(),
|
|
121
|
+
success_without_rule: succWithout,
|
|
122
|
+
failure_with_rule: failWith,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Strongest signal first: most distinct failing runs, then most successes-with.
|
|
128
|
+
out.sort(
|
|
129
|
+
(a, b) =>
|
|
130
|
+
b.failure_without_rule - a.failure_without_rule ||
|
|
131
|
+
b.success_with_rule - a.success_with_rule ||
|
|
132
|
+
(a.phase < b.phase ? -1 : a.phase > b.phase ? 1 : a.rule < b.rule ? -1 : 1),
|
|
133
|
+
);
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const CONFOUND_NOTE =
|
|
138
|
+
'Correlation, NOT causation. A rule absent from failing runs may reflect the ' +
|
|
139
|
+
'task type or phase shape, not a missing guardrail. Low N inflates noise. ' +
|
|
140
|
+
'Each candidate is a question for a human — promote (or reject) only via ' +
|
|
141
|
+
'learning-to-rule-or-skill. Never auto-add a rule from this output.';
|
|
142
|
+
|
|
143
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
144
|
+
let auditDir = DEFAULT_AUDIT_DIR;
|
|
145
|
+
let month: string | null = null;
|
|
146
|
+
let minCount = 2;
|
|
147
|
+
let asJson = false;
|
|
148
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
149
|
+
const a = argv[i];
|
|
150
|
+
if (a === '--audit-dir') auditDir = argv[++i] ?? auditDir;
|
|
151
|
+
else if (a === '--month') month = argv[++i] ?? null;
|
|
152
|
+
else if (a === '--min-count') minCount = parseInt(argv[++i] ?? '2', 10) || 2;
|
|
153
|
+
else if (a === '--json') asJson = true;
|
|
154
|
+
}
|
|
155
|
+
const records = loadRecords(auditDir, month);
|
|
156
|
+
const candidates = mineCandidates(records, minCount);
|
|
157
|
+
if (asJson) {
|
|
158
|
+
process.stdout.write(
|
|
159
|
+
JSON.stringify(
|
|
160
|
+
{ schema_version: SCHEMA_VERSION, records: records.length, min_count: minCount, confounding: CONFOUND_NOTE, candidates },
|
|
161
|
+
null,
|
|
162
|
+
2,
|
|
163
|
+
) + '\n',
|
|
164
|
+
);
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
if (records.length === 0) {
|
|
168
|
+
process.stdout.write('missing-guardrails: no audit-log-v1 records found (nothing to mine).\n');
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
if (candidates.length === 0) {
|
|
172
|
+
process.stdout.write(`missing-guardrails: ${records.length} record(s), 0 candidates (min-count ${minCount}).\n`);
|
|
173
|
+
return 0;
|
|
174
|
+
}
|
|
175
|
+
process.stdout.write(`missing-guardrails: ${candidates.length} candidate(s) from ${records.length} record(s):\n\n`);
|
|
176
|
+
for (const c of candidates) {
|
|
177
|
+
process.stdout.write(
|
|
178
|
+
` [${c.phase}] rule '${c.rule}' — absent in ${c.failure_without_rule} failing run(s), ` +
|
|
179
|
+
`present in ${c.success_with_rule} success(es). ` +
|
|
180
|
+
`(fail-with-rule ${c.failure_with_rule}, success-without ${c.success_without_rule})\n`,
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
process.stdout.write(`\n⚠️ ${CONFOUND_NOTE}\n`);
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const _isCli =
|
|
188
|
+
process.argv[1] !== undefined && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
|
|
189
|
+
if (_isCli) process.exit(main());
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* phase_gate.ts — Python→TypeScript migration phase gate.
|
|
4
4
|
*
|
|
5
|
-
* Phase 1 Step 10 of `agents/roadmaps/road-to-typescript-only-scripts.md`.
|
|
5
|
+
* Phase 1 Step 10 of `agents/roadmaps/archive/road-to-typescript-only-scripts.md`.
|
|
6
6
|
*
|
|
7
7
|
* Reads `src/scripts/parity/phase-manifest.json` and enforces:
|
|
8
8
|
*
|
|
@@ -196,6 +196,27 @@ export function runReplay(options: ReplayOptions): ReplayReport {
|
|
|
196
196
|
const tsScript = `${scriptBase}.ts`;
|
|
197
197
|
const tsxCommand = resolveTsxCommand(cwd);
|
|
198
198
|
|
|
199
|
+
// Local python-skip guard (teardown D2): the replay harness is migration
|
|
200
|
+
// tooling — it byte-compares a live `python3 <script>.py` run against the
|
|
201
|
+
// tsx twin, which requires BOTH the runtime and the original `.py` to
|
|
202
|
+
// exist. Post-teardown neither holds; fail fast with a clear message
|
|
203
|
+
// instead of a spawn error, so the python-free-env shim retirement does
|
|
204
|
+
// not depend on porting this harness to a frozen-golden design.
|
|
205
|
+
if (spawnSync("python3", ["--version"], { encoding: "utf8" }).status !== 0) {
|
|
206
|
+
return {
|
|
207
|
+
script: options.script,
|
|
208
|
+
status: "fail",
|
|
209
|
+
cases: options.caseDirs.map((caseDir) => ({
|
|
210
|
+
caseDir,
|
|
211
|
+
diffs: [],
|
|
212
|
+
error:
|
|
213
|
+
"python3 unavailable — the golden-replay harness needs the pre-teardown " +
|
|
214
|
+
"python runtime plus the original .py; freeze the baseline to a TS golden " +
|
|
215
|
+
"instead (teardown D2 medium-term).",
|
|
216
|
+
})),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
199
220
|
const cases: CaseResult[] = [];
|
|
200
221
|
for (const caseDirRaw of options.caseDirs) {
|
|
201
222
|
const caseDir = path.resolve(cwd, caseDirRaw);
|
|
@@ -68,6 +68,70 @@ export function kernel_ids(): Set<string> {
|
|
|
68
68
|
return new Set();
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
/**
|
|
72
|
+
* id → workspaces for every non-kernel router entry (router.json schema v2,
|
|
73
|
+
* road-to-request-scoped-rule-load Phase 1). Rules absent from the map (or
|
|
74
|
+
* with an empty list) fail safe: they stay in scope.
|
|
75
|
+
*/
|
|
76
|
+
export function rule_workspaces_map(): Map<string, string[]> {
|
|
77
|
+
const data = JSON.parse(fs.readFileSync(ROUTER, 'utf-8')) as Record<string, unknown>;
|
|
78
|
+
const map = new Map<string, string[]>();
|
|
79
|
+
for (const tier of ['tier_1', 'tier_2']) {
|
|
80
|
+
const entries = data[tier];
|
|
81
|
+
if (!Array.isArray(entries)) continue;
|
|
82
|
+
for (const e of entries) {
|
|
83
|
+
const obj = e as Record<string, unknown>;
|
|
84
|
+
const ws = Array.isArray(obj.workspaces) ? obj.workspaces.map((w) => String(w)) : [];
|
|
85
|
+
map.set(String(obj.id), ws);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return map;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Whether a rule id survives a workspace scope. Kernel always survives;
|
|
93
|
+
* `scope === null` = legacy-all. An out-of-scope non-kernel rule is dropped
|
|
94
|
+
* entirely — neither body nor pointer line (the pointer floor shrinks with
|
|
95
|
+
* consumer scoping).
|
|
96
|
+
*/
|
|
97
|
+
export function id_in_scope(
|
|
98
|
+
rule_id: string,
|
|
99
|
+
scope: readonly string[] | null,
|
|
100
|
+
kernel: ReadonlySet<string>,
|
|
101
|
+
wsMap: ReadonlyMap<string, string[]>,
|
|
102
|
+
fallback_ws: readonly string[] = [],
|
|
103
|
+
): boolean {
|
|
104
|
+
if (scope === null || kernel.has(rule_id)) {
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
// Router map first (schema v2); `type: manual` rules are reference-only
|
|
108
|
+
// and never emitted to the router — their frontmatter is the fallback.
|
|
109
|
+
const ws = wsMap.get(rule_id) ?? fallback_ws;
|
|
110
|
+
if (ws.length === 0) {
|
|
111
|
+
return true; // untagged / unknown → fail safe
|
|
112
|
+
}
|
|
113
|
+
return ws.some((w) => scope.includes(w));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** `workspaces:` list parsed straight from a rule file's frontmatter. */
|
|
117
|
+
export function fm_workspaces(text: string): string[] {
|
|
118
|
+
const [fm] = split_frontmatter(text);
|
|
119
|
+
// Flow style: `workspaces: [a, b, c]`
|
|
120
|
+
const flow = /^workspaces:[ \t]*\[([^\]]*)\]/m.exec(fm);
|
|
121
|
+
if (flow) {
|
|
122
|
+
return (flow[1] as string)
|
|
123
|
+
.split(',')
|
|
124
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ''))
|
|
125
|
+
.filter((s) => s.length > 0);
|
|
126
|
+
}
|
|
127
|
+
// Block style; tolerate the list being the LAST frontmatter key.
|
|
128
|
+
const m = /^workspaces:[ \t]*\n((?:[ \t]+-[ \t]+.*(?:\n|$))+)/m.exec(fm);
|
|
129
|
+
if (!m) {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
return [...(m[1] as string).matchAll(/-[ \t]+(\S+)/g)].map((x) => x[1] as string);
|
|
133
|
+
}
|
|
134
|
+
|
|
71
135
|
/** Return [frontmatter_including_fences, body]. Empty fm if none. */
|
|
72
136
|
export function split_frontmatter(text: string): [string, string] {
|
|
73
137
|
if (text.startsWith('---\n')) {
|
|
@@ -123,12 +187,19 @@ export function thin_entry(rule_id: string, text: string): string {
|
|
|
123
187
|
}
|
|
124
188
|
|
|
125
189
|
/** Map {filename: thin_or_full_text} for every rule. Kernel stays full. */
|
|
126
|
-
export function build_thin(
|
|
190
|
+
export function build_thin(
|
|
191
|
+
rules_dir: string = RULES_SOURCE,
|
|
192
|
+
scope: readonly string[] | null = null,
|
|
193
|
+
): Map<string, string> {
|
|
127
194
|
const kernel = kernel_ids();
|
|
195
|
+
const wsMap = scope !== null ? rule_workspaces_map() : new Map<string, string[]>();
|
|
128
196
|
const out = new Map<string, string>();
|
|
129
197
|
for (const p of _globSortedMd(rules_dir)) {
|
|
130
198
|
const text = fs.readFileSync(p, 'utf-8');
|
|
131
199
|
const stem = path.basename(p).replace(/\.md$/, '');
|
|
200
|
+
if (!id_in_scope(stem, scope, kernel, wsMap, fm_workspaces(text))) {
|
|
201
|
+
continue; // out of workspace scope — no body, no pointer line
|
|
202
|
+
}
|
|
132
203
|
out.set(path.basename(p), kernel.has(stem) ? text : thin_entry(stem, text));
|
|
133
204
|
}
|
|
134
205
|
return out;
|
|
@@ -163,12 +234,24 @@ function _python_round1(x: number): number {
|
|
|
163
234
|
return r / 10;
|
|
164
235
|
}
|
|
165
236
|
|
|
166
|
-
/** Eager vs thin token footprint for the rule layer. */
|
|
167
|
-
export function measure(
|
|
237
|
+
/** Eager vs thin token footprint for the rule layer (scope applies to both arms). */
|
|
238
|
+
export function measure(
|
|
239
|
+
rules_dir: string = RULES_SOURCE,
|
|
240
|
+
scope: readonly string[] | null = null,
|
|
241
|
+
): ThinMeasure {
|
|
168
242
|
const kernel = kernel_ids();
|
|
169
|
-
const
|
|
243
|
+
const wsMap = scope !== null ? rule_workspaces_map() : new Map<string, string[]>();
|
|
244
|
+
const mdPaths = _globSortedMd(rules_dir).filter((p) =>
|
|
245
|
+
id_in_scope(
|
|
246
|
+
path.basename(p).replace(/\.md$/, ''),
|
|
247
|
+
scope,
|
|
248
|
+
kernel,
|
|
249
|
+
wsMap,
|
|
250
|
+
fm_workspaces(fs.readFileSync(p, 'utf-8')),
|
|
251
|
+
),
|
|
252
|
+
);
|
|
170
253
|
const eager_blob = mdPaths.map((p) => fs.readFileSync(p, 'utf-8')).join('');
|
|
171
|
-
const thin_blob = [...build_thin(rules_dir).values()].join('');
|
|
254
|
+
const thin_blob = [...build_thin(rules_dir, scope).values()].join('');
|
|
172
255
|
const eager = token_count.measure(eager_blob);
|
|
173
256
|
const thin = token_count.measure(thin_blob);
|
|
174
257
|
const n = mdPaths.length;
|
|
@@ -198,9 +281,13 @@ export function measure(rules_dir: string = RULES_SOURCE): ThinMeasure {
|
|
|
198
281
|
}
|
|
199
282
|
|
|
200
283
|
/** Write thin rule files to `out_dir`; return the count written. */
|
|
201
|
-
export function write_thin(
|
|
284
|
+
export function write_thin(
|
|
285
|
+
out_dir: string,
|
|
286
|
+
rules_dir: string = RULES_SOURCE,
|
|
287
|
+
scope: readonly string[] | null = null,
|
|
288
|
+
): number {
|
|
202
289
|
fs.mkdirSync(out_dir, { recursive: true });
|
|
203
|
-
const files = build_thin(rules_dir);
|
|
290
|
+
const files = build_thin(rules_dir, scope);
|
|
204
291
|
for (const [name, text] of files) {
|
|
205
292
|
fs.writeFileSync(path.join(out_dir, name), text, 'utf-8');
|
|
206
293
|
}
|
|
@@ -293,22 +380,26 @@ interface ParsedArgs {
|
|
|
293
380
|
measure: boolean;
|
|
294
381
|
out: string | null;
|
|
295
382
|
json: boolean;
|
|
383
|
+
workspaces: string[] | null;
|
|
296
384
|
}
|
|
297
385
|
|
|
298
386
|
// argparse `prog` defaults to basename(sys.argv[0]) → `project_thin_rules.py`.
|
|
299
|
-
const _USAGE =
|
|
387
|
+
const _USAGE =
|
|
388
|
+
'usage: project_thin_rules.py [-h] [--measure] [--out OUT] [--json] [--workspaces WS]\n';
|
|
300
389
|
|
|
301
|
-
// Full `-h` help block
|
|
390
|
+
// Full `-h` help block.
|
|
302
391
|
const _HELP =
|
|
303
392
|
_USAGE +
|
|
304
393
|
'\n' +
|
|
305
394
|
'Thin-projection of the rule layer (lean-initial-context build-out, Phase 3.1).\n' +
|
|
306
395
|
'\n' +
|
|
307
396
|
'optional arguments:\n' +
|
|
308
|
-
' -h, --help
|
|
309
|
-
' --measure
|
|
310
|
-
' --out OUT
|
|
311
|
-
' --json\n'
|
|
397
|
+
' -h, --help show this help message and exit\n' +
|
|
398
|
+
' --measure print the eager-vs-thin token delta\n' +
|
|
399
|
+
' --out OUT write thin rule files to this dir\n' +
|
|
400
|
+
' --json\n' +
|
|
401
|
+
' --workspaces WS comma-separated workspace scope (router.json v2 fields);\n' +
|
|
402
|
+
' kernel always survives, out-of-scope rules drop entirely\n';
|
|
312
403
|
|
|
313
404
|
function _argError(msg: string): never {
|
|
314
405
|
process.stderr.write(_USAGE);
|
|
@@ -317,7 +408,7 @@ function _argError(msg: string): never {
|
|
|
317
408
|
}
|
|
318
409
|
|
|
319
410
|
function parse_args(argv: string[]): ParsedArgs {
|
|
320
|
-
const out: ParsedArgs = { measure: false, out: null, json: false };
|
|
411
|
+
const out: ParsedArgs = { measure: false, out: null, json: false, workspaces: null };
|
|
321
412
|
for (let i = 0; i < argv.length; i += 1) {
|
|
322
413
|
const a = argv[i] as string;
|
|
323
414
|
if (a === '-h' || a === '--help') {
|
|
@@ -336,6 +427,19 @@ function parse_args(argv: string[]): ParsedArgs {
|
|
|
336
427
|
i += 1;
|
|
337
428
|
} else if (a.startsWith('--out=')) {
|
|
338
429
|
out.out = a.slice('--out='.length);
|
|
430
|
+
} else if (a === '--workspaces') {
|
|
431
|
+
const next = argv[i + 1];
|
|
432
|
+
if (next === undefined) {
|
|
433
|
+
_argError('argument --workspaces: expected one argument');
|
|
434
|
+
}
|
|
435
|
+
out.workspaces = next.split(',').map((s) => s.trim()).filter((s) => s.length > 0);
|
|
436
|
+
i += 1;
|
|
437
|
+
} else if (a.startsWith('--workspaces=')) {
|
|
438
|
+
out.workspaces = a
|
|
439
|
+
.slice('--workspaces='.length)
|
|
440
|
+
.split(',')
|
|
441
|
+
.map((s) => s.trim())
|
|
442
|
+
.filter((s) => s.length > 0);
|
|
339
443
|
} else {
|
|
340
444
|
_argError(`unrecognized arguments: ${a}`);
|
|
341
445
|
}
|
|
@@ -357,12 +461,12 @@ export function main(argv: string[] | null = null): number {
|
|
|
357
461
|
const args = parse_args(argv ?? process.argv.slice(2));
|
|
358
462
|
|
|
359
463
|
if (args.out !== null) {
|
|
360
|
-
const n = write_thin(args.out);
|
|
464
|
+
const n = write_thin(args.out, RULES_SOURCE, args.workspaces);
|
|
361
465
|
process.stdout.write(`wrote ${n} thin rule files → ${args.out}\n`);
|
|
362
466
|
return 0;
|
|
363
467
|
}
|
|
364
468
|
|
|
365
|
-
const m = measure();
|
|
469
|
+
const m = measure(RULES_SOURCE, args.workspaces);
|
|
366
470
|
if (args.json) {
|
|
367
471
|
// `saved_pct` is a Python float (round(..., 1)); wrap it so an
|
|
368
472
|
// integer-valued result still renders as `N.0` (json.dumps parity).
|
package/src/scripts/release.ts
CHANGED
|
@@ -151,6 +151,18 @@ class CalledProcessError extends Error {
|
|
|
151
151
|
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
152
152
|
const PACKAGE_JSON = path.join(REPO_ROOT, 'package.json');
|
|
153
153
|
const MARKETPLACE_JSON = path.join(REPO_ROOT, '.claude-plugin', 'marketplace.json');
|
|
154
|
+
// Source-of-truth project-settings template. Carries an `agent_config_version`
|
|
155
|
+
// pin that check_template_pin_drift requires to equal package.json.version. We
|
|
156
|
+
// bump the src twin here; `task release-prepare` (run right after the bump)
|
|
157
|
+
// regenerates the dist/agent-src/ twin from it.
|
|
158
|
+
const PROJECT_TEMPLATE = path.join(
|
|
159
|
+
REPO_ROOT,
|
|
160
|
+
'src',
|
|
161
|
+
'agent-src',
|
|
162
|
+
'templates',
|
|
163
|
+
'agents',
|
|
164
|
+
'agent-project-settings.example.yml',
|
|
165
|
+
);
|
|
154
166
|
const CHANGELOG = path.join(REPO_ROOT, 'CHANGELOG.md');
|
|
155
167
|
const MAIN_BRANCH = 'main';
|
|
156
168
|
const REMOTE = 'origin';
|
|
@@ -879,6 +891,29 @@ function set_marketplace_version(p: string, version: string): void {
|
|
|
879
891
|
fs.writeFileSync(p, jsonDumpsIndent(data, 2) + '\n', 'utf-8');
|
|
880
892
|
}
|
|
881
893
|
|
|
894
|
+
function set_template_pin(p: string, version: string): void {
|
|
895
|
+
// Rewrite the single `agent_config_version:` line in place, preserving the
|
|
896
|
+
// rest of the YAML byte-for-byte. Quoted value to match the existing pin
|
|
897
|
+
// style and check_template_pin_drift's tolerant parse.
|
|
898
|
+
const text = fs.readFileSync(p, 'utf-8');
|
|
899
|
+
const lines = text.split('\n');
|
|
900
|
+
let found = false;
|
|
901
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
902
|
+
if (/^\s*agent_config_version\s*:/.test(lines[i]!)) {
|
|
903
|
+
lines[i] = lines[i]!.replace(
|
|
904
|
+
/^(\s*agent_config_version\s*:\s*).*/,
|
|
905
|
+
`$1"${version}"`,
|
|
906
|
+
);
|
|
907
|
+
found = true;
|
|
908
|
+
break;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
if (!found) {
|
|
912
|
+
die(`set_template_pin: no \`agent_config_version:\` line in ${p}`);
|
|
913
|
+
}
|
|
914
|
+
fs.writeFileSync(p, lines.join('\n'), 'utf-8');
|
|
915
|
+
}
|
|
916
|
+
|
|
882
917
|
// ─── preflight ────────────────────────────────────────────────────────────────
|
|
883
918
|
|
|
884
919
|
/**
|
|
@@ -982,6 +1017,7 @@ function print_preview(plan: Plan): void {
|
|
|
982
1017
|
process.stdout.write('Files to change:\n');
|
|
983
1018
|
process.stdout.write(` · ${path.relative(REPO_ROOT, PACKAGE_JSON)}\n`);
|
|
984
1019
|
process.stdout.write(` · ${path.relative(REPO_ROOT, MARKETPLACE_JSON)}\n`);
|
|
1020
|
+
process.stdout.write(` · ${path.relative(REPO_ROOT, PROJECT_TEMPLATE)}\n`);
|
|
985
1021
|
process.stdout.write(` · ${path.relative(REPO_ROOT, CHANGELOG)}\n`);
|
|
986
1022
|
process.stdout.write(' · regenerated derived files via `task release-prepare`\n');
|
|
987
1023
|
process.stdout.write(
|
|
@@ -1204,9 +1240,10 @@ function execute(
|
|
|
1204
1240
|
if (resume && current_pkg === plan.target) {
|
|
1205
1241
|
_step(2, total, `Files already at ${plan.target} — skip bump`);
|
|
1206
1242
|
} else {
|
|
1207
|
-
_step(2, total, 'Bump package.json + marketplace.json, prepend CHANGELOG');
|
|
1243
|
+
_step(2, total, 'Bump package.json + marketplace.json + template pin, prepend CHANGELOG');
|
|
1208
1244
|
set_package_version(PACKAGE_JSON, plan.target);
|
|
1209
1245
|
set_marketplace_version(MARKETPLACE_JSON, plan.target);
|
|
1246
|
+
set_template_pin(PROJECT_TEMPLATE, plan.target);
|
|
1210
1247
|
prepend_changelog(CHANGELOG, plan.changelog_entry);
|
|
1211
1248
|
}
|
|
1212
1249
|
|
|
@@ -1727,6 +1764,7 @@ export {
|
|
|
1727
1764
|
prepend_changelog,
|
|
1728
1765
|
set_package_version,
|
|
1729
1766
|
set_marketplace_version,
|
|
1767
|
+
set_template_pin,
|
|
1730
1768
|
resolve_bump,
|
|
1731
1769
|
_detect_in_flight_target,
|
|
1732
1770
|
print_preview,
|