@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,202 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Hard-gate linter for the roadmap `## Blockers` contract
|
|
4
|
+
* (`templates/roadmaps.md` rule 20 / `roadmap-ci-steps-policy` siblings).
|
|
5
|
+
*
|
|
6
|
+
* Validates, for every active roadmap under `agents/roadmaps/*.md`:
|
|
7
|
+
*
|
|
8
|
+
* 1. Every `### blocker: <id>` entry declares all five required fields
|
|
9
|
+
* (Status, Owner, Blocks, What to do, Resolved when).
|
|
10
|
+
* 2. Every inline `<!-- blocked-by: <id> -->` annotation resolves to a
|
|
11
|
+
* `### blocker: <id>` entry declared in the SAME file.
|
|
12
|
+
*
|
|
13
|
+
* Fenced code blocks are stripped before scanning so a roadmap that shows
|
|
14
|
+
* the `## Blockers` shape as a documentation example is not flagged.
|
|
15
|
+
*
|
|
16
|
+
* Exit codes: 0 = clean / no active roadmaps, 1 = violations.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import * as fs from 'node:fs';
|
|
20
|
+
import * as path from 'node:path';
|
|
21
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
22
|
+
|
|
23
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
24
|
+
const QUIET = process.argv.slice(2).includes('--quiet');
|
|
25
|
+
|
|
26
|
+
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
27
|
+
const ROADMAP_GLOB = 'agents/roadmaps/*.md';
|
|
28
|
+
|
|
29
|
+
const FENCED_CODE_RE = /^[ \t]*```[^\n]*\n[\s\S]*?^[ \t]*```[ \t]*$/gm;
|
|
30
|
+
const BLOCKERS_SECTION_RE = /^##[ \t]+Blockers[ \t]*$/im;
|
|
31
|
+
const NEXT_H2_RE = /^##[ \t]+\S/m;
|
|
32
|
+
const BLOCKER_HEADING_RE = /^###[ \t]+blocker:[ \t]*(.+?)[ \t]*$/gim;
|
|
33
|
+
// Only a real checkbox line (`- [ ] … <!-- blocked-by: id -->`) counts — a
|
|
34
|
+
// wrapped continuation line or inline-code documentation example of the
|
|
35
|
+
// syntax (as this very lint script's own roadmap step describes it) must
|
|
36
|
+
// not be mistaken for a live cross-reference.
|
|
37
|
+
const BLOCKED_BY_LINE_RE = /^-[ \t]*\[[ xX~-]\].*<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+)[ \t]*-->/i;
|
|
38
|
+
|
|
39
|
+
const REQUIRED_FIELDS: ReadonlyArray<readonly [string, RegExp]> = [
|
|
40
|
+
['Status', /^-[ \t]*\*\*Status:\*\*/im],
|
|
41
|
+
['Owner', /^-[ \t]*\*\*Owner:\*\*/im],
|
|
42
|
+
['Blocks', /^-[ \t]*\*\*Blocks:\*\*/im],
|
|
43
|
+
['What to do', /^-[ \t]*\*\*What to do:\*\*/im],
|
|
44
|
+
['Resolved when', /^-[ \t]*\*\*Resolved when:\*\*/im],
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
interface Violation {
|
|
48
|
+
line: number;
|
|
49
|
+
message: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** 1-based line number of a character offset. */
|
|
53
|
+
function _lineAt(text: string, index: number): number {
|
|
54
|
+
let n = 1;
|
|
55
|
+
for (let i = 0; i < index && i < text.length; i++) {
|
|
56
|
+
if (text.charCodeAt(i) === 10) {
|
|
57
|
+
n += 1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return n;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Blank out fenced code blocks, preserving line count and offsets. */
|
|
64
|
+
function _stripFencedCode(text: string): string {
|
|
65
|
+
return text.replace(FENCED_CODE_RE, (m) => '\n'.repeat((m.match(/\n/g) ?? []).length));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function _scan(rawText: string): Violation[] {
|
|
69
|
+
const violations: Violation[] = [];
|
|
70
|
+
const text = _stripFencedCode(rawText);
|
|
71
|
+
const declaredIds = new Set<string>();
|
|
72
|
+
|
|
73
|
+
const sectionMatch = BLOCKERS_SECTION_RE.exec(text);
|
|
74
|
+
if (sectionMatch) {
|
|
75
|
+
const sectionStart = sectionMatch.index + sectionMatch[0].length;
|
|
76
|
+
const rest = text.slice(sectionStart);
|
|
77
|
+
const h2 = NEXT_H2_RE.exec(rest);
|
|
78
|
+
const sectionEnd = h2 ? sectionStart + h2.index : text.length;
|
|
79
|
+
const section = text.slice(sectionStart, sectionEnd);
|
|
80
|
+
|
|
81
|
+
BLOCKER_HEADING_RE.lastIndex = 0;
|
|
82
|
+
const heads: Array<{ start: number; end: number; id: string }> = [];
|
|
83
|
+
let hm: RegExpExecArray | null;
|
|
84
|
+
while ((hm = BLOCKER_HEADING_RE.exec(section)) !== null) {
|
|
85
|
+
heads.push({
|
|
86
|
+
start: hm.index,
|
|
87
|
+
end: hm.index + hm[0].length,
|
|
88
|
+
id: (hm[1] as string).trim(),
|
|
89
|
+
});
|
|
90
|
+
if (hm.index === BLOCKER_HEADING_RE.lastIndex) {
|
|
91
|
+
BLOCKER_HEADING_RE.lastIndex++;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
for (let i = 0; i < heads.length; i++) {
|
|
95
|
+
const cur = heads[i] as { start: number; end: number; id: string };
|
|
96
|
+
declaredIds.add(cur.id);
|
|
97
|
+
const bodyEnd = i + 1 < heads.length ? (heads[i + 1] as { start: number }).start : section.length;
|
|
98
|
+
const body = section.slice(cur.end, bodyEnd);
|
|
99
|
+
const missing = REQUIRED_FIELDS.filter(([, re]) => !re.test(body)).map(([name]) => name);
|
|
100
|
+
if (missing.length) {
|
|
101
|
+
violations.push({
|
|
102
|
+
line: _lineAt(text, sectionStart + cur.start),
|
|
103
|
+
message: `blocker '${cur.id}' missing required field(s): ${missing.join(', ')}`,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const lines = text.split('\n');
|
|
110
|
+
for (let i = 0; i < lines.length; i++) {
|
|
111
|
+
// A real annotation is bare markdown (an actual checkbox + HTML
|
|
112
|
+
// comment); an inline-code-quoted mention (`` `<!-- blocked-by: id -->` ``,
|
|
113
|
+
// e.g. this very lint script's own roadmap step documenting the
|
|
114
|
+
// syntax) is prose, not a live cross-reference — blank inline code
|
|
115
|
+
// spans before matching.
|
|
116
|
+
const cleaned = (lines[i] as string).replace(/`[^`\n]*`/g, (m) => ' '.repeat(m.length));
|
|
117
|
+
const m = BLOCKED_BY_LINE_RE.exec(cleaned);
|
|
118
|
+
if (!m) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const id = m[1] as string;
|
|
122
|
+
if (!declaredIds.has(id)) {
|
|
123
|
+
violations.push({
|
|
124
|
+
line: i + 1,
|
|
125
|
+
message:
|
|
126
|
+
`blocked-by references unknown blocker id '${id}' ` +
|
|
127
|
+
`(no matching '### blocker: ${id}' in this file)`,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
violations.sort((a, b) => a.line - b.line);
|
|
132
|
+
return violations;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Sorted `agents/roadmaps/*.md` (non-recursive — active roadmaps only). */
|
|
136
|
+
function _globRoadmaps(): string[] {
|
|
137
|
+
const dir = path.join(REPO_ROOT, 'agents', 'roadmaps');
|
|
138
|
+
let entries: fs.Dirent[];
|
|
139
|
+
try {
|
|
140
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
141
|
+
} catch {
|
|
142
|
+
return [];
|
|
143
|
+
}
|
|
144
|
+
const out: string[] = [];
|
|
145
|
+
for (const entry of entries) {
|
|
146
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
147
|
+
out.push(path.join(dir, entry.name));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return out.sort();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function _relPosix(target: string, root: string): string {
|
|
154
|
+
return path.relative(root, target).split(path.sep).join('/');
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function main(): number {
|
|
158
|
+
const roadmaps = _globRoadmaps();
|
|
159
|
+
if (roadmaps.length === 0) {
|
|
160
|
+
if (!QUIET) {
|
|
161
|
+
process.stdout.write(`✅ no active roadmaps under ${ROADMAP_GLOB}\n`);
|
|
162
|
+
}
|
|
163
|
+
return 0;
|
|
164
|
+
}
|
|
165
|
+
let failed = 0;
|
|
166
|
+
for (const roadmap of roadmaps) {
|
|
167
|
+
const rel = _relPosix(roadmap, REPO_ROOT);
|
|
168
|
+
const text = fs.readFileSync(roadmap, 'utf-8');
|
|
169
|
+
const violations = _scan(text);
|
|
170
|
+
if (violations.length) {
|
|
171
|
+
failed += 1;
|
|
172
|
+
process.stderr.write(`❌ ${rel}\n`);
|
|
173
|
+
for (const v of violations) {
|
|
174
|
+
process.stderr.write(` line ${v.line}: ${v.message}\n`);
|
|
175
|
+
}
|
|
176
|
+
} else if (!QUIET) {
|
|
177
|
+
process.stdout.write(`✅ ${rel}\n`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (failed) {
|
|
181
|
+
process.stderr.write(
|
|
182
|
+
`\n❌ ${failed} roadmap(s) violate the ## Blockers contract — ` +
|
|
183
|
+
'see .augment/rules/roadmap-progress-sync.md and ' +
|
|
184
|
+
'.augment/templates/roadmaps.md rule 20\n',
|
|
185
|
+
);
|
|
186
|
+
return 1;
|
|
187
|
+
}
|
|
188
|
+
if (!QUIET) {
|
|
189
|
+
process.stdout.write(`\n✅ ${roadmaps.length} roadmap(s) blocker-contract-clean\n`);
|
|
190
|
+
}
|
|
191
|
+
return 0;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const _isCliEntry =
|
|
195
|
+
process.argv[1] !== undefined &&
|
|
196
|
+
import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
|
|
197
|
+
if (_isCliEntry || process.argv[1] === _HERE) {
|
|
198
|
+
process.exit(main());
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export { REPO_ROOT, ROADMAP_GLOB, REQUIRED_FIELDS, _scan, _globRoadmaps, main };
|
|
202
|
+
export type { Violation };
|
|
@@ -42,6 +42,9 @@ const COUNCIL_PAT = /^## Council Round \d+\b/m;
|
|
|
42
42
|
const VERDICT_PAT = /^### Verdict\b/m;
|
|
43
43
|
// re.compile(r"^complexity:\s*(lightweight|structural)\s*$", re.MULTILINE)
|
|
44
44
|
const COMPLEXITY_PAT = /^complexity:\s*(lightweight|structural)\s*$/m;
|
|
45
|
+
// execution.mode (templates/roadmaps.md rule 18): nested under `execution:`.
|
|
46
|
+
const EXEC_MODE_PAT = /^execution:[^\S\n]*\n(?:[ \t]+(?!mode:).*\n)*[ \t]+mode:[ \t]*([^\s#]+)/m;
|
|
47
|
+
const EXEC_MODE_VALUES = new Set(['autonomous', 'phase-checkpoints', 'interactive']);
|
|
45
48
|
|
|
46
49
|
// Plate / horizon detection — template rule 16 forbids time-boxed plates.
|
|
47
50
|
const PLATE_PATS: ReadonlyArray<readonly [RegExp, string]> = [
|
|
@@ -161,7 +164,11 @@ function _check_no_plate(text: string, problems: string[]): void {
|
|
|
161
164
|
}
|
|
162
165
|
}
|
|
163
166
|
|
|
164
|
-
function lint_roadmap(
|
|
167
|
+
function lint_roadmap(
|
|
168
|
+
p: string,
|
|
169
|
+
horizon_weeks: number,
|
|
170
|
+
warnings?: string[],
|
|
171
|
+
): string[] {
|
|
165
172
|
const text = fs.readFileSync(p, 'utf-8');
|
|
166
173
|
const line_count = _countChar(text, '\n') + (text && !text.endsWith('\n') ? 1 : 0);
|
|
167
174
|
const problems: string[] = [];
|
|
@@ -180,9 +187,77 @@ function lint_roadmap(p: string, horizon_weeks: number): string[] {
|
|
|
180
187
|
if (horizon_weeks <= 0) {
|
|
181
188
|
_check_no_plate(text, problems);
|
|
182
189
|
}
|
|
190
|
+
_check_execution_mode(fm, problems);
|
|
191
|
+
if (warnings) {
|
|
192
|
+
_check_autonomous_authoring(text, fm, warnings);
|
|
193
|
+
}
|
|
183
194
|
return problems;
|
|
184
195
|
}
|
|
185
196
|
|
|
197
|
+
// Vague-step patterns (ask-when-uncertain trigger subset) — under
|
|
198
|
+
// execution.mode: autonomous these guarantee mid-run ambiguity halts,
|
|
199
|
+
// so they warn at authoring time instead. Warnings never fail the lint.
|
|
200
|
+
const VAGUE_STEP_PATS: Array<[RegExp, string]> = [
|
|
201
|
+
[/\b(improve|optimi[sz]e)\b(?!.*\bby\b)/i, "'improve / optimize' without a measurable target"],
|
|
202
|
+
[/\bmake (it|this|.{0,30}) (better|cleaner|nicer)\b/i, "'make it better/cleaner'"],
|
|
203
|
+
[/\bclean ?up\b(?!.*\(<)/i, "'clean up' without named scope"],
|
|
204
|
+
[/\bfix (this|it)\b/i, "'fix this' without a symptom"],
|
|
205
|
+
[/\buse best practices\b/i, "'use best practices'"],
|
|
206
|
+
[/\bhandle errors properly\b/i, "'handle errors properly'"],
|
|
207
|
+
];
|
|
208
|
+
|
|
209
|
+
function _check_autonomous_authoring(text: string, fm: string, warnings: string[]): void {
|
|
210
|
+
const m = EXEC_MODE_PAT.exec(fm);
|
|
211
|
+
if (m === null || m[1]!.replace(/^['"]|['"]$/g, '') !== 'autonomous') {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const deferred = _countMatches(/^\s*-\s*\[~\]/m, text);
|
|
215
|
+
if (deferred > 0) {
|
|
216
|
+
warnings.push(
|
|
217
|
+
`execution.mode: autonomous with ${deferred} pre-existing [~] deferred item(s) — ` +
|
|
218
|
+
'the deferred-resolution archival gate (roadmap-progress-sync Iron Law 3) ' +
|
|
219
|
+
'WILL interrupt the run at the end; resolve or re-author them now',
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
for (const rawLine of text.split('\n')) {
|
|
223
|
+
if (!/^\s*-\s*\[ \]/.test(rawLine)) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
for (const [re, label] of VAGUE_STEP_PATS) {
|
|
227
|
+
if (re.test(rawLine)) {
|
|
228
|
+
warnings.push(
|
|
229
|
+
`vague step under execution.mode: autonomous (${label}): ` +
|
|
230
|
+
`"${rawLine.trim().slice(0, 80)}" — vagueness resolves cheaply at ` +
|
|
231
|
+
'authoring time, expensively as a mid-run ambiguity halt',
|
|
232
|
+
);
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function _check_execution_mode(fm: string, problems: string[]): void {
|
|
240
|
+
if (!fm || !/^execution:/m.test(fm)) {
|
|
241
|
+
return; // absent field = interactive default — valid
|
|
242
|
+
}
|
|
243
|
+
const m = EXEC_MODE_PAT.exec(fm);
|
|
244
|
+
if (m === null) {
|
|
245
|
+
problems.push(
|
|
246
|
+
"'execution:' frontmatter block present but no 'mode:' key found " +
|
|
247
|
+
"(expected execution.mode: autonomous | phase-checkpoints | interactive " +
|
|
248
|
+
'per templates/roadmaps.md rule 18)',
|
|
249
|
+
);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const value = m[1]!.replace(/^['"]|['"]$/g, '');
|
|
253
|
+
if (!EXEC_MODE_VALUES.has(value)) {
|
|
254
|
+
problems.push(
|
|
255
|
+
`unknown execution.mode '${value}' — allowed: autonomous | ` +
|
|
256
|
+
'phase-checkpoints | interactive (templates/roadmaps.md rule 18)',
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
186
261
|
function main(): number {
|
|
187
262
|
const roadmaps = _globRoadmaps();
|
|
188
263
|
const horizon_weeks = _read_horizon_weeks();
|
|
@@ -196,7 +271,11 @@ function main(): number {
|
|
|
196
271
|
const summary: Array<[string, string]> = [];
|
|
197
272
|
for (const roadmap of roadmaps) {
|
|
198
273
|
const rel = _relPosix(roadmap, REPO_ROOT);
|
|
199
|
-
const
|
|
274
|
+
const warnings: string[] = [];
|
|
275
|
+
const problems = lint_roadmap(roadmap, horizon_weeks, warnings);
|
|
276
|
+
for (const w of warnings) {
|
|
277
|
+
process.stderr.write(`⚠️ ${rel}\n - ${w}\n`);
|
|
278
|
+
}
|
|
200
279
|
const text = fs.readFileSync(roadmap, 'utf-8');
|
|
201
280
|
const complexity = _read_complexity(_frontmatter(text)) ?? 'untagged';
|
|
202
281
|
summary.push([rel, complexity]);
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Lint subagent determinism — the ADR-109 guarantees the schema mini-validator
|
|
4
|
+
* cannot express.
|
|
5
|
+
*
|
|
6
|
+
* `validate_frontmatter` (the schema gate) covers type / enum / required /
|
|
7
|
+
* pattern, but its mini-validator ignores JSON-Schema `const` and `uniqueItems`.
|
|
8
|
+
* This lint closes that gap for `src/subagents/*.md`:
|
|
9
|
+
*
|
|
10
|
+
* 1. `schema_version` MUST equal `subagent-v1` (schema `const`).
|
|
11
|
+
* 2. `discovery.visible` MUST be exactly `false` — default-off (schema `const`).
|
|
12
|
+
* 3. `tools` MUST have no duplicate entries (schema `uniqueItems`).
|
|
13
|
+
* 4. `name` MUST match the filename stem (addressable-handle invariant).
|
|
14
|
+
* 5. `name` MUST be globally unique across the subagent category
|
|
15
|
+
* (projection-path collision guard — two units would overwrite each other
|
|
16
|
+
* in `.claude/agents/`).
|
|
17
|
+
*
|
|
18
|
+
* Exit codes: 0 clean, 1 any violation.
|
|
19
|
+
*
|
|
20
|
+
* See ADR-109 (§ 6 determinism) and `src/scripts/schemas/subagent.schema.json`.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import * as fs from 'node:fs';
|
|
24
|
+
import * as path from 'node:path';
|
|
25
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
26
|
+
|
|
27
|
+
import { parse_frontmatter } from './validate_frontmatter.js';
|
|
28
|
+
|
|
29
|
+
const QUIET = process.argv.includes('--quiet');
|
|
30
|
+
|
|
31
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
32
|
+
const REPO = path.resolve(path.dirname(_HERE), '..', '..');
|
|
33
|
+
const SUBAGENT_DIR = path.join(REPO, 'src', 'subagents');
|
|
34
|
+
|
|
35
|
+
function _listSubagents(dir: string): string[] {
|
|
36
|
+
if (!fs.existsSync(dir)) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
return fs
|
|
40
|
+
.readdirSync(dir)
|
|
41
|
+
.filter((f) => f.endsWith('.md'))
|
|
42
|
+
.sort()
|
|
43
|
+
.map((f) => path.join(dir, f));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function main(dir: string = SUBAGENT_DIR): number {
|
|
47
|
+
const findings: string[] = [];
|
|
48
|
+
const namesSeen = new Map<string, string>();
|
|
49
|
+
|
|
50
|
+
for (const file of _listSubagents(dir)) {
|
|
51
|
+
const rel = path.relative(REPO, file);
|
|
52
|
+
const stem = path.basename(file, '.md');
|
|
53
|
+
const text = fs.readFileSync(file, 'utf-8');
|
|
54
|
+
const [data] = parse_frontmatter(text);
|
|
55
|
+
if (data === null || typeof data !== 'object' || Array.isArray(data)) {
|
|
56
|
+
findings.push(`${rel}: no parseable frontmatter`);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const fm = data as Record<string, unknown>;
|
|
60
|
+
|
|
61
|
+
if (fm.schema_version !== 'subagent-v1') {
|
|
62
|
+
findings.push(`${rel}: schema_version must be 'subagent-v1' (got ${JSON.stringify(fm.schema_version)})`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const discovery = fm.discovery;
|
|
66
|
+
const visible =
|
|
67
|
+
discovery !== null && typeof discovery === 'object' && !Array.isArray(discovery)
|
|
68
|
+
? (discovery as Record<string, unknown>).visible
|
|
69
|
+
: undefined;
|
|
70
|
+
if (visible !== false) {
|
|
71
|
+
findings.push(`${rel}: discovery.visible must be exactly false (default-off; got ${JSON.stringify(visible)})`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const tools = fm.tools;
|
|
75
|
+
if (Array.isArray(tools)) {
|
|
76
|
+
const seen = new Set<unknown>();
|
|
77
|
+
const dupes = new Set<unknown>();
|
|
78
|
+
for (const t of tools) {
|
|
79
|
+
if (seen.has(t)) {
|
|
80
|
+
dupes.add(t);
|
|
81
|
+
}
|
|
82
|
+
seen.add(t);
|
|
83
|
+
}
|
|
84
|
+
if (dupes.size > 0) {
|
|
85
|
+
findings.push(`${rel}: tools has duplicate entr(y/ies): ${[...dupes].map((d) => JSON.stringify(d)).join(', ')}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const name = fm.name;
|
|
90
|
+
if (typeof name !== 'string' || name !== stem) {
|
|
91
|
+
findings.push(`${rel}: name must match the filename stem '${stem}' (got ${JSON.stringify(name)})`);
|
|
92
|
+
} else {
|
|
93
|
+
const prior = namesSeen.get(name);
|
|
94
|
+
if (prior !== undefined) {
|
|
95
|
+
findings.push(`${rel}: duplicate subagent name '${name}' (also in ${prior}) — projection-path collision`);
|
|
96
|
+
} else {
|
|
97
|
+
namesSeen.set(name, rel);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (findings.length > 0) {
|
|
103
|
+
process.stdout.write('❌ subagent determinism:\n');
|
|
104
|
+
for (const f of findings.sort()) {
|
|
105
|
+
process.stdout.write(` - ${f}\n`);
|
|
106
|
+
}
|
|
107
|
+
return 1;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (!QUIET) {
|
|
111
|
+
process.stdout.write(
|
|
112
|
+
`✅ subagent determinism: ${namesSeen.size} subagent(s) clean.\n`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const _isCliEntry =
|
|
119
|
+
process.argv[1] !== undefined &&
|
|
120
|
+
import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
|
|
121
|
+
if (_isCliEntry) {
|
|
122
|
+
process.exit(main());
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export { main };
|
|
@@ -16,8 +16,10 @@
|
|
|
16
16
|
* 2. `always`-type rules under `.augment/rules/` — full body injected.
|
|
17
17
|
* 3. `auto`-type rules — only a registry stub is injected per rule.
|
|
18
18
|
*
|
|
19
|
-
* The
|
|
20
|
-
*
|
|
19
|
+
* The cap comes from `src/config/budgets.yml`
|
|
20
|
+
* (augment_workspace_guidelines) — the single source of truth for the
|
|
21
|
+
* budget gates. The internal cap is deliberately below the verified
|
|
22
|
+
* platform maximum recorded there.
|
|
21
23
|
*
|
|
22
24
|
* Exit codes: 0 = under fail threshold, 1 = at/above fail threshold,
|
|
23
25
|
* 3 = internal error.
|
|
@@ -39,10 +41,48 @@ export const TREND_FILE = path.join(
|
|
|
39
41
|
'.augment-budget-history.jsonl',
|
|
40
42
|
);
|
|
41
43
|
|
|
42
|
-
//
|
|
43
|
-
export const
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
// Budget caps — loaded from src/config/budgets.yml (single source of truth).
|
|
45
|
+
export const BUDGETS_FILE = path.join(REPO_ROOT, 'src', 'config', 'budgets.yml');
|
|
46
|
+
|
|
47
|
+
interface BudgetConfig {
|
|
48
|
+
platform_max_chars: number;
|
|
49
|
+
total_cap_chars: number;
|
|
50
|
+
warn_threshold: number;
|
|
51
|
+
fail_threshold: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function _load_budget_config(): BudgetConfig {
|
|
55
|
+
// Tiny purpose-built reader (keys are flat scalars) — avoids a hard yaml
|
|
56
|
+
// dependency in a script that must run before `npm ci` in some flows.
|
|
57
|
+
const text = fs.readFileSync(BUDGETS_FILE, 'utf-8');
|
|
58
|
+
const section = text.split(/^augment_workspace_guidelines:\s*$/m)[1] ?? '';
|
|
59
|
+
const num = (key: string): number => {
|
|
60
|
+
const m = new RegExp(`^\\s+${key}:\\s*([0-9.]+)\\s*$`, 'm').exec(section);
|
|
61
|
+
if (!m) {
|
|
62
|
+
throw new Error(`budgets.yml: missing augment_workspace_guidelines.${key}`);
|
|
63
|
+
}
|
|
64
|
+
return Number(m[1]);
|
|
65
|
+
};
|
|
66
|
+
const cfg: BudgetConfig = {
|
|
67
|
+
platform_max_chars: num('platform_max_chars'),
|
|
68
|
+
total_cap_chars: num('total_cap_chars'),
|
|
69
|
+
warn_threshold: num('warn_threshold'),
|
|
70
|
+
fail_threshold: num('fail_threshold'),
|
|
71
|
+
};
|
|
72
|
+
if (cfg.total_cap_chars > cfg.platform_max_chars) {
|
|
73
|
+
throw new Error(
|
|
74
|
+
`budgets.yml: total_cap_chars (${cfg.total_cap_chars}) must never exceed ` +
|
|
75
|
+
`platform_max_chars (${cfg.platform_max_chars})`,
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
return cfg;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const _BUDGET = _load_budget_config();
|
|
82
|
+
export const PLATFORM_MAX = _BUDGET.platform_max_chars;
|
|
83
|
+
export const TOTAL_CAP = _BUDGET.total_cap_chars;
|
|
84
|
+
export const WARN_THRESHOLD = _BUDGET.warn_threshold;
|
|
85
|
+
export const FAIL_THRESHOLD = _BUDGET.fail_threshold;
|
|
46
86
|
|
|
47
87
|
// Stub template Augment injects for `type: auto` rules.
|
|
48
88
|
function STUB(desc: string, p: string): string {
|
|
@@ -21,8 +21,9 @@
|
|
|
21
21
|
* 7. Runtime boundary disclaimer
|
|
22
22
|
* 8. Anti-sycophancy rules in "Do NOT"
|
|
23
23
|
*
|
|
24
|
-
* NOTE:
|
|
25
|
-
*
|
|
24
|
+
* NOTE: scans `src/skills` — the canonical source-of-truth skill library.
|
|
25
|
+
* (The pre-py2ts .py read the now-removed legacy condensed-source skills
|
|
26
|
+
* corpus; repointed here so the scanner runs on the live tree.)
|
|
26
27
|
*/
|
|
27
28
|
|
|
28
29
|
import * as fs from 'node:fs';
|
|
@@ -32,7 +33,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
32
33
|
const _HERE = fileURLToPath(import.meta.url);
|
|
33
34
|
// src/scripts/measure_patterns.ts → parents[2] is the repo root.
|
|
34
35
|
const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
35
|
-
const SKILLS_DIR = path.join(ROOT, '
|
|
36
|
+
const SKILLS_DIR = path.join(ROOT, 'src', 'skills');
|
|
36
37
|
|
|
37
38
|
type Tier = number | string;
|
|
38
39
|
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
* measure_skill_reduction
|
|
21
21
|
* measure_skill_reduction --json
|
|
22
22
|
*
|
|
23
|
-
* NOTE:
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* (iterdir on a missing dir) →
|
|
27
|
-
*
|
|
23
|
+
* NOTE: scans `src/skills` — the canonical source-of-truth skill library.
|
|
24
|
+
* (The pre-py2ts .py read the now-removed legacy condensed-source skills
|
|
25
|
+
* corpus; repointed here so the scanner runs on the live tree.) When
|
|
26
|
+
* the directory is absent the scanner throws (iterdir on a missing dir) →
|
|
27
|
+
* non-zero exit, empty stdout.
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
30
|
import * as fs from 'node:fs';
|
|
@@ -35,7 +35,7 @@ import { parse as parseYaml } from 'yaml';
|
|
|
35
35
|
const _HERE = fileURLToPath(import.meta.url);
|
|
36
36
|
// src/scripts/measure_skill_reduction.ts → parents[2] is the repo root.
|
|
37
37
|
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
38
|
-
const SKILLS_DIR = path.join(REPO_ROOT, '
|
|
38
|
+
const SKILLS_DIR = path.join(REPO_ROOT, 'src', 'skills');
|
|
39
39
|
const TARGET_REDUCTION = 0.4;
|
|
40
40
|
const PHASE_3_USER_TYPES = ['consultant', 'creator'] as const;
|
|
41
41
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* migration_status.ts — Python→TypeScript migration dashboard.
|
|
4
4
|
*
|
|
5
|
-
* Phase 1 Step 13 of `agents/roadmaps/road-to-typescript-only-scripts.md`.
|
|
5
|
+
* Phase 1 Step 13 of `agents/roadmaps/archive/road-to-typescript-only-scripts.md`.
|
|
6
6
|
*
|
|
7
7
|
* Counts the remaining tracked `.py` files (via `git ls-files '*.py'`),
|
|
8
8
|
* buckets them into the roadmap's migration categories, compares each
|
|
@@ -100,6 +100,10 @@ const EXCLUDED_PREFIXES: readonly string[] = [
|
|
|
100
100
|
'.claude/',
|
|
101
101
|
'.augment/',
|
|
102
102
|
'internal/bench/',
|
|
103
|
+
// Eval fixtures simulate CONSUMER project files (a python DB model the
|
|
104
|
+
// structure-grounding eval reads as foreign source) — carve-out, not
|
|
105
|
+
// package source. Same class as the internal/bench/ trap fixtures.
|
|
106
|
+
'internal/evals/',
|
|
103
107
|
'tmp/',
|
|
104
108
|
'.tmp/',
|
|
105
109
|
];
|
|
@@ -225,7 +229,7 @@ function renderDashboard(
|
|
|
225
229
|
lines.push('');
|
|
226
230
|
lines.push(
|
|
227
231
|
'Tracks remaining tracked `.py` files per roadmap phase of ' +
|
|
228
|
-
'`agents/roadmaps/road-to-typescript-only-scripts.md`. ' +
|
|
232
|
+
'`agents/roadmaps/archive/road-to-typescript-only-scripts.md`. ' +
|
|
229
233
|
'Baseline = Phase 1 snapshot (hardcoded in the script).',
|
|
230
234
|
);
|
|
231
235
|
lines.push('');
|