@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
|
@@ -11,7 +11,7 @@ writes JSON files in `runs/`.
|
|
|
11
11
|
|
|
12
12
|
Layout per skill:
|
|
13
13
|
|
|
14
|
-
.agent-src.
|
|
14
|
+
.agent-src.uncondensed/skills/{name}/evals/
|
|
15
15
|
evals.json
|
|
16
16
|
runs/ # gitignored
|
|
17
17
|
{timestamp}-baseline/{scenario_id}/output.txt
|
|
@@ -31,7 +31,7 @@ from pathlib import Path
|
|
|
31
31
|
from typing import Any
|
|
32
32
|
|
|
33
33
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
34
|
-
SKILLS_ROOT = REPO_ROOT / ".agent-src.
|
|
34
|
+
SKILLS_ROOT = REPO_ROOT / ".agent-src.uncondensed" / "skills"
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
def _skill_dir(skill: str) -> Path:
|
|
@@ -63,10 +63,10 @@ class SkillRuntime:
|
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
def discover_skills(root: Path) -> List[Path]:
|
|
66
|
-
"""Find all SKILL.md files, preferring .agent-src.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
base =
|
|
66
|
+
"""Find all SKILL.md files, preferring .agent-src.uncondensed/."""
|
|
67
|
+
uncondensed = root / ".agent-src.uncondensed" / "skills"
|
|
68
|
+
condensed = root / ".agent-src" / "skills"
|
|
69
|
+
base = uncondensed if uncondensed.exists() else condensed
|
|
70
70
|
if not base.exists():
|
|
71
71
|
return []
|
|
72
72
|
return sorted(f for f in base.rglob("SKILL.md") if not f.is_symlink())
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"name": {
|
|
11
11
|
"type": "string",
|
|
12
12
|
"pattern": "^[a-z][a-z0-9-]*(:[a-z][a-z0-9-]*)?$",
|
|
13
|
-
"$comment": "Top-level commands use the bare slug (`commit`). Nested cluster commands under `commands/<cluster>/<sub>.md` use the colon form (`council:default`) to mirror Claude Code's `/cluster:sub` rendering. Directory slug for `.claude/skills/` is the hyphenated form (`council-default`), generated by
|
|
13
|
+
"$comment": "Top-level commands use the bare slug (`commit`). Nested cluster commands under `commands/<cluster>/<sub>.md` use the colon form (`council:default`) to mirror Claude Code's `/cluster:sub` rendering. Directory slug for `.claude/skills/` is the hyphenated form (`council-default`), generated by condense.py."
|
|
14
14
|
},
|
|
15
15
|
"tier": {
|
|
16
16
|
"type": "integer",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"type": "string",
|
|
41
41
|
"pattern": "^[a-z][a-z0-9-]*$"
|
|
42
42
|
},
|
|
43
|
-
"description": "Personas this command invokes (see .agent-src.
|
|
43
|
+
"description": "Personas this command invokes (see .agent-src.uncondensed/personas/). Mirrors `skills:`; each entry must match a persona slug."
|
|
44
44
|
},
|
|
45
45
|
"cluster": {
|
|
46
46
|
"type": "string",
|
|
@@ -70,12 +70,12 @@
|
|
|
70
70
|
"framework": {
|
|
71
71
|
"type": "string",
|
|
72
72
|
"pattern": "^[a-z][a-z0-9-]*$",
|
|
73
|
-
"description": "Framework carve-out marker. Set on commands that are 100% coupled to one stack (e.g. `framework: laravel` on update-form-request-messages). Generic, multi-stack commands MUST omit this key. Routed by .agent-src.
|
|
73
|
+
"description": "Framework carve-out marker. Set on commands that are 100% coupled to one stack (e.g. `framework: laravel` on update-form-request-messages). Generic, multi-stack commands MUST omit this key. Routed by .agent-src.uncondensed/rules/framework-neutrality-in-generic-skills.md (Tier 2)."
|
|
74
74
|
},
|
|
75
75
|
"council_depth": {
|
|
76
76
|
"type": "string",
|
|
77
77
|
"enum": ["deep"],
|
|
78
|
-
"description": "Optional reasoning-depth marker for AI Council invocations triggered by this command. The only accepted value is 'deep'; omit the key for default depth (setting 'standard' is rejected — every frontmatter byte counts against the context window, and 'standard' is the implicit default). 'deep' instructs the host agent to pass --depth deep to council_cli, which floors rounds at max(ai_council.deep_min_rounds, ai_council.min_rounds). Use for architecture, refactoring, or bug-diagnosis commands. See .agent-src.
|
|
78
|
+
"description": "Optional reasoning-depth marker for AI Council invocations triggered by this command. The only accepted value is 'deep'; omit the key for default depth (setting 'standard' is rejected — every frontmatter byte counts against the context window, and 'standard' is the implicit default). 'deep' instructs the host agent to pass --depth deep to council_cli, which floors rounds at max(ai_council.deep_min_rounds, ai_council.min_rounds). Use for architecture, refactoring, or bug-diagnosis commands. See .agent-src.uncondensed/skills/ai-council/SKILL.md."
|
|
79
79
|
},
|
|
80
80
|
"suggestion": {
|
|
81
81
|
"type": "object",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"items": {
|
|
31
31
|
"type": "string",
|
|
32
32
|
"pattern": "^((\\.\\./)*contexts/|agents/settings/contexts/|\\.agent-src/contexts/)[^\\s]+\\.md$",
|
|
33
|
-
"description": "Logical name (preferred — `contexts/<area>/<file>.md`) or project-local (`agents/settings/contexts/<file>.md`). The `.agent-src.
|
|
33
|
+
"description": "Logical name (preferred — `contexts/<area>/<file>.md`) or project-local (`agents/settings/contexts/<file>.md`). The `.agent-src.uncondensed/` prefix is rejected by the regex; the rewriter (`scripts/condense.py::_rewrite_paths`) resolves logical names at condense time. Rewritten relative forms (`../contexts/...`, `../../contexts/...`) are accepted so the linter passes on the condensed mirror in CI."
|
|
34
34
|
},
|
|
35
|
-
"description": "Lazy on-demand context references. Use logical names rooted at the source (e.g. `contexts/execution/foo.md`); the `.agent-src.
|
|
35
|
+
"description": "Lazy on-demand context references. Use logical names rooted at the source (e.g. `contexts/execution/foo.md`); the `.agent-src.uncondensed/` prefix is forbidden by the regex (road-to-path-fixes.md P5.3). Path rules and budget caps enforced by scripts/lint_load_context.py. Contract: docs/contracts/load-context-schema.md."
|
|
36
36
|
},
|
|
37
37
|
"load_context_eager": {
|
|
38
38
|
"type": "array",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"council_depth": {
|
|
52
52
|
"type": "string",
|
|
53
53
|
"enum": ["deep"],
|
|
54
|
-
"description": "Optional reasoning-depth marker for AI Council invocations triggered while this rule is active. The only accepted value is 'deep'; omit the key for default depth (setting 'standard' is rejected — every frontmatter byte counts against the context window, and 'standard' is the implicit default). 'deep' instructs the host agent to pass --depth deep to council_cli, which floors rounds at max(ai_council.deep_min_rounds, ai_council.min_rounds). Use for rules that gate architecture, refactoring, or bug-diagnosis flows. See .agent-src.
|
|
54
|
+
"description": "Optional reasoning-depth marker for AI Council invocations triggered while this rule is active. The only accepted value is 'deep'; omit the key for default depth (setting 'standard' is rejected — every frontmatter byte counts against the context window, and 'standard' is the implicit default). 'deep' instructs the host agent to pass --depth deep to council_cli, which floors rounds at max(ai_council.deep_min_rounds, ai_council.min_rounds). Use for rules that gate architecture, refactoring, or bug-diagnosis flows. See .agent-src.uncondensed/skills/ai-council/SKILL.md."
|
|
55
55
|
},
|
|
56
56
|
"triggers": {
|
|
57
57
|
"type": "array",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"phrase": {"type": "string"},
|
|
64
64
|
"intent": {"type": "string"},
|
|
65
65
|
"file_pattern": {"type": "string"},
|
|
66
|
-
"path_prefix": {"type": "string", "description": "Literal path-prefix match pattern the host evaluates against the file the agent is editing — NOT a file reference. The rewriter leaves it verbatim. Source-of-truth rules that must fire on edits under `.agent-src.
|
|
66
|
+
"path_prefix": {"type": "string", "description": "Literal path-prefix match pattern the host evaluates against the file the agent is editing — NOT a file reference. The rewriter leaves it verbatim. Source-of-truth rules that must fire on edits under `.agent-src.uncondensed/` keep that prefix here (the prefix ban applies only to `load_context:` and body links — see road-to-path-fixes.md P2.2 / AI-Council 2026-05-06)."},
|
|
67
67
|
"command": {"type": "string"},
|
|
68
68
|
"reason": {"type": "string"}
|
|
69
69
|
}
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"reason": {"type": "string", "description": "Human-readable rationale for the suppression — surfaced in audit logs."}
|
|
98
98
|
}
|
|
99
99
|
},
|
|
100
|
-
"description": "Per-rule allowlist consumed by the post-
|
|
100
|
+
"description": "Per-rule allowlist consumed by the post-condensation validator (scripts/check_condensed_paths.py). Rules that document forbidden path substrings as their subject matter (e.g. augment-portability, no-roadmap-references) declare the literal strings here so the gate does not flag itself. road-to-path-fixes.md P5.1."
|
|
101
101
|
},
|
|
102
102
|
"workspaces": {
|
|
103
103
|
"type": "array",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"framework": {
|
|
39
39
|
"type": "string",
|
|
40
40
|
"pattern": "^[a-z][a-z0-9-]*$",
|
|
41
|
-
"description": "Framework carve-out marker. Set on skills that are 100% coupled to one stack (e.g. `framework: laravel` on laravel-* skills). Generic, multi-stack skills MUST omit this key. Routed by .agent-src.
|
|
41
|
+
"description": "Framework carve-out marker. Set on skills that are 100% coupled to one stack (e.g. `framework: laravel` on laravel-* skills). Generic, multi-stack skills MUST omit this key. Routed by .agent-src.uncondensed/rules/framework-neutrality-in-generic-skills.md (Tier 2)."
|
|
42
42
|
},
|
|
43
43
|
"personas": {
|
|
44
44
|
"type": "array",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"tier": {
|
|
51
51
|
"type": "string",
|
|
52
52
|
"enum": ["senior"],
|
|
53
|
-
"description": "Optional tier marker. `senior` opts the skill into the Senior-Tier Required Structure check (Context-First lead, Related Skills, Proactive Triggers, Output Artifacts) per .agent-src.
|
|
53
|
+
"description": "Optional tier marker. `senior` opts the skill into the Senior-Tier Required Structure check (Context-First lead, Related Skills, Proactive Triggers, Output Artifacts) per .agent-src.uncondensed/rules/skill-quality.md."
|
|
54
54
|
},
|
|
55
55
|
"meta_skill": {
|
|
56
56
|
"type": "boolean",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"council_depth": {
|
|
75
75
|
"type": "string",
|
|
76
76
|
"enum": ["deep"],
|
|
77
|
-
"description": "Optional reasoning-depth marker for AI Council invocations triggered by this skill. The only accepted value is 'deep'; omit the key for default depth (setting 'standard' is rejected — every frontmatter byte counts against the context window, and 'standard' is the implicit default). 'deep' instructs the host agent to pass --depth deep to council_cli, which floors rounds at max(ai_council.deep_min_rounds, ai_council.min_rounds). Use for architecture, refactoring, or bug-diagnosis skills. See .agent-src.
|
|
77
|
+
"description": "Optional reasoning-depth marker for AI Council invocations triggered by this skill. The only accepted value is 'deep'; omit the key for default depth (setting 'standard' is rejected — every frontmatter byte counts against the context window, and 'standard' is the implicit default). 'deep' instructs the host agent to pass --depth deep to council_cli, which floors rounds at max(ai_council.deep_min_rounds, ai_council.min_rounds). Use for architecture, refactoring, or bug-diagnosis skills. See .agent-src.uncondensed/skills/ai-council/SKILL.md."
|
|
78
78
|
},
|
|
79
79
|
"context_spine": {
|
|
80
80
|
"type": "array",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://github.com/event4u-app/agent-config/scripts/schemas/user-type.schema.json",
|
|
4
4
|
"title": "User-type frontmatter",
|
|
5
|
-
"$comment": "Source: docs/contracts/user-type-schema.md. The runtime review-lens axis seeded under .agent-src.
|
|
5
|
+
"$comment": "Source: docs/contracts/user-type-schema.md. The runtime review-lens axis seeded under .agent-src.uncondensed/user-types/. Distinct from the install-time user-type-axis YAMLs in user-types/ (root) which carry their own user-type-axis.schema.json.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["id", "kind", "description", "version", "source"],
|
|
@@ -36,7 +36,7 @@ import yaml
|
|
|
36
36
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
37
37
|
FIXTURES = REPO_ROOT / "tests" / "fixtures" / "skill_selection" / "fixtures.yml"
|
|
38
38
|
CLUSTERS = REPO_ROOT / "agents" / "reports" / "skill-collision-clusters.json"
|
|
39
|
-
SKILLS_DIR = REPO_ROOT / ".agent-src.
|
|
39
|
+
SKILLS_DIR = REPO_ROOT / ".agent-src.uncondensed" / "skills"
|
|
40
40
|
DEFAULT_OUT = REPO_ROOT / "agents" / "reports" / "skill-selection-accuracy.json"
|
|
41
41
|
|
|
42
42
|
PASS_A = 0.90
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""Skill-collision cluster analysis (Phase 2.2 of step-1-v2-feedback-followup).
|
|
3
3
|
|
|
4
|
-
Walks `.agent-src.
|
|
4
|
+
Walks `.agent-src.uncondensed/skills/<id>/SKILL.md`, extracts the
|
|
5
5
|
`description` frontmatter, computes pairwise keyword overlap, and groups
|
|
6
6
|
high-overlap skill pairs into clusters. The output drives the
|
|
7
7
|
selection-accuracy fixture set defined by council file 05 (Round-3
|
|
@@ -37,7 +37,7 @@ from pathlib import Path
|
|
|
37
37
|
import yaml
|
|
38
38
|
|
|
39
39
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
40
|
-
SKILLS_DIR = REPO_ROOT / ".agent-src.
|
|
40
|
+
SKILLS_DIR = REPO_ROOT / ".agent-src.uncondensed" / "skills"
|
|
41
41
|
OUT_JSON = REPO_ROOT / "agents" / "reports" / "skill-collision-clusters.json"
|
|
42
42
|
|
|
43
43
|
KEYWORD_OVERLAP_THRESHOLD = 0.40
|
package/scripts/skill_linter.py
CHANGED
|
@@ -1214,7 +1214,7 @@ def parse_execution_block(frontmatter: str) -> Optional[dict]:
|
|
|
1214
1214
|
def lint_senior_tier_blocks(text: str) -> List[Issue]:
|
|
1215
1215
|
"""Validate the four required blocks for `tier: senior` skills.
|
|
1216
1216
|
|
|
1217
|
-
Per .agent-src.
|
|
1217
|
+
Per .agent-src.uncondensed/rules/skill-quality.md § Senior-Tier
|
|
1218
1218
|
Required Structure: Context-First lead (description), Related Skills
|
|
1219
1219
|
(with WHEN / WHEN NOT lists), Proactive Triggers, Output Artifacts.
|
|
1220
1220
|
|
|
@@ -1830,7 +1830,7 @@ def lint_persona(path: Path, text: str) -> LintResult:
|
|
|
1830
1830
|
artifact_type="persona",
|
|
1831
1831
|
status="fail",
|
|
1832
1832
|
issues=issues,
|
|
1833
|
-
suggestions=["See .agent-src.
|
|
1833
|
+
suggestions=["See .agent-src.uncondensed/templates/persona.md for the schema"],
|
|
1834
1834
|
)
|
|
1835
1835
|
|
|
1836
1836
|
# Required frontmatter fields
|
|
@@ -1975,7 +1975,7 @@ def lint_usertype(path: Path, text: str) -> LintResult:
|
|
|
1975
1975
|
artifact_type="user-type",
|
|
1976
1976
|
status="fail",
|
|
1977
1977
|
issues=issues,
|
|
1978
|
-
suggestions=[".agent-src.
|
|
1978
|
+
suggestions=[".agent-src.uncondensed/user-types/_template/user-type.md"],
|
|
1979
1979
|
)
|
|
1980
1980
|
|
|
1981
1981
|
# Required keys per docs/contracts/user-type-schema.md § 1.
|
|
@@ -2061,8 +2061,8 @@ def lint_usertype(path: Path, text: str) -> LintResult:
|
|
|
2061
2061
|
def gather_all_candidate_files(root: Path) -> list[Path]:
|
|
2062
2062
|
"""Gather all lintable files across every source root (ADR-017 multi-root).
|
|
2063
2063
|
|
|
2064
|
-
Walks ``artefact_roots()`` (legacy ``.agent-src.
|
|
2065
|
-
``packages/*/.agent-src.
|
|
2064
|
+
Walks ``artefact_roots()`` (legacy ``.agent-src.uncondensed/`` plus every
|
|
2065
|
+
``packages/*/.agent-src.uncondensed/``). Falls back to ``.agent-src/``
|
|
2066
2066
|
only when no source root exists. Skips symlinks to avoid double-counting.
|
|
2067
2067
|
Deduplicates on logical relpath \u2014 first root wins per the agent_src
|
|
2068
2068
|
contract.
|
|
@@ -2106,8 +2106,8 @@ def gather_all_candidate_files(root: Path) -> list[Path]:
|
|
|
2106
2106
|
if charter.exists() and not charter.is_symlink():
|
|
2107
2107
|
_add(charter, src_root)
|
|
2108
2108
|
else:
|
|
2109
|
-
# Pure-
|
|
2110
|
-
# projects that vendor the
|
|
2109
|
+
# Pure-condensed fallback (.agent-src/ only). Used by consumer
|
|
2110
|
+
# projects that vendor the condensed tree without sources.
|
|
2111
2111
|
augment_root = root / ".agent-src"
|
|
2112
2112
|
if augment_root.exists():
|
|
2113
2113
|
for sub_pattern in (
|
|
@@ -2138,7 +2138,7 @@ def gather_candidate_files_under(src_root: Path) -> list[Path]:
|
|
|
2138
2138
|
"""Gather lintable files under an arbitrary source root.
|
|
2139
2139
|
|
|
2140
2140
|
Mirrors the per-root walk used by ``gather_all_candidate_files`` but
|
|
2141
|
-
scoped to a single directory \u2014 e.g. ``packages/pack-laravel/.agent-src.
|
|
2141
|
+
scoped to a single directory \u2014 e.g. ``packages/pack-laravel/.agent-src.uncondensed/``
|
|
2142
2142
|
so CI can lint a single pack in parallel (ADR-017 Phase 4.4).
|
|
2143
2143
|
Skips symlinks and ``README.md`` siblings under ``personas/`` /
|
|
2144
2144
|
``user-types/``.
|
|
@@ -2219,11 +2219,11 @@ def gather_changed_candidate_files(root: Path) -> list[Path]:
|
|
|
2219
2219
|
# tool-native frontmatter (e.g. Windsurf's trigger/globs) that
|
|
2220
2220
|
# the linter does not validate — they regenerate from source.
|
|
2221
2221
|
# ADR-017: accept legacy flat layout AND
|
|
2222
|
-
# packages/*/.agent-src.
|
|
2222
|
+
# packages/*/.agent-src.uncondensed/ paths.
|
|
2223
2223
|
in_source = (
|
|
2224
|
-
norm.startswith(".agent-src.
|
|
2224
|
+
norm.startswith(".agent-src.uncondensed/")
|
|
2225
2225
|
or norm.startswith(".agent-src/")
|
|
2226
|
-
or "/.agent-src.
|
|
2226
|
+
or "/.agent-src.uncondensed/" in norm
|
|
2227
2227
|
or "/.agent-src/" in norm
|
|
2228
2228
|
)
|
|
2229
2229
|
if not in_source:
|
|
@@ -2716,7 +2716,7 @@ def _skill_id_from_path(path: Path) -> Optional[str]:
|
|
|
2716
2716
|
|
|
2717
2717
|
def _is_frugality_charter(path: Path) -> bool:
|
|
2718
2718
|
"""True iff the path ends in the canonical charter relpath, regardless
|
|
2719
|
-
of whether it lives under .agent-src/ or .agent-src.
|
|
2719
|
+
of whether it lives under .agent-src/ or .agent-src.uncondensed/."""
|
|
2720
2720
|
norm = str(path).replace("\\", "/")
|
|
2721
2721
|
return norm.endswith("/" + FRUGALITY_CHARTER_RELPATH)
|
|
2722
2722
|
|
|
@@ -2836,7 +2836,7 @@ def lint_frugality_charter_index(path: Path, text: str) -> List[Issue]:
|
|
|
2836
2836
|
def lint_governance(path: Path, text: str, artifact_type: str, repo_root: Path | None = None) -> List[Issue]:
|
|
2837
2837
|
"""Check governance and packaging consistency.
|
|
2838
2838
|
|
|
2839
|
-
-
|
|
2839
|
+
- Condensed/uncondensed pairs must exist
|
|
2840
2840
|
- No duplicate skill names
|
|
2841
2841
|
- Files must be in correct location for their type
|
|
2842
2842
|
"""
|
|
@@ -2847,44 +2847,44 @@ def lint_governance(path: Path, text: str, artifact_type: str, repo_root: Path |
|
|
|
2847
2847
|
path_str = str(path)
|
|
2848
2848
|
path_relative = path_str
|
|
2849
2849
|
|
|
2850
|
-
# Determine if this is a
|
|
2851
|
-
|
|
2852
|
-
|
|
2850
|
+
# Determine if this is a condensed or uncondensed artifact
|
|
2851
|
+
is_condensed = "/.agent-src/" in path_str and "/.agent-src.uncondensed/" not in path_str
|
|
2852
|
+
is_uncondensed = "/.agent-src.uncondensed/" in path_str
|
|
2853
2853
|
|
|
2854
|
-
if not
|
|
2854
|
+
if not is_condensed and not is_uncondensed:
|
|
2855
2855
|
return issues
|
|
2856
2856
|
|
|
2857
|
-
# --- Check:
|
|
2858
|
-
# ADR-017: sources live under packages/*/.agent-src.
|
|
2857
|
+
# --- Check: condensed/uncondensed pair exists ---
|
|
2858
|
+
# ADR-017: sources live under packages/*/.agent-src.uncondensed/ but
|
|
2859
2859
|
# all packs project into the single repo-root .agent-src/ tree. The
|
|
2860
2860
|
# pair-check now resolves via logical relpath, not a path-swap.
|
|
2861
2861
|
from _lib.agent_src import strip_source_prefix as _strip
|
|
2862
2862
|
norm = path_str.replace("\\", "/")
|
|
2863
|
-
if
|
|
2863
|
+
if is_uncondensed:
|
|
2864
2864
|
# Compute logical path then map to .agent-src/ at repo root.
|
|
2865
2865
|
# Try direct strip first; fall back to substring split for absolute paths.
|
|
2866
2866
|
logical = _strip(norm)
|
|
2867
2867
|
if logical is None:
|
|
2868
|
-
marker = "/.agent-src.
|
|
2868
|
+
marker = "/.agent-src.uncondensed/"
|
|
2869
2869
|
idx = norm.rfind(marker)
|
|
2870
2870
|
logical = norm[idx + len(marker):] if idx != -1 else None
|
|
2871
2871
|
if logical:
|
|
2872
|
-
|
|
2873
|
-
if not
|
|
2874
|
-
issues.append(Issue("warning", "
|
|
2875
|
-
f"
|
|
2876
|
-
f"{
|
|
2877
|
-
elif
|
|
2878
|
-
#
|
|
2872
|
+
condensed_path = repo_root / ".agent-src" / logical
|
|
2873
|
+
if not condensed_path.exists():
|
|
2874
|
+
issues.append(Issue("warning", "condensed_variant_missing",
|
|
2875
|
+
f"Uncondensed file exists but condensed variant missing: "
|
|
2876
|
+
f"{condensed_path.name}"))
|
|
2877
|
+
elif is_condensed:
|
|
2878
|
+
# Condensed lives at repo-root .agent-src/<logical>. Source could
|
|
2879
2879
|
# be at any source root \u2014 resolve via artefact_roots.
|
|
2880
2880
|
marker = "/.agent-src/"
|
|
2881
2881
|
idx = norm.rfind(marker)
|
|
2882
2882
|
logical = norm[idx + len(marker):] if idx != -1 else None
|
|
2883
2883
|
if logical:
|
|
2884
|
-
|
|
2885
|
-
if
|
|
2886
|
-
issues.append(Issue("warning", "
|
|
2887
|
-
f"
|
|
2884
|
+
uncondensed_path = resolve_logical(logical)
|
|
2885
|
+
if uncondensed_path is None or not uncondensed_path.exists():
|
|
2886
|
+
issues.append(Issue("warning", "uncondensed_variant_missing",
|
|
2887
|
+
f"Condensed file exists but uncondensed source missing: "
|
|
2888
2888
|
f"{Path(logical).name}"))
|
|
2889
2889
|
|
|
2890
2890
|
# --- Check: file in correct location for type ---
|
|
@@ -3277,8 +3277,8 @@ def format_json(results: list[LintResult]) -> str:
|
|
|
3277
3277
|
return json.dumps(payload, indent=2, ensure_ascii=False)
|
|
3278
3278
|
|
|
3279
3279
|
|
|
3280
|
-
def
|
|
3281
|
-
"""Check that every
|
|
3280
|
+
def check_condensation_pairs(root: Path) -> list[LintResult]:
|
|
3281
|
+
"""Check that every uncondensed skill/rule/command has a condensed counterpart and vice versa."""
|
|
3282
3282
|
results: list[LintResult] = []
|
|
3283
3283
|
|
|
3284
3284
|
pairs = [
|
|
@@ -3289,78 +3289,78 @@ def check_compression_pairs(root: Path) -> list[LintResult]:
|
|
|
3289
3289
|
|
|
3290
3290
|
for subdir, pattern, is_nested in pairs:
|
|
3291
3291
|
# ADR-017: union across every source root.
|
|
3292
|
-
|
|
3293
|
-
|
|
3292
|
+
condensed_dir = root / ".agent-src" / subdir
|
|
3293
|
+
uncondensed_names: set[str] = set()
|
|
3294
3294
|
any_source = False
|
|
3295
3295
|
for src_root in artefact_roots():
|
|
3296
|
-
|
|
3297
|
-
if not
|
|
3296
|
+
uncondensed_dir = src_root / subdir
|
|
3297
|
+
if not uncondensed_dir.exists():
|
|
3298
3298
|
continue
|
|
3299
3299
|
any_source = True
|
|
3300
3300
|
if is_nested:
|
|
3301
|
-
|
|
3301
|
+
uncondensed_names |= {d.name for d in uncondensed_dir.iterdir() if d.is_dir() and (d / pattern).exists()}
|
|
3302
3302
|
else:
|
|
3303
|
-
|
|
3303
|
+
uncondensed_names |= {f.name for f in uncondensed_dir.glob(pattern) if f.is_file()}
|
|
3304
3304
|
|
|
3305
3305
|
if not any_source:
|
|
3306
3306
|
continue
|
|
3307
3307
|
|
|
3308
|
-
# Collect names from
|
|
3309
|
-
if
|
|
3308
|
+
# Collect names from condensed
|
|
3309
|
+
if condensed_dir.exists():
|
|
3310
3310
|
if is_nested:
|
|
3311
|
-
|
|
3311
|
+
condensed_names = {d.name for d in condensed_dir.iterdir() if d.is_dir() and (d / pattern).exists()}
|
|
3312
3312
|
else:
|
|
3313
|
-
|
|
3313
|
+
condensed_names = {f.name for f in condensed_dir.glob(pattern) if f.is_file()}
|
|
3314
3314
|
else:
|
|
3315
|
-
|
|
3315
|
+
condensed_names = set()
|
|
3316
3316
|
|
|
3317
|
-
# Missing
|
|
3318
|
-
for name in sorted(
|
|
3317
|
+
# Missing condensed
|
|
3318
|
+
for name in sorted(uncondensed_names - condensed_names):
|
|
3319
3319
|
path_str = f".agent-src/{subdir}/{name}/{pattern}" if is_nested else f".agent-src/{subdir}/{name}"
|
|
3320
3320
|
results.append(LintResult(
|
|
3321
3321
|
file=path_str,
|
|
3322
3322
|
artifact_type=subdir.rstrip("s"),
|
|
3323
3323
|
status="fail",
|
|
3324
|
-
issues=[Issue("error", "
|
|
3325
|
-
suggestions=[f"Run /
|
|
3324
|
+
issues=[Issue("error", "missing_condensed", f"Uncondensed exists but condensed version is missing")],
|
|
3325
|
+
suggestions=[f"Run /condense to generate .agent-src/{subdir}/{name}"],
|
|
3326
3326
|
))
|
|
3327
3327
|
|
|
3328
|
-
# Orphaned
|
|
3329
|
-
for name in sorted(
|
|
3328
|
+
# Orphaned condensed (no source)
|
|
3329
|
+
for name in sorted(condensed_names - uncondensed_names):
|
|
3330
3330
|
path_str = f".agent-src/{subdir}/{name}/{pattern}" if is_nested else f".agent-src/{subdir}/{name}"
|
|
3331
3331
|
results.append(LintResult(
|
|
3332
3332
|
file=path_str,
|
|
3333
3333
|
artifact_type=subdir.rstrip("s"),
|
|
3334
3334
|
status="fail",
|
|
3335
|
-
issues=[Issue("error", "
|
|
3336
|
-
suggestions=[f"Delete orphaned file or restore
|
|
3335
|
+
issues=[Issue("error", "orphaned_condensed", f"Condensed exists but uncondensed source is missing")],
|
|
3336
|
+
suggestions=[f"Delete orphaned file or restore uncondensed source"],
|
|
3337
3337
|
))
|
|
3338
3338
|
|
|
3339
3339
|
return results
|
|
3340
3340
|
|
|
3341
3341
|
|
|
3342
|
-
def
|
|
3343
|
-
"""Check that
|
|
3342
|
+
def check_condensation_quality(root: Path) -> list[LintResult]:
|
|
3343
|
+
"""Check that condensed skills preserve key content from their uncondensed source."""
|
|
3344
3344
|
results: list[LintResult] = []
|
|
3345
|
-
|
|
3346
|
-
if not
|
|
3345
|
+
condensed_dir = root / ".agent-src" / "skills"
|
|
3346
|
+
if not condensed_dir.exists():
|
|
3347
3347
|
return results
|
|
3348
3348
|
|
|
3349
3349
|
# ADR-017: collect skill dirs from every source root.
|
|
3350
3350
|
skill_sources: list[Path] = []
|
|
3351
3351
|
for src_root in artefact_roots():
|
|
3352
|
-
|
|
3353
|
-
if
|
|
3354
|
-
skill_sources.extend(sorted(
|
|
3352
|
+
uncondensed_dir = src_root / "skills"
|
|
3353
|
+
if uncondensed_dir.exists():
|
|
3354
|
+
skill_sources.extend(sorted(uncondensed_dir.iterdir()))
|
|
3355
3355
|
if not skill_sources:
|
|
3356
3356
|
return results
|
|
3357
3357
|
|
|
3358
|
-
# Sections that MUST exist in
|
|
3358
|
+
# Sections that MUST exist in condensed if they exist in uncondensed
|
|
3359
3359
|
preserved_sections = ["When to use", "Procedure", "Gotcha", "Gotchas", "Do NOT", "Output format", "Output"]
|
|
3360
3360
|
|
|
3361
3361
|
for skill_dir in skill_sources:
|
|
3362
3362
|
src = skill_dir / "SKILL.md"
|
|
3363
|
-
dst =
|
|
3363
|
+
dst = condensed_dir / skill_dir.name / "SKILL.md"
|
|
3364
3364
|
if not src.exists() or not dst.exists():
|
|
3365
3365
|
continue
|
|
3366
3366
|
|
|
@@ -3372,11 +3372,11 @@ def check_compression_quality(root: Path) -> list[LintResult]:
|
|
|
3372
3372
|
issues: list[Issue] = []
|
|
3373
3373
|
suggestions: list[str] = []
|
|
3374
3374
|
|
|
3375
|
-
# Check required sections survived
|
|
3375
|
+
# Check required sections survived condensation
|
|
3376
3376
|
for section in preserved_sections:
|
|
3377
3377
|
if section_matches(section, src_sections) and not section_matches(section, dst_sections):
|
|
3378
|
-
issues.append(Issue("warning", "
|
|
3379
|
-
f"
|
|
3378
|
+
issues.append(Issue("warning", "condensation_lost_section",
|
|
3379
|
+
f"Condensed version lost '{section}' section"))
|
|
3380
3380
|
|
|
3381
3381
|
# Check validation keywords survived
|
|
3382
3382
|
src_proc = find_procedure_block(src_text) or ""
|
|
@@ -3385,23 +3385,23 @@ def check_compression_quality(root: Path) -> list[LintResult]:
|
|
|
3385
3385
|
src_has_validation = any(re.search(p, src_proc, re.IGNORECASE) for p in validation_patterns)
|
|
3386
3386
|
dst_has_validation = any(re.search(p, dst_proc, re.IGNORECASE) for p in validation_patterns)
|
|
3387
3387
|
if src_has_validation and not dst_has_validation:
|
|
3388
|
-
issues.append(Issue("warning", "
|
|
3389
|
-
"
|
|
3388
|
+
issues.append(Issue("warning", "condensation_lost_validation",
|
|
3389
|
+
"Condensed procedure lost validation keywords present in uncondensed"))
|
|
3390
3390
|
|
|
3391
3391
|
# Check code blocks / examples survived
|
|
3392
3392
|
src_code_blocks = len(re.findall(r"```", src_text)) # pairs of ``` = blocks
|
|
3393
3393
|
dst_code_blocks = len(re.findall(r"```", dst_text))
|
|
3394
3394
|
if src_code_blocks > 0 and dst_code_blocks < src_code_blocks // 2:
|
|
3395
|
-
issues.append(Issue("warning", "
|
|
3396
|
-
f"
|
|
3395
|
+
issues.append(Issue("warning", "condensation_lost_example",
|
|
3396
|
+
f"Condensed version has fewer code blocks "
|
|
3397
3397
|
f"({dst_code_blocks // 2} vs {src_code_blocks // 2} in source)"))
|
|
3398
3398
|
|
|
3399
3399
|
# Check anti-pattern / "Do NOT" bullets survived
|
|
3400
3400
|
src_donot = len(re.findall(r"(?:Do NOT|NEVER|MUST NOT)\b", src_text))
|
|
3401
3401
|
dst_donot = len(re.findall(r"(?:Do NOT|NEVER|MUST NOT)\b", dst_text))
|
|
3402
3402
|
if src_donot > 0 and dst_donot < src_donot // 2:
|
|
3403
|
-
issues.append(Issue("warning", "
|
|
3404
|
-
f"
|
|
3403
|
+
issues.append(Issue("warning", "condensation_lost_antipattern",
|
|
3404
|
+
f"Condensed version lost anti-pattern constraints "
|
|
3405
3405
|
f"({dst_donot} vs {src_donot} in source)"))
|
|
3406
3406
|
|
|
3407
3407
|
if issues:
|
|
@@ -3411,7 +3411,7 @@ def check_compression_quality(root: Path) -> list[LintResult]:
|
|
|
3411
3411
|
artifact_type="skill",
|
|
3412
3412
|
status="pass_with_warnings",
|
|
3413
3413
|
issues=issues,
|
|
3414
|
-
suggestions=suggestions or ["Re-
|
|
3414
|
+
suggestions=suggestions or ["Re-condense to preserve lost content"],
|
|
3415
3415
|
))
|
|
3416
3416
|
|
|
3417
3417
|
return results
|
|
@@ -3458,7 +3458,7 @@ def check_duplication(root: Path) -> list[LintResult]:
|
|
|
3458
3458
|
if len(words_a) > 3 and len(words_b) > 3:
|
|
3459
3459
|
overlap = len(words_a & words_b) / min(len(words_a), len(words_b))
|
|
3460
3460
|
if overlap > 0.7:
|
|
3461
|
-
rel_a = f".agent-src.
|
|
3461
|
+
rel_a = f".agent-src.uncondensed/skills/{name_a}/SKILL.md"
|
|
3462
3462
|
results.append(LintResult(
|
|
3463
3463
|
file=rel_a,
|
|
3464
3464
|
artifact_type="skill",
|
|
@@ -3490,9 +3490,9 @@ def parse_args() -> argparse.Namespace:
|
|
|
3490
3490
|
parser.add_argument("--all", action="store_true", help="Lint all skills/rules in the repo")
|
|
3491
3491
|
parser.add_argument("--changed", action="store_true", help="Lint changed skills/rules")
|
|
3492
3492
|
parser.add_argument("--format", choices=["text", "json"], default="text", help="Output format")
|
|
3493
|
-
parser.add_argument("--pairs", action="store_true", help="Check
|
|
3493
|
+
parser.add_argument("--pairs", action="store_true", help="Check condensation pairs (uncondensed vs condensed)")
|
|
3494
3494
|
parser.add_argument("--duplicates", action="store_true", help="Detect skills with similar descriptions")
|
|
3495
|
-
parser.add_argument("--
|
|
3495
|
+
parser.add_argument("--condensation-quality", action="store_true", help="Check condensed skills preserve key content")
|
|
3496
3496
|
parser.add_argument("--strict-warnings", action="store_true", help="Return non-zero on warnings")
|
|
3497
3497
|
parser.add_argument("--report", action="store_true", help="Output quality score report")
|
|
3498
3498
|
parser.add_argument("--repo-root", default=".", help="Repository root")
|
|
@@ -3562,7 +3562,7 @@ def format_report(results: list[LintResult]) -> str:
|
|
|
3562
3562
|
lines.append("| File | Issues | Status |")
|
|
3563
3563
|
lines.append("|---|---|---|")
|
|
3564
3564
|
for fpath, count, status in files_with_issues[:10]:
|
|
3565
|
-
short = fpath.replace(".agent-src.
|
|
3565
|
+
short = fpath.replace(".agent-src.uncondensed/", "")
|
|
3566
3566
|
lines.append(f"| `{short}` | {count} | {status} |")
|
|
3567
3567
|
|
|
3568
3568
|
# Per-file quality breakdown (skills only)
|
|
@@ -3572,7 +3572,7 @@ def format_report(results: list[LintResult]) -> str:
|
|
|
3572
3572
|
lines.append("| Skill | Structure | Validation | Scope | Dependency | Lines |")
|
|
3573
3573
|
lines.append("|---|---|---|---|---|---|")
|
|
3574
3574
|
for r in sorted(skill_results, key=lambda x: x.file):
|
|
3575
|
-
short = r.file.replace(".agent-src.
|
|
3575
|
+
short = r.file.replace(".agent-src.uncondensed/skills/", "").replace(".agent-src/skills/", "").replace("/SKILL.md", "")
|
|
3576
3576
|
codes = {i.code for i in r.issues}
|
|
3577
3577
|
|
|
3578
3578
|
# Structure: fail if missing required sections
|
|
@@ -3625,7 +3625,7 @@ def main() -> int:
|
|
|
3625
3625
|
continue
|
|
3626
3626
|
if path.is_dir():
|
|
3627
3627
|
# Walk the directory like a source root so callers can pass
|
|
3628
|
-
# `packages/pack-laravel/.agent-src.
|
|
3628
|
+
# `packages/pack-laravel/.agent-src.uncondensed/` (ADR-017 Phase 4.4).
|
|
3629
3629
|
paths.extend(gather_candidate_files_under(path))
|
|
3630
3630
|
else:
|
|
3631
3631
|
paths.append(path)
|
|
@@ -3646,11 +3646,11 @@ def main() -> int:
|
|
|
3646
3646
|
|
|
3647
3647
|
# Additional checks
|
|
3648
3648
|
if args.pairs or args.report:
|
|
3649
|
-
results.extend(
|
|
3649
|
+
results.extend(check_condensation_pairs(root))
|
|
3650
3650
|
if args.duplicates:
|
|
3651
3651
|
results.extend(check_duplication(root))
|
|
3652
|
-
if args.
|
|
3653
|
-
results.extend(
|
|
3652
|
+
if args.condensation_quality or args.report:
|
|
3653
|
+
results.extend(check_condensation_quality(root))
|
|
3654
3654
|
|
|
3655
3655
|
if args.report:
|
|
3656
3656
|
print(format_report(results))
|
package/scripts/skill_overlap.py
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
|
|
4
4
|
Implements step-2-skill-inventory-rationalization.md Phase 2 Step 2.
|
|
5
5
|
Mirrors `scripts/audit_overlap.py` (the rule-side analog) but reads
|
|
6
|
-
`.agent-src.
|
|
6
|
+
`.agent-src.uncondensed/skills/<slug>/SKILL.md` frontmatter directly
|
|
7
7
|
and emits `agents/runtime/metrics/skill-overlap.md` listing pairs scoring
|
|
8
8
|
≥ 0.6 on either:
|
|
9
9
|
|
|
10
10
|
- description-trigger Jaccard (tokenized union of `description` +
|
|
11
11
|
any `triggers:` / `keywords:` / `intents:` frontmatter values);
|
|
12
12
|
- symbol-set overlap (paths cited inside the SKILL.md body —
|
|
13
|
-
`.agent-src.
|
|
13
|
+
`.agent-src.uncondensed/...`, `agents/...`, `scripts/...`).
|
|
14
14
|
|
|
15
15
|
The 0.6 threshold matches the roadmap; the rule-side script uses
|
|
16
16
|
lower thresholds because rules have richer trigger metadata. Skills
|
|
@@ -28,7 +28,7 @@ from itertools import combinations
|
|
|
28
28
|
from pathlib import Path
|
|
29
29
|
|
|
30
30
|
REPO = Path(__file__).resolve().parent.parent
|
|
31
|
-
SKILLS = REPO / ".agent-src.
|
|
31
|
+
SKILLS = REPO / ".agent-src.uncondensed" / "skills"
|
|
32
32
|
OUT = REPO / "agents" / "metrics" / "skill-overlap.md"
|
|
33
33
|
|
|
34
34
|
# Roadmap target. Empirical calibration (210 skills, 2026-05-16) shows
|
|
@@ -56,7 +56,7 @@ STOPWORDS = {
|
|
|
56
56
|
"command", "commands", "guideline", "guidelines",
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
PATH_RE = re.compile(r"`?(?:\.agent-src(?:\.
|
|
59
|
+
PATH_RE = re.compile(r"`?(?:\.agent-src(?:\.uncondensed)?|agents|scripts|docs|tests|\.augment|\.claude)/[A-Za-z0-9_./-]+`?")
|
|
60
60
|
TOKEN_RE = re.compile(r"[A-Za-z][A-Za-z0-9_-]{2,}")
|
|
61
61
|
|
|
62
62
|
|
|
@@ -155,7 +155,7 @@ def render(pairs: list[dict], total: int) -> str:
|
|
|
155
155
|
"# Skill Structural Overlap (baseline)",
|
|
156
156
|
"",
|
|
157
157
|
"> Generated by `scripts/skill_overlap.py`. Scans",
|
|
158
|
-
"> `.agent-src.
|
|
158
|
+
"> `.agent-src.uncondensed/skills/*/SKILL.md` frontmatter (description +",
|
|
159
159
|
"> trigger metadata) and body symbol references. Reports pairs in two",
|
|
160
160
|
f"> tiers: **strong** ≥ {STRONG_TOKEN} description-token Jaccard or ≥ {STRONG_SYMBOL}",
|
|
161
161
|
f"> symbol-set Jaccard (roadmap floor); **candidate** ≥ {CANDIDATE_TOKEN} / ≥ {CANDIDATE_SYMBOL}",
|
|
@@ -28,8 +28,8 @@ from pathlib import Path
|
|
|
28
28
|
from typing import Dict, List
|
|
29
29
|
|
|
30
30
|
ROOT = Path(__file__).resolve().parents[2]
|
|
31
|
-
DEFAULT_SKILLS = ROOT / ".agent-src.
|
|
32
|
-
DEFAULT_PERSONAS = ROOT / ".agent-src.
|
|
31
|
+
DEFAULT_SKILLS = ROOT / ".agent-src.uncondensed" / "skills"
|
|
32
|
+
DEFAULT_PERSONAS = ROOT / ".agent-src.uncondensed" / "personas"
|
|
33
33
|
THRESHOLDS = {"core": 5, "specialist": 3}
|
|
34
34
|
|
|
35
35
|
|