@event4u/agent-config 2.26.0 → 3.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/commands/agent-handoff.md +15 -3
- package/.agent-src/commands/agent-status.md +12 -0
- package/.agent-src/commands/agents/audit.md +12 -0
- package/.agent-src/commands/agents/init.md +12 -0
- package/.agent-src/commands/agents/optimize.md +12 -0
- package/.agent-src/commands/agents/user/accept.md +12 -0
- package/.agent-src/commands/agents/user/init.md +12 -0
- package/.agent-src/commands/agents/user/review.md +12 -0
- package/.agent-src/commands/agents/user/show.md +12 -0
- package/.agent-src/commands/agents/user/update.md +12 -0
- package/.agent-src/commands/agents/user.md +12 -0
- package/.agent-src/commands/agents.md +12 -0
- package/.agent-src/commands/analyze-reference-repo.md +15 -3
- package/.agent-src/commands/bug-fix.md +12 -0
- package/.agent-src/commands/bug-investigate.md +13 -1
- package/.agent-src/commands/challenge-me/vision.md +12 -0
- package/.agent-src/commands/challenge-me/with-docs.md +12 -0
- package/.agent-src/commands/challenge-me.md +12 -0
- package/.agent-src/commands/chat-history/import.md +16 -4
- package/.agent-src/commands/chat-history/learn.md +15 -3
- package/.agent-src/commands/chat-history/show.md +17 -5
- package/.agent-src/commands/chat-history.md +14 -2
- package/.agent-src/commands/check-current-md.md +12 -0
- package/.agent-src/commands/commit/in-chunks.md +12 -0
- package/.agent-src/commands/commit.md +12 -0
- package/.agent-src/commands/compress.md +12 -0
- package/.agent-src/commands/context/create.md +17 -5
- package/.agent-src/commands/context/refactor.md +15 -3
- package/.agent-src/commands/context.md +12 -0
- package/.agent-src/commands/cost-report.md +12 -0
- package/.agent-src/commands/council/analysis.md +15 -3
- package/.agent-src/commands/council/debate.md +17 -5
- package/.agent-src/commands/council/default.md +17 -5
- package/.agent-src/commands/council/design.md +12 -0
- package/.agent-src/commands/council/optimize.md +12 -0
- package/.agent-src/commands/council/pr.md +12 -0
- package/.agent-src/commands/council.md +13 -1
- package/.agent-src/commands/create-pr/description-only.md +12 -0
- package/.agent-src/commands/create-pr.md +39 -0
- package/.agent-src/commands/e2e-heal.md +12 -0
- package/.agent-src/commands/e2e-plan.md +12 -0
- package/.agent-src/commands/estimate-ticket.md +12 -0
- package/.agent-src/commands/feature/dev.md +13 -1
- package/.agent-src/commands/feature/explore.md +12 -0
- package/.agent-src/commands/feature/plan.md +14 -2
- package/.agent-src/commands/feature/refactor.md +12 -0
- package/.agent-src/commands/feature/roadmap.md +12 -0
- package/.agent-src/commands/feature.md +12 -0
- package/.agent-src/commands/fix/ci.md +12 -0
- package/.agent-src/commands/fix/portability.md +12 -0
- package/.agent-src/commands/fix/pr-bot-comments.md +12 -0
- package/.agent-src/commands/fix/pr-comments.md +12 -0
- package/.agent-src/commands/fix/pr-developer-comments.md +12 -0
- package/.agent-src/commands/fix/refs.md +12 -0
- package/.agent-src/commands/fix/seeder.md +12 -0
- package/.agent-src/commands/fix.md +12 -0
- package/.agent-src/commands/ghostwriter/delete.md +20 -8
- package/.agent-src/commands/ghostwriter/fetch.md +19 -7
- package/.agent-src/commands/ghostwriter/list.md +19 -7
- package/.agent-src/commands/ghostwriter/show.md +14 -2
- package/.agent-src/commands/ghostwriter/write.md +15 -3
- package/.agent-src/commands/ghostwriter.md +14 -2
- package/.agent-src/commands/grill-me.md +12 -0
- package/.agent-src/commands/implement-ticket.md +12 -0
- package/.agent-src/commands/install-via-agent.md +129 -0
- package/.agent-src/commands/jira-ticket.md +12 -0
- package/.agent-src/commands/judge/on-diff.md +12 -0
- package/.agent-src/commands/judge/solo.md +12 -0
- package/.agent-src/commands/judge/steps.md +12 -0
- package/.agent-src/commands/judge.md +12 -0
- package/.agent-src/commands/memory/add.md +12 -0
- package/.agent-src/commands/memory/learn-low-impact.md +18 -6
- package/.agent-src/commands/memory/load.md +12 -0
- package/.agent-src/commands/memory/mine-session.md +12 -0
- package/.agent-src/commands/memory/promote.md +12 -0
- package/.agent-src/commands/memory/propose.md +12 -0
- package/.agent-src/commands/memory.md +12 -0
- package/.agent-src/commands/mode.md +12 -0
- package/.agent-src/commands/module/create.md +12 -0
- package/.agent-src/commands/module/explore.md +13 -1
- package/.agent-src/commands/module.md +12 -0
- package/.agent-src/commands/optimize/agents-dir.md +14 -2
- package/.agent-src/commands/optimize/augmentignore.md +12 -0
- package/.agent-src/commands/optimize/rtk.md +12 -0
- package/.agent-src/commands/optimize/skills.md +12 -0
- package/.agent-src/commands/optimize-prompt.md +12 -0
- package/.agent-src/commands/optimize.md +12 -0
- package/.agent-src/commands/orchestrate.md +13 -1
- package/.agent-src/commands/override/create.md +12 -0
- package/.agent-src/commands/override/manage.md +12 -0
- package/.agent-src/commands/override.md +12 -0
- package/.agent-src/commands/package-reset.md +12 -0
- package/.agent-src/commands/package-test.md +12 -0
- package/.agent-src/commands/post-as/ghostwriter.md +12 -0
- package/.agent-src/commands/post-as/me.md +13 -1
- package/.agent-src/commands/post-as.md +12 -0
- package/.agent-src/commands/prepare-for-review.md +12 -0
- package/.agent-src/commands/project-analyze.md +27 -15
- package/.agent-src/commands/project-health.md +13 -1
- package/.agent-src/commands/quality-fix.md +12 -0
- package/.agent-src/commands/refine-ticket.md +12 -0
- package/.agent-src/commands/research/deep.md +12 -0
- package/.agent-src/commands/research/report.md +12 -0
- package/.agent-src/commands/research.md +12 -0
- package/.agent-src/commands/review-changes.md +12 -0
- package/.agent-src/commands/review-routing.md +12 -0
- package/.agent-src/commands/roadmap/ai-council.md +15 -3
- package/.agent-src/commands/roadmap/create.md +13 -1
- package/.agent-src/commands/roadmap/process-full.md +12 -0
- package/.agent-src/commands/roadmap/process-phase.md +12 -0
- package/.agent-src/commands/roadmap/process-step.md +12 -0
- package/.agent-src/commands/roadmap.md +12 -0
- package/.agent-src/commands/rule-compliance-audit.md +12 -0
- package/.agent-src/commands/set-cost-profile.md +12 -0
- package/.agent-src/commands/sync-agent-settings.md +12 -0
- package/.agent-src/commands/sync-gitignore/fix.md +32 -13
- package/.agent-src/commands/sync-gitignore.md +13 -1
- package/.agent-src/commands/tests/create.md +12 -0
- package/.agent-src/commands/tests/execute.md +12 -0
- package/.agent-src/commands/tests.md +12 -0
- package/.agent-src/commands/threat-model.md +12 -0
- package/.agent-src/commands/update-form-request-messages.md +12 -0
- package/.agent-src/commands/upstream-contribute.md +12 -0
- package/.agent-src/commands/video/from-script.md +13 -1
- package/.agent-src/commands/video/scene.md +12 -0
- package/.agent-src/commands/video/stitch.md +13 -1
- package/.agent-src/commands/video/storyboard.md +12 -0
- package/.agent-src/commands/video.md +13 -1
- package/.agent-src/commands/work.md +12 -0
- package/.agent-src/contexts/augment-infrastructure.md +2 -2
- package/.agent-src/contexts/authority/scope-mechanics.md +11 -0
- package/.agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
- package/.agent-src/contexts/documentation-hierarchy.md +2 -2
- package/.agent-src/contexts/execution/cheap-question-mechanics.md +81 -0
- package/.agent-src/contexts/execution/roadmap-process-loop.md +19 -0
- package/.agent-src/ghostwriter/README.md +2 -2
- package/.agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
- package/.agent-src/personas/README.md +1 -1
- package/.agent-src/personas/advisors/contrarian.md +1 -1
- package/.agent-src/personas/advisors/executor.md +1 -1
- package/.agent-src/personas/advisors/expansionist.md +1 -1
- package/.agent-src/personas/advisors/first-principles.md +1 -1
- package/.agent-src/personas/advisors/outsider.md +1 -1
- package/.agent-src/rules/agent-authority.md +12 -0
- package/.agent-src/rules/analysis-skill-routing.md +12 -0
- package/.agent-src/rules/architecture.md +13 -1
- package/.agent-src/rules/artifact-drafting-protocol.md +13 -1
- package/.agent-src/rules/artifact-engagement-recording.md +13 -1
- package/.agent-src/rules/ask-when-uncertain.md +12 -0
- package/.agent-src/rules/augment-edit-discipline.md +13 -1
- package/.agent-src/rules/augment-source-of-truth.md +13 -1
- package/.agent-src/rules/autonomous-execution.md +13 -1
- package/.agent-src/rules/caveman-speak.md +15 -3
- package/.agent-src/rules/cli-output-handling.md +13 -1
- package/.agent-src/rules/command-suggestion-policy.md +13 -1
- package/.agent-src/rules/commit-conventions.md +13 -1
- package/.agent-src/rules/commit-policy.md +12 -0
- package/.agent-src/rules/context-hygiene.md +51 -3
- package/.agent-src/rules/copilot-routing.md +13 -1
- package/.agent-src/rules/devcontainer-routing.md +13 -1
- package/.agent-src/rules/direct-answers.md +12 -0
- package/.agent-src/rules/docker-commands.md +13 -1
- package/.agent-src/rules/domain-adoption-policy.md +17 -5
- package/.agent-src/rules/domain-safety-disclaimer.md +13 -1
- package/.agent-src/rules/domain-safety-pii.md +13 -1
- package/.agent-src/rules/domain-safety-retention.md +13 -1
- package/.agent-src/rules/downstream-changes.md +13 -1
- package/.agent-src/rules/engineering-safety-floor.md +102 -0
- package/.agent-src/rules/external-reference-deep-dive.md +13 -1
- package/.agent-src/rules/fast-path-marker-visibility.md +21 -1
- package/.agent-src/rules/finance-safety-floor.md +114 -0
- package/.agent-src/rules/framework-neutrality-in-generic-skills.md +13 -1
- package/.agent-src/rules/git-history-discipline.md +14 -2
- package/.agent-src/rules/guidelines.md +12 -0
- package/.agent-src/rules/improve-before-implement.md +13 -1
- package/.agent-src/rules/invite-challenge.md +13 -1
- package/.agent-src/rules/language-and-tone.md +12 -0
- package/.agent-src/rules/laravel-routing.md +13 -1
- package/.agent-src/rules/laravel-translations.md +13 -1
- package/.agent-src/rules/low-impact-corpus-privacy-floor.md +17 -5
- package/.agent-src/rules/markdown-safe-codeblocks.md +13 -1
- package/.agent-src/rules/media-governance-routing.md +27 -15
- package/.agent-src/rules/minimal-safe-diff.md +13 -1
- package/.agent-src/rules/missing-tool-handling.md +13 -1
- package/.agent-src/rules/model-recommendation.md +13 -1
- package/.agent-src/rules/no-attribution-footers.md +13 -1
- package/.agent-src/rules/no-cheap-questions.md +46 -32
- package/.agent-src/rules/no-roadmap-references.md +28 -16
- package/.agent-src/rules/non-destructive-by-default.md +12 -0
- package/.agent-src/rules/onboarding-gate.md +19 -6
- package/.agent-src/rules/package-ci-checks.md +12 -0
- package/.agent-src/rules/persona-governance.md +13 -1
- package/.agent-src/rules/php-coding.md +13 -1
- package/.agent-src/rules/preservation-guard.md +13 -1
- package/.agent-src/rules/provider-lifecycle-discipline.md +18 -6
- package/.agent-src/rules/reviewer-awareness.md +13 -1
- package/.agent-src/rules/roadmap-ci-steps-policy.md +13 -1
- package/.agent-src/rules/roadmap-progress-sync.md +18 -1
- package/.agent-src/rules/role-mode-adherence.md +13 -1
- package/.agent-src/rules/rule-type-governance.md +13 -1
- package/.agent-src/rules/runtime-safety.md +13 -1
- package/.agent-src/rules/scope-control.md +12 -0
- package/.agent-src/rules/security-sensitive-stop.md +13 -1
- package/.agent-src/rules/size-enforcement.md +12 -0
- package/.agent-src/rules/skill-improvement-trigger.md +13 -1
- package/.agent-src/rules/skill-quality.md +13 -1
- package/.agent-src/rules/slash-command-routing-policy.md +13 -1
- package/.agent-src/rules/strategy-safety-floor.md +114 -0
- package/.agent-src/rules/symfony-routing.md +13 -1
- package/.agent-src/rules/think-before-action.md +13 -1
- package/.agent-src/rules/token-efficiency.md +13 -1
- package/.agent-src/rules/token-optimizer-maintenance.md +12 -0
- package/.agent-src/rules/tool-safety.md +13 -1
- package/.agent-src/rules/ui-audit-gate.md +13 -1
- package/.agent-src/rules/upstream-proposal.md +13 -1
- package/.agent-src/rules/user-interaction.md +13 -1
- package/.agent-src/rules/user-interrupt-priority.md +12 -0
- package/.agent-src/rules/verify-before-complete.md +12 -0
- package/.agent-src/skills/accessibility-auditor/SKILL.md +12 -0
- package/.agent-src/skills/activation-design/SKILL.md +12 -0
- package/.agent-src/skills/adr-create/SKILL.md +12 -0
- package/.agent-src/skills/adversarial-review/SKILL.md +12 -0
- package/.agent-src/skills/agent-docs-writing/SKILL.md +16 -4
- package/.agent-src/skills/agents-md-thin-root/SKILL.md +28 -10
- package/.agent-src/skills/ai-council/SKILL.md +28 -15
- package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +12 -0
- package/.agent-src/skills/analysis-skill-router/SKILL.md +12 -0
- package/.agent-src/skills/api-design/SKILL.md +13 -3
- package/.agent-src/skills/api-endpoint/SKILL.md +12 -0
- package/.agent-src/skills/api-testing/SKILL.md +12 -0
- package/.agent-src/skills/architecture-review-lens/SKILL.md +12 -0
- package/.agent-src/skills/artisan-commands/SKILL.md +12 -0
- package/.agent-src/skills/async-python-patterns/SKILL.md +13 -1
- package/.agent-src/skills/authz-review/SKILL.md +12 -2
- package/.agent-src/skills/aws-infrastructure/SKILL.md +12 -0
- package/.agent-src/skills/blade-ui/SKILL.md +12 -0
- package/.agent-src/skills/blast-radius-analyzer/SKILL.md +12 -0
- package/.agent-src/skills/bug-analyzer/SKILL.md +14 -2
- package/.agent-src/skills/build-buy-partner/SKILL.md +12 -0
- package/.agent-src/skills/canvas-design/SKILL.md +12 -0
- package/.agent-src/skills/character-consistency/SKILL.md +23 -11
- package/.agent-src/skills/check-refs/SKILL.md +12 -0
- package/.agent-src/skills/churn-prevention/SKILL.md +12 -0
- package/.agent-src/skills/code-refactoring/SKILL.md +16 -4
- package/.agent-src/skills/code-review/SKILL.md +12 -0
- package/.agent-src/skills/command-routing/SKILL.md +12 -0
- package/.agent-src/skills/command-writing/SKILL.md +14 -2
- package/.agent-src/skills/comp-banding/SKILL.md +12 -0
- package/.agent-src/skills/competitive-moat-analysis/SKILL.md +12 -2
- package/.agent-src/skills/competitive-positioning/SKILL.md +12 -2
- package/.agent-src/skills/composer-packages/SKILL.md +12 -0
- package/.agent-src/skills/compress-memory/SKILL.md +12 -0
- package/.agent-src/skills/content-funnel-design/SKILL.md +12 -2
- package/.agent-src/skills/context-authoring/SKILL.md +18 -6
- package/.agent-src/skills/context-document/SKILL.md +17 -5
- package/.agent-src/skills/contracts-cognition/SKILL.md +12 -2
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +12 -0
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +13 -1
- package/.agent-src/skills/copilot-config/SKILL.md +12 -0
- package/.agent-src/skills/customer-research/SKILL.md +12 -0
- package/.agent-src/skills/dashboard-design/SKILL.md +12 -0
- package/.agent-src/skills/data-flow-mapper/SKILL.md +12 -0
- package/.agent-src/skills/data-handling-judgment/SKILL.md +12 -2
- package/.agent-src/skills/database/SKILL.md +14 -2
- package/.agent-src/skills/dcf-modeling/SKILL.md +12 -2
- package/.agent-src/skills/deal-qualification-meddic/SKILL.md +12 -2
- package/.agent-src/skills/decision-record/SKILL.md +12 -0
- package/.agent-src/skills/deep-reading-analyst/SKILL.md +12 -0
- package/.agent-src/skills/defense-in-depth/SKILL.md +13 -1
- package/.agent-src/skills/dependency-upgrade/SKILL.md +12 -0
- package/.agent-src/skills/description-assist/SKILL.md +12 -0
- package/.agent-src/skills/design-review/SKILL.md +12 -0
- package/.agent-src/skills/devcontainer/SKILL.md +12 -0
- package/.agent-src/skills/developer-like-execution/SKILL.md +12 -0
- package/.agent-src/skills/discovery-interview/SKILL.md +12 -2
- package/.agent-src/skills/doc-coauthoring/SKILL.md +12 -0
- package/.agent-src/skills/docker/SKILL.md +12 -0
- package/.agent-src/skills/editorial-calendar/SKILL.md +12 -2
- package/.agent-src/skills/eloquent/SKILL.md +12 -0
- package/.agent-src/skills/eloquent/evals/triggers.json +1 -1
- package/.agent-src/skills/error-handling-patterns/SKILL.md +13 -1
- package/.agent-src/skills/estimate-ticket/SKILL.md +12 -0
- package/.agent-src/skills/existing-ui-audit/SKILL.md +12 -0
- package/.agent-src/skills/expansion-playbook/SKILL.md +12 -0
- package/.agent-src/skills/fe-design/SKILL.md +12 -0
- package/.agent-src/skills/feature-planning/SKILL.md +12 -0
- package/.agent-src/skills/file-editor/SKILL.md +12 -0
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +12 -0
- package/.agent-src/skills/flux/SKILL.md +12 -0
- package/.agent-src/skills/forecast-accuracy/SKILL.md +12 -2
- package/.agent-src/skills/forecasting/SKILL.md +12 -2
- package/.agent-src/skills/form-handler/SKILL.md +12 -0
- package/.agent-src/skills/fundraising-narrative/SKILL.md +12 -2
- package/.agent-src/skills/funnel-analysis/SKILL.md +12 -0
- package/.agent-src/skills/git-workflow/SKILL.md +12 -0
- package/.agent-src/skills/github-ci/SKILL.md +12 -0
- package/.agent-src/skills/grafana/SKILL.md +12 -0
- package/.agent-src/skills/gtm-launch/SKILL.md +12 -2
- package/.agent-src/skills/guideline-writing/SKILL.md +12 -0
- package/.agent-src/skills/hiring-loop-design/SKILL.md +12 -0
- package/.agent-src/skills/incident-commander/SKILL.md +12 -2
- package/.agent-src/skills/jira-integration/SKILL.md +12 -0
- package/.agent-src/skills/jobs-events/SKILL.md +12 -0
- package/.agent-src/skills/judge-bug-hunter/SKILL.md +12 -0
- package/.agent-src/skills/judge-code-quality/SKILL.md +12 -0
- package/.agent-src/skills/judge-security-auditor/SKILL.md +12 -0
- package/.agent-src/skills/judge-test-coverage/SKILL.md +12 -0
- package/.agent-src/skills/laravel/SKILL.md +12 -0
- package/.agent-src/skills/laravel-api-endpoint/SKILL.md +15 -3
- package/.agent-src/skills/laravel-dto/SKILL.md +14 -2
- package/.agent-src/skills/laravel-horizon/SKILL.md +12 -0
- package/.agent-src/skills/laravel-mail/SKILL.md +12 -0
- package/.agent-src/skills/laravel-middleware/SKILL.md +12 -0
- package/.agent-src/skills/laravel-migration/SKILL.md +12 -0
- package/.agent-src/skills/laravel-notifications/SKILL.md +12 -0
- package/.agent-src/skills/laravel-pennant/SKILL.md +12 -0
- package/.agent-src/skills/laravel-pulse/SKILL.md +12 -0
- package/.agent-src/skills/laravel-reverb/SKILL.md +12 -0
- package/.agent-src/skills/laravel-scheduling/SKILL.md +12 -0
- package/.agent-src/skills/laravel-validation/SKILL.md +12 -0
- package/.agent-src/skills/laravel-websocket/SKILL.md +12 -0
- package/.agent-src/skills/launch-readiness/SKILL.md +12 -2
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +15 -3
- package/.agent-src/skills/lint-skills/SKILL.md +12 -0
- package/.agent-src/skills/livewire/SKILL.md +12 -0
- package/.agent-src/skills/livewire-architect/SKILL.md +12 -0
- package/.agent-src/skills/logging-monitoring/SKILL.md +12 -0
- package/.agent-src/skills/market-entry-analysis/SKILL.md +12 -0
- package/.agent-src/skills/markitdown/SKILL.md +14 -2
- package/.agent-src/skills/mcp/SKILL.md +12 -0
- package/.agent-src/skills/mcp-builder/SKILL.md +14 -2
- package/.agent-src/skills/md-language-check/SKILL.md +13 -1
- package/.agent-src/skills/memory-consolidation/SKILL.md +12 -0
- package/.agent-src/skills/merge-conflicts/SKILL.md +12 -0
- package/.agent-src/skills/messaging-architecture/SKILL.md +12 -2
- package/.agent-src/skills/migration-architect/SKILL.md +12 -0
- package/.agent-src/skills/mobile-e2e-strategy/SKILL.md +12 -0
- package/.agent-src/skills/module-management/SKILL.md +12 -0
- package/.agent-src/skills/motion-choreographer/SKILL.md +16 -4
- package/.agent-src/skills/multi-tenancy/SKILL.md +14 -2
- package/.agent-src/skills/nextjs-patterns/SKILL.md +12 -0
- package/.agent-src/skills/okr-tree-modeling/SKILL.md +12 -2
- package/.agent-src/skills/onboarding-design/SKILL.md +12 -0
- package/.agent-src/skills/onboarding-program/SKILL.md +12 -0
- package/.agent-src/skills/one-on-one-cadence/SKILL.md +12 -0
- package/.agent-src/skills/openapi/SKILL.md +13 -1
- package/.agent-src/skills/org-design/SKILL.md +12 -0
- package/.agent-src/skills/override-management/SKILL.md +12 -0
- package/.agent-src/skills/perf-feedback-craft/SKILL.md +12 -0
- package/.agent-src/skills/performance/SKILL.md +12 -0
- package/.agent-src/skills/performance-analysis/SKILL.md +12 -0
- package/.agent-src/skills/persona-writing/SKILL.md +12 -0
- package/.agent-src/skills/pest-testing/SKILL.md +12 -0
- package/.agent-src/skills/php-coder/SKILL.md +12 -0
- package/.agent-src/skills/php-debugging/SKILL.md +12 -0
- package/.agent-src/skills/php-service/SKILL.md +12 -0
- package/.agent-src/skills/pipeline-strategy/SKILL.md +12 -2
- package/.agent-src/skills/pixar-storyteller/SKILL.md +17 -5
- package/.agent-src/skills/playwright-architect/SKILL.md +12 -2
- package/.agent-src/skills/playwright-testing/SKILL.md +12 -0
- package/.agent-src/skills/po-discovery/SKILL.md +12 -0
- package/.agent-src/skills/positioning-strategy/SKILL.md +12 -0
- package/.agent-src/skills/privacy-review/SKILL.md +12 -2
- package/.agent-src/skills/project-analysis-core/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-laravel/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-nextjs/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-node-express/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-react/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-symfony/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +12 -0
- package/.agent-src/skills/project-analyzer/SKILL.md +30 -18
- package/.agent-src/skills/project-docs/SKILL.md +25 -13
- package/.agent-src/skills/prompt-engineering-patterns/SKILL.md +13 -1
- package/.agent-src/skills/prompt-optimizer/SKILL.md +13 -1
- package/.agent-src/skills/quality-tools/SKILL.md +12 -2
- package/.agent-src/skills/react-native-setup/SKILL.md +12 -0
- package/.agent-src/skills/react-shadcn-ui/SKILL.md +12 -0
- package/.agent-src/skills/readme-reviewer/SKILL.md +64 -3
- package/.agent-src/skills/readme-writing/SKILL.md +64 -4
- package/.agent-src/skills/readme-writing-package/SKILL.md +60 -5
- package/.agent-src/skills/receiving-code-review/SKILL.md +12 -0
- package/.agent-src/skills/refine-prompt/SKILL.md +13 -1
- package/.agent-src/skills/refine-ticket/SKILL.md +14 -2
- package/.agent-src/skills/refine-ticket/detection-map.yml +2 -2
- package/.agent-src/skills/release-comms/SKILL.md +12 -2
- package/.agent-src/skills/repomix-packer/SKILL.md +13 -1
- package/.agent-src/skills/requesting-code-review/SKILL.md +12 -0
- package/.agent-src/skills/retention-loops/SKILL.md +12 -0
- package/.agent-src/skills/review-routing/SKILL.md +12 -0
- package/.agent-src/skills/rice-prioritization/SKILL.md +12 -0
- package/.agent-src/skills/risk-officer/SKILL.md +12 -0
- package/.agent-src/skills/roadmap-management/SKILL.md +12 -0
- package/.agent-src/skills/roadmap-writing/SKILL.md +12 -0
- package/.agent-src/skills/rtk-output-filtering/SKILL.md +12 -0
- package/.agent-src/skills/rule-refactor/SKILL.md +15 -3
- package/.agent-src/skills/rule-writing/SKILL.md +13 -1
- package/.agent-src/skills/runway-cognition/SKILL.md +12 -2
- package/.agent-src/skills/scenario-modeling/SKILL.md +12 -2
- package/.agent-src/skills/scene-expander/SKILL.md +18 -6
- package/.agent-src/skills/script-writing/SKILL.md +13 -1
- package/.agent-src/skills/secrets-management/SKILL.md +13 -3
- package/.agent-src/skills/security/SKILL.md +12 -0
- package/.agent-src/skills/security-audit/SKILL.md +12 -0
- package/.agent-src/skills/sentry-integration/SKILL.md +12 -0
- package/.agent-src/skills/sequential-thinking/SKILL.md +12 -0
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +12 -0
- package/.agent-src/skills/skill-management/SKILL.md +12 -0
- package/.agent-src/skills/skill-reviewer/SKILL.md +12 -0
- package/.agent-src/skills/skill-writing/SKILL.md +12 -0
- package/.agent-src/skills/sql-writing/SKILL.md +12 -0
- package/.agent-src/skills/stakeholder-tradeoff/SKILL.md +12 -0
- package/.agent-src/skills/subagent-orchestration/SKILL.md +13 -1
- package/.agent-src/skills/symfony-workflow/SKILL.md +12 -0
- package/.agent-src/skills/systematic-debugging/SKILL.md +53 -0
- package/.agent-src/skills/tailwind-engineer/SKILL.md +12 -0
- package/.agent-src/skills/tech-debt-tracker/SKILL.md +12 -2
- package/.agent-src/skills/technical-specification/SKILL.md +12 -0
- package/.agent-src/skills/terraform/SKILL.md +12 -0
- package/.agent-src/skills/terragrunt/SKILL.md +12 -0
- package/.agent-src/skills/test-driven-development/SKILL.md +12 -0
- package/.agent-src/skills/test-performance/SKILL.md +13 -1
- package/.agent-src/skills/testing-anti-patterns/SKILL.md +13 -1
- package/.agent-src/skills/threat-modeling/SKILL.md +12 -0
- package/.agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +12 -0
- package/.agent-src/skills/token-optimizer/SKILL.md +12 -0
- package/.agent-src/skills/traefik/SKILL.md +12 -0
- package/.agent-src/skills/ui-component-architect/SKILL.md +12 -0
- package/.agent-src/skills/unit-economics-modeling/SKILL.md +12 -2
- package/.agent-src/skills/universal-project-analysis/SKILL.md +12 -0
- package/.agent-src/skills/upstream-contribute/SKILL.md +12 -0
- package/.agent-src/skills/using-git-worktrees/SKILL.md +12 -0
- package/.agent-src/skills/validate-feature-fit/SKILL.md +12 -0
- package/.agent-src/skills/verify-completion-evidence/SKILL.md +12 -0
- package/.agent-src/skills/video-director/SKILL.md +18 -6
- package/.agent-src/skills/vision-articulation/SKILL.md +12 -0
- package/.agent-src/skills/voc-extract/SKILL.md +12 -2
- package/.agent-src/skills/voice-and-tone-design/SKILL.md +12 -2
- package/.agent-src/templates/agent-settings.md +5 -5
- package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/.agent-src/templates/agents/memory/ownership.example.yml +1 -1
- package/.agent-src/templates/agents/proposal.example.md +12 -0
- package/.agent-src/templates/command.md +1 -1
- package/.agent-src/templates/contexts/auth-model.md +2 -2
- package/.agent-src/templates/contexts/data-sensitivity.md +3 -3
- package/.agent-src/templates/contexts/deployment-order.md +2 -2
- package/.agent-src/templates/contexts/observability.md +3 -3
- package/.agent-src/templates/contexts/tenant-boundaries.md +3 -3
- package/.agent-src/templates/contexts.md +1 -1
- package/.agent-src/templates/hooks/pre-commit-frontmatter +66 -0
- package/.agent-src/templates/hooks/pre-commit-roadmap-progress +78 -39
- package/.agent-src/templates/rule.md +1 -1
- package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +7 -4
- package/.agent-src/templates/scripts/work_engine/cli.py +6 -6
- package/.agent-src/templates/scripts/work_engine/emitters.py +29 -4
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.py +3 -3
- package/.agent-src/templates/scripts/work_engine/orchestration.py +25 -11
- package/.agent-src/templates/scripts/work_engine/state.py +53 -0
- package/.agent-src/templates/skill-archive-note.md +4 -4
- package/.claude-plugin/marketplace.json +2 -2
- package/AGENTS.md +12 -9
- package/CHANGELOG.md +268 -90
- package/CONTRIBUTING.md +61 -0
- package/README.md +173 -558
- package/config/agent-settings.template.yml +11 -8
- package/config/discovery/packs.yml +162 -0
- package/config/discovery/unassigned-artefacts.yml +68 -0
- package/config/discovery/workspaces.yml +59 -0
- package/config/gitignore-block.txt +36 -23
- package/dist/cli/agent-config.js +199 -0
- package/dist/cli/agent-config.js.map +1 -0
- package/dist/cli/bash/runBash.js +40 -0
- package/dist/cli/bash/runBash.js.map +1 -0
- package/dist/cli/commands/doctorShell.js +91 -0
- package/dist/cli/commands/doctorShell.js.map +1 -0
- package/dist/cli/commands/packs.js +59 -0
- package/dist/cli/commands/packs.js.map +1 -0
- package/dist/cli/commands/settings.js +35 -0
- package/dist/cli/commands/settings.js.map +1 -0
- package/dist/cli/commands/uiServe.js +119 -0
- package/dist/cli/commands/uiServe.js.map +1 -0
- package/dist/cli/commands/versions.js +64 -0
- package/dist/cli/commands/versions.js.map +1 -0
- package/dist/cli/commands/workspaces.js +58 -0
- package/dist/cli/commands/workspaces.js.map +1 -0
- package/dist/cli/discovery/loadManifest.js +62 -0
- package/dist/cli/discovery/loadManifest.js.map +1 -0
- package/dist/cli/log/logger.js +41 -0
- package/dist/cli/log/logger.js.map +1 -0
- package/dist/cli/paths.js +60 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/python/resolvePython.js +38 -0
- package/dist/cli/python/resolvePython.js.map +1 -0
- package/dist/cli/registry.js +77 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/discovery/deprecation-report.md +7 -0
- package/dist/discovery/discovery-manifest.json +9893 -0
- package/dist/discovery/discovery-manifest.json.sha256 +1 -0
- package/dist/discovery/discovery-manifest.summary.md +93 -0
- package/dist/discovery/orphan-report.md +10 -0
- package/dist/discovery/packs.json +1002 -0
- package/dist/discovery/trust-report.md +26 -0
- package/dist/discovery/workspaces.json +705 -0
- package/dist/mcp/awesome-mcp-servers.row.md +1 -0
- package/dist/mcp/mcp-cloudflare-catalogue.json +27 -0
- package/dist/mcp/registry-manifest.json +63 -0
- package/dist/router.json +1623 -0
- package/dist/server/app.js +125 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/io/atomicMultiWrite.js +204 -0
- package/dist/server/io/atomicMultiWrite.js.map +1 -0
- package/dist/server/io/atomicWrite.js +79 -0
- package/dist/server/io/atomicWrite.js.map +1 -0
- package/dist/server/io/substituteTemplate.js +87 -0
- package/dist/server/io/substituteTemplate.js.map +1 -0
- package/dist/server/io/yamlIO.js +162 -0
- package/dist/server/io/yamlIO.js.map +1 -0
- package/dist/server/port.js +97 -0
- package/dist/server/port.js.map +1 -0
- package/dist/server/routes/discovery.js +72 -0
- package/dist/server/routes/discovery.js.map +1 -0
- package/dist/server/routes/ping.js +57 -0
- package/dist/server/routes/ping.js.map +1 -0
- package/dist/server/routes/schema.js +41 -0
- package/dist/server/routes/schema.js.map +1 -0
- package/dist/server/routes/settings.js +236 -0
- package/dist/server/routes/settings.js.map +1 -0
- package/dist/server/routes/userMd.js +127 -0
- package/dist/server/routes/userMd.js.map +1 -0
- package/dist/server/routes/wizard.js +374 -0
- package/dist/server/routes/wizard.js.map +1 -0
- package/dist/server/schemas/settings.js +137 -0
- package/dist/server/schemas/settings.js.map +1 -0
- package/dist/server/token.js +75 -0
- package/dist/server/token.js.map +1 -0
- package/dist/server/writeRoot.js +84 -0
- package/dist/server/writeRoot.js.map +1 -0
- package/dist/server/writeRoot.test.js +91 -0
- package/dist/server/writeRoot.test.js.map +1 -0
- package/dist/shared/userMd/formAdapter.js +83 -0
- package/dist/shared/userMd/formAdapter.js.map +1 -0
- package/dist/shared/userMd/schema.js +46 -0
- package/dist/shared/userMd/schema.js.map +1 -0
- package/dist/shared/userMd/utils.js +88 -0
- package/dist/shared/userMd/utils.js.map +1 -0
- package/dist/ui/assets/index-D-DY1ywI.js +35 -0
- package/dist/ui/assets/index-D-DY1ywI.js.map +1 -0
- package/dist/ui/assets/index-Dqfhmg-d.css +1 -0
- package/dist/ui/index.html +14 -0
- package/docs/adrs/caveman/0001-default-off-until-bench.md +2 -2
- package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
- package/docs/adrs/router/0001-three-tier-routing.md +5 -5
- package/docs/adrs/schema/0001-json-schema-frontmatter.md +4 -4
- package/docs/adrs/schema/README.md +1 -1
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +3 -3
- package/docs/architecture/setup-vs-settings-shared-surface.md +114 -0
- package/docs/architecture.md +3 -2
- package/docs/archive/CHANGELOG-pre-2.2.0.md +7 -7
- package/docs/archive/CHANGELOG-pre-3.0.0.md +130 -0
- package/docs/archive/CHANGELOG-pre-3.1.0.md +167 -0
- package/docs/catalog.md +92 -100
- package/docs/contracts/CHANGELOG-conventions.md +1 -1
- package/docs/contracts/STABILITY.md +1 -1
- package/docs/contracts/adr-architectural-consensus-mechanism.md +5 -5
- package/docs/contracts/adr-chat-history-split.md +1 -1
- package/docs/contracts/adr-implement-ticket-runtime.md +1 -1
- package/docs/contracts/adr-install-user-type-axis.md +1 -1
- package/docs/contracts/adr-mcp-runtime.md +2 -2
- package/docs/contracts/agent-user-schema.md +17 -11
- package/docs/contracts/ai-council-config.md +13 -13
- package/docs/contracts/audit-log-v1.md +2 -2
- package/docs/contracts/command-clusters.md +2 -2
- package/docs/contracts/compression-default-kill-criterion.md +3 -3
- package/docs/contracts/consumer-bridge.md +79 -0
- package/docs/contracts/decision-trace-v1.md +5 -5
- package/docs/contracts/discovery-manifest.md +209 -0
- package/docs/contracts/discovery-manifest.schema.json +219 -0
- package/docs/contracts/explain-trace.schema.json +144 -0
- package/docs/contracts/file-ownership-matrix.json +288 -328
- package/docs/contracts/file-ownership-matrix.md +1 -1
- package/docs/contracts/frontmatter-contract.md +140 -0
- package/docs/contracts/ghostwriter-schema.md +3 -3
- package/docs/contracts/gui-wizard.md +223 -0
- package/docs/contracts/hook-architecture-v1.md +10 -10
- package/docs/contracts/installer-agent-mode.md +137 -0
- package/docs/contracts/kernel-membership.md +5 -5
- package/docs/contracts/linter-structural-model.md +3 -3
- package/docs/contracts/load-context-schema.md +5 -5
- package/docs/contracts/local-server-api.md +134 -0
- package/docs/contracts/low-impact-corpus-format.md +1 -1
- package/docs/contracts/mcp-cloud-scope.md +2 -2
- package/docs/contracts/mcp-discovery-phase-notice.md +1 -1
- package/docs/contracts/mcp-phase-1-scope.md +5 -4
- package/docs/contracts/mcp-registry-manifest.schema.json +129 -0
- package/docs/contracts/mcp-tool-inventory.md +9 -9
- package/docs/contracts/mcp-tool-stub-envelope.md +1 -1
- package/docs/contracts/memory-visibility-v1.md +2 -2
- package/docs/contracts/multi-tool-projection-fidelity.md +3 -3
- package/docs/contracts/namespace.md +7 -7
- package/docs/contracts/one-off-script-lifecycle.md +1 -1
- package/docs/contracts/package-self-orientation.md +1 -1
- package/docs/contracts/provider-lifecycle.md +7 -7
- package/docs/contracts/router-blending.md +1 -1
- package/docs/contracts/rule-classification.md +2 -2
- package/docs/contracts/rule-router.md +4 -4
- package/docs/contracts/settings-api.md +207 -0
- package/docs/contracts/settings-gui-agent-mode.schema.json +128 -0
- package/docs/contracts/smoke-contracts.md +3 -3
- package/docs/contracts/tier-3-contrib-plugin.md +1 -1
- package/docs/contracts/trust-and-safety.md +144 -0
- package/docs/contracts/universal-skills.md +1 -1
- package/docs/contracts/write-engine.md +1 -1
- package/docs/customization.md +139 -13
- package/docs/decisions/ADR-001-kernel-swap-deferred.md +1 -1
- package/docs/decisions/ADR-002-kernel-bucket-overrides.md +1 -1
- package/docs/decisions/ADR-004-rule-governance-pruning.md +8 -8
- package/docs/decisions/ADR-006-skill-tools-python-pilot.md +5 -5
- package/docs/decisions/ADR-007-agent-discovery-scopes.md +16 -4
- package/docs/decisions/ADR-008-installed-tools-manifest.md +2 -2
- package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +2 -2
- package/docs/decisions/ADR-011-domain-pack-readiness.md +4 -4
- package/docs/decisions/ADR-012-typescript-cli-shell.md +162 -0
- package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +234 -0
- package/docs/decisions/ADR-014-gui-framework-choice.md +136 -0
- package/docs/decisions/ADR-015-discovery-manifest-contract.md +146 -0
- package/docs/decisions/ADR-016-installer-architecture.md +189 -0
- package/docs/decisions/ADR-017-monorepo-physical-layout.md +261 -0
- package/docs/decisions/ADR-018-trust-and-safety-layer.md +159 -0
- package/docs/decisions/ADR-019-router-json-dist-location.md +124 -0
- package/docs/decisions/ADR-020-global-only-consumer-scope.md +123 -0
- package/docs/decisions/ADR-021-deployment-shape.md +153 -0
- package/docs/decisions/ADR-rule-kernel-and-router.md +2 -2
- package/docs/decisions/INDEX.md +10 -0
- package/docs/deploy/connector-setup.md +129 -0
- package/docs/deploy/env-vars.md +70 -0
- package/docs/deploy/policy-cookbook.md +130 -0
- package/docs/deploy/quickstart.md +112 -0
- package/docs/distribution/mcp-submission-checklist.md +95 -0
- package/docs/distribution/public-install-smoke.md +68 -0
- package/docs/distribution/registries.md +55 -0
- package/docs/distribution/telemetry-privacy.md +128 -0
- package/docs/distribution/telemetry-schema.md +174 -0
- package/docs/distribution/topics-equivalents-decay-policy.md +51 -0
- package/docs/examples/agent-user.example.md +3 -1
- package/docs/featured-skills.md +95 -0
- package/docs/getting-started-by-role.md +19 -1
- package/docs/getting-started.md +5 -4
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
- package/docs/guidelines/agent-infra/installed-tools-manifest.md +11 -8
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +10 -1
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/tool-integration.md +1 -1
- package/docs/guidelines/docs/readme-size-and-splitting.md +53 -1
- package/docs/guidelines/php/api-design.md +1 -1
- package/docs/guidelines/prompt-templates.md +2 -2
- package/docs/hook-payload-capture.md +3 -3
- package/docs/installation.md +39 -18
- package/docs/maintainers/dev-mode.md +105 -0
- package/docs/migrations/commands-1.15.0.md +3 -3
- package/docs/parity/bench-ruflo.json +1 -1
- package/docs/parity/ruflo.md +3 -3
- package/docs/profiles.md +1 -1
- package/docs/quality.md +2 -2
- package/docs/recruits/_template.md +3 -3
- package/docs/setup/enterprise-and-offline.md +3 -3
- package/docs/setup/mcp-server-docker.md +5 -3
- package/docs/setup/per-ide/claude-desktop.md +3 -2
- package/docs/skills-catalog.md +62 -18
- package/docs/wizard.md +156 -0
- package/llms.txt +61 -17
- package/package.json +63 -3
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_archive/README.md +2 -2
- package/scripts/_archive/_p4_migrate.py +1 -1
- package/scripts/_cli/cmd_doctor.py +155 -7
- package/scripts/_cli/cmd_explain.py +108 -3
- package/scripts/_cli/cmd_migrate.py +2 -2
- package/scripts/_cli/cmd_migrate_to_global.py +415 -0
- package/scripts/_cli/cmd_settings_migrate.py +146 -0
- package/scripts/_cli/explain_last/__init__.py +122 -0
- package/scripts/_cli/explain_last/assumptions.py +59 -0
- package/scripts/_cli/explain_last/council.py +105 -0
- package/scripts/_cli/explain_last/halt.py +44 -0
- package/scripts/_cli/explain_last/inputs.py +125 -0
- package/scripts/_cli/explain_last/memory.py +94 -0
- package/scripts/_cli/explain_last/provider.py +52 -0
- package/scripts/_cli/explain_last/render.py +52 -0
- package/scripts/_cli/explain_last/route.py +59 -0
- package/scripts/_cli/explain_last/scrubber.py +105 -0
- package/scripts/_cli/explain_last/sections/__init__.py +35 -0
- package/scripts/_cli/explain_last/sections/assumptions.py +21 -0
- package/scripts/_cli/explain_last/sections/council.py +27 -0
- package/scripts/_cli/explain_last/sections/halt.py +31 -0
- package/scripts/_cli/explain_last/sections/header.py +24 -0
- package/scripts/_cli/explain_last/sections/inputs.py +27 -0
- package/scripts/_cli/explain_last/sections/memory.py +21 -0
- package/scripts/_cli/explain_last/sections/pack.py +16 -0
- package/scripts/_cli/explain_last/sections/provider.py +26 -0
- package/scripts/_cli/explain_last/sections/route.py +22 -0
- package/scripts/_cli/explain_last/state_loader.py +76 -0
- package/scripts/_dispatch.bash +987 -0
- 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 +7 -4
- package/scripts/_lib/agent_src.py +157 -0
- package/scripts/_lib/agents_overlay.py +3 -3
- package/scripts/_phase4_bucket.py +210 -0
- package/scripts/agent-config +50 -947
- package/scripts/ai-video/adapters/higgsfield.sh +1 -1
- package/scripts/ai-video/adapters/sora.sh +1 -1
- package/scripts/ai-video/test-pipeline.sh +2 -2
- package/scripts/ai_council/_default_prices.py +5 -5
- package/scripts/ai_council/advisors.py +1 -1
- package/scripts/ai_council/clients.py +2 -2
- package/scripts/ai_council/compile_corpus.py +9 -8
- package/scripts/ai_council/config.py +3 -3
- package/scripts/ai_council/events_log.py +8 -4
- package/scripts/ai_council/low_impact_corpus.py +1 -1
- package/scripts/ai_council/low_impact_intake.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +2 -2
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_structural_optimization.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +3 -3
- package/scripts/ai_council/pricing.py +8 -7
- package/scripts/ai_council/probation_gate.py +1 -1
- package/scripts/ai_council/redact_low_impact_entry.py +1 -1
- package/scripts/ai_council/session.py +13 -13
- package/scripts/ai_council/shadow_dispatch.py +2 -2
- package/scripts/annotate_discovery.py +149 -0
- package/scripts/audit_adr_coverage.py +1 -1
- package/scripts/audit_auto_rules.py +2 -2
- package/scripts/audit_cloud_compatibility.py +1 -1
- package/scripts/audit_command_surface.py +2 -2
- package/scripts/audit_likelihood.py +4 -4
- package/scripts/audit_overlap.py +3 -3
- package/scripts/audit_skill_descriptions.py +18 -6
- package/scripts/audit_user_type_axis.py +1 -1
- package/scripts/build_discovery_manifest.py +658 -0
- package/scripts/build_mcp_registry_manifest.py +181 -0
- package/scripts/build_rule_trigger_matrix.py +2 -2
- package/scripts/capture_showcase_session.py +1 -1
- package/scripts/chat_history.py +5 -5
- package/scripts/check_always_budget.py +7 -2
- package/scripts/check_artefact_checksums.py +104 -0
- package/scripts/check_cluster_patterns.py +20 -4
- package/scripts/check_command_count_messaging.py +33 -14
- package/scripts/check_council_layout.py +26 -20
- package/scripts/check_council_references.py +53 -14
- package/scripts/check_discovery_determinism.py +70 -0
- package/scripts/check_kernel_rule_bundle.py +2 -2
- package/scripts/check_no_roadmap_refs.py +2 -2
- package/scripts/check_one_off_location.py +1 -1
- package/scripts/check_overlay_cascade_subdirs.py +7 -3
- package/scripts/check_public_links.py +2 -2
- package/scripts/check_references.py +19 -23
- package/scripts/check_release_includes_discovery.py +61 -0
- package/scripts/check_reply_consistency.py +32 -9
- package/scripts/check_template_pin_drift.py +24 -7
- package/scripts/check_token_optimizer_freshness.py +18 -3
- package/scripts/ci_summary.py +2 -2
- package/scripts/ci_time_ratio.py +1 -1
- package/scripts/command_suggester/__init__.py +1 -1
- package/scripts/compile_router.py +34 -2
- package/scripts/compress.py +162 -44
- package/scripts/config/presets.py +19 -1
- package/scripts/config/profiles.py +16 -1
- package/scripts/context_hygiene_hook.py +2 -2
- package/scripts/council_cli.py +22 -22
- package/scripts/council_prune.py +3 -3
- package/scripts/discovery_stats.py +70 -0
- package/scripts/expected_perms.json +47 -0
- package/scripts/extract_audit_patterns.py +2 -2
- package/scripts/gen_discovery_baseline.py +127 -0
- package/scripts/generate_index.py +78 -46
- package/scripts/generate_ownership_matrix.py +99 -44
- package/scripts/generate_pack_manifests.py +183 -0
- package/scripts/hook_manifest.yaml +5 -5
- package/scripts/hooks/cline-dispatcher.sh +1 -1
- package/scripts/hooks/cowork-dispatcher.sh +1 -1
- package/scripts/hooks/dispatch_hook.py +3 -3
- package/scripts/hooks/gemini-dispatcher.sh +1 -1
- package/scripts/hooks/replay_hook.py +1 -1
- package/scripts/hooks/state_io.py +5 -5
- package/scripts/hooks_doctor.py +4 -4
- package/scripts/install +18 -1
- package/scripts/install-hooks.sh +2 -2
- package/scripts/install.py +937 -62
- package/scripts/install.sh +147 -27
- package/scripts/inventory_frontmatter.py +1 -1
- package/scripts/lint_agents_layout.py +183 -0
- package/scripts/lint_agents_md.py +1 -1
- package/scripts/lint_archived_skills.py +35 -19
- package/scripts/lint_artefact_frontmatter.py +180 -0
- package/scripts/lint_bench_corpus.py +14 -2
- package/scripts/lint_command_tiers.py +15 -2
- package/scripts/lint_discovery_manifest.py +136 -0
- package/scripts/lint_discovery_vocabulary.py +148 -0
- package/scripts/lint_explain_trace.py +80 -0
- package/scripts/lint_featured_skills.py +139 -0
- package/scripts/lint_framework_leakage.py +33 -6
- package/scripts/lint_framework_leakage_allowlist.json +63 -62
- package/scripts/lint_ghostwriter_source.py +1 -1
- package/scripts/lint_global_paths.py +147 -0
- package/scripts/lint_load_context.py +3 -3
- package/scripts/lint_mcp_registry_manifest.py +69 -0
- package/scripts/lint_media_policy_linkage.py +6 -6
- package/scripts/lint_orchestration_dsl.py +6 -3
- package/scripts/lint_pack_boundaries.py +147 -0
- package/scripts/lint_pack_first_win.py +103 -0
- package/scripts/lint_positioning.py +143 -0
- package/scripts/lint_readme_jargon.py +131 -0
- package/scripts/lint_readme_size.py +33 -0
- package/scripts/lint_rule_interactions.py +23 -5
- package/scripts/lint_rule_tiers.py +14 -5
- package/scripts/lint_skill_tools.py +1 -1
- package/scripts/lint_topics_yaml.py +89 -0
- package/scripts/lint_trust_coherence.py +212 -0
- package/scripts/mcp_server/consumer_tool_catalog.json +3 -3
- package/scripts/mcp_server/telemetry.py +2 -2
- package/scripts/mcp_server/tools.py +27 -11
- package/scripts/mcp_telemetry_health.py +2 -2
- package/scripts/mcp_telemetry_store.py +1 -1
- package/scripts/measure_augment_budget.py +3 -3
- package/scripts/measure_density.py +2 -2
- package/scripts/measure_frugality_savings.py +3 -3
- package/scripts/measure_roadmap_trajectory.py +1 -1
- package/scripts/measure_rule_budget.py +25 -7
- package/scripts/memory_report.py +1 -1
- package/scripts/migrate_command_suggestions.py +3 -3
- package/scripts/minimal_safe_diff_hook.py +1 -1
- package/scripts/move_artefact.py +143 -0
- package/scripts/new_skill.py +148 -0
- package/scripts/onboarding_gate_hook.py +4 -4
- package/scripts/plan_physical_move.py +353 -0
- package/scripts/prepack-check.mjs +62 -0
- package/scripts/probe_projection_fidelity.py +2 -2
- package/scripts/refine_ticket_detect.py +31 -8
- package/scripts/schemas/command.schema.json +45 -1
- package/scripts/schemas/persona.schema.json +1 -1
- package/scripts/schemas/rule.schema.json +44 -4
- package/scripts/schemas/skill.schema.json +41 -1
- package/scripts/score_skill_selection.py +1 -1
- package/scripts/skill_collision_clusters.py +1 -1
- package/scripts/skill_linter.py +250 -120
- package/scripts/skill_overlap.py +1 -1
- package/scripts/skill_tools/run_block_d_eval.py +1 -1
- package/scripts/skill_trigger_eval.py +28 -8
- package/scripts/skill_usage_collect.py +3 -3
- package/scripts/skill_usage_report.py +3 -3
- package/scripts/smoke/kernel.sh +1 -1
- package/scripts/smoke/router.sh +24 -5
- package/scripts/smoke/skills.sh +15 -7
- package/scripts/smoke_quickstart.py +12 -3
- package/scripts/snapshot_agent_outputs.py +144 -0
- package/scripts/spotcheck_thin_root.py +1 -1
- package/scripts/sync_github_metadata.py +147 -0
- package/scripts/sync_gitignore.py +15 -5
- package/scripts/update_counts.py +45 -17
- package/scripts/update_prices.py +4 -3
- package/scripts/validate_decision_engine.py +9 -1
- package/scripts/validate_discovery_manifest.py +94 -0
- package/scripts/validate_frontmatter.py +39 -20
- package/scripts/verify_before_complete_hook.py +1 -1
- package/scripts/verify_physical_move.py +185 -0
- package/scripts/verify_roadmap_closure.py +1 -1
- package/templates/agent-user.md +34 -0
- package/templates/agent-user.yml +21 -0
- package/templates/minimal/agents-overrides-readme.md +46 -0
- package/templates/minimal/overrides-gitkeep +2 -0
- package/.agent-src/commands/onboard.md +0 -467
- package/templates/minimal/agents-gitkeep +0 -2
|
@@ -15,8 +15,11 @@ import sys
|
|
|
15
15
|
from pathlib import Path
|
|
16
16
|
|
|
17
17
|
ROOT = Path(__file__).resolve().parent.parent
|
|
18
|
+
# ADR-017: rules now live across multiple source roots. Legacy
|
|
19
|
+
# .agent-src.uncompressed/rules/ is kept as a fallback for the
|
|
20
|
+
# pure-compressed consumer projection.
|
|
18
21
|
RULES_DIR = ROOT / ".agent-src.uncompressed" / "rules"
|
|
19
|
-
OUT_PATH = ROOT / "router.json"
|
|
22
|
+
OUT_PATH = ROOT / "dist" / "router.json"
|
|
20
23
|
SETTINGS_PATH = ROOT / ".agent-settings.yml"
|
|
21
24
|
SCHEMA_VERSION = 1
|
|
22
25
|
|
|
@@ -116,11 +119,39 @@ def _load_settings() -> dict:
|
|
|
116
119
|
return load_agent_settings(project_path=SETTINGS_PATH)
|
|
117
120
|
|
|
118
121
|
|
|
122
|
+
def _iter_rule_files() -> list[Path]:
|
|
123
|
+
"""Walk every source root for rule files. First root wins per id."""
|
|
124
|
+
try:
|
|
125
|
+
from scripts._lib.agent_src import artefact_roots # type: ignore
|
|
126
|
+
except ImportError:
|
|
127
|
+
import sys as _sys
|
|
128
|
+
from pathlib import Path as _Path
|
|
129
|
+
_sys.path.insert(0, str(_Path(__file__).resolve().parent))
|
|
130
|
+
from _lib.agent_src import artefact_roots # type: ignore[import-not-found]
|
|
131
|
+
|
|
132
|
+
seen: dict[str, Path] = {}
|
|
133
|
+
roots = artefact_roots()
|
|
134
|
+
if not roots:
|
|
135
|
+
# Pure-compressed fallback for consumer projections that vendor
|
|
136
|
+
# the flat .agent-src/ tree without sources.
|
|
137
|
+
if RULES_DIR.exists():
|
|
138
|
+
for path in sorted(RULES_DIR.glob("*.md")):
|
|
139
|
+
seen.setdefault(path.stem, path)
|
|
140
|
+
else:
|
|
141
|
+
for src_root in roots:
|
|
142
|
+
rd = src_root / "rules"
|
|
143
|
+
if not rd.exists():
|
|
144
|
+
continue
|
|
145
|
+
for path in sorted(rd.glob("*.md")):
|
|
146
|
+
seen.setdefault(path.stem, path)
|
|
147
|
+
return [seen[k] for k in sorted(seen)]
|
|
148
|
+
|
|
149
|
+
|
|
119
150
|
def _collect(rules_dir: Path) -> dict:
|
|
120
151
|
settings = _load_settings()
|
|
121
152
|
kernel: list[str] = []
|
|
122
153
|
tiered: dict[str, list[dict]] = {"tier-1": [], "tier-2": []}
|
|
123
|
-
for path in
|
|
154
|
+
for path in _iter_rule_files():
|
|
124
155
|
fm = _parse_frontmatter(path.read_text(encoding="utf-8"))
|
|
125
156
|
if not fm:
|
|
126
157
|
continue
|
|
@@ -172,6 +203,7 @@ def main(argv: list[str]) -> int:
|
|
|
172
203
|
return 1
|
|
173
204
|
print("✅ router.json is up to date")
|
|
174
205
|
return 0
|
|
206
|
+
OUT_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
175
207
|
OUT_PATH.write_text(text, encoding="utf-8")
|
|
176
208
|
counts = (len(out["kernel"]), len(out["tier_1"]), len(out["tier_2"]))
|
|
177
209
|
print(f"✅ router.json — kernel={counts[0]} tier-1={counts[1]} tier-2={counts[2]}")
|
package/scripts/compress.py
CHANGED
|
@@ -32,14 +32,43 @@ import yaml
|
|
|
32
32
|
|
|
33
33
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
34
34
|
from _lib.script_output import info, success, flush_summary, resolve_level # noqa: E402
|
|
35
|
+
from _lib.agent_src import ( # noqa: E402
|
|
36
|
+
artefact_roots,
|
|
37
|
+
iter_all_sources,
|
|
38
|
+
resolve_logical,
|
|
39
|
+
)
|
|
35
40
|
|
|
36
41
|
PROJECT_ROOT = Path(__file__).resolve().parent.parent
|
|
42
|
+
# Legacy single-root anchor — kept for backward compatibility with callers
|
|
43
|
+
# that pass it explicitly. Multi-root iteration (post-ADR-017 physical
|
|
44
|
+
# move) goes through `_lib.agent_src` helpers.
|
|
37
45
|
SOURCE_DIR = PROJECT_ROOT / ".agent-src.uncompressed"
|
|
38
46
|
TARGET_DIR = PROJECT_ROOT / ".agent-src"
|
|
39
47
|
AUGMENT_DIR = PROJECT_ROOT / ".augment"
|
|
40
48
|
HASH_FILE = PROJECT_ROOT / ".compression-hashes.json"
|
|
41
49
|
SETTINGS_FILE = PROJECT_ROOT / ".agent-settings.yml"
|
|
42
50
|
|
|
51
|
+
|
|
52
|
+
def _iter_sources():
|
|
53
|
+
"""Yield (physical_path, logical_relpath) for every source artefact.
|
|
54
|
+
|
|
55
|
+
Wraps `_lib.agent_src.iter_all_sources` so the compressor walks every
|
|
56
|
+
active source root (legacy `.agent-src.uncompressed/` plus any
|
|
57
|
+
`packages/*/.agent-src.uncompressed/`) and keys outputs by the
|
|
58
|
+
logical relative path that survives the physical move (ADR-017).
|
|
59
|
+
"""
|
|
60
|
+
yield from iter_all_sources()
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _resolve_source(relative: str) -> Path | None:
|
|
64
|
+
"""Find the physical path that backs a logical relative path."""
|
|
65
|
+
return resolve_logical(relative)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _any_source_root_exists() -> bool:
|
|
69
|
+
"""True if at least one artefact source root contains files."""
|
|
70
|
+
return bool(artefact_roots())
|
|
71
|
+
|
|
43
72
|
# Self-projection tool toggle — see .agent-tools.yml. When the file is
|
|
44
73
|
# absent (e.g. tests run in tmp dirs, consumer projects), `_active_tools`
|
|
45
74
|
# returns ``None`` which is treated as "emit every tool".
|
|
@@ -148,8 +177,8 @@ def mark_done(relative_path: str) -> None:
|
|
|
148
177
|
relative paths in the shipped layer (P1 of road-to-path-fixes.md).
|
|
149
178
|
Idempotent — re-running is a no-op.
|
|
150
179
|
"""
|
|
151
|
-
source_file =
|
|
152
|
-
if not source_file.exists():
|
|
180
|
+
source_file = _resolve_source(relative_path)
|
|
181
|
+
if source_file is None or not source_file.exists():
|
|
153
182
|
print(f"❌ Source file not found: {relative_path}")
|
|
154
183
|
sys.exit(1)
|
|
155
184
|
apply_path_rewriter(relative_path)
|
|
@@ -181,12 +210,9 @@ def mark_all_done() -> None:
|
|
|
181
210
|
"""Mark ALL .md files as compressed (e.g. after initial full compression)."""
|
|
182
211
|
hashes = load_hashes()
|
|
183
212
|
count = 0
|
|
184
|
-
for source_file in
|
|
185
|
-
if source_file.is_dir():
|
|
186
|
-
continue
|
|
213
|
+
for source_file, relative in _iter_sources():
|
|
187
214
|
if not should_compress(source_file):
|
|
188
215
|
continue
|
|
189
|
-
relative = str(source_file.relative_to(SOURCE_DIR))
|
|
190
216
|
hashes[relative] = file_hash(source_file)
|
|
191
217
|
count += 1
|
|
192
218
|
save_hashes(hashes)
|
|
@@ -194,15 +220,17 @@ def mark_all_done() -> None:
|
|
|
194
220
|
|
|
195
221
|
|
|
196
222
|
def list_changed_md(source_dir: Path) -> list:
|
|
197
|
-
"""List .md files whose source hash differs from stored hash (= need recompression).
|
|
223
|
+
"""List .md files whose source hash differs from stored hash (= need recompression).
|
|
224
|
+
|
|
225
|
+
The ``source_dir`` parameter is retained for backward compatibility but
|
|
226
|
+
ignored — iteration walks every active source root (ADR-017).
|
|
227
|
+
"""
|
|
228
|
+
del source_dir # multi-root: ignored, kept for signature stability
|
|
198
229
|
hashes = load_hashes()
|
|
199
230
|
changed = []
|
|
200
|
-
for source_file in
|
|
201
|
-
if source_file.is_dir():
|
|
202
|
-
continue
|
|
231
|
+
for source_file, relative in _iter_sources():
|
|
203
232
|
if not should_compress(source_file):
|
|
204
233
|
continue
|
|
205
|
-
relative = str(source_file.relative_to(source_dir))
|
|
206
234
|
current_hash = file_hash(source_file)
|
|
207
235
|
stored_hash = hashes.get(relative)
|
|
208
236
|
if stored_hash != current_hash:
|
|
@@ -211,12 +239,12 @@ def list_changed_md(source_dir: Path) -> list:
|
|
|
211
239
|
|
|
212
240
|
|
|
213
241
|
def find_stale_hashes(source_dir: Path) -> list:
|
|
214
|
-
"""Find hashes stored for source files that no longer exist."""
|
|
242
|
+
"""Find hashes stored for source files that no longer exist in any root."""
|
|
243
|
+
del source_dir # multi-root: ignored, kept for signature stability
|
|
215
244
|
hashes = load_hashes()
|
|
216
245
|
stale = []
|
|
217
246
|
for relative in sorted(hashes.keys()):
|
|
218
|
-
|
|
219
|
-
if not source_file.exists():
|
|
247
|
+
if _resolve_source(relative) is None:
|
|
220
248
|
stale.append(relative)
|
|
221
249
|
return stale
|
|
222
250
|
|
|
@@ -240,10 +268,16 @@ def should_compress(filepath: Path) -> bool:
|
|
|
240
268
|
return False
|
|
241
269
|
if filepath.name in COPY_AS_IS:
|
|
242
270
|
return False
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
271
|
+
# Determine the logical relative path so the COPY_AS_IS_DIRS check
|
|
272
|
+
# works for both legacy (`.agent-src.uncompressed/`) and post-move
|
|
273
|
+
# (`packages/*/.agent-src.uncompressed/`) source roots.
|
|
274
|
+
rel_parts: tuple[str, ...] = filepath.parts
|
|
275
|
+
for root in artefact_roots():
|
|
276
|
+
try:
|
|
277
|
+
rel_parts = filepath.relative_to(root).parts
|
|
278
|
+
break
|
|
279
|
+
except ValueError:
|
|
280
|
+
continue
|
|
247
281
|
if rel_parts and rel_parts[0] in COPY_AS_IS_DIRS:
|
|
248
282
|
return False
|
|
249
283
|
return True
|
|
@@ -256,7 +290,8 @@ def copy_file(source: Path, target: Path) -> None:
|
|
|
256
290
|
|
|
257
291
|
|
|
258
292
|
def cleanup_stale(source_dir: Path, target_dir: Path) -> int:
|
|
259
|
-
"""Delete files in target that don't exist in source. Returns count."""
|
|
293
|
+
"""Delete files in target that don't exist in any source root. Returns count."""
|
|
294
|
+
del source_dir # multi-root: ignored, kept for signature stability
|
|
260
295
|
deleted = 0
|
|
261
296
|
if not target_dir.exists():
|
|
262
297
|
return 0
|
|
@@ -265,8 +300,7 @@ def cleanup_stale(source_dir: Path, target_dir: Path) -> int:
|
|
|
265
300
|
if target_file.is_dir():
|
|
266
301
|
continue
|
|
267
302
|
relative = target_file.relative_to(target_dir)
|
|
268
|
-
|
|
269
|
-
if not source_file.exists():
|
|
303
|
+
if _resolve_source(str(relative)) is None:
|
|
270
304
|
print(f" Deleting stale: {relative}")
|
|
271
305
|
target_file.unlink()
|
|
272
306
|
deleted += 1
|
|
@@ -281,14 +315,17 @@ def cleanup_stale(source_dir: Path, target_dir: Path) -> int:
|
|
|
281
315
|
|
|
282
316
|
|
|
283
317
|
def sync_non_md(source_dir: Path, target_dir: Path) -> int:
|
|
284
|
-
"""Copy all non-.md files (and COPY_AS_IS .md files) from source
|
|
318
|
+
"""Copy all non-.md files (and COPY_AS_IS .md files) from every source
|
|
319
|
+
root to target. Returns count."""
|
|
320
|
+
del source_dir # multi-root: ignored, kept for signature stability
|
|
285
321
|
copied = 0
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
continue
|
|
322
|
+
seen: set[str] = set()
|
|
323
|
+
for source_file, relative in _iter_sources():
|
|
289
324
|
if should_compress(source_file):
|
|
290
325
|
continue # .md files are compressed by the agent, not copied here
|
|
291
|
-
relative
|
|
326
|
+
if relative in seen:
|
|
327
|
+
continue
|
|
328
|
+
seen.add(relative)
|
|
292
329
|
target_file = target_dir / relative
|
|
293
330
|
copy_file(source_file, target_file)
|
|
294
331
|
print(f" Copied: {relative}")
|
|
@@ -298,36 +335,41 @@ def sync_non_md(source_dir: Path, target_dir: Path) -> int:
|
|
|
298
335
|
|
|
299
336
|
def list_md_files(source_dir: Path) -> list:
|
|
300
337
|
"""List all .md files that need compression by the agent."""
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
338
|
+
del source_dir # multi-root: ignored, kept for signature stability
|
|
339
|
+
files: list[str] = []
|
|
340
|
+
seen: set[str] = set()
|
|
341
|
+
for source_file, relative in _iter_sources():
|
|
342
|
+
if not should_compress(source_file):
|
|
304
343
|
continue
|
|
305
|
-
if
|
|
306
|
-
|
|
307
|
-
|
|
344
|
+
if relative in seen:
|
|
345
|
+
continue
|
|
346
|
+
seen.add(relative)
|
|
347
|
+
files.append(relative)
|
|
348
|
+
return sorted(files)
|
|
308
349
|
|
|
309
350
|
|
|
310
351
|
def check_sync(source_dir: Path, target_dir: Path) -> tuple:
|
|
311
|
-
"""Check if target is in sync with source. Returns (missing, stale) lists."""
|
|
352
|
+
"""Check if target is in sync with source(s). Returns (missing, stale) lists."""
|
|
353
|
+
del source_dir # multi-root: ignored, kept for signature stability
|
|
312
354
|
missing = []
|
|
313
355
|
stale = []
|
|
314
356
|
|
|
315
|
-
# Files in source but not in target
|
|
316
|
-
|
|
317
|
-
|
|
357
|
+
# Files in any source root but not in target
|
|
358
|
+
seen: set[str] = set()
|
|
359
|
+
for _source_file, relative in _iter_sources():
|
|
360
|
+
if relative in seen:
|
|
318
361
|
continue
|
|
319
|
-
|
|
362
|
+
seen.add(relative)
|
|
320
363
|
if not (target_dir / relative).exists():
|
|
321
364
|
missing.append(relative)
|
|
322
365
|
|
|
323
|
-
# Files in target but not in source (stale)
|
|
366
|
+
# Files in target but not in any source root (stale)
|
|
324
367
|
if target_dir.exists():
|
|
325
368
|
for target_file in sorted(target_dir.rglob("*")):
|
|
326
369
|
if target_file.is_dir():
|
|
327
370
|
continue
|
|
328
371
|
relative = str(target_file.relative_to(target_dir))
|
|
329
|
-
|
|
330
|
-
if not (source_dir / relative).exists():
|
|
372
|
+
if _resolve_source(relative) is None:
|
|
331
373
|
stale.append(relative)
|
|
332
374
|
|
|
333
375
|
return missing, stale
|
|
@@ -512,11 +554,80 @@ def _rewrite_body_links(body: str, prefix: str) -> str:
|
|
|
512
554
|
return _BODY_DOCS_RE.sub(prefix + r"\1", body)
|
|
513
555
|
|
|
514
556
|
|
|
557
|
+
# ── Human-review banner injection (Phase 5.3 / ADR-018) ───────────────────
|
|
558
|
+
# Source artefacts may set `trust.human_review_required: true` in their
|
|
559
|
+
# frontmatter. The compressor injects a short, parser-stable banner block
|
|
560
|
+
# at the top of the projected body so every downstream surface (agent
|
|
561
|
+
# memory, .augment, .claude, etc.) surfaces the gate. Idempotent — the
|
|
562
|
+
# marker comment prevents double-injection on re-compress.
|
|
563
|
+
|
|
564
|
+
_HRR_BANNER_MARKER = "<!-- agent-config:human-review-banner -->"
|
|
565
|
+
|
|
566
|
+
# Plain YAML list item — any scalar, used to read `packs:` / `workspaces:`
|
|
567
|
+
# blocks where values are bare identifiers, not file paths.
|
|
568
|
+
_FM_PLAIN_LIST_RE = re.compile(r'^\s*-\s*(["\']?)([^"\'\n]+?)\1\s*$')
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
def _parse_trust_and_owner(fm_lines):
|
|
572
|
+
"""Extract `trust.level`, `human_review_required`, and an owner hint
|
|
573
|
+
from a frontmatter line list. Owner falls back to the first pack
|
|
574
|
+
prefix (`finance-basic` → `finance`), then the first workspace,
|
|
575
|
+
then `unknown`.
|
|
576
|
+
"""
|
|
577
|
+
level = None
|
|
578
|
+
hrr = False
|
|
579
|
+
packs: list[str] = []
|
|
580
|
+
workspaces: list[str] = []
|
|
581
|
+
in_trust = False
|
|
582
|
+
in_packs = False
|
|
583
|
+
in_workspaces = False
|
|
584
|
+
for line in fm_lines:
|
|
585
|
+
stripped = line.lstrip()
|
|
586
|
+
indent = len(line) - len(stripped)
|
|
587
|
+
if indent == 0 and stripped.endswith(":"):
|
|
588
|
+
key = stripped[:-1]
|
|
589
|
+
in_trust = key == "trust"
|
|
590
|
+
in_packs = key == "packs"
|
|
591
|
+
in_workspaces = key == "workspaces"
|
|
592
|
+
continue
|
|
593
|
+
if in_trust and stripped.startswith("level:"):
|
|
594
|
+
level = stripped.split(":", 1)[1].strip().strip('"').strip("'")
|
|
595
|
+
elif in_trust and stripped.startswith("human_review_required:"):
|
|
596
|
+
val = stripped.split(":", 1)[1].strip()
|
|
597
|
+
hrr = val.lower() == "true"
|
|
598
|
+
elif in_packs or in_workspaces:
|
|
599
|
+
m = _FM_PLAIN_LIST_RE.match(line)
|
|
600
|
+
if m:
|
|
601
|
+
value = m.group(2).strip()
|
|
602
|
+
(packs if in_packs else workspaces).append(value)
|
|
603
|
+
owner = "unknown"
|
|
604
|
+
if packs:
|
|
605
|
+
owner = packs[0].split("-")[0]
|
|
606
|
+
elif workspaces:
|
|
607
|
+
owner = workspaces[0]
|
|
608
|
+
return level, hrr, owner
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
def _inject_hrr_banner(body: str, level: str, owner: str) -> str:
|
|
612
|
+
"""Prepend the HUMAN_REVIEW banner block to `body`. Idempotent — a
|
|
613
|
+
body that already carries `_HRR_BANNER_MARKER` is returned unchanged.
|
|
614
|
+
"""
|
|
615
|
+
if _HRR_BANNER_MARKER in body:
|
|
616
|
+
return body
|
|
617
|
+
banner = (
|
|
618
|
+
f"{_HRR_BANNER_MARKER}\n"
|
|
619
|
+
f"> HUMAN REVIEW REQUIRED · trust: {level} · owner: {owner}\n\n"
|
|
620
|
+
)
|
|
621
|
+
return banner + body.lstrip("\n")
|
|
622
|
+
|
|
623
|
+
|
|
515
624
|
def _rewrite_paths(content: str, source_relative_path: str) -> str:
|
|
516
625
|
"""Rewrite logical / legacy paths in `content` for a file shipped at
|
|
517
626
|
`.agent-src/{source_relative_path}`. Idempotent.
|
|
518
627
|
|
|
519
628
|
See module-level comment above for the full pattern catalog.
|
|
629
|
+
Also injects the HUMAN_REVIEW banner when the source frontmatter
|
|
630
|
+
sets `trust.human_review_required: true` (Phase 5.3 / ADR-018).
|
|
520
631
|
"""
|
|
521
632
|
prefix = _depth_prefix(source_relative_path)
|
|
522
633
|
fm_lines, body = _split_frontmatter(content)
|
|
@@ -524,6 +635,9 @@ def _rewrite_paths(content: str, source_relative_path: str) -> str:
|
|
|
524
635
|
if fm_lines is None:
|
|
525
636
|
return body
|
|
526
637
|
new_fm = _rewrite_frontmatter_lines(fm_lines, prefix)
|
|
638
|
+
level, hrr, owner = _parse_trust_and_owner(fm_lines)
|
|
639
|
+
if hrr and level:
|
|
640
|
+
body = _inject_hrr_banner(body, level, owner)
|
|
527
641
|
return "---\n" + "\n".join(new_fm) + "\n---\n" + body
|
|
528
642
|
|
|
529
643
|
|
|
@@ -1096,8 +1210,11 @@ def clean_tools() -> None:
|
|
|
1096
1210
|
|
|
1097
1211
|
|
|
1098
1212
|
def main() -> None:
|
|
1099
|
-
|
|
1100
|
-
|
|
1213
|
+
# Multi-root awareness (ADR-017): tolerate a missing legacy
|
|
1214
|
+
# `.agent-src.uncompressed/` as long as at least one package-scoped
|
|
1215
|
+
# source root carries artefacts.
|
|
1216
|
+
if not SOURCE_DIR.exists() and not _any_source_root_exists():
|
|
1217
|
+
print(f"❌ No source directory found (looked at {SOURCE_DIR} and packages/*/.agent-src.uncompressed)")
|
|
1101
1218
|
sys.exit(1)
|
|
1102
1219
|
|
|
1103
1220
|
arg = sys.argv[1] if len(sys.argv) > 1 else "--sync"
|
|
@@ -1149,9 +1266,10 @@ def main() -> None:
|
|
|
1149
1266
|
copied = sync_non_md(SOURCE_DIR, TARGET_DIR)
|
|
1150
1267
|
print(f"\n--- Cleanup stale files ---")
|
|
1151
1268
|
deleted = cleanup_stale(SOURCE_DIR, TARGET_DIR)
|
|
1152
|
-
# Also cleanup stale hashes
|
|
1269
|
+
# Also cleanup stale hashes (multi-root aware — resolve against
|
|
1270
|
+
# every artefact root, not just the legacy SOURCE_DIR).
|
|
1153
1271
|
hashes = load_hashes()
|
|
1154
|
-
stale_keys = [k for k in hashes if
|
|
1272
|
+
stale_keys = [k for k in hashes if _resolve_source(k) is None]
|
|
1155
1273
|
for k in stale_keys:
|
|
1156
1274
|
del hashes[k]
|
|
1157
1275
|
if stale_keys:
|
|
@@ -93,7 +93,25 @@ def _load_yaml(path: Path) -> dict[str, Any]:
|
|
|
93
93
|
|
|
94
94
|
|
|
95
95
|
def _preset_file(project_root: Path, preset_id: str) -> Path:
|
|
96
|
-
|
|
96
|
+
# Legacy single-root layout — honor when present so tests that mock a
|
|
97
|
+
# ``.agent-src.uncompressed/`` sub-tree under ``project_root`` keep working.
|
|
98
|
+
legacy = project_root / PRESETS_DIRNAME / f"{preset_id}.yml"
|
|
99
|
+
if legacy.exists():
|
|
100
|
+
return legacy
|
|
101
|
+
# Monorepo layout — scan every package root via the agent_src helper.
|
|
102
|
+
try:
|
|
103
|
+
import sys as _sys
|
|
104
|
+
scripts_root = Path(__file__).resolve().parents[1]
|
|
105
|
+
if str(scripts_root) not in _sys.path:
|
|
106
|
+
_sys.path.insert(0, str(scripts_root))
|
|
107
|
+
from _lib.agent_src import artefact_roots # type: ignore
|
|
108
|
+
except Exception:
|
|
109
|
+
return legacy
|
|
110
|
+
for root in artefact_roots():
|
|
111
|
+
candidate = root / "presets" / f"{preset_id}.yml"
|
|
112
|
+
if candidate.exists():
|
|
113
|
+
return candidate
|
|
114
|
+
return legacy
|
|
97
115
|
|
|
98
116
|
|
|
99
117
|
def _coerce_scalar(raw: str) -> Any:
|
|
@@ -89,7 +89,22 @@ def _load_yaml(path: Path) -> dict[str, Any]:
|
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
def _profile_file(project_root: Path, profile_id: str) -> Path:
|
|
92
|
-
|
|
92
|
+
legacy = project_root / PROFILES_DIRNAME / f"{profile_id}.yml"
|
|
93
|
+
if legacy.exists():
|
|
94
|
+
return legacy
|
|
95
|
+
try:
|
|
96
|
+
import sys as _sys
|
|
97
|
+
scripts_root = Path(__file__).resolve().parents[1]
|
|
98
|
+
if str(scripts_root) not in _sys.path:
|
|
99
|
+
_sys.path.insert(0, str(scripts_root))
|
|
100
|
+
from _lib.agent_src import artefact_roots # type: ignore
|
|
101
|
+
except Exception:
|
|
102
|
+
return legacy
|
|
103
|
+
for root in artefact_roots():
|
|
104
|
+
candidate = root / "profiles" / f"{profile_id}.yml"
|
|
105
|
+
if candidate.exists():
|
|
106
|
+
return candidate
|
|
107
|
+
return legacy
|
|
93
108
|
|
|
94
109
|
|
|
95
110
|
def _build_resolved(
|
|
@@ -6,7 +6,7 @@ freshness threshold, the 3-failure stop, and tool-loop detection. The
|
|
|
6
6
|
agent's job shrinks from "remember three counters" to "read this file
|
|
7
7
|
before responding".
|
|
8
8
|
|
|
9
|
-
Output: `agents/state/context-hygiene.json`
|
|
9
|
+
Output: `agents/runtime/state/context-hygiene.json`
|
|
10
10
|
{
|
|
11
11
|
"tool_calls": <int>, // running PostToolUse count
|
|
12
12
|
"consecutive_same_tool": <int>, // includes the latest call
|
|
@@ -31,7 +31,7 @@ import sys
|
|
|
31
31
|
from pathlib import Path
|
|
32
32
|
|
|
33
33
|
# Re-use the shared atomic-write helper so concerns honour the single
|
|
34
|
-
# `agents/state/.dispatcher.lock` discipline (hook-architecture-v1.md
|
|
34
|
+
# `agents/runtime/state/.dispatcher.lock` discipline (hook-architecture-v1.md
|
|
35
35
|
# § Concurrency, Phase 7.4).
|
|
36
36
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
37
37
|
from hooks.state_io import atomic_write_json # noqa: E402
|
package/scripts/council_cli.py
CHANGED
|
@@ -24,15 +24,15 @@ import yaml
|
|
|
24
24
|
|
|
25
25
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
26
26
|
SETTINGS_FILE = REPO_ROOT / ".agent-settings.yml"
|
|
27
|
-
AI_COUNCIL_FILE = REPO_ROOT / "agents" / ".ai-council.yml"
|
|
27
|
+
AI_COUNCIL_FILE = REPO_ROOT / "agents" / "settings" / ".ai-council.yml"
|
|
28
28
|
|
|
29
29
|
# Canonical output dirs per ai-council § "Output path convention".
|
|
30
30
|
# Enforced at write-time by `_validate_council_output_path` so shell-side
|
|
31
31
|
# `>` redirects and forgetful agents can't strand artefacts at agents/ root.
|
|
32
32
|
COUNCIL_CANONICAL_DIRS: dict[str, str] = {
|
|
33
|
-
"responses": "agents/council
|
|
34
|
-
"sessions": "agents/council
|
|
35
|
-
"questions": "agents/council
|
|
33
|
+
"responses": "agents/runtime/council/responses",
|
|
34
|
+
"sessions": "agents/runtime/council/sessions",
|
|
35
|
+
"questions": "agents/runtime/council/questions",
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
|
|
@@ -139,7 +139,7 @@ def load_settings(
|
|
|
139
139
|
``load_agent_settings``. ``ai_council.*`` keys are not whitelisted,
|
|
140
140
|
so the project file remains authoritative for council config.
|
|
141
141
|
|
|
142
|
-
Step-2 council-redesign overlay: when ``agents/.ai-council.yml``
|
|
142
|
+
Step-2 council-redesign overlay: when ``agents/settings/.ai-council.yml``
|
|
143
143
|
exists it is the single source of truth — the validated config is
|
|
144
144
|
synthesized back into ``settings['ai_council']`` and wins over any
|
|
145
145
|
legacy block in ``.agent-settings.yml``. The pre-2 path stays alive
|
|
@@ -478,7 +478,7 @@ def _construct_api_member(
|
|
|
478
478
|
"""Build an api-mode client for a known provider name.
|
|
479
479
|
|
|
480
480
|
``api_key_ref`` carries the validated ``file:<path>`` / ``env:<VAR>``
|
|
481
|
-
reference from ``agents/.ai-council.yml`` and is resolved lazily here
|
|
481
|
+
reference from ``agents/settings/.ai-council.yml`` and is resolved lazily here
|
|
482
482
|
so the council does not require keys for disabled providers. When
|
|
483
483
|
``api_key_ref`` is ``None`` (no new config yet, or legacy code path),
|
|
484
484
|
fall back to the per-provider loaders so the pre-step-2
|
|
@@ -500,7 +500,7 @@ def _construct_api_member(
|
|
|
500
500
|
if name == "gemini":
|
|
501
501
|
if not api_key_ref:
|
|
502
502
|
raise CouncilDisabledError(
|
|
503
|
-
"member 'gemini' requires api_key_ref in agents/.ai-council.yml "
|
|
503
|
+
"member 'gemini' requires api_key_ref in agents/settings/.ai-council.yml "
|
|
504
504
|
"(e.g. `env:GEMINI_API_KEY`) — no legacy fallback."
|
|
505
505
|
)
|
|
506
506
|
api_key = resolve_api_key(api_key_ref, scope="ai_council.members.gemini")
|
|
@@ -508,7 +508,7 @@ def _construct_api_member(
|
|
|
508
508
|
if name == "xai":
|
|
509
509
|
if not api_key_ref:
|
|
510
510
|
raise CouncilDisabledError(
|
|
511
|
-
"member 'xai' requires api_key_ref in agents/.ai-council.yml "
|
|
511
|
+
"member 'xai' requires api_key_ref in agents/settings/.ai-council.yml "
|
|
512
512
|
"(e.g. `env:XAI_API_KEY`) — no legacy fallback."
|
|
513
513
|
)
|
|
514
514
|
api_key = resolve_api_key(api_key_ref, scope="ai_council.members.xai")
|
|
@@ -516,7 +516,7 @@ def _construct_api_member(
|
|
|
516
516
|
if name == "perplexity":
|
|
517
517
|
if not api_key_ref:
|
|
518
518
|
raise CouncilDisabledError(
|
|
519
|
-
"member 'perplexity' requires api_key_ref in agents/.ai-council.yml "
|
|
519
|
+
"member 'perplexity' requires api_key_ref in agents/settings/.ai-council.yml "
|
|
520
520
|
"(e.g. `env:PERPLEXITY_API_KEY`) — no legacy fallback."
|
|
521
521
|
)
|
|
522
522
|
api_key = resolve_api_key(api_key_ref, scope="ai_council.members.perplexity")
|
|
@@ -794,7 +794,7 @@ def _peer_review_active(ai_cfg: dict[str, Any], args: argparse.Namespace) -> boo
|
|
|
794
794
|
Resolution chain (highest priority first):
|
|
795
795
|
1. ``--peer-review`` CLI flag — explicit opt-in.
|
|
796
796
|
2. ``ai_council.peer_review.enabled: true`` in
|
|
797
|
-
``agents/.ai-council.yml`` — opt-in via config.
|
|
797
|
+
``agents/settings/.ai-council.yml`` — opt-in via config.
|
|
798
798
|
Both default to false; peer-review is opt-in by R2 verdict.
|
|
799
799
|
"""
|
|
800
800
|
if getattr(args, "peer_review", False):
|
|
@@ -1037,7 +1037,7 @@ def _emit_debate_estimate(
|
|
|
1037
1037
|
if requested > max_rounds_cap:
|
|
1038
1038
|
raise argparse.ArgumentTypeError(
|
|
1039
1039
|
f"--rounds={requested} exceeds debate_max_rounds={max_rounds_cap}; "
|
|
1040
|
-
f"raise the cap in agents/.ai-council.yml or lower --rounds."
|
|
1040
|
+
f"raise the cap in agents/settings/.ai-council.yml or lower --rounds."
|
|
1041
1041
|
)
|
|
1042
1042
|
rounds = requested
|
|
1043
1043
|
per_round_usd = sum(e.total_usd for e in estimates)
|
|
@@ -1424,7 +1424,7 @@ def _debate_refusal_cap(
|
|
|
1424
1424
|
def _emit_shadow_slo_banner() -> None:
|
|
1425
1425
|
"""Pre-flight SLO banner for solo-dispatch invocations (step-9 P10).
|
|
1426
1426
|
|
|
1427
|
-
Reads ``agents/council
|
|
1427
|
+
Reads ``agents/runtime/council/shadow-log.jsonl`` and prints the 7-day rolling
|
|
1428
1428
|
disagreement rate. ``OK``, ``WARN``, ``BREACH`` are all surfaced so the
|
|
1429
1429
|
user can see when single-member quality is drifting. Never auto-flips
|
|
1430
1430
|
back to full council \u2014 visibility-first, action-second (D10).
|
|
@@ -1444,7 +1444,7 @@ def _apply_solo_dispatch(
|
|
|
1444
1444
|
) -> tuple[list[ExternalAIClient], str | None]:
|
|
1445
1445
|
"""Filter ``members`` to a single solo-dispatch pick (step-9 P9).
|
|
1446
1446
|
|
|
1447
|
-
Loads the routing chain from ``agents/.ai-council.yml`` and asks
|
|
1447
|
+
Loads the routing chain from ``agents/settings/.ai-council.yml`` and asks
|
|
1448
1448
|
:func:`select_solo_member` for the first chain entry whose member
|
|
1449
1449
|
is runtime-present. The probe is conservative: a member counts as
|
|
1450
1450
|
auth-valid iff ``build_members`` returned a runtime client for it
|
|
@@ -1596,7 +1596,7 @@ def cmd_run(
|
|
|
1596
1596
|
# Phase 8 step 5 — opt-in cost disclosure for non-debate lenses.
|
|
1597
1597
|
# Default mode is "off" for analysis / default (cheap enough that
|
|
1598
1598
|
# the disclosure is friction); users opt in by setting
|
|
1599
|
-
# `lenses.<name>.cost_disclosure.mode` in agents/.ai-council.yml.
|
|
1599
|
+
# `lenses.<name>.cost_disclosure.mode` in agents/settings/.ai-council.yml.
|
|
1600
1600
|
disc_mode, disc_threshold, disc_show = _resolve_cost_disclosure(
|
|
1601
1601
|
ai_cfg, question.mode,
|
|
1602
1602
|
)
|
|
@@ -1885,7 +1885,7 @@ def cmd_debate(
|
|
|
1885
1885
|
if requested > max_rounds_cap:
|
|
1886
1886
|
raise argparse.ArgumentTypeError(
|
|
1887
1887
|
f"--rounds={requested} exceeds debate_max_rounds={max_rounds_cap}; "
|
|
1888
|
-
f"raise the cap in agents/.ai-council.yml or lower --rounds."
|
|
1888
|
+
f"raise the cap in agents/settings/.ai-council.yml or lower --rounds."
|
|
1889
1889
|
)
|
|
1890
1890
|
rounds = requested
|
|
1891
1891
|
|
|
@@ -1942,7 +1942,7 @@ def cmd_debate(
|
|
|
1942
1942
|
f"❌ council:debate refused · high-end estimate "
|
|
1943
1943
|
f"${debate_estimate.high_usd:.4f} exceeds "
|
|
1944
1944
|
f"debate.max_cost_usd=${cap:.2f}. Lower --rounds, drop "
|
|
1945
|
-
f"members, or raise the cap in agents/.ai-council.yml.\n"
|
|
1945
|
+
f"members, or raise the cap in agents/settings/.ai-council.yml.\n"
|
|
1946
1946
|
)
|
|
1947
1947
|
return 4
|
|
1948
1948
|
|
|
@@ -2037,7 +2037,7 @@ def cmd_render(args: argparse.Namespace) -> int:
|
|
|
2037
2037
|
Lens resolution order: explicit ``--prompt-mode`` > ``prompt_mode``
|
|
2038
2038
|
in the payload > ``mode`` in the payload > ``None`` (default decision
|
|
2039
2039
|
template). R4 Q4 escape hatch ``--prose-synthesis`` overrides the
|
|
2040
|
-
table. ``--output`` writes to ``agents/council
|
|
2040
|
+
table. ``--output`` writes to ``agents/runtime/council/sessions/`` (enforced);
|
|
2041
2041
|
omit it for stdout.
|
|
2042
2042
|
"""
|
|
2043
2043
|
payload = json.loads(Path(args.responses).read_text(encoding="utf-8"))
|
|
@@ -2258,7 +2258,7 @@ def _add_common_input_args(p: argparse.ArgumentParser) -> None:
|
|
|
2258
2258
|
"(anonymised) responses for blind spots before "
|
|
2259
2259
|
"synthesis. Adds N extra API calls. Opt-in per the "
|
|
2260
2260
|
"R2 verdict; also accepts ai_council.peer_review."
|
|
2261
|
-
"enabled: true in agents/.ai-council.yml.")
|
|
2261
|
+
"enabled: true in agents/settings/.ai-council.yml.")
|
|
2262
2262
|
|
|
2263
2263
|
|
|
2264
2264
|
def cmd_shadow_report(args: argparse.Namespace) -> int:
|
|
@@ -2405,7 +2405,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
2405
2405
|
help="Required to actually start the debate.")
|
|
2406
2406
|
p_deb.add_argument("--rounds", type=int, default=None,
|
|
2407
2407
|
help="Number of debate rounds (default 2). Capped by "
|
|
2408
|
-
"ai_council.debate_max_rounds in agents/.ai-council.yml.")
|
|
2408
|
+
"ai_council.debate_max_rounds in agents/settings/.ai-council.yml.")
|
|
2409
2409
|
p_deb.add_argument("--auto-continue", action="store_true",
|
|
2410
2410
|
default=False, dest="auto_continue",
|
|
2411
2411
|
help="Skip the between-round y/N prompt. The hard cap "
|
|
@@ -2441,7 +2441,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
2441
2441
|
"to the `mode` recorded in the responses JSON.")
|
|
2442
2442
|
p_ren.add_argument("--output", default=None,
|
|
2443
2443
|
help="Write the rendered markdown to a file under "
|
|
2444
|
-
"agents/council
|
|
2444
|
+
"agents/runtime/council/sessions/ (enforced). Omit for "
|
|
2445
2445
|
"stdout. Prefer this over shell redirects so "
|
|
2446
2446
|
"the canonical-path check fires at write-time.")
|
|
2447
2447
|
_add_prose_synthesis_arg(p_ren)
|
|
@@ -2483,12 +2483,12 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
2483
2483
|
|
|
2484
2484
|
p_sha = sub.add_parser(
|
|
2485
2485
|
"shadow-report",
|
|
2486
|
-
help="Read agents/council
|
|
2486
|
+
help="Read agents/runtime/council/shadow-log.jsonl and print the 7-day "
|
|
2487
2487
|
"rolling disagreement rate + SLO status (step-9 P10).",
|
|
2488
2488
|
)
|
|
2489
2489
|
p_sha.add_argument("--log", default=None,
|
|
2490
2490
|
help="Path to the shadow log (default: "
|
|
2491
|
-
"agents/council
|
|
2491
|
+
"agents/runtime/council/shadow-log.jsonl).")
|
|
2492
2492
|
p_sha.add_argument("--window-days", type=int, default=7,
|
|
2493
2493
|
help="Rolling window in days (default: 7).")
|
|
2494
2494
|
|
package/scripts/council_prune.py
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
Deletes council files older than `ai_council.session_retention_days`
|
|
5
5
|
(default 7) across all four artefact directories:
|
|
6
6
|
|
|
7
|
-
- agents/council
|
|
8
|
-
- agents/council
|
|
9
|
-
- agents/council
|
|
7
|
+
- agents/runtime/council/sessions/ (timestamp subdirs + root files)
|
|
8
|
+
- agents/runtime/council/questions/ (mtime-based)
|
|
9
|
+
- agents/runtime/council/responses/ (mtime-based)
|
|
10
10
|
|
|
11
11
|
Same logic as the auto-prune that runs on every `council save()`,
|
|
12
12
|
exposed as a Task target so the user can sweep on demand.
|