@event4u/agent-config 2.26.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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/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 +12 -0
- 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 +12 -0
- 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/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 +13 -1
- 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 +15 -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/external-reference-deep-dive.md +13 -1
- package/.agent-src/rules/fast-path-marker-visibility.md +21 -1
- package/.agent-src/rules/framework-neutrality-in-generic-skills.md +13 -1
- package/.agent-src/rules/git-history-discipline.md +13 -1
- 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 +12 -0
- 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 +14 -2
- 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/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 +14 -2
- 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 +12 -0
- package/.agent-src/skills/readme-writing/SKILL.md +12 -0
- package/.agent-src/skills/readme-writing-package/SKILL.md +12 -0
- 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 +12 -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/rule.md +1 -1
- package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +3 -3
- 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/state.py +53 -0
- package/.agent-src/templates/skill-archive-note.md +4 -4
- package/.claude-plugin/marketplace.json +1 -2
- package/AGENTS.md +5 -4
- package/CHANGELOG.md +170 -90
- package/CONTRIBUTING.md +61 -0
- package/README.md +23 -20
- package/config/agent-settings.template.yml +11 -1
- package/config/discovery/packs.yml +142 -0
- package/config/discovery/unassigned-artefacts.yml +66 -0
- package/config/discovery/workspaces.yml +59 -0
- package/config/gitignore-block.txt +17 -20
- 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 +110 -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 +75 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/discovery/discovery-manifest.json +9195 -0
- package/dist/discovery/discovery-manifest.json.sha256 +1 -0
- package/dist/discovery/discovery-manifest.summary.md +93 -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/server/app.js +117 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/io/atomicMultiWrite.js +202 -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 +140 -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 +49 -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 +155 -0
- package/dist/server/routes/settings.js.map +1 -0
- package/dist/server/routes/userMd.js +117 -0
- package/dist/server/routes/userMd.js.map +1 -0
- package/dist/server/routes/wizard.js +138 -0
- package/dist/server/routes/wizard.js.map +1 -0
- package/dist/server/schemas/settings.js +138 -0
- package/dist/server/schemas/settings.js.map +1 -0
- package/dist/server/token.js +68 -0
- package/dist/server/token.js.map +1 -0
- package/dist/server/writeRoot.js +67 -0
- package/dist/server/writeRoot.js.map +1 -0
- package/dist/server/writeRoot.test.js +73 -0
- package/dist/server/writeRoot.test.js.map +1 -0
- package/dist/shared/userMd/formAdapter.js +105 -0
- package/dist/shared/userMd/formAdapter.js.map +1 -0
- package/dist/shared/userMd/schema.js +118 -0
- package/dist/shared/userMd/schema.js.map +1 -0
- package/dist/shared/userMd/utils.js +74 -0
- package/dist/shared/userMd/utils.js.map +1 -0
- package/dist/ui/assets/index-BTRcKDlB.js +39 -0
- package/dist/ui/assets/index-BTRcKDlB.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/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 +2 -2
- package/docs/architecture/setup-vs-settings-shared-surface.md +114 -0
- package/docs/architecture.md +2 -1
- package/docs/archive/CHANGELOG-pre-2.2.0.md +7 -7
- package/docs/archive/CHANGELOG-pre-3.0.0.md +130 -0
- package/docs/catalog.md +66 -78
- 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 +11 -2
- 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/decision-trace-v1.md +5 -5
- package/docs/contracts/discovery-manifest.schema.json +146 -0
- package/docs/contracts/explain-trace.schema.json +144 -0
- package/docs/contracts/file-ownership-matrix.json +117 -341
- package/docs/contracts/file-ownership-matrix.md +1 -1
- package/docs/contracts/ghostwriter-schema.md +3 -3
- package/docs/contracts/hook-architecture-v1.md +10 -10
- package/docs/contracts/kernel-membership.md +4 -4
- 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-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 +1 -1
- 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 +2 -2
- package/docs/contracts/router-blending.md +1 -1
- package/docs/contracts/rule-classification.md +2 -2
- package/docs/contracts/settings-api.md +160 -0
- package/docs/contracts/settings-gui-agent-mode.schema.json +128 -0
- package/docs/contracts/tier-3-contrib-plugin.md +1 -1
- package/docs/contracts/universal-skills.md +1 -1
- package/docs/contracts/write-engine.md +1 -1
- package/docs/customization.md +137 -11
- 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 +4 -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 +210 -0
- package/docs/decisions/ADR-014-gui-framework-choice.md +136 -0
- package/docs/decisions/ADR-rule-kernel-and-router.md +2 -2
- package/docs/decisions/INDEX.md +3 -0
- package/docs/distribution/mcp-submission-checklist.md +95 -0
- package/docs/distribution/topics-equivalents-decay-policy.md +51 -0
- package/docs/examples/agent-user.example.md +3 -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/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/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 +12 -4
- 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/skills-catalog.md +62 -18
- package/docs/wizard.md +121 -0
- package/llms.txt +61 -17
- package/package.json +46 -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 +5 -5
- package/scripts/_cli/cmd_explain.py +106 -2
- package/scripts/_cli/cmd_migrate.py +2 -2
- 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 +58 -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 +954 -0
- package/scripts/_lib/agent_settings.py +3 -3
- package/scripts/_lib/agents_overlay.py +3 -3
- package/scripts/_phase4_bucket.py +210 -0
- package/scripts/agent-config +35 -943
- 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_user_type_axis.py +1 -1
- package/scripts/build_discovery_manifest.py +302 -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_council_layout.py +26 -20
- package/scripts/check_council_references.py +10 -10
- 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_public_links.py +2 -2
- package/scripts/check_references.py +14 -21
- package/scripts/check_release_includes_discovery.py +61 -0
- 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/context_hygiene_hook.py +2 -2
- package/scripts/council_cli.py +22 -22
- package/scripts/council_prune.py +3 -3
- package/scripts/extract_audit_patterns.py +2 -2
- package/scripts/gen_discovery_baseline.py +127 -0
- package/scripts/generate_ownership_matrix.py +1 -1
- 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-hooks.sh +2 -2
- package/scripts/install.py +3 -3
- package/scripts/install.sh +120 -18
- package/scripts/inventory_frontmatter.py +1 -1
- package/scripts/lint_agents_layout.py +103 -0
- package/scripts/lint_archived_skills.py +3 -3
- package/scripts/lint_artefact_frontmatter.py +180 -0
- 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_framework_leakage_allowlist.json +63 -62
- package/scripts/lint_ghostwriter_source.py +1 -1
- 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_positioning.py +143 -0
- package/scripts/lint_rule_tiers.py +2 -2
- package/scripts/lint_skill_tools.py +1 -1
- package/scripts/lint_topics_yaml.py +89 -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 +3 -3
- 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/onboarding_gate_hook.py +4 -4
- package/scripts/prepack-check.mjs +62 -0
- package/scripts/probe_projection_fidelity.py +2 -2
- package/scripts/refine_ticket_detect.py +1 -1
- package/scripts/schemas/command.schema.json +41 -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 +2 -2
- package/scripts/skill_overlap.py +1 -1
- package/scripts/skill_tools/run_block_d_eval.py +1 -1
- package/scripts/skill_usage_collect.py +3 -3
- package/scripts/skill_usage_report.py +3 -3
- package/scripts/smoke_quickstart.py +1 -1
- 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_prices.py +4 -3
- package/scripts/verify_before_complete_hook.py +1 -1
- package/scripts/verify_roadmap_closure.py +1 -1
- package/templates/agent-user.md +35 -0
- package/.agent-src/commands/onboard.md +0 -467
package/scripts/install.sh
CHANGED
|
@@ -641,40 +641,139 @@ copy_if_missing() {
|
|
|
641
641
|
cp "$source" "$target"
|
|
642
642
|
}
|
|
643
643
|
|
|
644
|
-
# Migrate legacy infra files
|
|
645
|
-
#
|
|
646
|
-
#
|
|
647
|
-
#
|
|
648
|
-
# /
|
|
649
|
-
#
|
|
650
|
-
# exists;
|
|
644
|
+
# Migrate legacy infra files to their current home under agents/runtime/.
|
|
645
|
+
# Three source layouts are handled per file:
|
|
646
|
+
# - pre-2.x: <name> at project root
|
|
647
|
+
# - 2.x intermediate: agents/<name>
|
|
648
|
+
# - current: agents/runtime/<name>
|
|
649
|
+
# Covered files: .agent-chat-history (+ .bak) and the append-only budget
|
|
650
|
+
# history JSONLs. Idempotent: skips silently if the target already exists;
|
|
651
|
+
# never overwrites.
|
|
652
|
+
#
|
|
653
|
+
# .agent-prices.md is handled separately by migrate_legacy_prices_file.
|
|
651
654
|
migrate_legacy_root_infra() {
|
|
652
655
|
local project_root="$1"
|
|
653
|
-
local
|
|
654
|
-
local items=(
|
|
656
|
+
local runtime_dir="$project_root/agents/runtime"
|
|
657
|
+
local items=(
|
|
658
|
+
".agent-chat-history"
|
|
659
|
+
".agent-chat-history.bak"
|
|
660
|
+
".augment-budget-history.jsonl"
|
|
661
|
+
".rule-budget-history.jsonl"
|
|
662
|
+
)
|
|
655
663
|
|
|
656
664
|
for name in "${items[@]}"; do
|
|
657
|
-
local
|
|
658
|
-
local
|
|
665
|
+
local target="$runtime_dir/$name"
|
|
666
|
+
local sources=("$project_root/$name" "$project_root/agents/$name")
|
|
667
|
+
|
|
668
|
+
for old in "${sources[@]}"; do
|
|
669
|
+
[[ -e "$old" ]] || continue
|
|
670
|
+
|
|
671
|
+
if [[ -e "$target" ]]; then
|
|
672
|
+
log_warn "Legacy ${old#"$project_root/"} found, but agents/runtime/$name already exists — leaving source in place"
|
|
673
|
+
continue
|
|
674
|
+
fi
|
|
675
|
+
|
|
676
|
+
if $DRY_RUN; then
|
|
677
|
+
log_verbose "would migrate ${old#"$project_root/"} → agents/runtime/$name"
|
|
678
|
+
continue
|
|
679
|
+
fi
|
|
680
|
+
|
|
681
|
+
mkdir -p "$runtime_dir"
|
|
682
|
+
mv "$old" "$target"
|
|
683
|
+
log_info "Migrated ${old#"$project_root/"} → agents/runtime/$name"
|
|
684
|
+
done
|
|
685
|
+
done
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
# Migrate the low-impact decision corpus from agents/ to agents/decisions/.
|
|
689
|
+
# Pre-refactor: the .md and its .lock.yaml lived at agents/ root. They
|
|
690
|
+
# now live under agents/decisions/ to separate tracked decisions from
|
|
691
|
+
# volatile runtime data. Idempotent: skips silently if the target
|
|
692
|
+
# already exists; never overwrites.
|
|
693
|
+
migrate_legacy_low_impact_decisions() {
|
|
694
|
+
local project_root="$1"
|
|
695
|
+
local decisions_dir="$project_root/agents/decisions"
|
|
696
|
+
local items=("low-impact-decisions.md" "low-impact-decisions.lock.yaml")
|
|
697
|
+
|
|
698
|
+
for name in "${items[@]}"; do
|
|
699
|
+
local old="$project_root/agents/$name"
|
|
700
|
+
local target="$decisions_dir/$name"
|
|
659
701
|
|
|
660
702
|
[[ -e "$old" ]] || continue
|
|
661
703
|
|
|
662
|
-
if [[ -e "$
|
|
663
|
-
log_warn "Legacy
|
|
704
|
+
if [[ -e "$target" ]]; then
|
|
705
|
+
log_warn "Legacy agents/$name found, but agents/decisions/$name already exists — leaving source in place"
|
|
664
706
|
continue
|
|
665
707
|
fi
|
|
666
708
|
|
|
667
709
|
if $DRY_RUN; then
|
|
668
|
-
log_verbose "would migrate
|
|
710
|
+
log_verbose "would migrate agents/$name → agents/decisions/$name"
|
|
669
711
|
continue
|
|
670
712
|
fi
|
|
671
713
|
|
|
672
|
-
mkdir -p "$
|
|
673
|
-
mv "$old" "$
|
|
674
|
-
log_info "Migrated
|
|
714
|
+
mkdir -p "$decisions_dir"
|
|
715
|
+
mv "$old" "$target"
|
|
716
|
+
log_info "Migrated agents/$name → agents/decisions/$name"
|
|
675
717
|
done
|
|
676
718
|
}
|
|
677
719
|
|
|
720
|
+
# Migrate the AI Council price cache to its current home under agents/runtime/.
|
|
721
|
+
# Two source locations are handled:
|
|
722
|
+
# - pre-2.x: .agent-prices.md at project root
|
|
723
|
+
# - 2.x intermediate: agents/.agent-prices.md
|
|
724
|
+
# Both move to agents/runtime/.agent-prices.md. Idempotent: skips silently
|
|
725
|
+
# if the target already exists; never overwrites.
|
|
726
|
+
migrate_legacy_prices_file() {
|
|
727
|
+
local project_root="$1"
|
|
728
|
+
local runtime_dir="$project_root/agents/runtime"
|
|
729
|
+
local target="$runtime_dir/.agent-prices.md"
|
|
730
|
+
local sources=("$project_root/.agent-prices.md" "$project_root/agents/.agent-prices.md")
|
|
731
|
+
|
|
732
|
+
for old in "${sources[@]}"; do
|
|
733
|
+
[[ -e "$old" ]] || continue
|
|
734
|
+
|
|
735
|
+
if [[ -e "$target" ]]; then
|
|
736
|
+
log_warn "Legacy ${old#"$project_root/"} found, but agents/runtime/.agent-prices.md already exists — leaving source in place"
|
|
737
|
+
continue
|
|
738
|
+
fi
|
|
739
|
+
|
|
740
|
+
if $DRY_RUN; then
|
|
741
|
+
log_verbose "would migrate ${old#"$project_root/"} → agents/runtime/.agent-prices.md"
|
|
742
|
+
continue
|
|
743
|
+
fi
|
|
744
|
+
|
|
745
|
+
mkdir -p "$runtime_dir"
|
|
746
|
+
mv "$old" "$target"
|
|
747
|
+
log_info "Migrated ${old#"$project_root/"} → agents/runtime/.agent-prices.md"
|
|
748
|
+
done
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
# Migrate the AI Council config from agents/.ai-council.yml to
|
|
752
|
+
# agents/settings/.ai-council.yml. Idempotent: skips silently if the
|
|
753
|
+
# target already exists; never overwrites.
|
|
754
|
+
migrate_legacy_council_yml() {
|
|
755
|
+
local project_root="$1"
|
|
756
|
+
local settings_dir="$project_root/agents/settings"
|
|
757
|
+
local target="$settings_dir/.ai-council.yml"
|
|
758
|
+
local source="$project_root/agents/.ai-council.yml"
|
|
759
|
+
|
|
760
|
+
[[ -e "$source" ]] || return 0
|
|
761
|
+
|
|
762
|
+
if [[ -e "$target" ]]; then
|
|
763
|
+
log_warn "Legacy agents/.ai-council.yml found, but agents/settings/.ai-council.yml already exists — leaving source in place"
|
|
764
|
+
return 0
|
|
765
|
+
fi
|
|
766
|
+
|
|
767
|
+
if $DRY_RUN; then
|
|
768
|
+
log_verbose "would migrate agents/.ai-council.yml → agents/settings/.ai-council.yml"
|
|
769
|
+
return 0
|
|
770
|
+
fi
|
|
771
|
+
|
|
772
|
+
mkdir -p "$settings_dir"
|
|
773
|
+
mv "$source" "$target"
|
|
774
|
+
log_info "Migrated agents/.ai-council.yml → agents/settings/.ai-council.yml"
|
|
775
|
+
}
|
|
776
|
+
|
|
678
777
|
# Ensure .gitignore contains the managed agent-config block.
|
|
679
778
|
# Delegates to scripts/sync_gitignore.py so the installer and the
|
|
680
779
|
# standalone /sync-gitignore command share one source of truth
|
|
@@ -768,6 +867,9 @@ main() {
|
|
|
768
867
|
|
|
769
868
|
# 0. Migrate legacy infra files (root → agents/) before any content sync.
|
|
770
869
|
migrate_legacy_root_infra "$TARGET_DIR"
|
|
870
|
+
migrate_legacy_low_impact_decisions "$TARGET_DIR"
|
|
871
|
+
migrate_legacy_prices_file "$TARGET_DIR"
|
|
872
|
+
migrate_legacy_council_yml "$TARGET_DIR"
|
|
771
873
|
|
|
772
874
|
# 0b. Resolve settings (e.g. augment.rules_use_symlinks). On first
|
|
773
875
|
# install the file does not exist yet → defaults preserved.
|
|
@@ -823,7 +925,7 @@ main() {
|
|
|
823
925
|
if [[ "$airgap_mode" == "api" ]]; then
|
|
824
926
|
echo ""
|
|
825
927
|
echo "⚠️ airgapped environment detected — defaulting to mode: api"
|
|
826
|
-
echo " Set defaults.member_mode: api in agents/.ai-council.yml when configuring the council."
|
|
928
|
+
echo " Set defaults.member_mode: api in agents/settings/.ai-council.yml when configuring the council."
|
|
827
929
|
fi
|
|
828
930
|
fi
|
|
829
931
|
elif ! $QUIET; then
|
|
@@ -10,7 +10,7 @@ YAML frontmatter of every file, and prints per-type:
|
|
|
10
10
|
- sample values (up to 3) per key
|
|
11
11
|
|
|
12
12
|
Output is Markdown on stdout, intended to be captured into
|
|
13
|
-
`agents/docs/frontmatter-contract.md` as raw material for Phase 1 of the
|
|
13
|
+
`agents/reference/docs/frontmatter-contract.md` as raw material for Phase 1 of the
|
|
14
14
|
frontmatter-schema roadmap.
|
|
15
15
|
|
|
16
16
|
Stdlib-only. No PyYAML — we do a simple line-based parse sufficient for
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""CI guard for the `agents/` top-level layout.
|
|
3
|
+
|
|
4
|
+
The `agents/` tree is the project boundary for memory, roadmaps,
|
|
5
|
+
runtime artefacts, settings, audits, and policies. Flat files at the
|
|
6
|
+
`agents/` root are restricted to a small, intentional whitelist —
|
|
7
|
+
everything else lives in a typed subdirectory (`runtime/`, `settings/`,
|
|
8
|
+
`audits/`, `roadmaps/`, `policies/`, `contexts/`, etc.).
|
|
9
|
+
|
|
10
|
+
Categories:
|
|
11
|
+
|
|
12
|
+
ALLOWED — Whitelisted flat files. Linter is silent.
|
|
13
|
+
UNKNOWN — Anything else. Linter fails.
|
|
14
|
+
|
|
15
|
+
Exit codes:
|
|
16
|
+
0 — layout is clean.
|
|
17
|
+
1 — at least one UNKNOWN file.
|
|
18
|
+
|
|
19
|
+
Invocation (from project root):
|
|
20
|
+
python3 scripts/lint_agents_layout.py
|
|
21
|
+
python3 scripts/lint_agents_layout.py --strict
|
|
22
|
+
python3 scripts/lint_agents_layout.py --quiet
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import sys
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
|
|
30
|
+
AGENTS_ROOT = Path("agents")
|
|
31
|
+
|
|
32
|
+
# Intentional flat files at agents/ root. Anything not in this set is
|
|
33
|
+
# UNKNOWN (linter failure). Durable records live under typed subdirs:
|
|
34
|
+
# decisions/ (low-impact corpus, ADR-style records), evidence/ (durable
|
|
35
|
+
# reports / metrics / council artefacts), runtime/ (volatile, gitignored).
|
|
36
|
+
ALLOWED_FLAT_FILES: frozenset[str] = frozenset(
|
|
37
|
+
{
|
|
38
|
+
# Entry document — narrative pointer to the agents/ tree.
|
|
39
|
+
"index.md",
|
|
40
|
+
# D1 anchor / progress dashboard — kept at root by the
|
|
41
|
+
# roadmap-progress-sync rule so consumers see it first.
|
|
42
|
+
"roadmaps-progress.md",
|
|
43
|
+
# Worked example for the ai-video pipeline. Stays adjacent to
|
|
44
|
+
# the agents/reference/ai-video/ dir as a reference template.
|
|
45
|
+
".ai-video.xml.example",
|
|
46
|
+
# Empty-tree sentinel so agents/ survives a fresh checkout
|
|
47
|
+
# before any runtime artefact lands.
|
|
48
|
+
".gitkeep",
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def find_violations(root: Path) -> list[str]:
|
|
54
|
+
"""Return UNKNOWN flat-file violations at the agents/ root."""
|
|
55
|
+
unknown: list[str] = []
|
|
56
|
+
if not root.is_dir():
|
|
57
|
+
return unknown
|
|
58
|
+
|
|
59
|
+
for path in sorted(root.iterdir()):
|
|
60
|
+
if not path.is_file():
|
|
61
|
+
continue
|
|
62
|
+
name = path.name
|
|
63
|
+
if name in ALLOWED_FLAT_FILES:
|
|
64
|
+
continue
|
|
65
|
+
unknown.append(
|
|
66
|
+
f"{path}: flat file not in agents/ whitelist — move to a typed "
|
|
67
|
+
f"subdirectory (runtime/, evidence/, decisions/, settings/, "
|
|
68
|
+
f"audits/, roadmaps/, policies/, contexts/, …) or add to "
|
|
69
|
+
f"ALLOWED_FLAT_FILES in scripts/lint_agents_layout.py with "
|
|
70
|
+
f"rationale."
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
return unknown
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def main() -> int:
|
|
77
|
+
args = sys.argv[1:]
|
|
78
|
+
# --strict kept for backward-compat; no longer affects exit code now
|
|
79
|
+
# that the LEGACY tier is gone.
|
|
80
|
+
_ = "--strict" in args
|
|
81
|
+
quiet = "--quiet" in args
|
|
82
|
+
|
|
83
|
+
unknown = find_violations(AGENTS_ROOT)
|
|
84
|
+
|
|
85
|
+
if unknown:
|
|
86
|
+
print("❌ agents/ layout violations (unknown flat files):\n")
|
|
87
|
+
for f in unknown:
|
|
88
|
+
print(f" - {f}")
|
|
89
|
+
print(
|
|
90
|
+
"\nRule: scripts/lint_agents_layout.py — flat files at agents/ "
|
|
91
|
+
"root must be whitelisted. Typed subdirectories: runtime/, "
|
|
92
|
+
"evidence/, decisions/, settings/, audits/, roadmaps/, "
|
|
93
|
+
"policies/, contexts/, … ."
|
|
94
|
+
)
|
|
95
|
+
return 1
|
|
96
|
+
|
|
97
|
+
if not quiet:
|
|
98
|
+
print("✅ agents/ layout clean.")
|
|
99
|
+
return 0
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
if __name__ == "__main__":
|
|
103
|
+
sys.exit(main())
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Lint archive notes under agents/archived-skills/.
|
|
2
|
+
"""Lint archive notes under agents/evidence/archived-skills/.
|
|
3
3
|
|
|
4
4
|
Enforces the contract from
|
|
5
5
|
.agent-src.uncompressed/templates/skill-archive-note.md:
|
|
6
6
|
|
|
7
|
-
1. Every <slug>.md under agents/archived-skills/ has the six required
|
|
7
|
+
1. Every <slug>.md under agents/evidence/archived-skills/ has the six required
|
|
8
8
|
frontmatter fields with valid values.
|
|
9
9
|
2. `reason` is one of {unused, merged, superseded, deprecated}.
|
|
10
10
|
3. When `reason ∈ {merged, superseded}` the `replacement` slug exists
|
|
@@ -14,7 +14,7 @@ Enforces the contract from
|
|
|
14
14
|
its frontmatter `replaced_by:` field.
|
|
15
15
|
|
|
16
16
|
Hooked into `task ci` via `task lint-archived-skills`. Passes cleanly
|
|
17
|
-
against an empty agents/archived-skills/ (only README.md present).
|
|
17
|
+
against an empty agents/evidence/archived-skills/ (only README.md present).
|
|
18
18
|
|
|
19
19
|
Exit codes:
|
|
20
20
|
0 contract holds
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Lint Phase-4 discovery frontmatter on every artefact.
|
|
3
|
+
|
|
4
|
+
Walks the same trees as `scripts/build_discovery_manifest.py` (skills,
|
|
5
|
+
rules, commands, templates under `.agent-src.uncompressed/`) and asserts
|
|
6
|
+
per-file that the five ADR-013 keys (`workspaces`, `packs`, `lifecycle`,
|
|
7
|
+
`trust`, `install`) are present and well-formed:
|
|
8
|
+
|
|
9
|
+
- `workspaces:` exists, is a non-empty list, every value in `workspaces.yml`
|
|
10
|
+
- `packs:` exists, is a non-empty list, every value in `packs.yml`
|
|
11
|
+
- `lifecycle:` is one of {active, deprecated, experimental, archived}
|
|
12
|
+
- `trust.level` is one of {core, professional, experimental, advisory, restricted}
|
|
13
|
+
- `trust.confidence` is one of {high, medium, low}
|
|
14
|
+
- `trust.human_review_required` is a bool
|
|
15
|
+
- `install.default` and `install.removable` are bools
|
|
16
|
+
- artefact path is not also listed in `unassigned-artefacts.yml`
|
|
17
|
+
|
|
18
|
+
Exits 0 clean, 1 on any violation. Stdlib + pyyaml. Cap: ≤ 200 LOC.
|
|
19
|
+
"""
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import argparse
|
|
23
|
+
import sys
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from typing import Any
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
import yaml
|
|
29
|
+
except ImportError: # pragma: no cover
|
|
30
|
+
print("ERROR: PyYAML required (pip install pyyaml)", file=sys.stderr)
|
|
31
|
+
sys.exit(2)
|
|
32
|
+
|
|
33
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
34
|
+
SRC = ROOT / ".agent-src.uncompressed"
|
|
35
|
+
VOCAB_DIR = ROOT / "config" / "discovery"
|
|
36
|
+
|
|
37
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
38
|
+
from validate_frontmatter import parse_frontmatter # noqa: E402
|
|
39
|
+
|
|
40
|
+
LIFECYCLES = frozenset({"active", "deprecated", "experimental", "archived"})
|
|
41
|
+
TRUST_LEVELS = frozenset(
|
|
42
|
+
{"core", "professional", "experimental", "advisory", "restricted"}
|
|
43
|
+
)
|
|
44
|
+
TRUST_CONFIDENCE = frozenset({"high", "medium", "low"})
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _load_vocab() -> tuple[set[str], set[str], set[str]]:
|
|
48
|
+
ws = yaml.safe_load((VOCAB_DIR / "workspaces.yml").read_text("utf-8")) or []
|
|
49
|
+
packs = yaml.safe_load((VOCAB_DIR / "packs.yml").read_text("utf-8")) or []
|
|
50
|
+
raw_un = yaml.safe_load((VOCAB_DIR / "unassigned-artefacts.yml").read_text("utf-8")) or []
|
|
51
|
+
ws_ids = {e["id"] for e in ws}
|
|
52
|
+
pack_ids = {e["id"] for e in packs}
|
|
53
|
+
quarantine = {e["path"] for e in raw_un}
|
|
54
|
+
return ws_ids, pack_ids, quarantine
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _iter_artefacts() -> list[Path]:
|
|
58
|
+
out: list[Path] = []
|
|
59
|
+
for p in sorted((SRC / "skills").rglob("SKILL.md")):
|
|
60
|
+
out.append(p)
|
|
61
|
+
for p in sorted((SRC / "rules").rglob("*.md")):
|
|
62
|
+
out.append(p)
|
|
63
|
+
for p in sorted((SRC / "commands").rglob("*.md")):
|
|
64
|
+
out.append(p)
|
|
65
|
+
if (SRC / "templates").exists():
|
|
66
|
+
for p in sorted((SRC / "templates").rglob("*.md")):
|
|
67
|
+
out.append(p)
|
|
68
|
+
return out
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _check_one(
|
|
72
|
+
path: Path,
|
|
73
|
+
ws_ids: set[str],
|
|
74
|
+
pack_ids: set[str],
|
|
75
|
+
quarantine: set[str],
|
|
76
|
+
) -> list[str]:
|
|
77
|
+
rel = path.relative_to(ROOT).as_posix()
|
|
78
|
+
errs: list[str] = []
|
|
79
|
+
if rel in quarantine:
|
|
80
|
+
# Quarantined scaffolds are not required to carry frontmatter and
|
|
81
|
+
# must NOT also try to (would shadow the materialisation contract).
|
|
82
|
+
text = path.read_text("utf-8", errors="replace")
|
|
83
|
+
fm, _ = parse_frontmatter(text)
|
|
84
|
+
if isinstance(fm, dict) and any(
|
|
85
|
+
k in fm for k in ("workspaces", "packs", "lifecycle", "trust", "install")
|
|
86
|
+
):
|
|
87
|
+
errs.append(
|
|
88
|
+
f"{rel}: quarantined in unassigned-artefacts.yml but carries"
|
|
89
|
+
" discovery frontmatter — remove one or the other."
|
|
90
|
+
)
|
|
91
|
+
return errs
|
|
92
|
+
|
|
93
|
+
text = path.read_text("utf-8", errors="replace")
|
|
94
|
+
fm, _ = parse_frontmatter(text)
|
|
95
|
+
if not isinstance(fm, dict):
|
|
96
|
+
errs.append(f"{rel}: missing or unparseable frontmatter")
|
|
97
|
+
return errs
|
|
98
|
+
|
|
99
|
+
for key in ("workspaces", "packs", "lifecycle", "trust", "install"):
|
|
100
|
+
if key not in fm:
|
|
101
|
+
errs.append(f"{rel}: missing required key `{key}`")
|
|
102
|
+
if errs:
|
|
103
|
+
return errs
|
|
104
|
+
|
|
105
|
+
ws = fm["workspaces"]
|
|
106
|
+
if not isinstance(ws, list) or not ws:
|
|
107
|
+
errs.append(f"{rel}: workspaces must be a non-empty list")
|
|
108
|
+
else:
|
|
109
|
+
bad = [w for w in ws if w not in ws_ids]
|
|
110
|
+
if bad:
|
|
111
|
+
errs.append(f"{rel}: workspaces not in workspaces.yml: {bad}")
|
|
112
|
+
|
|
113
|
+
packs = fm["packs"]
|
|
114
|
+
if not isinstance(packs, list) or not packs:
|
|
115
|
+
errs.append(f"{rel}: packs must be a non-empty list")
|
|
116
|
+
else:
|
|
117
|
+
bad = [p for p in packs if p not in pack_ids]
|
|
118
|
+
if bad:
|
|
119
|
+
errs.append(f"{rel}: packs not in packs.yml: {bad}")
|
|
120
|
+
|
|
121
|
+
lc = fm["lifecycle"]
|
|
122
|
+
if lc not in LIFECYCLES:
|
|
123
|
+
errs.append(f"{rel}: lifecycle `{lc}` not in {sorted(LIFECYCLES)}")
|
|
124
|
+
|
|
125
|
+
trust = fm["trust"]
|
|
126
|
+
if not isinstance(trust, dict):
|
|
127
|
+
errs.append(f"{rel}: trust must be a mapping")
|
|
128
|
+
else:
|
|
129
|
+
if trust.get("level") not in TRUST_LEVELS:
|
|
130
|
+
errs.append(
|
|
131
|
+
f"{rel}: trust.level `{trust.get('level')}` not in {sorted(TRUST_LEVELS)}"
|
|
132
|
+
)
|
|
133
|
+
if trust.get("confidence") not in TRUST_CONFIDENCE:
|
|
134
|
+
errs.append(
|
|
135
|
+
f"{rel}: trust.confidence `{trust.get('confidence')}` not in"
|
|
136
|
+
f" {sorted(TRUST_CONFIDENCE)}"
|
|
137
|
+
)
|
|
138
|
+
if not isinstance(trust.get("human_review_required"), bool):
|
|
139
|
+
errs.append(f"{rel}: trust.human_review_required must be bool")
|
|
140
|
+
|
|
141
|
+
install = fm["install"]
|
|
142
|
+
if not isinstance(install, dict):
|
|
143
|
+
errs.append(f"{rel}: install must be a mapping")
|
|
144
|
+
else:
|
|
145
|
+
if not isinstance(install.get("default"), bool):
|
|
146
|
+
errs.append(f"{rel}: install.default must be bool")
|
|
147
|
+
if not isinstance(install.get("removable"), bool):
|
|
148
|
+
errs.append(f"{rel}: install.removable must be bool")
|
|
149
|
+
return errs
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def main(argv: list[str] | None = None) -> int:
|
|
153
|
+
parser = argparse.ArgumentParser(description=__doc__.splitlines()[0])
|
|
154
|
+
parser.add_argument("--quiet", action="store_true")
|
|
155
|
+
args = parser.parse_args(argv)
|
|
156
|
+
|
|
157
|
+
ws_ids, pack_ids, quarantine = _load_vocab()
|
|
158
|
+
artefacts = _iter_artefacts()
|
|
159
|
+
all_errs: list[str] = []
|
|
160
|
+
for p in artefacts:
|
|
161
|
+
all_errs.extend(_check_one(p, ws_ids, pack_ids, quarantine))
|
|
162
|
+
|
|
163
|
+
if all_errs:
|
|
164
|
+
for e in all_errs:
|
|
165
|
+
print(f"ERROR: {e}", file=sys.stderr)
|
|
166
|
+
print(
|
|
167
|
+
f"\n{len(all_errs)} violation(s) across {len(artefacts)} artefact(s).",
|
|
168
|
+
file=sys.stderr,
|
|
169
|
+
)
|
|
170
|
+
return 1
|
|
171
|
+
if not args.quiet:
|
|
172
|
+
print(
|
|
173
|
+
f"✅ lint-artefact-frontmatter: {len(artefacts)} artefact(s) clean"
|
|
174
|
+
f" (quarantine: {len(quarantine)})."
|
|
175
|
+
)
|
|
176
|
+
return 0
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
if __name__ == "__main__":
|
|
180
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Lint a generated discovery-manifest.json against schema + checksum.
|
|
3
|
+
|
|
4
|
+
Checks:
|
|
5
|
+
1. File parses as JSON.
|
|
6
|
+
2. Validates against `docs/contracts/discovery-manifest.schema.json`.
|
|
7
|
+
3. Recomputes sha256 with the `checksum` field zeroed and compares.
|
|
8
|
+
4. Cross-references workspace / pack IDs against `config/discovery/*.yml`.
|
|
9
|
+
|
|
10
|
+
CLI:
|
|
11
|
+
python scripts/lint_discovery_manifest.py [--manifest PATH]
|
|
12
|
+
|
|
13
|
+
Exit codes:
|
|
14
|
+
0 clean
|
|
15
|
+
1 schema or integrity failure
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import argparse
|
|
20
|
+
import hashlib
|
|
21
|
+
import json
|
|
22
|
+
import sys
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from typing import Any
|
|
25
|
+
|
|
26
|
+
import yaml
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
import jsonschema
|
|
30
|
+
except ImportError:
|
|
31
|
+
print("error: jsonschema not installed (pip install jsonschema)", file=sys.stderr)
|
|
32
|
+
sys.exit(1)
|
|
33
|
+
|
|
34
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
35
|
+
SCHEMA_PATH = ROOT / "docs" / "contracts" / "discovery-manifest.schema.json"
|
|
36
|
+
VOCAB_DIR = ROOT / "config" / "discovery"
|
|
37
|
+
DEFAULT_MANIFEST = ROOT / "dist" / "discovery" / "discovery-manifest.json"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _serialize(manifest: dict[str, Any]) -> str:
|
|
41
|
+
return json.dumps(manifest, indent=2, sort_keys=True, ensure_ascii=False) + "\n"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _check_checksum(manifest: dict[str, Any]) -> str | None:
|
|
45
|
+
actual = manifest.get("checksum", "")
|
|
46
|
+
if not isinstance(actual, str) or not actual.startswith("sha256:"):
|
|
47
|
+
return f"checksum: malformed value {actual!r}"
|
|
48
|
+
# Mirror scripts/build_discovery_manifest.py::_finalise_checksum —
|
|
49
|
+
# `generated_at` is wall-clock and excluded from the digest input so
|
|
50
|
+
# the hash stays byte-stable across runs.
|
|
51
|
+
snapshot = dict(manifest)
|
|
52
|
+
snapshot["checksum"] = "sha256:" + "0" * 64
|
|
53
|
+
snapshot["generated_at"] = "<normalised>"
|
|
54
|
+
raw = _serialize(snapshot).encode("utf-8")
|
|
55
|
+
expected = "sha256:" + hashlib.sha256(raw).hexdigest()
|
|
56
|
+
if expected != actual:
|
|
57
|
+
return f"checksum mismatch: expected {expected}, got {actual}"
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _check_vocab(manifest: dict[str, Any]) -> list[str]:
|
|
62
|
+
errs: list[str] = []
|
|
63
|
+
workspaces = yaml.safe_load((VOCAB_DIR / "workspaces.yml").read_text(encoding="utf-8")) or []
|
|
64
|
+
packs = yaml.safe_load((VOCAB_DIR / "packs.yml").read_text(encoding="utf-8")) or []
|
|
65
|
+
ws_ids = {w["id"] for w in workspaces}
|
|
66
|
+
pack_ids = {p["id"] for p in packs}
|
|
67
|
+
|
|
68
|
+
m_ws_ids = {w["id"] for w in manifest.get("workspaces", [])}
|
|
69
|
+
m_pk_ids = {p["id"] for p in manifest.get("packs", [])}
|
|
70
|
+
if m_ws_ids != ws_ids:
|
|
71
|
+
diff = ws_ids ^ m_ws_ids
|
|
72
|
+
errs.append(f"workspaces: vocabulary/manifest mismatch on {sorted(diff)}")
|
|
73
|
+
if m_pk_ids != pack_ids:
|
|
74
|
+
diff = pack_ids ^ m_pk_ids
|
|
75
|
+
errs.append(f"packs: vocabulary/manifest mismatch on {sorted(diff)}")
|
|
76
|
+
|
|
77
|
+
for a in manifest.get("artefacts", []):
|
|
78
|
+
for w in a.get("workspaces", []):
|
|
79
|
+
if w not in ws_ids:
|
|
80
|
+
errs.append(f"{a['path']}: unknown workspace '{w}'")
|
|
81
|
+
for p in a.get("packs", []):
|
|
82
|
+
if p not in pack_ids:
|
|
83
|
+
errs.append(f"{a['path']}: unknown pack '{p}'")
|
|
84
|
+
return errs
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def main(argv: list[str] | None = None) -> int:
|
|
88
|
+
parser = argparse.ArgumentParser(description=__doc__.splitlines()[0])
|
|
89
|
+
parser.add_argument("--manifest", type=Path, default=DEFAULT_MANIFEST)
|
|
90
|
+
parser.add_argument("--quiet", action="store_true")
|
|
91
|
+
args = parser.parse_args(argv)
|
|
92
|
+
|
|
93
|
+
if not args.manifest.exists():
|
|
94
|
+
print(f"error: manifest not found at {args.manifest}", file=sys.stderr)
|
|
95
|
+
return 1
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
manifest = json.loads(args.manifest.read_text(encoding="utf-8"))
|
|
99
|
+
except json.JSONDecodeError as exc:
|
|
100
|
+
print(f"error: invalid JSON: {exc}", file=sys.stderr)
|
|
101
|
+
return 1
|
|
102
|
+
|
|
103
|
+
schema = json.loads(SCHEMA_PATH.read_text(encoding="utf-8"))
|
|
104
|
+
try:
|
|
105
|
+
jsonschema.validate(manifest, schema)
|
|
106
|
+
except jsonschema.ValidationError as exc:
|
|
107
|
+
print(f"schema error: {exc.message}", file=sys.stderr)
|
|
108
|
+
path = "/".join(str(p) for p in exc.absolute_path)
|
|
109
|
+
if path:
|
|
110
|
+
print(f" at: {path}", file=sys.stderr)
|
|
111
|
+
return 1
|
|
112
|
+
|
|
113
|
+
if (err := _check_checksum(manifest)):
|
|
114
|
+
print(f"error: {err}", file=sys.stderr)
|
|
115
|
+
return 1
|
|
116
|
+
|
|
117
|
+
vocab_errs = _check_vocab(manifest)
|
|
118
|
+
if vocab_errs:
|
|
119
|
+
for e in vocab_errs[:20]:
|
|
120
|
+
print(f"error: {e}", file=sys.stderr)
|
|
121
|
+
if len(vocab_errs) > 20:
|
|
122
|
+
print(f" ... and {len(vocab_errs) - 20} more", file=sys.stderr)
|
|
123
|
+
return 1
|
|
124
|
+
|
|
125
|
+
if not args.quiet:
|
|
126
|
+
print(
|
|
127
|
+
f"OK {args.manifest.relative_to(ROOT)}: "
|
|
128
|
+
f"{len(manifest['artefacts'])} artefacts, "
|
|
129
|
+
f"{len(manifest['unassigned'])} unassigned, "
|
|
130
|
+
f"checksum verified"
|
|
131
|
+
)
|
|
132
|
+
return 0
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
if __name__ == "__main__":
|
|
136
|
+
sys.exit(main())
|