@event4u/agent-config 3.3.0 → 4.1.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 +181 -3
- package/CONTRIBUTING.md +31 -12
- package/README.md +18 -10
- 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/apply.js +238 -0
- package/dist/install/apply.js.map +1 -0
- package/dist/install/atomic.js +92 -0
- package/dist/install/atomic.js.map +1 -0
- package/dist/install/bridges/augment.js +20 -0
- package/dist/install/bridges/augment.js.map +1 -0
- package/dist/install/bridges/claude.js +44 -0
- package/dist/install/bridges/claude.js.map +1 -0
- package/dist/install/bridges/cline.js +69 -0
- package/dist/install/bridges/cline.js.map +1 -0
- package/dist/install/bridges/copilot.js +28 -0
- package/dist/install/bridges/copilot.js.map +1 -0
- package/dist/install/bridges/cursor.js +34 -0
- package/dist/install/bridges/cursor.js.map +1 -0
- package/dist/install/bridges/gemini.js +39 -0
- package/dist/install/bridges/gemini.js.map +1 -0
- package/dist/install/bridges/index.js +88 -0
- package/dist/install/bridges/index.js.map +1 -0
- package/dist/install/bridges/marker-content.js +153 -0
- package/dist/install/bridges/marker-content.js.map +1 -0
- package/dist/install/bridges/markers.js +42 -0
- package/dist/install/bridges/markers.js.map +1 -0
- package/dist/install/bridges/types.js +31 -0
- package/dist/install/bridges/types.js.map +1 -0
- package/dist/install/bridges/vscode.js +26 -0
- package/dist/install/bridges/vscode.js.map +1 -0
- package/dist/install/bridges/windsurf.js +35 -0
- package/dist/install/bridges/windsurf.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 +547 -0
- package/dist/server/routes/install.js.map +1 -0
- package/dist/server/routes/wizard.js +301 -6
- 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 +4 -3
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/ui/assets/index-BXZILUxe.css +1 -0
- package/dist/ui/assets/index-DLEuEW1V.js +35 -0
- package/dist/ui/assets/index-DLEuEW1V.js.map +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 +1 -1
- 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 +1 -1
- 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/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 +76 -11
- 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 +144 -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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
Two storage tiers exist (see docs/contracts/ghostwriter-schema.md):
|
|
5
5
|
|
|
6
|
-
* .agent-src.
|
|
6
|
+
* .agent-src.uncondensed/ghostwriter/ — package source. Ships
|
|
7
7
|
fictional fixtures ONLY (`fictional: true`). Every file stem must
|
|
8
8
|
be on scripts/ghostwriter_fixture_allowlist.txt. `aliases:` is
|
|
9
9
|
forbidden here (consumer-only feature).
|
|
@@ -28,7 +28,7 @@ import yaml
|
|
|
28
28
|
QUIET = "--quiet" in sys.argv
|
|
29
29
|
|
|
30
30
|
REPO = Path(__file__).resolve().parents[1]
|
|
31
|
-
PACKAGE_DIR = REPO / ".agent-src.
|
|
31
|
+
PACKAGE_DIR = REPO / ".agent-src.uncondensed" / "ghostwriter"
|
|
32
32
|
CONSUMER_DIR = REPO / "agents" / "ghostwriter"
|
|
33
33
|
ALLOWLIST = REPO / "scripts" / "ghostwriter_fixture_allowlist.txt"
|
|
34
34
|
EXEMPT_STEMS = frozenset({"README"})
|
|
@@ -159,7 +159,7 @@ def lint_consumer_side() -> list[str]:
|
|
|
159
159
|
if data.get("fictional") is True:
|
|
160
160
|
errors.append(
|
|
161
161
|
f" 'fictional: true' in consumer tree: {path.relative_to(REPO)} "
|
|
162
|
-
f"— fictional fixtures belong in .agent-src.
|
|
162
|
+
f"— fictional fixtures belong in .agent-src.uncondensed/ghostwriter/"
|
|
163
163
|
)
|
|
164
164
|
|
|
165
165
|
aliases = data.get("aliases")
|
package/scripts/lint_handoffs.py
CHANGED
|
@@ -27,7 +27,7 @@ from typing import Iterable
|
|
|
27
27
|
QUIET = "--quiet" in sys.argv
|
|
28
28
|
|
|
29
29
|
REPO = Path(__file__).resolve().parents[1]
|
|
30
|
-
SKILLS_DIR = REPO / ".agent-src.
|
|
30
|
+
SKILLS_DIR = REPO / ".agent-src.uncondensed" / "skills"
|
|
31
31
|
|
|
32
32
|
LINK_RE = re.compile(r"\[`?([a-z0-9][a-z0-9-]*)`?\]\(([^)]+SKILL\.md)\)")
|
|
33
33
|
RELATED_HEADING_RE = re.compile(r"^##\s+Related\s+Skills\s*$", re.IGNORECASE)
|
|
@@ -24,37 +24,37 @@ QUIET = "--quiet" in sys.argv
|
|
|
24
24
|
ROOT = Path(__file__).resolve().parent.parent
|
|
25
25
|
|
|
26
26
|
SCAN_DIRS = [
|
|
27
|
-
ROOT / ".agent-src.
|
|
28
|
-
ROOT / ".agent-src.
|
|
27
|
+
ROOT / ".agent-src.uncondensed" / "rules",
|
|
28
|
+
ROOT / ".agent-src.uncondensed" / "contexts",
|
|
29
29
|
ROOT / "agents" / "contexts",
|
|
30
30
|
]
|
|
31
31
|
|
|
32
32
|
ALLOWED_PREFIXES = (
|
|
33
33
|
"contexts/", # logical name (canonical — P1.1 / P5.3)
|
|
34
|
-
".agent-src/contexts/", # projected (defensive — only seen in
|
|
34
|
+
".agent-src/contexts/", # projected (defensive — only seen in condensed inputs)
|
|
35
35
|
"agents/settings/contexts/", # project-local
|
|
36
36
|
)
|
|
37
37
|
|
|
38
|
-
# `.agent-src.
|
|
38
|
+
# `.agent-src.uncondensed/contexts/` was the legacy fully-qualified form
|
|
39
39
|
# (pre road-to-path-fixes.md P5.3). It is now a hard error: P2.1 migrated
|
|
40
40
|
# all in-tree rules to logical names, the rewriter resolves them at
|
|
41
|
-
#
|
|
41
|
+
# condense time, and the schema regex in `scripts/schemas/rule.schema.json`
|
|
42
42
|
# rejects the prefix at validate-schema time. Keeping a separate runtime
|
|
43
43
|
# diagnostic so the failure points authors at the canonical
|
|
44
44
|
# `contexts/<area>/<file>.md` form rather than a generic schema mismatch.
|
|
45
|
-
LEGACY_PREFIX = ".agent-src.
|
|
45
|
+
LEGACY_PREFIX = ".agent-src.uncondensed/contexts/"
|
|
46
46
|
|
|
47
47
|
# Logical names resolve against the source root.
|
|
48
|
-
SOURCE_ROOT = ROOT / ".agent-src.
|
|
48
|
+
SOURCE_ROOT = ROOT / ".agent-src.uncondensed"
|
|
49
49
|
|
|
50
|
-
PUBLIC_RULE_PREFIX = ".agent-src.
|
|
50
|
+
PUBLIC_RULE_PREFIX = ".agent-src.uncondensed/rules/"
|
|
51
51
|
PROJECT_LOCAL_PREFIX = "agents/settings/contexts/"
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
def resolve_entry(entry: str) -> Path:
|
|
55
55
|
"""Resolve a `load_context:` entry to an absolute path on disk.
|
|
56
56
|
|
|
57
|
-
Logical names (`contexts/...`) live under `.agent-src.
|
|
57
|
+
Logical names (`contexts/...`) live under `.agent-src.uncondensed/`;
|
|
58
58
|
fully-qualified entries are repo-root-relative.
|
|
59
59
|
"""
|
|
60
60
|
if entry.startswith("contexts/"):
|
|
@@ -152,9 +152,9 @@ def main() -> int:
|
|
|
152
152
|
errors.append(f"{rel(f)}: entry not str ending in .md → {entry!r}")
|
|
153
153
|
continue
|
|
154
154
|
if entry.startswith(LEGACY_PREFIX):
|
|
155
|
-
logical = entry[len(".agent-src.
|
|
155
|
+
logical = entry[len(".agent-src.uncondensed/"):]
|
|
156
156
|
errors.append(
|
|
157
|
-
f"{rel(f)}: legacy `.agent-src.
|
|
157
|
+
f"{rel(f)}: legacy `.agent-src.uncondensed/` prefix in load_context → {entry} "
|
|
158
158
|
f"— use logical name `{logical}` instead (road-to-path-fixes.md P5.3)"
|
|
159
159
|
)
|
|
160
160
|
continue
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
Every policy file under `agents/settings/policies/media/` (except README) must
|
|
5
5
|
be linked from at least one of:
|
|
6
6
|
|
|
7
|
-
* a skill SKILL.md (any .agent-src.
|
|
7
|
+
* a skill SKILL.md (any .agent-src.uncondensed/skills/*/SKILL.md
|
|
8
8
|
or .claude/skills/*/SKILL.md),
|
|
9
|
-
* a routing rule under .agent-src.
|
|
9
|
+
* a routing rule under .agent-src.uncondensed/rules/, or
|
|
10
10
|
* a sibling policy file under agents/settings/policies/media/.
|
|
11
11
|
|
|
12
12
|
A policy that no surface references is a silent policy and a silent
|
|
@@ -31,9 +31,9 @@ EXEMPT_STEMS = frozenset({"README"})
|
|
|
31
31
|
|
|
32
32
|
# Surfaces scanned for inbound references to policy files.
|
|
33
33
|
SCAN_ROOTS: tuple[Path, ...] = (
|
|
34
|
-
REPO / ".agent-src.
|
|
35
|
-
REPO / ".agent-src.
|
|
36
|
-
REPO / ".agent-src.
|
|
34
|
+
REPO / ".agent-src.uncondensed" / "skills",
|
|
35
|
+
REPO / ".agent-src.uncondensed" / "rules",
|
|
36
|
+
REPO / ".agent-src.uncondensed" / "commands",
|
|
37
37
|
REPO / ".claude" / "skills",
|
|
38
38
|
REPO / "agents" / "policies" / "media",
|
|
39
39
|
)
|
|
@@ -10,7 +10,7 @@ import argparse, re, sys
|
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
12
|
ROOT = Path(__file__).resolve().parent.parent
|
|
13
|
-
SRC = ROOT / ".agent-src.
|
|
13
|
+
SRC = ROOT / ".agent-src.uncondensed"
|
|
14
14
|
|
|
15
15
|
# Source-of-truth regex; mirrored in docs/contracts/namespace.md § 1.
|
|
16
16
|
NAME_RE = re.compile(r"^[a-z][a-z0-9]*(-[a-z0-9]+)*$")
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Atomic-command linter for the command-collapse policy.
|
|
4
4
|
|
|
5
5
|
Reads the locked verb clusters from `docs/contracts/command-clusters.md`,
|
|
6
|
-
finds every command file under `.agent-src.
|
|
6
|
+
finds every command file under `.agent-src.uncondensed/commands/` that
|
|
7
7
|
was **added** since `--baseline` (default: `main`), and requires each
|
|
8
8
|
new file to declare either:
|
|
9
9
|
|
|
@@ -32,7 +32,7 @@ from dataclasses import dataclass
|
|
|
32
32
|
from pathlib import Path
|
|
33
33
|
|
|
34
34
|
ROOT = Path(__file__).resolve().parent.parent
|
|
35
|
-
COMMANDS_DIR = Path(".agent-src.
|
|
35
|
+
COMMANDS_DIR = Path(".agent-src.uncondensed/commands")
|
|
36
36
|
CLUSTER_CONTRACT = Path("docs/contracts/command-clusters.md")
|
|
37
37
|
|
|
38
38
|
|
|
@@ -47,7 +47,7 @@ MAX_STEPS = 32
|
|
|
47
47
|
MIN_STEPS = 1
|
|
48
48
|
|
|
49
49
|
# Subagent-orchestration modes — kept in lock-step with
|
|
50
|
-
# .agent-src.
|
|
50
|
+
# .agent-src.uncondensed/skills/subagent-orchestration/SKILL.md.
|
|
51
51
|
SUBAGENT_MODES = {
|
|
52
52
|
"do-and-judge", "do-and-judge-two-stage",
|
|
53
53
|
"do-in-steps", "do-in-parallel", "do-in-worktrees",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""Enforce cross-pack reference boundaries.
|
|
3
3
|
|
|
4
4
|
Phase 4.4 of the monorepo migration (ADR-017). Walks every markdown
|
|
5
|
-
link in every artefact under ``packages/*/.agent-src.
|
|
5
|
+
link in every artefact under ``packages/*/.agent-src.uncondensed/``
|
|
6
6
|
and verifies the link target's pack is either the same pack, ``core``
|
|
7
7
|
(always allowed), or listed in the source pack's ``requires``.
|
|
8
8
|
|
|
@@ -46,7 +46,7 @@ def _build_artefact_index() -> dict[str, str]:
|
|
|
46
46
|
for pkg in sorted(PACKAGES.iterdir()):
|
|
47
47
|
if not pkg.is_dir():
|
|
48
48
|
continue
|
|
49
|
-
src_root = pkg / ".agent-src.
|
|
49
|
+
src_root = pkg / ".agent-src.uncondensed"
|
|
50
50
|
if not src_root.is_dir():
|
|
51
51
|
continue
|
|
52
52
|
pid = _load_pack_meta(pkg).get("id") or pkg.name.removeprefix("pack-")
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""Lint persona governance — per-domain cap (hard) + citation floor (warn).
|
|
3
3
|
|
|
4
4
|
Enforces the mechanical checks in
|
|
5
|
-
`.agent-src.
|
|
5
|
+
`.agent-src.uncondensed/rules/persona-governance.md`:
|
|
6
6
|
|
|
7
7
|
1. **Per-domain cap (HARD)** — ≤ 2 active specialist personas per
|
|
8
8
|
content domain. Core-tier personas are exempt. `status:
|
|
@@ -11,7 +11,7 @@ Enforces the mechanical checks in
|
|
|
11
11
|
deletion, no soak window.
|
|
12
12
|
2. **Skill citation floor (WARN)** — every active specialist
|
|
13
13
|
persona SHOULD be cited by `personas: [<id>]` in at least one
|
|
14
|
-
skill SKILL.md under `.agent-src.
|
|
14
|
+
skill SKILL.md under `.agent-src.uncondensed/skills/` or
|
|
15
15
|
`.claude/skills/`. Surfaced as a warning, never blocks CI:
|
|
16
16
|
the citation floor is enforced at PR time per the rule (a new
|
|
17
17
|
specialist MUST land with a cite); pre-existing wiring debt is
|
|
@@ -39,9 +39,9 @@ from pathlib import Path
|
|
|
39
39
|
QUIET = "--quiet" in sys.argv
|
|
40
40
|
|
|
41
41
|
REPO = Path(__file__).resolve().parents[1]
|
|
42
|
-
PERSONA_DIR = REPO / ".agent-src.
|
|
42
|
+
PERSONA_DIR = REPO / ".agent-src.uncondensed" / "personas"
|
|
43
43
|
SKILL_ROOTS: tuple[Path, ...] = (
|
|
44
|
-
REPO / ".agent-src.
|
|
44
|
+
REPO / ".agent-src.uncondensed" / "skills",
|
|
45
45
|
REPO / ".claude" / "skills",
|
|
46
46
|
)
|
|
47
47
|
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Linter for ``agents/roles/<slug>/`` role experiences.
|
|
3
|
+
|
|
4
|
+
Asserts the structural floor pinned in
|
|
5
|
+
``docs/contracts/role-experience.md``:
|
|
6
|
+
|
|
7
|
+
1. Every role directory has ``index.md`` + ``skills.yml``.
|
|
8
|
+
2. ``index.md`` carries all required frontmatter keys (``role``,
|
|
9
|
+
``display_name``, ``tagline``, ``recommended_packs``,
|
|
10
|
+
``install_path_hint``, ``recruit_session_ref``, ``status``).
|
|
11
|
+
3. ``index.md`` body declares at least three first tasks (per
|
|
12
|
+
``## Three first tasks`` heading + numbered list).
|
|
13
|
+
4. ``prompts/`` contains at least five prompts (per the roadmap's
|
|
14
|
+
Phase B Step 6 acceptance — ``≥ 5 prompts per role``).
|
|
15
|
+
5. Every prompt under ``prompts/<name>.md`` carries the four
|
|
16
|
+
required frontmatter keys (``name``, ``intent``, ``inputs``,
|
|
17
|
+
``output_shape``) plus ``skill_hint``.
|
|
18
|
+
6. Every ``skills.yml`` skill ``id`` resolves to an existing skill
|
|
19
|
+
under ``.agent-src.uncondensed/skills/<id>/`` or
|
|
20
|
+
``.agent-src/skills/<id>/`` (condensed projection counts).
|
|
21
|
+
|
|
22
|
+
The roadmap step is intentionally opt-in for CI — the existing
|
|
23
|
+
``task ci`` wiring is the caller's concern; this script is the
|
|
24
|
+
mechanical floor it can wrap.
|
|
25
|
+
|
|
26
|
+
Phase B Step 6 of ``road-to-frictionless-employee-workspace.md``.
|
|
27
|
+
Adds a ``--plain-language`` mode for Phase C Step 5 that scans the
|
|
28
|
+
role indices for jargon listed in
|
|
29
|
+
``docs/contracts/plain-language-surface.md`` and flags any hit.
|
|
30
|
+
"""
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import argparse
|
|
34
|
+
import re
|
|
35
|
+
import sys
|
|
36
|
+
from pathlib import Path
|
|
37
|
+
|
|
38
|
+
import yaml
|
|
39
|
+
|
|
40
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
41
|
+
ROLES_DIR = ROOT / "agents" / "roles"
|
|
42
|
+
SKILL_SOURCES = [
|
|
43
|
+
ROOT / ".agent-src.uncondensed" / "skills",
|
|
44
|
+
ROOT / ".agent-src" / "skills",
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
REQUIRED_INDEX_KEYS = {
|
|
48
|
+
"role",
|
|
49
|
+
"display_name",
|
|
50
|
+
"tagline",
|
|
51
|
+
"recommended_packs",
|
|
52
|
+
"install_path_hint",
|
|
53
|
+
"recruit_session_ref",
|
|
54
|
+
"status",
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
REQUIRED_PROMPT_KEYS = {"name", "intent", "inputs", "output_shape", "skill_hint"}
|
|
58
|
+
|
|
59
|
+
MIN_FIRST_TASKS = 3
|
|
60
|
+
MIN_PROMPTS_PER_ROLE = 5
|
|
61
|
+
|
|
62
|
+
FRONTMATTER_RE = re.compile(r"^---\r?\n(.*?)\r?\n---\r?\n", re.DOTALL)
|
|
63
|
+
TASK_HEADING_RE = re.compile(r"^## Three first tasks\s*$", re.MULTILINE)
|
|
64
|
+
TASK_ITEM_RE = re.compile(r"^\s*\d+\.\s+\*\*[^*]+\*\*", re.MULTILINE)
|
|
65
|
+
|
|
66
|
+
# Jargon list mirrors docs/contracts/plain-language-surface.md.
|
|
67
|
+
PLAIN_LANGUAGE_JARGON = [
|
|
68
|
+
"council",
|
|
69
|
+
"trust level",
|
|
70
|
+
"pack",
|
|
71
|
+
"orchestration",
|
|
72
|
+
"contract",
|
|
73
|
+
"advisory",
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def parse_frontmatter(text: str) -> tuple[dict, str]:
|
|
78
|
+
m = FRONTMATTER_RE.match(text)
|
|
79
|
+
if m is None:
|
|
80
|
+
return {}, text
|
|
81
|
+
try:
|
|
82
|
+
loaded = yaml.safe_load(m.group(1)) or {}
|
|
83
|
+
except yaml.YAMLError:
|
|
84
|
+
return {}, text[m.end():]
|
|
85
|
+
if not isinstance(loaded, dict):
|
|
86
|
+
return {}, text[m.end():]
|
|
87
|
+
return loaded, text[m.end():]
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def count_first_tasks(body: str) -> int:
|
|
91
|
+
heading_match = TASK_HEADING_RE.search(body)
|
|
92
|
+
if heading_match is None:
|
|
93
|
+
return 0
|
|
94
|
+
# Slice from heading to the next "## " heading (or end of file).
|
|
95
|
+
after = body[heading_match.end():]
|
|
96
|
+
next_section = re.search(r"^## ", after, re.MULTILINE)
|
|
97
|
+
section = after[: next_section.start()] if next_section else after
|
|
98
|
+
return len(TASK_ITEM_RE.findall(section))
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def all_skills() -> set[str]:
|
|
102
|
+
found: set[str] = set()
|
|
103
|
+
for src in SKILL_SOURCES:
|
|
104
|
+
if not src.exists():
|
|
105
|
+
continue
|
|
106
|
+
for child in src.iterdir():
|
|
107
|
+
if child.is_dir():
|
|
108
|
+
found.add(child.name)
|
|
109
|
+
return found
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def lint_role(role_dir: Path, known_skills: set[str], failures: list[str]) -> None:
|
|
113
|
+
slug = role_dir.name
|
|
114
|
+
if slug.startswith(("_", ".")):
|
|
115
|
+
return
|
|
116
|
+
|
|
117
|
+
index_path = role_dir / "index.md"
|
|
118
|
+
skills_path = role_dir / "skills.yml"
|
|
119
|
+
|
|
120
|
+
if not index_path.exists():
|
|
121
|
+
failures.append(f"{role_dir}: missing index.md")
|
|
122
|
+
return
|
|
123
|
+
if not skills_path.exists():
|
|
124
|
+
failures.append(f"{role_dir}: missing skills.yml")
|
|
125
|
+
return
|
|
126
|
+
|
|
127
|
+
fm, body = parse_frontmatter(index_path.read_text(encoding="utf-8"))
|
|
128
|
+
missing_keys = REQUIRED_INDEX_KEYS - set(fm)
|
|
129
|
+
if missing_keys:
|
|
130
|
+
failures.append(
|
|
131
|
+
f"{index_path}: missing frontmatter keys: {sorted(missing_keys)}"
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
first_tasks = count_first_tasks(body)
|
|
135
|
+
if first_tasks < MIN_FIRST_TASKS:
|
|
136
|
+
failures.append(
|
|
137
|
+
f"{index_path}: requires ≥ {MIN_FIRST_TASKS} first tasks, found {first_tasks}"
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
prompts_dir = role_dir / "prompts"
|
|
141
|
+
prompts = sorted(prompts_dir.glob("*.md")) if prompts_dir.exists() else []
|
|
142
|
+
if len(prompts) < MIN_PROMPTS_PER_ROLE:
|
|
143
|
+
failures.append(
|
|
144
|
+
f"{role_dir}: requires ≥ {MIN_PROMPTS_PER_ROLE} prompts in prompts/, "
|
|
145
|
+
f"found {len(prompts)}"
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
for prompt_path in prompts:
|
|
149
|
+
prompt_fm, _ = parse_frontmatter(prompt_path.read_text(encoding="utf-8"))
|
|
150
|
+
missing = REQUIRED_PROMPT_KEYS - set(prompt_fm)
|
|
151
|
+
if missing:
|
|
152
|
+
failures.append(
|
|
153
|
+
f"{prompt_path}: missing frontmatter keys: {sorted(missing)}"
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
try:
|
|
157
|
+
skills_doc = yaml.safe_load(skills_path.read_text(encoding="utf-8")) or {}
|
|
158
|
+
except yaml.YAMLError as exc:
|
|
159
|
+
failures.append(f"{skills_path}: malformed YAML ({exc})")
|
|
160
|
+
return
|
|
161
|
+
skill_entries = skills_doc.get("skills", [])
|
|
162
|
+
if not isinstance(skill_entries, list):
|
|
163
|
+
failures.append(f"{skills_path}: `skills:` must be a list")
|
|
164
|
+
return
|
|
165
|
+
for entry in skill_entries:
|
|
166
|
+
if not isinstance(entry, dict):
|
|
167
|
+
failures.append(f"{skills_path}: skill entry is not a mapping: {entry!r}")
|
|
168
|
+
continue
|
|
169
|
+
skill_id = entry.get("id")
|
|
170
|
+
if not isinstance(skill_id, str):
|
|
171
|
+
failures.append(f"{skills_path}: skill entry missing `id`: {entry!r}")
|
|
172
|
+
continue
|
|
173
|
+
if known_skills and skill_id not in known_skills:
|
|
174
|
+
failures.append(
|
|
175
|
+
f"{skills_path}: skill `{skill_id}` does not resolve to an existing skill"
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def lint_plain_language(failures: list[str]) -> None:
|
|
180
|
+
"""Scan each role's index.md for the six jargon terms; flag hits.
|
|
181
|
+
|
|
182
|
+
Skipped sections: frontmatter, fenced code blocks. Role-experience
|
|
183
|
+
index files are the non-developer surface and must not leak the
|
|
184
|
+
package's internal vocabulary.
|
|
185
|
+
"""
|
|
186
|
+
for role_dir in sorted(ROLES_DIR.iterdir()):
|
|
187
|
+
if not role_dir.is_dir() or role_dir.name.startswith(("_", ".")):
|
|
188
|
+
continue
|
|
189
|
+
index_path = role_dir / "index.md"
|
|
190
|
+
if not index_path.exists():
|
|
191
|
+
continue
|
|
192
|
+
_, body = parse_frontmatter(index_path.read_text(encoding="utf-8"))
|
|
193
|
+
# Strip fenced code blocks.
|
|
194
|
+
body_stripped = re.sub(r"```[\s\S]*?```", "", body)
|
|
195
|
+
for term in PLAIN_LANGUAGE_JARGON:
|
|
196
|
+
pattern = re.compile(rf"\b{re.escape(term)}\b", re.IGNORECASE)
|
|
197
|
+
if pattern.search(body_stripped):
|
|
198
|
+
failures.append(
|
|
199
|
+
f"{index_path}: contains the jargon term `{term}` "
|
|
200
|
+
f"(see docs/contracts/plain-language-surface.md)"
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def main(argv: list[str] | None = None) -> int:
|
|
205
|
+
parser = argparse.ArgumentParser(prog="lint_role_experiences")
|
|
206
|
+
parser.add_argument(
|
|
207
|
+
"--plain-language",
|
|
208
|
+
action="store_true",
|
|
209
|
+
help="Additionally scan role indices for jargon listed in "
|
|
210
|
+
"docs/contracts/plain-language-surface.md.",
|
|
211
|
+
)
|
|
212
|
+
args = parser.parse_args(argv)
|
|
213
|
+
|
|
214
|
+
if not ROLES_DIR.exists():
|
|
215
|
+
print(f"lint_role_experiences: roles dir not found at {ROLES_DIR}")
|
|
216
|
+
return 0
|
|
217
|
+
|
|
218
|
+
known_skills = all_skills()
|
|
219
|
+
failures: list[str] = []
|
|
220
|
+
for role_dir in sorted(ROLES_DIR.iterdir()):
|
|
221
|
+
if role_dir.is_dir():
|
|
222
|
+
lint_role(role_dir, known_skills, failures)
|
|
223
|
+
|
|
224
|
+
if args.plain_language:
|
|
225
|
+
lint_plain_language(failures)
|
|
226
|
+
|
|
227
|
+
if failures:
|
|
228
|
+
for f in failures:
|
|
229
|
+
print(f"❌ {f}")
|
|
230
|
+
print(f"\nlint_role_experiences: {len(failures)} failure(s)")
|
|
231
|
+
return 1
|
|
232
|
+
print("✅ lint_role_experiences: all role experiences pass")
|
|
233
|
+
return 0
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
if __name__ == "__main__":
|
|
237
|
+
sys.exit(main())
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
Validates:
|
|
5
5
|
- Schema (required fields per pair)
|
|
6
|
-
- All rule slugs in `rules:` exist as `.agent-src.
|
|
6
|
+
- All rule slugs in `rules:` exist as `.agent-src.uncondensed/rules/<slug>.md`
|
|
7
7
|
- Every pair references rules listed in the top-level `rules:` block
|
|
8
8
|
- `relation` is one of the allowed values
|
|
9
9
|
- All `evidence:` entries point at real files (anchors are advisory, not checked)
|
|
@@ -38,7 +38,7 @@ def _rule_exists(slug: str) -> bool:
|
|
|
38
38
|
def _evidence_exists(file_part: str) -> bool:
|
|
39
39
|
"""Return True if the evidence path resolves under any source root.
|
|
40
40
|
|
|
41
|
-
Accepts legacy ``.agent-src.
|
|
41
|
+
Accepts legacy ``.agent-src.uncondensed/...`` citations and resolves
|
|
42
42
|
them through the multi-root layout; falls back to a literal repo
|
|
43
43
|
path check for non-source citations (docs/, agents/, ...).
|
|
44
44
|
"""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""Lint rule frontmatter for the `tier:` key.
|
|
3
3
|
|
|
4
|
-
Hard-fails CI if any rule under .agent-src.
|
|
4
|
+
Hard-fails CI if any rule under .agent-src.uncondensed/rules/ lacks a
|
|
5
5
|
`tier:` declaration or uses an unknown tier value. The valid tier set is
|
|
6
6
|
locked by agents/settings/contexts/hardening-pattern.md and the matrix in
|
|
7
7
|
agents/settings/contexts/rule-trigger-matrix.md.
|
|
@@ -33,7 +33,7 @@ COMPILED_SRC = ROOT / ".agent-src"
|
|
|
33
33
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
34
34
|
from _lib.agent_src import strip_source_prefix # noqa: E402
|
|
35
35
|
|
|
36
|
-
# Imported lazily inside _banner_marker() to keep the cap loose if
|
|
36
|
+
# Imported lazily inside _banner_marker() to keep the cap loose if condense.py
|
|
37
37
|
# grows additional top-level side effects.
|
|
38
38
|
_BANNER_MARKER = "<!-- agent-config:human-review-banner -->"
|
|
39
39
|
|
|
@@ -118,7 +118,7 @@ def _check_human_review_banners(
|
|
|
118
118
|
errs.append(
|
|
119
119
|
f"{rel}: human_review_required=true but compiled output"
|
|
120
120
|
f" `{compiled.relative_to(ROOT)}` is missing the HRR banner"
|
|
121
|
-
f" (`{_BANNER_MARKER}`) — re-run `task
|
|
121
|
+
f" (`{_BANNER_MARKER}`) — re-run `task condense`."
|
|
122
122
|
)
|
|
123
123
|
return errs
|
|
124
124
|
|