@event4u/agent-config 3.3.0 → 4.2.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/.agent-src/README.md +2 -2
- package/.agent-src/commands/agent-handoff.md +31 -2
- package/.agent-src/commands/agent-status.md +5 -5
- package/.agent-src/commands/agents/audit.md +8 -8
- package/.agent-src/commands/agents/init.md +25 -1
- package/.agent-src/commands/agents/optimize.md +3 -3
- package/.agent-src/commands/agents/user.md +1 -1
- package/.agent-src/commands/agents.md +1 -1
- package/.agent-src/commands/analyze-reference-repo.md +1 -1
- package/.agent-src/commands/check-current-md.md +8 -8
- package/.agent-src/commands/{compress.md → condense.md} +55 -55
- package/.agent-src/commands/context/create.md +7 -4
- package/.agent-src/commands/context/refactor.md +3 -1
- package/.agent-src/commands/feature/dev.md +1 -1
- package/.agent-src/commands/feature/explore.md +1 -1
- package/.agent-src/commands/feature/plan.md +10 -8
- package/.agent-src/commands/feature/refactor.md +3 -1
- package/.agent-src/commands/feature/roadmap.md +7 -4
- package/.agent-src/commands/fix/portability.md +3 -3
- package/.agent-src/commands/fix/refs.md +4 -4
- package/.agent-src/commands/ghostwriter.md +2 -2
- package/.agent-src/commands/memory/learn-low-impact.md +3 -3
- package/.agent-src/commands/module/explore.md +34 -8
- package/.agent-src/commands/optimize/agents-dir.md +9 -7
- package/.agent-src/commands/optimize/augmentignore.md +2 -2
- package/.agent-src/commands/optimize/skills.md +9 -9
- package/.agent-src/commands/post-as.md +1 -1
- package/.agent-src/commands/project-analyze.md +2 -2
- package/.agent-src/commands/project-health.md +3 -2
- package/.agent-src/commands/research/deep.md +1 -1
- package/.agent-src/commands/research/report.md +1 -1
- package/.agent-src/commands/research.md +1 -1
- package/.agent-src/commands/roadmap/ai-council.md +1 -1
- package/.agent-src/commands/roadmap/create.md +9 -4
- package/.agent-src/commands/rule-compliance-audit.md +1 -1
- package/.agent-src/commands/upstream-contribute.md +14 -14
- package/.agent-src/commands/video/from-script.md +1 -1
- package/.agent-src/commands/video/scene.md +1 -1
- package/.agent-src/commands/video/stitch.md +1 -1
- package/.agent-src/commands/video/storyboard.md +1 -1
- package/.agent-src/commands/video.md +1 -1
- package/.agent-src/contexts/augment-infrastructure.md +1 -1
- package/.agent-src/contexts/authority/commit-mechanics.md +15 -0
- package/.agent-src/contexts/authority/kernel-rule-edits.md +3 -3
- package/.agent-src/contexts/authority/scope-mechanics.md +1 -1
- package/.agent-src/contexts/communication/rules-auto/augment-source-of-truth-mechanics.md +28 -28
- package/.agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +4 -4
- package/.agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
- package/.agent-src/contexts/contracts/artifact-engagement-flow.md +6 -6
- package/.agent-src/contexts/contracts/command-suggestion-flow.md +3 -3
- package/.agent-src/contexts/contracts/emergency-triage-block.md +4 -4
- package/.agent-src/contexts/contracts/frugality-charter.md +3 -3
- package/.agent-src/contexts/documentation-hierarchy.md +14 -7
- package/.agent-src/contexts/execution/autonomy-examples.md +1 -1
- package/.agent-src/contexts/execution/cheap-question-mechanics.md +39 -2
- package/.agent-src/contexts/execution/roadmap-process-loop.md +28 -5
- package/.agent-src/contexts/override-system.md +5 -5
- package/.agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
- package/.agent-src/personas/advisors/first-principles.md +1 -1
- package/.agent-src/personas/hollywood-director.md +1 -1
- package/.agent-src/rules/architecture.md +5 -1
- package/.agent-src/rules/augment-edit-discipline.md +5 -5
- package/.agent-src/rules/augment-source-of-truth.md +15 -15
- package/.agent-src/rules/commit-conventions.md +1 -1
- package/.agent-src/rules/commit-policy.md +10 -0
- package/.agent-src/rules/domain-adoption-policy.md +3 -3
- package/.agent-src/rules/fast-path-marker-visibility.md +3 -3
- package/.agent-src/rules/finance-safety-floor.md +1 -1
- package/.agent-src/rules/framework-neutrality-in-generic-skills.md +8 -8
- package/.agent-src/rules/git-history-discipline.md +1 -1
- package/.agent-src/rules/improve-before-implement.md +2 -2
- package/.agent-src/rules/language-and-tone.md +2 -2
- package/.agent-src/rules/media-governance-routing.md +5 -5
- package/.agent-src/rules/no-attribution-footers.md +1 -0
- package/.agent-src/rules/no-cheap-questions.md +3 -0
- package/.agent-src/rules/no-decorative-emojis-in-git-surfaces.md +111 -0
- package/.agent-src/rules/no-pr-progress-comments.md +118 -0
- package/.agent-src/rules/no-roadmap-references.md +3 -3
- package/.agent-src/rules/non-destructive-by-default.md +1 -1
- package/.agent-src/rules/persona-governance.md +3 -3
- package/.agent-src/rules/preservation-guard.md +15 -15
- package/.agent-src/rules/roadmap-ci-steps-policy.md +7 -3
- package/.agent-src/rules/rule-type-governance.md +1 -1
- package/.agent-src/rules/skill-quality.md +1 -1
- package/.agent-src/rules/{caveman-speak.md → telegraph-speak.md} +15 -15
- package/.agent-src/rules/token-optimizer-maintenance.md +6 -6
- package/.agent-src/skills/agent-docs-writing/SKILL.md +17 -11
- package/.agent-src/skills/agents-md-thin-root/SKILL.md +9 -9
- package/.agent-src/skills/check-refs/SKILL.md +2 -2
- package/.agent-src/skills/code-refactoring/SKILL.md +2 -2
- package/.agent-src/skills/command-writing/SKILL.md +19 -19
- package/.agent-src/skills/comp-banding/SKILL.md +1 -1
- package/.agent-src/skills/condense-memory/SKILL.md +131 -0
- package/.agent-src/skills/context-authoring/SKILL.md +2 -2
- package/.agent-src/skills/context-document/SKILL.md +5 -3
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +3 -3
- package/.agent-src/skills/description-assist/SKILL.md +2 -2
- package/.agent-src/skills/git-workflow/SKILL.md +1 -1
- package/.agent-src/skills/guideline-writing/SKILL.md +5 -5
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +4 -4
- package/.agent-src/skills/lint-skills/SKILL.md +3 -3
- package/.agent-src/skills/md-language-check/SKILL.md +2 -2
- package/.agent-src/skills/module-detect-on-the-fly/SKILL.md +138 -0
- package/.agent-src/skills/module-management/SKILL.md +166 -94
- package/.agent-src/skills/override-management/SKILL.md +1 -1
- package/.agent-src/skills/persona-writing/SKILL.md +5 -5
- package/.agent-src/skills/positioning-strategy/SKILL.md +1 -1
- package/.agent-src/skills/project-docs/SKILL.md +6 -4
- package/.agent-src/skills/readme-reviewer/SKILL.md +2 -2
- package/.agent-src/skills/roadmap-management/SKILL.md +13 -1
- package/.agent-src/skills/roadmap-writing/SKILL.md +4 -2
- package/.agent-src/skills/rule-refactor/SKILL.md +5 -5
- package/.agent-src/skills/rule-writing/SKILL.md +18 -18
- package/.agent-src/skills/script-writing/SKILL.md +1 -1
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +6 -6
- package/.agent-src/skills/skill-management/SKILL.md +21 -21
- package/.agent-src/skills/skill-reviewer/SKILL.md +2 -2
- package/.agent-src/skills/skill-writing/SKILL.md +8 -8
- package/.agent-src/skills/skill-writing/evals/triggers.json +1 -1
- package/.agent-src/skills/token-optimizer/SKILL.md +4 -4
- package/.agent-src/skills/unit-economics-modeling/SKILL.md +1 -1
- package/.agent-src/skills/upstream-contribute/SKILL.md +17 -17
- package/.agent-src/templates/AGENTS.md +1 -0
- package/.agent-src/templates/agent-settings.md +24 -13
- package/.agent-src/templates/agents/agent-project-settings.example.yml +61 -2
- package/.agent-src/templates/command.md +5 -5
- package/.agent-src/templates/contexts.md +1 -1
- package/.agent-src/templates/copilot-instructions.md +8 -8
- package/.agent-src/templates/features.md +1 -1
- package/.agent-src/templates/hooks/pre-commit-frontmatter +2 -2
- package/.agent-src/templates/hooks/pre-commit-roadmap-progress +3 -3
- package/.agent-src/templates/persona.md +2 -2
- package/.agent-src/templates/roadmaps.md +1 -1
- package/.agent-src/templates/rule.md +13 -13
- package/.agent-src/templates/scripts/memory_lookup.py +1 -1
- package/.agent-src/templates/scripts/memory_status.py +2 -2
- package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +195 -1
- package/.agent-src/templates/scripts/work_engine/orchestration.py +1 -1
- package/.agent-src/templates/skill-archive-note.md +5 -5
- package/.agent-src/templates/skill.md +1 -1
- package/.claude-plugin/marketplace.json +4 -4
- package/AGENTS.md +16 -17
- package/CHANGELOG.md +216 -3
- package/CONTRIBUTING.md +31 -12
- package/README.md +21 -12
- package/config/agent-settings.template.yml +22 -2
- package/config/discovery/unassigned-artefacts.yml +24 -24
- package/config/profiles/full.ini +1 -1
- package/dist/cli/agent-config.js +52 -3
- package/dist/cli/agent-config.js.map +1 -1
- package/dist/cli/commands/uiServe.js +9 -0
- package/dist/cli/commands/uiServe.js.map +1 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +649 -606
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +439 -437
- package/dist/discovery/trust-report.md +5 -5
- package/dist/discovery/workspaces.json +450 -448
- package/dist/install/atomic.js +92 -0
- package/dist/install/atomic.js.map +1 -0
- package/dist/install/conflict.js +196 -0
- package/dist/install/conflict.js.map +1 -0
- package/dist/install/detect.js +218 -0
- package/dist/install/detect.js.map +1 -0
- package/dist/install/paths.js +82 -0
- package/dist/install/paths.js.map +1 -0
- package/dist/install/plan.js +157 -0
- package/dist/install/plan.js.map +1 -0
- package/dist/install/txlog.js +140 -0
- package/dist/install/txlog.js.map +1 -0
- package/dist/install/types.js +19 -0
- package/dist/install/types.js.map +1 -0
- package/dist/install/wizard-plan.js +184 -0
- package/dist/install/wizard-plan.js.map +1 -0
- package/dist/mcp/registry-manifest.json +4 -4
- package/dist/router.json +67 -19
- package/dist/server/app.js +6 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/routes/install.js +358 -0
- package/dist/server/routes/install.js.map +1 -0
- package/dist/server/routes/wizard.js +468 -32
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/server/routes/workspace.js +396 -0
- package/dist/server/routes/workspace.js.map +1 -0
- package/dist/server/schemas/settings.js +5 -3
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/ui/assets/index-BDAhhpDV.js +40 -0
- package/dist/ui/assets/index-BDAhhpDV.js.map +1 -0
- package/dist/ui/assets/index-BXZILUxe.css +1 -0
- package/dist/ui/index.html +2 -2
- package/docs/MIGRATION.md +1 -1
- package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
- package/docs/adrs/router/0001-three-tier-routing.md +4 -4
- package/docs/adrs/schema/0001-json-schema-frontmatter.md +1 -1
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +4 -4
- package/docs/adrs/{caveman → telegraph}/0001-default-off-until-bench.md +9 -9
- package/docs/adrs/telegraph/README.md +9 -0
- package/docs/architecture/augment-projection.md +4 -4
- package/docs/architecture/claude-bundle.md +1 -1
- package/docs/architecture/current-onboard-baseline.md +3 -3
- package/docs/architecture/multi-tool-projection.md +10 -10
- package/docs/architecture/source-projection.md +27 -27
- package/docs/architecture.md +19 -15
- package/docs/archive/CHANGELOG-pre-2.11.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-2.15.0.md +3 -3
- package/docs/archive/CHANGELOG-pre-2.16.0.md +1 -1
- package/docs/archive/CHANGELOG-pre-2.2.0.md +70 -70
- package/docs/archive/CHANGELOG-pre-2.20.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-2.25.0.md +15 -15
- package/docs/archive/CHANGELOG-pre-3.0.0.md +4 -4
- package/docs/archive/CHANGELOG-pre-3.1.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-3.2.0.md +3 -3
- package/docs/benchmark.md +65 -0
- package/docs/benchmarks.md +16 -16
- package/docs/catalog.md +17 -15
- package/docs/contracts/CHANGELOG-conventions.md +1 -1
- package/docs/contracts/STABILITY.md +2 -2
- package/docs/contracts/adoption-signal-floor.md +110 -0
- package/docs/contracts/adr-chat-history-split.md +4 -4
- package/docs/contracts/adr-command-suggestion.md +4 -4
- package/docs/contracts/adr-gtm-context-spine.md +1 -1
- package/docs/contracts/adr-implement-ticket-runtime.md +4 -4
- package/docs/contracts/adr-install-user-type-axis.md +1 -1
- package/docs/contracts/adr-layout.md +2 -2
- package/docs/contracts/adr-product-ui-track.md +10 -10
- package/docs/contracts/adr-user-types-axis.md +3 -3
- package/docs/contracts/adr-wing4-context-spine.md +1 -1
- package/docs/contracts/agent-memory-contract.md +3 -3
- package/docs/contracts/agents-md-tech-stack.md +2 -2
- package/docs/contracts/ai-council-config.md +2 -2
- package/docs/contracts/at-rest-encryption.md +4 -0
- package/docs/contracts/audit-log-v1.md +1 -1
- package/docs/contracts/benchmark-ab-contract.md +101 -0
- package/docs/contracts/benchmark-corpus-spec.md +1 -1
- package/docs/contracts/branch-protection-policy.md +98 -0
- package/docs/contracts/ci-cost-budget.md +106 -0
- package/docs/contracts/ci-green-floor.md +141 -0
- package/docs/contracts/command-clusters.md +6 -6
- package/docs/contracts/command-surface-tiers.md +2 -2
- package/docs/contracts/command-taxonomy.md +2 -2
- package/docs/contracts/{compression-default-kill-criterion.md → condensation-default-kill-criterion.md} +29 -29
- package/docs/contracts/config-presets.md +1 -1
- package/docs/contracts/context-paths.md +3 -3
- package/docs/contracts/context-spine.md +1 -1
- package/docs/contracts/cost-summary-schema.md +12 -12
- package/docs/contracts/cross-wing-handoff.md +4 -4
- package/docs/contracts/daily-workspace.md +4 -0
- package/docs/contracts/decision-trace-v1.md +2 -2
- package/docs/contracts/discovery-manifest.md +4 -4
- package/docs/contracts/explain-modes.md +4 -0
- package/docs/contracts/file-ownership-matrix.json +3493 -3318
- package/docs/contracts/file-ownership-matrix.md +3 -3
- package/docs/contracts/frontmatter-contract.md +4 -4
- package/docs/contracts/ghostwriter-schema.md +3 -3
- package/docs/contracts/gui-wizard.md +110 -97
- package/docs/contracts/harness-expectations.md +123 -0
- package/docs/contracts/host-agent-protocol.md +4 -0
- package/docs/contracts/implement-ticket-flow.md +9 -9
- package/docs/contracts/install-scopes.md +77 -0
- package/docs/contracts/iron-law-overrides.txt +1 -1
- package/docs/contracts/kernel-membership.md +26 -26
- package/docs/contracts/linear-ai-rules-inclusion.md +1 -1
- package/docs/contracts/linter-structural-model.md +2 -2
- package/docs/contracts/load-context-budget-model.md +4 -4
- package/docs/contracts/load-context-schema.md +13 -13
- package/docs/contracts/local-analytics.md +4 -0
- package/docs/contracts/local-knowledge-ingestion.md +1 -1
- package/docs/contracts/mcp-cloud-scope.md +2 -2
- package/docs/contracts/mcp-phase-1-scope.md +3 -3
- package/docs/contracts/measurement-baseline.md +5 -5
- package/docs/contracts/mental-models.md +30 -30
- package/docs/contracts/multi-tool-projection-fidelity.md +4 -4
- package/docs/contracts/namespace.md +4 -4
- package/docs/contracts/orchestration-dsl-v1.md +7 -7
- package/docs/contracts/package-self-orientation.md +12 -12
- package/docs/contracts/persona-schema.md +6 -6
- package/docs/contracts/pilot/language-and-tone.md +1 -1
- package/docs/contracts/plain-language-surface.md +117 -0
- package/docs/contracts/profile-system.md +3 -3
- package/docs/contracts/release-pr-gating.md +103 -0
- package/docs/contracts/role-experience.md +3 -3
- package/docs/contracts/rule-classification.md +13 -13
- package/docs/contracts/rule-interactions.md +4 -4
- package/docs/contracts/rule-interactions.yml +30 -30
- package/docs/contracts/rule-priority-hierarchy.md +13 -13
- package/docs/contracts/rule-router.md +2 -2
- package/docs/contracts/safety-model.md +1 -1
- package/docs/contracts/skill-distribution-channels.md +61 -0
- package/docs/contracts/skill-domains.md +2 -2
- package/docs/contracts/smoke-contracts.md +5 -5
- package/docs/contracts/telegraph-telemetry.md +83 -0
- package/docs/contracts/trust-and-safety.md +5 -5
- package/docs/contracts/ui-stack-extension.md +7 -7
- package/docs/contracts/ui-track-flow.md +9 -9
- package/docs/contracts/user-type-schema.md +4 -4
- package/docs/contracts/workflow-packs.md +4 -4
- package/docs/contracts/workspace-documents.md +4 -0
- package/docs/customization.md +28 -8
- package/docs/decisions/ADR-001-kernel-swap-deferred.md +6 -6
- package/docs/decisions/ADR-002-kernel-bucket-overrides.md +11 -11
- package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +2 -2
- package/docs/decisions/ADR-004-rule-governance-pruning.md +4 -4
- package/docs/decisions/ADR-005-subagent-worktrees.md +7 -7
- package/docs/decisions/ADR-011-domain-pack-readiness.md +6 -6
- package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +3 -3
- package/docs/decisions/ADR-015-discovery-manifest-contract.md +3 -3
- package/docs/decisions/ADR-017-monorepo-physical-layout.md +10 -10
- package/docs/decisions/ADR-018-trust-and-safety-layer.md +6 -6
- package/docs/decisions/ADR-019-router-json-dist-location.md +2 -2
- package/docs/decisions/ADR-020-global-only-consumer-scope.md +2 -2
- package/docs/decisions/ADR-021-deployment-shape.md +3 -3
- package/docs/decisions/ADR-022-daily-workspace-decomposition.md +1 -1
- package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +2 -2
- package/docs/decisions/ADR-028-root-layout.md +7 -7
- package/docs/decisions/ADR-029-multi-workspace-deferred.md +2 -2
- package/docs/decisions/ADR-rule-kernel-and-router.md +5 -5
- package/docs/deploy/connector-setup.md +2 -2
- package/docs/deploy/policy-cookbook.md +2 -2
- package/docs/deploy/team-deployment-posture.md +20 -0
- package/docs/development.md +17 -17
- package/docs/distribution/registries.md +32 -0
- package/docs/distribution/registry-submissions.md +85 -0
- package/docs/distribution/telemetry-schema.md +1 -1
- package/docs/getting-started-by-role.md +45 -3
- package/docs/getting-started.md +2 -2
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +1 -1
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/layered-settings.md +56 -2
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +2 -2
- package/docs/guidelines/agent-infra/rule-type-governance.md +1 -1
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +5 -5
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +1 -1
- package/docs/guidelines/augment-portability-patterns.md +4 -4
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/php/php-coding-patterns.md +1 -1
- package/docs/guidelines/prompt-templates.md +6 -6
- package/docs/maintainers/dev-mode.md +1 -1
- package/docs/mcp.md +1 -1
- package/docs/parity/bench.json +3 -3
- package/docs/parity/ruflo.md +2 -2
- package/docs/profiles.md +11 -11
- package/docs/quality.md +11 -11
- package/docs/safety.md +3 -3
- package/docs/setup/mcp-client-config.md +1 -1
- package/docs/setup/mcp-r2-bootstrap.md +1 -1
- package/docs/setup/mcp-server-docker.md +3 -3
- package/docs/setup/per-ide/windsurf.md +1 -1
- package/docs/skills-catalog.md +8 -7
- package/docs/troubleshooting.md +1 -1
- package/docs/walkthroughs/daily-workspace-a11y.md +87 -0
- package/llms.txt +7 -6
- package/package.json +1 -1
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_archive/README.md +2 -2
- package/scripts/_archive/_backfill_skill_domains.py +3 -3
- package/scripts/_archive/_bootstrap_tier_frontmatter.py +3 -3
- package/scripts/_archive/_p43_bodies.py +10 -10
- package/scripts/_archive/{_p43_compress.py → _p43_condense.py} +5 -5
- package/scripts/_archive/_p4_migrate.py +7 -7
- package/scripts/_archive/_phase2_shim_helper.py +1 -1
- package/scripts/_archive/_pilot_council_question.py +5 -5
- package/scripts/_cli/explain_last/inputs.py +1 -1
- package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
- package/scripts/_lib/agent_settings.py +195 -1
- package/scripts/_lib/agent_src.py +19 -19
- package/scripts/_lib/bench_ab_cache.py +162 -0
- package/scripts/_lib/bench_ab_scoring.py +209 -0
- package/scripts/_lib/{bench_caveman.py → bench_telegraph.py} +21 -21
- package/scripts/_lib/{bench_caveman_report.py → bench_telegraph_report.py} +21 -21
- package/scripts/_lib/claude_desktop_bundler.py +5 -5
- package/scripts/_lib/module_detection.py +223 -0
- package/scripts/_lib/scope_guard.sh +162 -0
- package/scripts/_phase4_bucket.py +3 -3
- package/scripts/_pilot_measure.py +4 -4
- package/scripts/_tmp_scan_framework_leakage.py +1 -1
- package/scripts/adoption_report.py +195 -0
- package/scripts/adoption_snapshot.py +219 -0
- package/scripts/adoption_status.py +166 -0
- package/scripts/ai-video/lib/parse-blueprint.sh +1 -1
- package/scripts/ai_council/advisors.py +5 -5
- package/scripts/ai_council/compile_corpus.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +3 -3
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_context_layer_v1_review.py +2 -2
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_inject_quiet_flag.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_v2.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_verbosity.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_nondestructive_inline_audit.py +3 -3
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_per_task.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase6_trigger_jaccard.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase_2a_budget_rebalance.py +6 -6
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_rebalancing_audit.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +6 -6
- package/scripts/annotate_discovery.py +13 -13
- package/scripts/apply_modules_config.py +290 -0
- package/scripts/audit_adr_coverage.py +2 -2
- package/scripts/audit_auto_rules.py +2 -2
- package/scripts/audit_cloud_compatibility.py +3 -3
- package/scripts/audit_command_surface.py +9 -9
- package/scripts/audit_likelihood.py +2 -2
- package/scripts/audit_user_type_axis.py +2 -2
- package/scripts/bench_ab_cache_dispatch.py +68 -0
- package/scripts/bench_ab_clone.py +170 -0
- package/scripts/bench_ab_diff.py +227 -0
- package/scripts/bench_ab_integrity.py +143 -0
- package/scripts/bench_ab_run.py +235 -0
- package/scripts/bench_ab_task_runner.py +369 -0
- package/scripts/bench_ab_tracka_run.py +202 -0
- package/scripts/{bench_compress_memory.py → bench_condense_memory.py} +16 -16
- package/scripts/bench_run.py +33 -33
- package/scripts/bench_runner.py +2 -2
- package/scripts/bootstrap.sh +99 -0
- package/scripts/build_cloud_bundle.py +6 -6
- package/scripts/build_discovery_manifest.py +7 -7
- package/scripts/build_linear_digest.py +3 -3
- package/scripts/build_rule_trigger_matrix.py +8 -8
- package/scripts/chat_history.py +5 -5
- package/scripts/check_always_budget.py +11 -5
- package/scripts/check_augment_description_cap.py +3 -3
- package/scripts/check_cluster_patterns.py +2 -2
- package/scripts/check_command_count_messaging.py +3 -3
- package/scripts/{check_compression.py → check_condensation.py} +34 -34
- package/scripts/{check_compressed_paths.py → check_condensed_paths.py} +8 -8
- package/scripts/check_context_paths.py +7 -7
- package/scripts/check_council_layout.py +2 -2
- package/scripts/check_council_references.py +9 -9
- package/scripts/check_iron_law_prominence.py +2 -2
- package/scripts/check_kernel_rule_bundle.py +2 -2
- package/scripts/check_module_management_neutral.py +149 -0
- package/scripts/check_no_roadmap_refs.py +9 -9
- package/scripts/check_portability.py +3 -3
- package/scripts/check_public_catalog_links.py +4 -4
- package/scripts/check_references.py +7 -6
- package/scripts/check_release_pr_shape.py +112 -0
- package/scripts/check_reply_consistency.py +3 -3
- package/scripts/check_safety_floor_untouched.py +1 -1
- package/scripts/check_template_pin_drift.py +5 -5
- package/scripts/check_token_optimizer_freshness.py +3 -3
- package/scripts/ci_status.py +301 -0
- package/scripts/ci_time_ratio.py +1 -1
- package/scripts/cleanup_other_scope.sh +146 -0
- package/scripts/compile_router.py +10 -10
- package/scripts/{compress.py → condense.py} +64 -64
- package/scripts/condense.sh +18 -0
- package/scripts/{compress_memory.py → condense_memory.py} +33 -33
- package/scripts/config/presets.py +2 -2
- package/scripts/config/profiles.py +1 -1
- package/scripts/cost_by_conversation.py +3 -3
- package/scripts/cost_summary.py +7 -7
- package/scripts/count_token_optimizer_usage.sh +1 -1
- package/scripts/gen_discovery_baseline.py +5 -5
- package/scripts/generate_index.py +6 -6
- package/scripts/generate_ownership_matrix.py +10 -10
- package/scripts/generate_pack_manifests.py +1 -1
- package/scripts/ghostwriter_fixture_allowlist.txt +1 -1
- package/scripts/install +3 -3
- package/scripts/install-hooks.sh +6 -6
- package/scripts/install.py +273 -45
- package/scripts/install.sh +187 -1
- package/scripts/inventory_frontmatter.py +2 -2
- package/scripts/iron_law_sha.py +3 -3
- package/scripts/lint_agents_layout.py +14 -7
- package/scripts/lint_agents_md.py +4 -4
- package/scripts/lint_archived_skills.py +3 -3
- package/scripts/lint_artefact_frontmatter.py +2 -2
- package/scripts/lint_bench_ab.py +172 -0
- package/scripts/lint_bench_corpus.py +1 -1
- package/scripts/lint_command_tiers.py +5 -5
- package/scripts/lint_context_spine_usage.py +1 -1
- package/scripts/lint_framework_leakage.py +7 -7
- package/scripts/lint_framework_leakage_allowlist.json +152 -84
- package/scripts/lint_ghostwriter_source.py +3 -3
- package/scripts/lint_handoffs.py +1 -1
- package/scripts/lint_load_context.py +11 -11
- package/scripts/lint_media_policy_linkage.py +5 -5
- package/scripts/lint_namespace.py +1 -1
- package/scripts/lint_no_new_atomic_commands.py +2 -2
- package/scripts/lint_orchestration_dsl.py +1 -1
- package/scripts/lint_pack_boundaries.py +2 -2
- package/scripts/lint_persona_governance.py +4 -4
- package/scripts/lint_role_experiences.py +237 -0
- package/scripts/lint_rule_interactions.py +2 -2
- package/scripts/lint_rule_tiers.py +1 -1
- package/scripts/lint_trust_coherence.py +2 -2
- package/scripts/mcp_registry_submit.sh +187 -0
- package/scripts/mcp_server/tools.py +1 -1
- package/scripts/measure_frugality_savings.py +10 -10
- package/scripts/measure_patterns.py +1 -1
- package/scripts/measure_projection_bytes.py +5 -5
- package/scripts/measure_rule_budget.py +3 -3
- package/scripts/measure_skill_reduction.py +1 -1
- package/scripts/memory_lookup.py +1 -1
- package/scripts/memory_status.py +2 -2
- package/scripts/migrate_command_suggestions.py +3 -3
- package/scripts/mine_session.py +1 -1
- package/scripts/move_artefact.py +3 -3
- package/scripts/new_skill.py +2 -2
- package/scripts/pack_mcp_content.py +9 -9
- package/scripts/plan_physical_move.py +6 -6
- package/scripts/print_required_checks.py +196 -0
- package/scripts/probe_skill_registration.py +413 -0
- package/scripts/propose_modules_config.py +145 -0
- package/scripts/prototype_lint_contradictions.py +1 -1
- package/scripts/recruit_preflight.sh +152 -0
- package/scripts/refine_ticket_detect.py +3 -3
- package/scripts/release.py +20 -0
- package/scripts/render_benchmark_md.py +308 -0
- package/scripts/roadmap_progress_hook.py +1 -1
- package/scripts/run_skill_evals.py +2 -2
- package/scripts/runtime_registry.py +4 -4
- package/scripts/schemas/command.schema.json +4 -4
- package/scripts/schemas/rule.schema.json +5 -5
- package/scripts/schemas/skill.schema.json +3 -3
- package/scripts/schemas/user-type.schema.json +1 -1
- package/scripts/score_skill_selection.py +1 -1
- package/scripts/skill_collision_clusters.py +2 -2
- package/scripts/skill_linter.py +81 -81
- package/scripts/skill_overlap.py +5 -5
- package/scripts/skill_tools/audit_persona_coverage.py +2 -2
- package/scripts/skill_tools/audit_user_type_coverage.py +2 -2
- package/scripts/skill_tools/run_block_d_eval.py +1 -1
- package/scripts/skill_tools/score_skill_relevance.py +1 -1
- package/scripts/skill_tools/suggest_skill_for_task.py +1 -1
- package/scripts/skill_trigger_eval.py +3 -3
- package/scripts/smoke/kernel.sh +7 -1
- package/scripts/smoke/router.sh +5 -5
- package/scripts/smoke/skills.sh +1 -1
- package/scripts/smoke_quickstart.py +1 -1
- package/scripts/snapshot_agent_outputs.py +3 -3
- package/scripts/spotcheck_thin_root.py +1 -1
- package/scripts/{caveman_stats.py → telegraph_stats.py} +18 -18
- package/scripts/update_counts.py +1 -1
- package/scripts/validate_decision_engine.py +1 -1
- package/scripts/validate_frontmatter.py +1 -1
- package/scripts/validate_safe_paths.py +3 -3
- package/scripts/{validate_caveman_carveouts.py → validate_telegraph_carveouts.py} +7 -7
- package/scripts/verify_roadmap_closure.py +6 -6
- package/templates/consumer-settings/ONBOARDING.md +41 -0
- package/.agent-src/commands/install-via-agent.md +0 -129
- package/.agent-src/skills/compress-memory/SKILL.md +0 -131
- package/dist/ui/assets/index-D-DY1ywI.js +0 -35
- package/dist/ui/assets/index-D-DY1ywI.js.map +0 -1
- package/dist/ui/assets/index-Dqfhmg-d.css +0 -1
- package/docs/adrs/caveman/README.md +0 -9
- package/docs/contracts/caveman-telemetry.md +0 -83
- package/scripts/compress.sh +0 -18
package/scripts/install.sh
CHANGED
|
@@ -37,6 +37,12 @@ DRY_RUN=false
|
|
|
37
37
|
VERBOSE=false
|
|
38
38
|
QUIET=false
|
|
39
39
|
SKIP_GITIGNORE=false
|
|
40
|
+
# Per the canonical-channel contract (docs/contracts/skill-distribution-channels.md),
|
|
41
|
+
# consumer installs default to the filesystem channel only (e.g. .claude/skills/) and
|
|
42
|
+
# do NOT project the plugin manifest (.claude-plugin/marketplace.json). Set this true
|
|
43
|
+
# via --legacy-both to also copy the plugin manifest for users on older harnesses
|
|
44
|
+
# that require both channels.
|
|
45
|
+
LEGACY_BOTH=false
|
|
40
46
|
# When true, skip payload sync entirely and only install the project-local
|
|
41
47
|
# `./agent-config` wrapper (Step 7 Phase 2). The bridge stage (install.py)
|
|
42
48
|
# handles the .agent-settings.yml stub + nested-install guard.
|
|
@@ -87,6 +93,7 @@ parse_args() {
|
|
|
87
93
|
--user-type) shift 2 ;;
|
|
88
94
|
--user-type=*) shift ;;
|
|
89
95
|
--minimal|--settings-only) MINIMAL=true; shift ;;
|
|
96
|
+
--legacy-both) LEGACY_BOTH=true; shift ;;
|
|
90
97
|
--help|-h) show_help; exit 0 ;;
|
|
91
98
|
*) log_error "Unknown argument: $1"; show_help; exit 1 ;;
|
|
92
99
|
esac
|
|
@@ -141,6 +148,10 @@ Options:
|
|
|
141
148
|
--verbose Show detailed output
|
|
142
149
|
--quiet Suppress all output except errors
|
|
143
150
|
--skip-gitignore Do not touch the target project's .gitignore
|
|
151
|
+
--legacy-both Also project the Claude plugin manifest
|
|
152
|
+
(.claude-plugin/marketplace.json) into the consumer install.
|
|
153
|
+
Default is filesystem-only per the canonical-channel contract
|
|
154
|
+
at docs/contracts/skill-distribution-channels.md.
|
|
144
155
|
--help, -h Show this help
|
|
145
156
|
|
|
146
157
|
Environment:
|
|
@@ -604,6 +615,163 @@ generate_windsurfrules() {
|
|
|
604
615
|
}
|
|
605
616
|
|
|
606
617
|
|
|
618
|
+
# Run scripts/_lib/scope_guard.sh as a pre-flight check. On DRIFT findings
|
|
619
|
+
# the function surfaces a numbered-options prompt and aborts on no-confirm
|
|
620
|
+
# paths. SCOPE_GUARD_BYPASS=1 (set by the orchestrator, CI runs, and
|
|
621
|
+
# --dry-run) skips the prompt entirely. Findings are always logged in
|
|
622
|
+
# verbose mode regardless.
|
|
623
|
+
run_scope_guard() {
|
|
624
|
+
local target="$1"
|
|
625
|
+
local guard="$SOURCE_DIR/scripts/_lib/scope_guard.sh"
|
|
626
|
+
|
|
627
|
+
# Skip when the guard is not present (e.g. trimmed install bundle).
|
|
628
|
+
[[ -f "$guard" ]] || { log_verbose "scope_guard.sh not found — skipping cross-scope drift check"; return 0; }
|
|
629
|
+
|
|
630
|
+
# Bypass paths that cannot or must not be interactive.
|
|
631
|
+
if $DRY_RUN; then
|
|
632
|
+
log_verbose "skip scope_guard (--dry-run)"
|
|
633
|
+
return 0
|
|
634
|
+
fi
|
|
635
|
+
if [[ "${SCOPE_GUARD_BYPASS:-0}" == "1" ]]; then
|
|
636
|
+
log_verbose "skip scope_guard (SCOPE_GUARD_BYPASS=1)"
|
|
637
|
+
return 0
|
|
638
|
+
fi
|
|
639
|
+
if [[ "${CI:-0}" == "true" ]] || [[ "${CI:-0}" == "1" ]]; then
|
|
640
|
+
log_verbose "skip scope_guard (CI=true)"
|
|
641
|
+
return 0
|
|
642
|
+
fi
|
|
643
|
+
|
|
644
|
+
local output verdict
|
|
645
|
+
output="$(bash "$guard" project "$SOURCE_DIR" "$target" 2>/dev/null || true)"
|
|
646
|
+
[[ -n "$output" ]] || return 0
|
|
647
|
+
|
|
648
|
+
local summary
|
|
649
|
+
summary="$(echo "$output" | grep '^SUMMARY' | tail -1)"
|
|
650
|
+
[[ -n "$summary" ]] || return 0
|
|
651
|
+
verdict="$(echo "$summary" | cut -f2)"
|
|
652
|
+
|
|
653
|
+
if [[ "$verdict" == "OK" ]]; then
|
|
654
|
+
log_verbose "scope_guard OK (no cross-scope install)"
|
|
655
|
+
return 0
|
|
656
|
+
fi
|
|
657
|
+
|
|
658
|
+
if [[ "$verdict" == "WARN" ]]; then
|
|
659
|
+
$QUIET || {
|
|
660
|
+
echo ""
|
|
661
|
+
echo " ⚠️ Cross-scope install detected (same version, no drift)."
|
|
662
|
+
echo "$output" | awk -F'\t' '$1=="WARN" { printf " - %s at %s (v%s)\n", $2, $3, $4 }'
|
|
663
|
+
echo ""
|
|
664
|
+
}
|
|
665
|
+
return 0
|
|
666
|
+
fi
|
|
667
|
+
|
|
668
|
+
# DRIFT: surface the gate. Non-interactive shells get the warning and
|
|
669
|
+
# an exit code that the caller can short-circuit with SCOPE_GUARD_BYPASS=1.
|
|
670
|
+
echo ""
|
|
671
|
+
echo " ❌ Cross-scope DRIFT detected — same package installed at user AND project scope at different versions:"
|
|
672
|
+
echo "$output" | awk -F'\t' '$1=="DRIFT" { printf " - %s: other-scope=%s (v%s) vs this-install=v%s\n", $2, $3, $4, $5 }'
|
|
673
|
+
echo ""
|
|
674
|
+
echo " The 2026-05-25 root cause (duplicate skill registration with stale frontmatter)"
|
|
675
|
+
echo " will fire when both registrations load. Choose how to proceed:"
|
|
676
|
+
echo ""
|
|
677
|
+
echo " 1. Abort install — fix drift first (recommended)"
|
|
678
|
+
echo " 2. Upgrade the OTHER scope first (run scripts/install.sh --target=\$HOME or equivalent)"
|
|
679
|
+
echo " 3. Force install at this scope — accept drift (set SCOPE_GUARD_BYPASS=1)"
|
|
680
|
+
echo " 4. Clean the other scope (bash scripts/cleanup_other_scope.sh --confirm)"
|
|
681
|
+
echo ""
|
|
682
|
+
echo " Recommendation: 1"
|
|
683
|
+
echo ""
|
|
684
|
+
|
|
685
|
+
# In interactive mode the caller has stdin; we honour SCOPE_GUARD_BYPASS=1
|
|
686
|
+
# already above. Default: abort.
|
|
687
|
+
if [[ -t 0 ]]; then
|
|
688
|
+
local choice
|
|
689
|
+
read -r -p " Enter 1-4 [default 1]: " choice || choice=1
|
|
690
|
+
case "${choice:-1}" in
|
|
691
|
+
2) echo " → Re-run scripts/install.sh against the other scope first; aborting this run."; exit 2 ;;
|
|
692
|
+
3) log_warn "Continuing despite DRIFT (user opted into option 3)" ;;
|
|
693
|
+
4) echo " → Run: bash scripts/cleanup_other_scope.sh --confirm — then retry."; exit 2 ;;
|
|
694
|
+
*) echo " → Aborting (option 1)."; exit 2 ;;
|
|
695
|
+
esac
|
|
696
|
+
else
|
|
697
|
+
echo " Non-interactive shell — aborting. Set SCOPE_GUARD_BYPASS=1 to override."
|
|
698
|
+
exit 2
|
|
699
|
+
fi
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
# Post-install skill-registration probe (Phase C Step 6). Informational by
|
|
703
|
+
# default; PROBE_STRICT=1 turns drift findings into a non-zero exit so a
|
|
704
|
+
# release install fails loudly. Skipped in dry-run and when python3 or the
|
|
705
|
+
# probe script is missing (older bundles).
|
|
706
|
+
run_post_install_probe() {
|
|
707
|
+
local target="$1"
|
|
708
|
+
local probe="$SOURCE_DIR/scripts/probe_skill_registration.py"
|
|
709
|
+
|
|
710
|
+
[[ -f "$probe" ]] || { log_verbose "skip probe_skill_registration.py (not found)"; return 0; }
|
|
711
|
+
if ! command -v python3 >/dev/null 2>&1; then
|
|
712
|
+
log_verbose "skip skill-registration probe (python3 missing)"
|
|
713
|
+
return 0
|
|
714
|
+
fi
|
|
715
|
+
if $DRY_RUN; then
|
|
716
|
+
log_verbose "skip skill-registration probe (--dry-run)"
|
|
717
|
+
return 0
|
|
718
|
+
fi
|
|
719
|
+
if [[ "${PROBE_BYPASS:-0}" == "1" ]]; then
|
|
720
|
+
log_verbose "skip skill-registration probe (PROBE_BYPASS=1)"
|
|
721
|
+
return 0
|
|
722
|
+
fi
|
|
723
|
+
|
|
724
|
+
local args=( "$probe" "--project" "$target" "--format=text" )
|
|
725
|
+
[[ "${PROBE_STRICT:-0}" == "1" ]] && args+=("--strict")
|
|
726
|
+
|
|
727
|
+
if python3 "${args[@]}" > /tmp/agent-config-probe.$$ 2>&1; then
|
|
728
|
+
# On clean output (no findings) only show a one-liner.
|
|
729
|
+
if grep -qE 'DUPLICATE|DRIFT' /tmp/agent-config-probe.$$; then
|
|
730
|
+
$QUIET || echo ""
|
|
731
|
+
$QUIET || echo " ⚠️ Skill-registration findings:"
|
|
732
|
+
$QUIET || sed -n '/DUPLICATE\|DRIFT/,$p' /tmp/agent-config-probe.$$ | head -40
|
|
733
|
+
$QUIET || echo ""
|
|
734
|
+
$QUIET || echo " Run: python3 scripts/probe_skill_registration.py — for the full report."
|
|
735
|
+
else
|
|
736
|
+
log_info "Skill-registration probe: clean (no duplicates / drift)"
|
|
737
|
+
fi
|
|
738
|
+
rm -f /tmp/agent-config-probe.$$
|
|
739
|
+
return 0
|
|
740
|
+
else
|
|
741
|
+
local code=$?
|
|
742
|
+
echo ""
|
|
743
|
+
echo " ❌ Skill-registration probe surfaced DUPLICATE / DRIFT findings (PROBE_STRICT=1):"
|
|
744
|
+
sed -n '/DUPLICATE\|DRIFT/,$p' /tmp/agent-config-probe.$$ | head -40
|
|
745
|
+
rm -f /tmp/agent-config-probe.$$
|
|
746
|
+
return "$code"
|
|
747
|
+
fi
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
# Project the Claude plugin manifest into the consumer install — gated on
|
|
751
|
+
# --legacy-both. Default install path is filesystem-only per the canonical-
|
|
752
|
+
# channel contract (docs/contracts/skill-distribution-channels.md). Only
|
|
753
|
+
# users on older Claude Code harnesses that need both channels opt in.
|
|
754
|
+
project_legacy_plugin_manifest() {
|
|
755
|
+
local project_root="$1"
|
|
756
|
+
local source_manifest="$SOURCE_DIR/.claude-plugin/marketplace.json"
|
|
757
|
+
local target_manifest="$project_root/.claude-plugin/marketplace.json"
|
|
758
|
+
|
|
759
|
+
if ! $LEGACY_BOTH; then
|
|
760
|
+
log_verbose "skip .claude-plugin/marketplace.json (filesystem is canonical; use --legacy-both to opt in)"
|
|
761
|
+
return 0
|
|
762
|
+
fi
|
|
763
|
+
is_tool_enabled "claude-code" || { log_verbose "skip .claude-plugin/marketplace.json (claude-code not selected)"; return 0; }
|
|
764
|
+
[[ -f "$source_manifest" ]] || { log_verbose "skip .claude-plugin/marketplace.json (source manifest absent)"; return 0; }
|
|
765
|
+
|
|
766
|
+
if $DRY_RUN; then
|
|
767
|
+
log_verbose "copy .claude-plugin/marketplace.json (--legacy-both)"
|
|
768
|
+
return
|
|
769
|
+
fi
|
|
770
|
+
mkdir -p "$(dirname "$target_manifest")"
|
|
771
|
+
cp "$source_manifest" "$target_manifest"
|
|
772
|
+
log_info "Projected .claude-plugin/marketplace.json (--legacy-both opted in)"
|
|
773
|
+
}
|
|
774
|
+
|
|
607
775
|
# Create GEMINI.md symlink (gemini-cli only).
|
|
608
776
|
create_gemini_md() {
|
|
609
777
|
local project_root="$1"
|
|
@@ -883,7 +1051,15 @@ main() {
|
|
|
883
1051
|
echo ""
|
|
884
1052
|
fi
|
|
885
1053
|
|
|
886
|
-
#
|
|
1054
|
+
# 0a. Cross-scope drift pre-flight (Phase B Step 3). Detect prior installs
|
|
1055
|
+
# of the same package at the OTHER scope (user-global ↔ project-local).
|
|
1056
|
+
# On DRIFT the function surfaces a numbered-options gate per the
|
|
1057
|
+
# non-destructive-by-default contract. SCOPE_GUARD_BYPASS=1 from the
|
|
1058
|
+
# orchestrator or a CI run skips the gate so non-interactive paths do
|
|
1059
|
+
# not hang.
|
|
1060
|
+
run_scope_guard "$TARGET_DIR"
|
|
1061
|
+
|
|
1062
|
+
# 0b. Migrate legacy infra files (root → agents/) before any content sync.
|
|
887
1063
|
migrate_legacy_root_infra "$TARGET_DIR"
|
|
888
1064
|
migrate_legacy_low_impact_decisions "$TARGET_DIR"
|
|
889
1065
|
migrate_legacy_prices_file "$TARGET_DIR"
|
|
@@ -920,6 +1096,9 @@ main() {
|
|
|
920
1096
|
create_tool_symlinks "$TARGET_DIR"
|
|
921
1097
|
create_skill_symlinks "$TARGET_DIR"
|
|
922
1098
|
|
|
1099
|
+
# 3b. Optionally project the Claude plugin manifest (--legacy-both).
|
|
1100
|
+
project_legacy_plugin_manifest "$TARGET_DIR"
|
|
1101
|
+
|
|
923
1102
|
# 4. Generate files
|
|
924
1103
|
generate_windsurfrules "$TARGET_DIR"
|
|
925
1104
|
create_gemini_md "$TARGET_DIR"
|
|
@@ -927,6 +1106,13 @@ main() {
|
|
|
927
1106
|
# 5. Install consumer CLI wrapper (gitignored, overwritten on every install)
|
|
928
1107
|
install_cli_wrapper "$TARGET_DIR"
|
|
929
1108
|
|
|
1109
|
+
# 5b. Post-install registration probe (Phase C Step 6). Surfaces any
|
|
1110
|
+
# duplicate / drifting skill registrations the new install would
|
|
1111
|
+
# conflict with. PROBE_STRICT=1 (set by release installs) flips
|
|
1112
|
+
# informational output into a non-zero exit so a release stops on
|
|
1113
|
+
# drift findings.
|
|
1114
|
+
run_post_install_probe "$TARGET_DIR"
|
|
1115
|
+
|
|
930
1116
|
# 6. Manage .gitignore
|
|
931
1117
|
ensure_gitignore "$TARGET_DIR"
|
|
932
1118
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""
|
|
3
3
|
Inventory frontmatter keys across all agent artefacts.
|
|
4
4
|
|
|
5
|
-
Reads .agent-src.
|
|
5
|
+
Reads .agent-src.uncondensed/{skills,rules,commands,personas}, parses the
|
|
6
6
|
YAML frontmatter of every file, and prints per-type:
|
|
7
7
|
|
|
8
8
|
- total file count
|
|
@@ -26,7 +26,7 @@ from collections import Counter, defaultdict
|
|
|
26
26
|
from pathlib import Path
|
|
27
27
|
|
|
28
28
|
ROOT = Path(__file__).resolve().parent.parent
|
|
29
|
-
SRC = ROOT / ".agent-src.
|
|
29
|
+
SRC = ROOT / ".agent-src.uncondensed"
|
|
30
30
|
|
|
31
31
|
FRONTMATTER_RE = re.compile(r"^---\n(.*?)\n---\n", re.DOTALL)
|
|
32
32
|
|
package/scripts/iron_law_sha.py
CHANGED
|
@@ -13,7 +13,7 @@ line), case-folded, then SHA-256-hashed. Empty fences hash to
|
|
|
13
13
|
SHA-256(''), which is `e3b0c442…` (the well-known empty-string hash).
|
|
14
14
|
|
|
15
15
|
Acceptance per `road-to-kernel-and-router.md` P2.2: re-runnable,
|
|
16
|
-
deterministic, stdlib-only, no network.
|
|
16
|
+
deterministic, stdlib-only, no network. Condensation of a kernel rule
|
|
17
17
|
must preserve this SHA (or surface a deliberate ADR-tracked diff).
|
|
18
18
|
"""
|
|
19
19
|
|
|
@@ -26,7 +26,7 @@ import sys
|
|
|
26
26
|
from pathlib import Path
|
|
27
27
|
|
|
28
28
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
29
|
-
RULES_DIR = REPO_ROOT / ".agent-src.
|
|
29
|
+
RULES_DIR = REPO_ROOT / ".agent-src.uncondensed" / "rules"
|
|
30
30
|
|
|
31
31
|
# Locked kernel set — kept in sync with measure_rule_budget.KERNEL_RULES.
|
|
32
32
|
KERNEL_RULES = (
|
|
@@ -50,7 +50,7 @@ def iron_law_sha(text: str) -> str:
|
|
|
50
50
|
|
|
51
51
|
Algorithm matches `scripts/_pilot_measure.py` exactly so the SHAs
|
|
52
52
|
recorded in `docs/contracts/kernel-membership.md` § 2 stay
|
|
53
|
-
reproducible across pre / post
|
|
53
|
+
reproducible across pre / post condensation.
|
|
54
54
|
"""
|
|
55
55
|
blocks = _FENCE_RE.findall(text)
|
|
56
56
|
norm = "".join(_WS_RE.sub(" ", b).strip().upper() for b in blocks)
|
|
@@ -9,12 +9,12 @@ everything else lives in a typed subdirectory (`runtime/`, `settings/`,
|
|
|
9
9
|
|
|
10
10
|
Two layout tiers:
|
|
11
11
|
|
|
12
|
-
MAINTAINER (this source repo, identified by ``.agent-src.
|
|
12
|
+
MAINTAINER (this source repo, identified by ``.agent-src.uncondensed/``)
|
|
13
13
|
Full `agents/` tree allowed — only the flat-file whitelist is
|
|
14
14
|
enforced. Phase 4 of road-to-global-only-install keeps the
|
|
15
15
|
maintainer surface unchanged.
|
|
16
16
|
|
|
17
|
-
CONSUMER (any repo without ``.agent-src.
|
|
17
|
+
CONSUMER (any repo without ``.agent-src.uncondensed/``)
|
|
18
18
|
Global-only target shape: `agents/overrides/` + the bridge
|
|
19
19
|
marker `agents/.event4u-bridge.yml` are the **only** expected
|
|
20
20
|
artefacts. Anything else surfaces as a WARNING with a pointer
|
|
@@ -55,6 +55,13 @@ ALLOWED_FLAT_FILES: frozenset[str] = frozenset(
|
|
|
55
55
|
# Consumer bridge marker (Phase 4 of road-to-global-only-install).
|
|
56
56
|
# Spec: docs/contracts/consumer-bridge.md (event4u-bridge/v1).
|
|
57
57
|
".event4u-bridge.yml",
|
|
58
|
+
# Per-tool projection toggle — which generated trees
|
|
59
|
+
# `task generate-tools` writes (`.claude/`, `.cursor/`,
|
|
60
|
+
# `.clinerules/`, `.windsurfrules`). Lives at agents/ root
|
|
61
|
+
# because both the package and the consumer generators read
|
|
62
|
+
# it before any subdirectory is touched (ADR-028 § Root layout
|
|
63
|
+
# toggle).
|
|
64
|
+
".agent-tools.yml",
|
|
58
65
|
}
|
|
59
66
|
)
|
|
60
67
|
|
|
@@ -76,21 +83,21 @@ def is_source_repo(project_root: Path) -> bool:
|
|
|
76
83
|
"""True when running inside the agent-config source repo.
|
|
77
84
|
|
|
78
85
|
The maintainer surface is identified by **any** of:
|
|
79
|
-
- ``.agent-src.
|
|
80
|
-
- ``packages/<pack>/.agent-src.
|
|
81
|
-
- ``.agent-src/`` at the workspace root (
|
|
86
|
+
- ``.agent-src.uncondensed/`` at the workspace root (legacy / single-pack layout),
|
|
87
|
+
- ``packages/<pack>/.agent-src.uncondensed/`` (current monorepo layout — see ``AGENTS.md``),
|
|
88
|
+
- ``.agent-src/`` at the workspace root (condensed authoring tree).
|
|
82
89
|
|
|
83
90
|
Consumer repos ship none of these — they only carry the deployed
|
|
84
91
|
`.augment/`, `.claude/`, etc. plus `agents/overrides/`.
|
|
85
92
|
"""
|
|
86
|
-
if (project_root / ".agent-src.
|
|
93
|
+
if (project_root / ".agent-src.uncondensed").is_dir():
|
|
87
94
|
return True
|
|
88
95
|
if (project_root / ".agent-src").is_dir():
|
|
89
96
|
return True
|
|
90
97
|
packages = project_root / "packages"
|
|
91
98
|
if packages.is_dir():
|
|
92
99
|
for sub in packages.iterdir():
|
|
93
|
-
if (sub / ".agent-src.
|
|
100
|
+
if (sub / ".agent-src.uncondensed").is_dir():
|
|
94
101
|
return True
|
|
95
102
|
return False
|
|
96
103
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""Thin-Root contract linter for AGENTS.md files (Phase 7).
|
|
3
3
|
|
|
4
4
|
Enforces caps + pointer-ratio + pointer-anatomy + emergency-triage
|
|
5
|
-
contract from `.agent-src.
|
|
5
|
+
contract from `.agent-src.uncondensed/skills/agents-md-thin-root/SKILL.md`:
|
|
6
6
|
|
|
7
7
|
(a) total char-count under FAIL/WARN budgets per file class
|
|
8
8
|
(b) substantive-pointer ratio >= 0.40
|
|
@@ -65,7 +65,7 @@ class Target:
|
|
|
65
65
|
TARGETS = [
|
|
66
66
|
Target(ROOT / "AGENTS.md", "package-root", 3000, 2800, template=False),
|
|
67
67
|
Target(
|
|
68
|
-
ROOT / "packages" / "core" / ".agent-src.
|
|
68
|
+
ROOT / "packages" / "core" / ".agent-src.uncondensed" / "templates" / "AGENTS.md",
|
|
69
69
|
"consumer-template", 2500, 2300, template=True,
|
|
70
70
|
),
|
|
71
71
|
]
|
|
@@ -81,10 +81,10 @@ def _resolve(target_str: str, template: bool) -> bool:
|
|
|
81
81
|
return True
|
|
82
82
|
candidates = [ROOT / raw]
|
|
83
83
|
if template and raw.startswith(".augment/"):
|
|
84
|
-
candidates.append(ROOT / raw.replace(".augment/", ".agent-src.
|
|
84
|
+
candidates.append(ROOT / raw.replace(".augment/", ".agent-src.uncondensed/", 1))
|
|
85
85
|
candidates.append(ROOT / raw.replace(".augment/", ".agent-src/", 1))
|
|
86
86
|
if raw.startswith(".agent-src/"):
|
|
87
|
-
candidates.append(ROOT / raw.replace(".agent-src/", ".agent-src.
|
|
87
|
+
candidates.append(ROOT / raw.replace(".agent-src/", ".agent-src.uncondensed/", 1))
|
|
88
88
|
return any(c.exists() for c in candidates)
|
|
89
89
|
|
|
90
90
|
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"""Lint archive notes under agents/evidence/archived-skills/.
|
|
3
3
|
|
|
4
4
|
Enforces the contract from
|
|
5
|
-
.agent-src.
|
|
5
|
+
.agent-src.uncondensed/templates/skill-archive-note.md:
|
|
6
6
|
|
|
7
7
|
1. Every <slug>.md under agents/evidence/archived-skills/ has the six required
|
|
8
8
|
frontmatter fields with valid values.
|
|
9
9
|
2. `reason` is one of {unused, merged, superseded, deprecated}.
|
|
10
10
|
3. When `reason ∈ {merged, superseded}` the `replacement` slug exists
|
|
11
|
-
under .agent-src.
|
|
11
|
+
under .agent-src.uncondensed/skills/.
|
|
12
12
|
4. No archived slug still has a live SKILL.md (no zombies).
|
|
13
13
|
5. No live SKILL.md cites an archived slug as a router target in
|
|
14
14
|
its frontmatter `replaced_by:` field.
|
|
@@ -34,7 +34,7 @@ REPO = Path(__file__).resolve().parents[1]
|
|
|
34
34
|
ARCHIVE_DIR = REPO / "agents" / "evidence" / "archived-skills"
|
|
35
35
|
|
|
36
36
|
# Live skill directories live under every artefact root post-monorepo
|
|
37
|
-
# Phase 4 (legacy + packages/*/.agent-src.
|
|
37
|
+
# Phase 4 (legacy + packages/*/.agent-src.uncondensed/skills/).
|
|
38
38
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
39
39
|
from _lib.agent_src import artefact_roots # noqa: E402
|
|
40
40
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""Lint Phase-4 discovery frontmatter on every artefact.
|
|
3
3
|
|
|
4
4
|
Walks the same trees as `scripts/build_discovery_manifest.py` (skills,
|
|
5
|
-
rules, commands, templates under `.agent-src.
|
|
5
|
+
rules, commands, templates under `.agent-src.uncondensed/`) and asserts
|
|
6
6
|
per-file that the five ADR-013 keys (`workspaces`, `packs`, `lifecycle`,
|
|
7
7
|
`trust`, `install`) are present and well-formed:
|
|
8
8
|
|
|
@@ -31,7 +31,7 @@ except ImportError: # pragma: no cover
|
|
|
31
31
|
sys.exit(2)
|
|
32
32
|
|
|
33
33
|
ROOT = Path(__file__).resolve().parents[1]
|
|
34
|
-
SRC = ROOT / ".agent-src.
|
|
34
|
+
SRC = ROOT / ".agent-src.uncondensed"
|
|
35
35
|
VOCAB_DIR = ROOT / "config" / "discovery"
|
|
36
36
|
|
|
37
37
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate the A/B bench corpora + `docs/benchmark.md` shape.
|
|
3
|
+
|
|
4
|
+
Phase 5 Step 3 of `agents/roadmaps/road-to-package-impact-benchmark.md`.
|
|
5
|
+
|
|
6
|
+
Checks:
|
|
7
|
+
|
|
8
|
+
- `internal/bench/corpora/ab-tracka.yaml`
|
|
9
|
+
- version: 1
|
|
10
|
+
- corpus_id: ab-tracka
|
|
11
|
+
- prompts: ≥ 30 entries
|
|
12
|
+
- per prompt: id, category ∈ {rule, skill}, expected_target, expected_keywords, prompt
|
|
13
|
+
|
|
14
|
+
- `internal/bench/corpora/ab-trackb.yaml`
|
|
15
|
+
- version: 1
|
|
16
|
+
- corpus_id: ab-trackb
|
|
17
|
+
- tasks: ≥ 10 entries
|
|
18
|
+
- per task: id, category ∈ {bugfix, feature, refactor, uiaudit, testadd},
|
|
19
|
+
prompt, seed_files, success_criteria
|
|
20
|
+
|
|
21
|
+
- `docs/benchmark.md` (if it exists)
|
|
22
|
+
- carries every section in REQUIRED_SECTIONS
|
|
23
|
+
|
|
24
|
+
Exit 0 on success, 1 on the first violation (with file + line where possible).
|
|
25
|
+
"""
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import argparse
|
|
29
|
+
import sys
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
33
|
+
TRACK_A_PATH = REPO_ROOT / "internal" / "bench" / "corpora" / "ab-tracka.yaml"
|
|
34
|
+
TRACK_B_PATH = REPO_ROOT / "internal" / "bench" / "corpora" / "ab-trackb.yaml"
|
|
35
|
+
DOCS_PATH = REPO_ROOT / "docs" / "benchmark.md"
|
|
36
|
+
|
|
37
|
+
REQUIRED_SECTIONS = (
|
|
38
|
+
"## Headline",
|
|
39
|
+
"## Track A",
|
|
40
|
+
"## Track B",
|
|
41
|
+
"## Methodology",
|
|
42
|
+
"## History",
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
TRACK_A_CATEGORIES = {"rule", "skill"}
|
|
46
|
+
TRACK_B_CATEGORIES = {"bugfix", "feature", "refactor", "uiaudit", "testadd"}
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
import yaml
|
|
50
|
+
except ImportError:
|
|
51
|
+
sys.stderr.write("lint_bench_ab: PyYAML required (pip install pyyaml)\n")
|
|
52
|
+
raise SystemExit(2)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class LintError(Exception):
|
|
56
|
+
pass
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _fail(path: Path, msg: str) -> None:
|
|
60
|
+
sys.stderr.write(f"lint_bench_ab: {path.relative_to(REPO_ROOT)}: {msg}\n")
|
|
61
|
+
raise LintError(msg)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def lint_track_a() -> None:
|
|
65
|
+
if not TRACK_A_PATH.exists():
|
|
66
|
+
_fail(TRACK_A_PATH, "missing corpus file")
|
|
67
|
+
data = yaml.safe_load(TRACK_A_PATH.read_text())
|
|
68
|
+
if data.get("version") != 1:
|
|
69
|
+
_fail(TRACK_A_PATH, f"version must be 1 (got {data.get('version')!r})")
|
|
70
|
+
if data.get("corpus_id") != "ab-tracka":
|
|
71
|
+
_fail(TRACK_A_PATH, f"corpus_id must be 'ab-tracka' (got {data.get('corpus_id')!r})")
|
|
72
|
+
prompts = data.get("prompts") or []
|
|
73
|
+
if not isinstance(prompts, list):
|
|
74
|
+
_fail(TRACK_A_PATH, "prompts must be a list")
|
|
75
|
+
if len(prompts) < 30:
|
|
76
|
+
_fail(TRACK_A_PATH, f"prompts must have ≥ 30 entries (found {len(prompts)})")
|
|
77
|
+
ids = set()
|
|
78
|
+
for i, prompt in enumerate(prompts):
|
|
79
|
+
loc = f"prompts[{i}]"
|
|
80
|
+
if not isinstance(prompt, dict):
|
|
81
|
+
_fail(TRACK_A_PATH, f"{loc} must be a mapping")
|
|
82
|
+
pid = prompt.get("id")
|
|
83
|
+
if not isinstance(pid, str) or not pid:
|
|
84
|
+
_fail(TRACK_A_PATH, f"{loc}.id must be a non-empty string")
|
|
85
|
+
if pid in ids:
|
|
86
|
+
_fail(TRACK_A_PATH, f"{loc}.id duplicates an earlier id ({pid!r})")
|
|
87
|
+
ids.add(pid)
|
|
88
|
+
cat = prompt.get("category")
|
|
89
|
+
if cat not in TRACK_A_CATEGORIES:
|
|
90
|
+
_fail(TRACK_A_PATH, f"{loc}.category must be in {TRACK_A_CATEGORIES} (got {cat!r})")
|
|
91
|
+
target = prompt.get("expected_target")
|
|
92
|
+
if not isinstance(target, str) or not target:
|
|
93
|
+
_fail(TRACK_A_PATH, f"{loc}.expected_target must be a non-empty string")
|
|
94
|
+
keywords = prompt.get("expected_keywords")
|
|
95
|
+
if keywords is not None and not isinstance(keywords, list):
|
|
96
|
+
_fail(TRACK_A_PATH, f"{loc}.expected_keywords must be a list when present")
|
|
97
|
+
if not isinstance(prompt.get("prompt"), str) or not prompt["prompt"]:
|
|
98
|
+
_fail(TRACK_A_PATH, f"{loc}.prompt must be a non-empty string")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def lint_track_b() -> None:
|
|
102
|
+
if not TRACK_B_PATH.exists():
|
|
103
|
+
_fail(TRACK_B_PATH, "missing corpus file")
|
|
104
|
+
data = yaml.safe_load(TRACK_B_PATH.read_text())
|
|
105
|
+
if data.get("version") != 1:
|
|
106
|
+
_fail(TRACK_B_PATH, f"version must be 1 (got {data.get('version')!r})")
|
|
107
|
+
if data.get("corpus_id") != "ab-trackb":
|
|
108
|
+
_fail(TRACK_B_PATH, f"corpus_id must be 'ab-trackb' (got {data.get('corpus_id')!r})")
|
|
109
|
+
tasks = data.get("tasks") or []
|
|
110
|
+
if not isinstance(tasks, list):
|
|
111
|
+
_fail(TRACK_B_PATH, "tasks must be a list")
|
|
112
|
+
if len(tasks) < 10:
|
|
113
|
+
_fail(TRACK_B_PATH, f"tasks must have ≥ 10 entries (found {len(tasks)})")
|
|
114
|
+
ids = set()
|
|
115
|
+
for i, task in enumerate(tasks):
|
|
116
|
+
loc = f"tasks[{i}]"
|
|
117
|
+
if not isinstance(task, dict):
|
|
118
|
+
_fail(TRACK_B_PATH, f"{loc} must be a mapping")
|
|
119
|
+
tid = task.get("id")
|
|
120
|
+
if not isinstance(tid, str) or not tid:
|
|
121
|
+
_fail(TRACK_B_PATH, f"{loc}.id must be a non-empty string")
|
|
122
|
+
if tid in ids:
|
|
123
|
+
_fail(TRACK_B_PATH, f"{loc}.id duplicates an earlier id ({tid!r})")
|
|
124
|
+
ids.add(tid)
|
|
125
|
+
cat = task.get("category")
|
|
126
|
+
if cat not in TRACK_B_CATEGORIES:
|
|
127
|
+
_fail(TRACK_B_PATH, f"{loc}.category must be in {TRACK_B_CATEGORIES} (got {cat!r})")
|
|
128
|
+
if not isinstance(task.get("prompt"), str) or not task["prompt"]:
|
|
129
|
+
_fail(TRACK_B_PATH, f"{loc}.prompt must be a non-empty string")
|
|
130
|
+
seeds = task.get("seed_files")
|
|
131
|
+
if not isinstance(seeds, list):
|
|
132
|
+
_fail(TRACK_B_PATH, f"{loc}.seed_files must be a list")
|
|
133
|
+
crit = task.get("success_criteria")
|
|
134
|
+
if not isinstance(crit, dict) or not crit:
|
|
135
|
+
_fail(TRACK_B_PATH, f"{loc}.success_criteria must be a non-empty mapping")
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def lint_doc(quiet: bool) -> None:
|
|
139
|
+
if not DOCS_PATH.exists():
|
|
140
|
+
if not quiet:
|
|
141
|
+
sys.stdout.write(
|
|
142
|
+
f"lint_bench_ab: {DOCS_PATH.relative_to(REPO_ROOT)} not yet rendered "
|
|
143
|
+
"(run task bench:ab:diff) — skipping doc shape check\n"
|
|
144
|
+
)
|
|
145
|
+
return
|
|
146
|
+
body = DOCS_PATH.read_text()
|
|
147
|
+
missing = [section for section in REQUIRED_SECTIONS if section not in body]
|
|
148
|
+
if missing:
|
|
149
|
+
_fail(DOCS_PATH, f"missing required sections: {missing}")
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def parse_args(argv: list[str]) -> argparse.Namespace:
|
|
153
|
+
parser = argparse.ArgumentParser(description="Validate A/B bench corpora + docs/benchmark.md.")
|
|
154
|
+
parser.add_argument("--quiet", action="store_true", help="Only emit on error.")
|
|
155
|
+
return parser.parse_args(argv)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def main(argv: list[str] | None = None) -> int:
|
|
159
|
+
args = parse_args(argv if argv is not None else sys.argv[1:])
|
|
160
|
+
try:
|
|
161
|
+
lint_track_a()
|
|
162
|
+
lint_track_b()
|
|
163
|
+
lint_doc(args.quiet)
|
|
164
|
+
except LintError:
|
|
165
|
+
return 1
|
|
166
|
+
if not args.quiet:
|
|
167
|
+
sys.stdout.write("lint_bench_ab: OK\n")
|
|
168
|
+
return 0
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
if __name__ == "__main__":
|
|
172
|
+
raise SystemExit(main())
|
|
@@ -40,7 +40,7 @@ REPO = Path(__file__).resolve().parents[1]
|
|
|
40
40
|
CORPUS_DIR = REPO / "tests" / "eval"
|
|
41
41
|
|
|
42
42
|
# Live skill directories live under every artefact root post-monorepo
|
|
43
|
-
# Phase 4 (legacy + packages/*/.agent-src.
|
|
43
|
+
# Phase 4 (legacy + packages/*/.agent-src.uncondensed/skills/).
|
|
44
44
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
45
45
|
from _lib.agent_src import artefact_roots # noqa: E402
|
|
46
46
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""Lint slash-command frontmatter for the `tier:` key.
|
|
3
3
|
|
|
4
|
-
Hard-fails CI if any command under .agent-src.
|
|
4
|
+
Hard-fails CI if any command under .agent-src.uncondensed/commands/
|
|
5
5
|
lacks a `tier:` declaration or uses an unknown tier value. The valid
|
|
6
6
|
tier set is locked by docs/contracts/command-surface-tiers.md.
|
|
7
7
|
|
|
@@ -27,7 +27,7 @@ from _lib.agent_src import artefact_roots # noqa: E402
|
|
|
27
27
|
COMMANDS_DIRS = [root / "commands" for root in artefact_roots() if (root / "commands").is_dir()]
|
|
28
28
|
# Consumer-facing projection — must also carry tier so .augment/commands/
|
|
29
29
|
# (which symlinks to .agent-src/commands/) renders the tier filter.
|
|
30
|
-
|
|
30
|
+
COMMANDS_DIR_CONDENSED = REPO / ".agent-src" / "commands"
|
|
31
31
|
|
|
32
32
|
VALID_TIERS = frozenset({"0", "1", "2"})
|
|
33
33
|
|
|
@@ -116,11 +116,11 @@ def main() -> int:
|
|
|
116
116
|
rc = 0
|
|
117
117
|
for commands_dir in COMMANDS_DIRS:
|
|
118
118
|
rc |= lint(commands_dir, quiet=QUIET)
|
|
119
|
-
# The
|
|
119
|
+
# The condensed projection is the consumer-facing tree (via the
|
|
120
120
|
# .augment/commands → .agent-src/commands symlink). It must also
|
|
121
121
|
# carry tier so the surface stays uniform.
|
|
122
|
-
if
|
|
123
|
-
rc |= lint(
|
|
122
|
+
if COMMANDS_DIR_CONDENSED.is_dir():
|
|
123
|
+
rc |= lint(COMMANDS_DIR_CONDENSED, quiet=QUIET)
|
|
124
124
|
return rc
|
|
125
125
|
|
|
126
126
|
|
|
@@ -28,7 +28,7 @@ QUIET = "--quiet" in sys.argv
|
|
|
28
28
|
|
|
29
29
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
30
30
|
SKILL_GLOBS = (
|
|
31
|
-
".agent-src.
|
|
31
|
+
".agent-src.uncondensed/skills/**/SKILL.md",
|
|
32
32
|
".agent-src/skills/**/SKILL.md",
|
|
33
33
|
)
|
|
34
34
|
VALID_SLOTS = (
|