@event4u/agent-config 5.2.0 → 5.4.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 +1 -9
- package/.agent-src/commands/agent-status.md +1 -9
- package/.agent-src/commands/agents/audit.md +1 -9
- package/.agent-src/commands/agents/init.md +1 -9
- package/.agent-src/commands/agents/optimize.md +1 -9
- package/.agent-src/commands/agents/user/accept.md +1 -9
- package/.agent-src/commands/agents/user/init.md +1 -9
- package/.agent-src/commands/agents/user/review.md +1 -9
- package/.agent-src/commands/agents/user/show.md +1 -9
- package/.agent-src/commands/agents/user/update.md +1 -9
- package/.agent-src/commands/agents/user.md +1 -9
- package/.agent-src/commands/agents.md +1 -9
- package/.agent-src/commands/analytics/prune.md +1 -9
- package/.agent-src/commands/analytics/show.md +1 -9
- package/.agent-src/commands/analytics.md +1 -9
- package/.agent-src/commands/analyze-reference-repo.md +1 -9
- package/.agent-src/commands/bug-fix.md +1 -9
- package/.agent-src/commands/bug-investigate.md +1 -9
- package/.agent-src/commands/challenge-me/vision.md +1 -9
- package/.agent-src/commands/challenge-me/with-docs.md +1 -9
- package/.agent-src/commands/challenge-me.md +1 -9
- package/.agent-src/commands/chat-history/import.md +1 -9
- package/.agent-src/commands/chat-history/learn.md +1 -9
- package/.agent-src/commands/chat-history/show.md +1 -9
- package/.agent-src/commands/chat-history.md +1 -9
- package/.agent-src/commands/check-current-md.md +1 -9
- package/.agent-src/commands/commit/in-chunks.md +1 -9
- package/.agent-src/commands/commit.md +1 -9
- package/.agent-src/commands/condense.md +1 -9
- package/.agent-src/commands/context/create.md +1 -9
- package/.agent-src/commands/context/refactor.md +1 -9
- package/.agent-src/commands/context.md +1 -9
- package/.agent-src/commands/cost-report.md +1 -9
- package/.agent-src/commands/council/analysis.md +1 -9
- package/.agent-src/commands/council/debate.md +1 -9
- package/.agent-src/commands/council/default.md +1 -9
- package/.agent-src/commands/council/design.md +1 -9
- package/.agent-src/commands/council/optimize.md +1 -9
- package/.agent-src/commands/council/pr.md +1 -9
- package/.agent-src/commands/council.md +1 -9
- package/.agent-src/commands/create-pr/description-only.md +1 -9
- package/.agent-src/commands/create-pr.md +1 -9
- package/.agent-src/commands/e2e-heal.md +1 -9
- package/.agent-src/commands/e2e-plan.md +1 -9
- package/.agent-src/commands/estimate-ticket.md +1 -9
- package/.agent-src/commands/feature/dev.md +1 -9
- package/.agent-src/commands/feature/explore.md +1 -9
- package/.agent-src/commands/feature/plan.md +1 -9
- package/.agent-src/commands/feature/refactor.md +1 -9
- package/.agent-src/commands/feature/roadmap.md +1 -9
- package/.agent-src/commands/feature.md +1 -9
- package/.agent-src/commands/fix/ci.md +1 -9
- package/.agent-src/commands/fix/portability.md +1 -9
- package/.agent-src/commands/fix/pr-bot-comments.md +1 -9
- package/.agent-src/commands/fix/pr-comments.md +1 -9
- package/.agent-src/commands/fix/pr-developer-comments.md +1 -9
- package/.agent-src/commands/fix/refs.md +1 -9
- package/.agent-src/commands/fix/seeder.md +1 -9
- package/.agent-src/commands/fix.md +1 -9
- package/.agent-src/commands/ghostwriter/delete.md +1 -9
- package/.agent-src/commands/ghostwriter/fetch.md +1 -9
- package/.agent-src/commands/ghostwriter/list.md +1 -9
- package/.agent-src/commands/ghostwriter/show.md +1 -9
- package/.agent-src/commands/ghostwriter/write.md +1 -9
- package/.agent-src/commands/ghostwriter.md +1 -9
- package/.agent-src/commands/grill-me.md +1 -9
- package/.agent-src/commands/implement-ticket.md +1 -9
- package/.agent-src/commands/jira-ticket.md +1 -9
- package/.agent-src/commands/judge/on-diff.md +1 -9
- package/.agent-src/commands/judge/solo.md +1 -9
- package/.agent-src/commands/judge/steps.md +1 -9
- package/.agent-src/commands/judge.md +1 -9
- package/.agent-src/commands/knowledge/forget.md +1 -9
- package/.agent-src/commands/knowledge/ingest.md +1 -9
- package/.agent-src/commands/knowledge/list.md +1 -9
- package/.agent-src/commands/knowledge.md +1 -9
- package/.agent-src/commands/memory/add.md +1 -9
- package/.agent-src/commands/memory/learn-low-impact.md +1 -9
- package/.agent-src/commands/memory/load.md +1 -9
- package/.agent-src/commands/memory/mine-session.md +1 -9
- package/.agent-src/commands/memory/promote.md +1 -9
- package/.agent-src/commands/memory/propose.md +1 -9
- package/.agent-src/commands/memory.md +1 -9
- package/.agent-src/commands/mode.md +1 -9
- package/.agent-src/commands/module/create.md +1 -9
- package/.agent-src/commands/module/explore.md +1 -9
- package/.agent-src/commands/module.md +1 -9
- package/.agent-src/commands/optimize/agents-dir.md +1 -9
- package/.agent-src/commands/optimize/augmentignore.md +1 -9
- package/.agent-src/commands/optimize/rtk.md +1 -9
- package/.agent-src/commands/optimize/skills.md +1 -9
- package/.agent-src/commands/optimize-prompt.md +1 -9
- package/.agent-src/commands/optimize.md +1 -9
- package/.agent-src/commands/orchestrate.md +1 -9
- package/.agent-src/commands/override/create.md +1 -9
- package/.agent-src/commands/override/manage.md +1 -9
- package/.agent-src/commands/override.md +1 -9
- package/.agent-src/commands/package-reset.md +1 -9
- package/.agent-src/commands/package-test.md +1 -9
- package/.agent-src/commands/post-as/ghostwriter.md +1 -9
- package/.agent-src/commands/post-as/me.md +1 -9
- package/.agent-src/commands/post-as.md +1 -9
- package/.agent-src/commands/prepare-for-review.md +1 -9
- package/.agent-src/commands/project-analyze.md +1 -9
- package/.agent-src/commands/project-health.md +1 -9
- package/.agent-src/commands/quality-fix.md +1 -9
- package/.agent-src/commands/refine-ticket.md +1 -9
- package/.agent-src/commands/research/deep.md +1 -9
- package/.agent-src/commands/research/report.md +1 -9
- package/.agent-src/commands/research.md +1 -9
- package/.agent-src/commands/review-changes.md +1 -9
- package/.agent-src/commands/review-routing.md +1 -9
- package/.agent-src/commands/roadmap/ai-council.md +1 -9
- package/.agent-src/commands/roadmap/create.md +1 -9
- package/.agent-src/commands/roadmap/process-full.md +1 -9
- package/.agent-src/commands/roadmap/process-phase.md +1 -9
- package/.agent-src/commands/roadmap/process-step.md +1 -9
- package/.agent-src/commands/roadmap.md +1 -9
- package/.agent-src/commands/rule-compliance-audit.md +1 -9
- package/.agent-src/commands/set-cost-profile.md +1 -9
- package/.agent-src/commands/sync-agent-settings.md +1 -9
- package/.agent-src/commands/sync-gitignore/fix.md +1 -9
- package/.agent-src/commands/sync-gitignore.md +1 -9
- package/.agent-src/commands/tests/create.md +1 -9
- package/.agent-src/commands/tests/execute.md +1 -9
- package/.agent-src/commands/tests.md +1 -9
- package/.agent-src/commands/threat-model.md +1 -9
- package/.agent-src/commands/update-form-request-messages.md +1 -9
- package/.agent-src/commands/upstream-contribute.md +1 -9
- package/.agent-src/commands/video/from-script.md +1 -9
- package/.agent-src/commands/video/scene.md +1 -9
- package/.agent-src/commands/video/stitch.md +1 -9
- package/.agent-src/commands/video/storyboard.md +1 -9
- package/.agent-src/commands/video.md +1 -9
- package/.agent-src/commands/work.md +1 -9
- package/.agent-src/contexts/model-recommendations.md +82 -82
- package/.agent-src/personas/ai-agent.md +0 -2
- package/.agent-src/personas/ai-video-technical-director.md +0 -2
- package/.agent-src/personas/backend-architect.md +0 -2
- package/.agent-src/personas/cmo.md +0 -2
- package/.agent-src/personas/critical-challenger.md +0 -2
- package/.agent-src/personas/customer-success-lead.md +0 -2
- package/.agent-src/personas/developer.md +0 -2
- package/.agent-src/personas/discovery-lead.md +0 -2
- package/.agent-src/personas/eloquent-tamer.md +0 -2
- package/.agent-src/personas/engineering-manager.md +0 -2
- package/.agent-src/personas/finance-partner.md +0 -2
- package/.agent-src/personas/frontend-engineer.md +0 -2
- package/.agent-src/personas/growth-pm.md +0 -2
- package/.agent-src/personas/hollywood-director.md +0 -2
- package/.agent-src/personas/people-strategist.md +0 -2
- package/.agent-src/personas/product-owner.md +0 -1
- package/.agent-src/personas/qa.md +0 -2
- package/.agent-src/personas/revops-maintainer.md +0 -2
- package/.agent-src/personas/revops.md +0 -2
- package/.agent-src/personas/security-engineer.md +0 -2
- package/.agent-src/personas/senior-engineer.md +0 -2
- package/.agent-src/personas/stakeholder.md +0 -2
- package/.agent-src/personas/strategist.md +0 -2
- package/.agent-src/personas/tech-writer.md +0 -2
- package/.agent-src/rules/agent-authority.md +0 -9
- package/.agent-src/rules/analysis-skill-routing.md +0 -9
- package/.agent-src/rules/architecture.md +0 -9
- package/.agent-src/rules/artifact-drafting-protocol.md +0 -9
- package/.agent-src/rules/artifact-engagement-recording.md +0 -9
- package/.agent-src/rules/ask-when-uncertain.md +0 -9
- package/.agent-src/rules/augment-edit-discipline.md +0 -9
- package/.agent-src/rules/augment-source-of-truth.md +0 -9
- package/.agent-src/rules/autonomous-execution.md +0 -9
- package/.agent-src/rules/cli-output-handling.md +0 -9
- package/.agent-src/rules/command-suggestion-policy.md +0 -9
- package/.agent-src/rules/commit-conventions.md +0 -9
- package/.agent-src/rules/commit-policy.md +0 -9
- package/.agent-src/rules/context-hygiene.md +0 -9
- package/.agent-src/rules/copilot-routing.md +0 -9
- package/.agent-src/rules/devcontainer-routing.md +0 -9
- package/.agent-src/rules/direct-answers.md +0 -9
- package/.agent-src/rules/docker-commands.md +0 -9
- package/.agent-src/rules/domain-adoption-policy.md +0 -9
- package/.agent-src/rules/domain-safety-disclaimer.md +0 -9
- package/.agent-src/rules/domain-safety-pii.md +0 -9
- package/.agent-src/rules/domain-safety-retention.md +0 -9
- package/.agent-src/rules/downstream-changes.md +0 -9
- package/.agent-src/rules/engineering-safety-floor.md +0 -9
- package/.agent-src/rules/external-reference-deep-dive.md +0 -9
- package/.agent-src/rules/fast-path-marker-visibility.md +0 -9
- package/.agent-src/rules/finance-safety-floor.md +0 -6
- package/.agent-src/rules/framework-neutrality-in-generic-skills.md +0 -9
- package/.agent-src/rules/git-history-discipline.md +0 -9
- package/.agent-src/rules/guidelines.md +0 -9
- package/.agent-src/rules/improve-before-implement.md +0 -9
- package/.agent-src/rules/invite-challenge.md +0 -9
- package/.agent-src/rules/language-and-tone.md +0 -9
- package/.agent-src/rules/laravel-routing.md +0 -4
- package/.agent-src/rules/laravel-translations.md +0 -4
- package/.agent-src/rules/linked-projects-onboarding-gate.md +0 -3
- package/.agent-src/rules/low-impact-corpus-privacy-floor.md +0 -9
- package/.agent-src/rules/markdown-safe-codeblocks.md +0 -9
- package/.agent-src/rules/media-governance-routing.md +0 -9
- package/.agent-src/rules/minimal-safe-diff.md +0 -9
- package/.agent-src/rules/missing-tool-handling.md +0 -9
- package/.agent-src/rules/model-recommendation.md +69 -15
- package/.agent-src/rules/no-attribution-footers.md +0 -9
- package/.agent-src/rules/no-cheap-questions.md +0 -9
- package/.agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -9
- package/.agent-src/rules/no-pr-progress-comments.md +0 -9
- package/.agent-src/rules/no-roadmap-references.md +0 -9
- package/.agent-src/rules/non-destructive-by-default.md +0 -9
- package/.agent-src/rules/onboarding-gate.md +0 -9
- package/.agent-src/rules/package-ci-checks.md +0 -9
- package/.agent-src/rules/persona-governance.md +0 -9
- package/.agent-src/rules/php-coding.md +0 -4
- package/.agent-src/rules/preservation-guard.md +0 -9
- package/.agent-src/rules/provider-lifecycle-discipline.md +0 -9
- package/.agent-src/rules/reviewer-awareness.md +0 -9
- package/.agent-src/rules/roadmap-ci-steps-policy.md +0 -9
- package/.agent-src/rules/roadmap-progress-sync.md +0 -9
- package/.agent-src/rules/role-mode-adherence.md +0 -9
- package/.agent-src/rules/rule-type-governance.md +0 -9
- package/.agent-src/rules/runtime-safety.md +0 -9
- package/.agent-src/rules/scope-control.md +0 -9
- package/.agent-src/rules/security-sensitive-stop.md +0 -9
- package/.agent-src/rules/size-enforcement.md +0 -9
- package/.agent-src/rules/skill-improvement-trigger.md +0 -9
- package/.agent-src/rules/skill-quality.md +0 -9
- package/.agent-src/rules/slash-command-routing-policy.md +0 -9
- package/.agent-src/rules/strategy-safety-floor.md +0 -6
- package/.agent-src/rules/symfony-routing.md +0 -4
- package/.agent-src/rules/telegraph-speak.md +0 -9
- package/.agent-src/rules/think-before-action.md +0 -9
- package/.agent-src/rules/token-efficiency.md +0 -9
- package/.agent-src/rules/token-optimizer-maintenance.md +0 -9
- package/.agent-src/rules/tool-safety.md +0 -9
- package/.agent-src/rules/ui-audit-gate.md +0 -9
- package/.agent-src/rules/upstream-proposal.md +0 -9
- package/.agent-src/rules/user-interaction.md +0 -9
- package/.agent-src/rules/user-interrupt-priority.md +0 -9
- package/.agent-src/rules/verify-before-complete.md +0 -9
- package/.agent-src/skills/accessibility-auditor/SKILL.md +1 -9
- package/.agent-src/skills/activation-design/SKILL.md +1 -4
- package/.agent-src/skills/adr-create/SKILL.md +1 -9
- package/.agent-src/skills/adversarial-review/SKILL.md +1 -9
- package/.agent-src/skills/agent-docs-writing/SKILL.md +1 -9
- package/.agent-src/skills/agents-md-thin-root/SKILL.md +1 -9
- package/.agent-src/skills/ai-council/SKILL.md +1 -9
- package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -9
- package/.agent-src/skills/analysis-skill-router/SKILL.md +1 -9
- package/.agent-src/skills/api-design/SKILL.md +1 -9
- package/.agent-src/skills/api-endpoint/SKILL.md +1 -9
- package/.agent-src/skills/api-testing/SKILL.md +1 -9
- package/.agent-src/skills/architecture-review-lens/SKILL.md +1 -9
- package/.agent-src/skills/artisan-commands/SKILL.md +1 -4
- package/.agent-src/skills/async-python-patterns/SKILL.md +1 -3
- package/.agent-src/skills/authz-review/SKILL.md +1 -9
- package/.agent-src/skills/aws-infrastructure/SKILL.md +1 -9
- package/.agent-src/skills/blade-ui/SKILL.md +1 -4
- package/.agent-src/skills/blast-radius-analyzer/SKILL.md +1 -9
- package/.agent-src/skills/bug-analyzer/SKILL.md +1 -9
- package/.agent-src/skills/build-buy-partner/SKILL.md +1 -7
- package/.agent-src/skills/canvas-design/SKILL.md +1 -3
- package/.agent-src/skills/character-consistency/SKILL.md +1 -3
- package/.agent-src/skills/check-refs/SKILL.md +1 -9
- package/.agent-src/skills/churn-prevention/SKILL.md +1 -5
- package/.agent-src/skills/code-refactoring/SKILL.md +1 -9
- package/.agent-src/skills/code-review/SKILL.md +1 -9
- package/.agent-src/skills/command-routing/SKILL.md +1 -9
- package/.agent-src/skills/command-writing/SKILL.md +1 -9
- package/.agent-src/skills/comp-banding/SKILL.md +1 -5
- package/.agent-src/skills/competitive-moat-analysis/SKILL.md +1 -7
- package/.agent-src/skills/competitive-positioning/SKILL.md +1 -5
- package/.agent-src/skills/composer-packages/SKILL.md +1 -4
- package/.agent-src/skills/condense-memory/SKILL.md +1 -9
- package/.agent-src/skills/content-funnel-design/SKILL.md +1 -5
- package/.agent-src/skills/context-authoring/SKILL.md +1 -9
- package/.agent-src/skills/context-document/SKILL.md +1 -9
- package/.agent-src/skills/contracts-cognition/SKILL.md +1 -5
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +1 -9
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +1 -9
- package/.agent-src/skills/copilot-config/SKILL.md +1 -9
- package/.agent-src/skills/customer-research/SKILL.md +1 -4
- package/.agent-src/skills/dashboard-design/SKILL.md +1 -9
- package/.agent-src/skills/data-flow-mapper/SKILL.md +1 -9
- package/.agent-src/skills/data-handling-judgment/SKILL.md +1 -9
- package/.agent-src/skills/database/SKILL.md +1 -9
- package/.agent-src/skills/dcf-modeling/SKILL.md +1 -6
- package/.agent-src/skills/deal-qualification-meddic/SKILL.md +1 -5
- package/.agent-src/skills/decision-record/SKILL.md +1 -9
- package/.agent-src/skills/deep-reading-analyst/SKILL.md +2 -9
- package/.agent-src/skills/defense-in-depth/SKILL.md +1 -9
- package/.agent-src/skills/dependency-upgrade/SKILL.md +1 -9
- package/.agent-src/skills/description-assist/SKILL.md +1 -9
- package/.agent-src/skills/design-review/SKILL.md +1 -9
- package/.agent-src/skills/devcontainer/SKILL.md +1 -9
- package/.agent-src/skills/developer-like-execution/SKILL.md +1 -9
- package/.agent-src/skills/discovery-interview/SKILL.md +1 -4
- package/.agent-src/skills/doc-coauthoring/SKILL.md +1 -9
- package/.agent-src/skills/docker/SKILL.md +1 -9
- package/.agent-src/skills/editorial-calendar/SKILL.md +1 -5
- package/.agent-src/skills/eloquent/SKILL.md +1 -4
- package/.agent-src/skills/error-handling-patterns/SKILL.md +1 -9
- package/.agent-src/skills/estimate-ticket/SKILL.md +1 -5
- package/.agent-src/skills/existing-ui-audit/SKILL.md +1 -9
- package/.agent-src/skills/expansion-playbook/SKILL.md +1 -5
- package/.agent-src/skills/fe-design/SKILL.md +1 -9
- package/.agent-src/skills/feature-planning/SKILL.md +1 -5
- package/.agent-src/skills/file-editor/SKILL.md +1 -9
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +1 -9
- package/.agent-src/skills/flux/SKILL.md +1 -4
- package/.agent-src/skills/forecast-accuracy/SKILL.md +1 -5
- package/.agent-src/skills/forecasting/SKILL.md +1 -5
- package/.agent-src/skills/form-handler/SKILL.md +1 -9
- package/.agent-src/skills/fundraising-narrative/SKILL.md +1 -7
- package/.agent-src/skills/funnel-analysis/SKILL.md +1 -5
- package/.agent-src/skills/git-workflow/SKILL.md +1 -9
- package/.agent-src/skills/github-ci/SKILL.md +1 -9
- package/.agent-src/skills/grafana/SKILL.md +1 -9
- package/.agent-src/skills/gtm-launch/SKILL.md +1 -5
- package/.agent-src/skills/guideline-writing/SKILL.md +1 -9
- package/.agent-src/skills/hiring-loop-design/SKILL.md +1 -5
- package/.agent-src/skills/incident-commander/SKILL.md +1 -9
- package/.agent-src/skills/jira-integration/SKILL.md +1 -9
- package/.agent-src/skills/jobs-events/SKILL.md +1 -4
- package/.agent-src/skills/judge-bug-hunter/SKILL.md +1 -9
- package/.agent-src/skills/judge-code-quality/SKILL.md +1 -9
- package/.agent-src/skills/judge-security-auditor/SKILL.md +1 -9
- package/.agent-src/skills/judge-test-coverage/SKILL.md +1 -9
- package/.agent-src/skills/laravel/SKILL.md +1 -4
- package/.agent-src/skills/laravel-api-endpoint/SKILL.md +1 -4
- package/.agent-src/skills/laravel-dto/SKILL.md +1 -4
- package/.agent-src/skills/laravel-horizon/SKILL.md +1 -4
- package/.agent-src/skills/laravel-mail/SKILL.md +1 -4
- package/.agent-src/skills/laravel-middleware/SKILL.md +1 -4
- package/.agent-src/skills/laravel-migration/SKILL.md +1 -4
- package/.agent-src/skills/laravel-notifications/SKILL.md +1 -4
- package/.agent-src/skills/laravel-pennant/SKILL.md +1 -4
- package/.agent-src/skills/laravel-pulse/SKILL.md +1 -4
- package/.agent-src/skills/laravel-reverb/SKILL.md +1 -4
- package/.agent-src/skills/laravel-scheduling/SKILL.md +1 -4
- package/.agent-src/skills/laravel-validation/SKILL.md +1 -4
- package/.agent-src/skills/laravel-websocket/SKILL.md +1 -4
- package/.agent-src/skills/launch-readiness/SKILL.md +1 -7
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +1 -8
- package/.agent-src/skills/lint-skills/SKILL.md +1 -9
- package/.agent-src/skills/livewire/SKILL.md +1 -4
- package/.agent-src/skills/livewire-architect/SKILL.md +1 -4
- package/.agent-src/skills/logging-monitoring/SKILL.md +1 -9
- package/.agent-src/skills/market-entry-analysis/SKILL.md +1 -7
- package/.agent-src/skills/markitdown/SKILL.md +1 -9
- package/.agent-src/skills/mcp/SKILL.md +1 -9
- package/.agent-src/skills/mcp-builder/SKILL.md +1 -9
- package/.agent-src/skills/md-language-check/SKILL.md +1 -9
- package/.agent-src/skills/memory-consolidation/SKILL.md +1 -9
- package/.agent-src/skills/merge-conflicts/SKILL.md +1 -9
- package/.agent-src/skills/messaging-architecture/SKILL.md +1 -5
- package/.agent-src/skills/migration-architect/SKILL.md +1 -9
- package/.agent-src/skills/mobile-e2e-strategy/SKILL.md +1 -9
- package/.agent-src/skills/module-detect-on-the-fly/SKILL.md +1 -9
- package/.agent-src/skills/module-management/SKILL.md +1 -9
- package/.agent-src/skills/motion-choreographer/SKILL.md +1 -3
- package/.agent-src/skills/multi-tenancy/SKILL.md +1 -9
- package/.agent-src/skills/nextjs-patterns/SKILL.md +1 -4
- package/.agent-src/skills/okr-tree-modeling/SKILL.md +1 -7
- package/.agent-src/skills/onboarding-design/SKILL.md +1 -5
- package/.agent-src/skills/onboarding-program/SKILL.md +1 -5
- package/.agent-src/skills/one-on-one-cadence/SKILL.md +1 -5
- package/.agent-src/skills/openapi/SKILL.md +1 -9
- package/.agent-src/skills/org-design/SKILL.md +1 -5
- package/.agent-src/skills/override-management/SKILL.md +1 -9
- package/.agent-src/skills/perf-feedback-craft/SKILL.md +1 -5
- package/.agent-src/skills/performance/SKILL.md +1 -9
- package/.agent-src/skills/performance-analysis/SKILL.md +1 -9
- package/.agent-src/skills/persona-writing/SKILL.md +1 -9
- package/.agent-src/skills/pest-testing/SKILL.md +1 -4
- package/.agent-src/skills/php-coder/SKILL.md +1 -4
- package/.agent-src/skills/php-debugging/SKILL.md +1 -4
- package/.agent-src/skills/php-service/SKILL.md +1 -4
- package/.agent-src/skills/pipeline-strategy/SKILL.md +1 -5
- package/.agent-src/skills/pixar-storyteller/SKILL.md +1 -3
- package/.agent-src/skills/playwright-architect/SKILL.md +1 -9
- package/.agent-src/skills/playwright-testing/SKILL.md +1 -9
- package/.agent-src/skills/po-discovery/SKILL.md +1 -5
- package/.agent-src/skills/positioning-strategy/SKILL.md +1 -5
- package/.agent-src/skills/privacy-review/SKILL.md +1 -9
- package/.agent-src/skills/project-analysis-core/SKILL.md +2 -9
- package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +2 -9
- package/.agent-src/skills/project-analysis-laravel/SKILL.md +1 -4
- package/.agent-src/skills/project-analysis-nextjs/SKILL.md +1 -4
- package/.agent-src/skills/project-analysis-node-express/SKILL.md +1 -3
- package/.agent-src/skills/project-analysis-react/SKILL.md +1 -4
- package/.agent-src/skills/project-analysis-symfony/SKILL.md +1 -4
- package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +1 -4
- package/.agent-src/skills/project-analyzer/SKILL.md +2 -9
- package/.agent-src/skills/project-docs/SKILL.md +1 -9
- package/.agent-src/skills/prompt-engineering-patterns/SKILL.md +1 -9
- package/.agent-src/skills/prompt-optimizer/SKILL.md +1 -9
- package/.agent-src/skills/quality-tools/SKILL.md +1 -9
- package/.agent-src/skills/react-native-setup/SKILL.md +1 -4
- package/.agent-src/skills/react-shadcn-ui/SKILL.md +1 -4
- package/.agent-src/skills/readme-reviewer/SKILL.md +1 -9
- package/.agent-src/skills/readme-writing/SKILL.md +1 -9
- package/.agent-src/skills/readme-writing-package/SKILL.md +1 -9
- package/.agent-src/skills/receiving-code-review/SKILL.md +1 -9
- package/.agent-src/skills/refine-prompt/SKILL.md +1 -9
- package/.agent-src/skills/refine-ticket/SKILL.md +1 -5
- package/.agent-src/skills/release-comms/SKILL.md +1 -5
- package/.agent-src/skills/repomix-packer/SKILL.md +2 -9
- package/.agent-src/skills/requesting-code-review/SKILL.md +1 -9
- package/.agent-src/skills/retention-loops/SKILL.md +1 -5
- package/.agent-src/skills/review-routing/SKILL.md +1 -9
- package/.agent-src/skills/rice-prioritization/SKILL.md +1 -5
- package/.agent-src/skills/risk-officer/SKILL.md +1 -9
- package/.agent-src/skills/roadmap-management/SKILL.md +1 -9
- package/.agent-src/skills/roadmap-writing/SKILL.md +1 -9
- package/.agent-src/skills/rtk-output-filtering/SKILL.md +1 -9
- package/.agent-src/skills/rule-refactor/SKILL.md +1 -9
- package/.agent-src/skills/rule-writing/SKILL.md +1 -9
- package/.agent-src/skills/runway-cognition/SKILL.md +1 -5
- package/.agent-src/skills/scenario-modeling/SKILL.md +1 -6
- package/.agent-src/skills/scene-expander/SKILL.md +1 -3
- package/.agent-src/skills/script-writing/SKILL.md +1 -9
- package/.agent-src/skills/secrets-management/SKILL.md +1 -9
- package/.agent-src/skills/security/SKILL.md +1 -9
- package/.agent-src/skills/security-audit/SKILL.md +1 -9
- package/.agent-src/skills/sentry-integration/SKILL.md +1 -9
- package/.agent-src/skills/sequential-thinking/SKILL.md +1 -9
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -9
- package/.agent-src/skills/skill-management/SKILL.md +1 -8
- package/.agent-src/skills/skill-reviewer/SKILL.md +1 -9
- package/.agent-src/skills/skill-writing/SKILL.md +1 -8
- package/.agent-src/skills/sql-writing/SKILL.md +1 -9
- package/.agent-src/skills/stakeholder-tradeoff/SKILL.md +1 -5
- package/.agent-src/skills/subagent-orchestration/SKILL.md +1 -9
- package/.agent-src/skills/symfony-workflow/SKILL.md +1 -4
- package/.agent-src/skills/systematic-debugging/SKILL.md +1 -9
- package/.agent-src/skills/tailwind-engineer/SKILL.md +1 -9
- package/.agent-src/skills/tech-debt-tracker/SKILL.md +1 -9
- package/.agent-src/skills/technical-specification/SKILL.md +1 -5
- package/.agent-src/skills/terraform/SKILL.md +1 -9
- package/.agent-src/skills/terragrunt/SKILL.md +1 -9
- package/.agent-src/skills/test-driven-development/SKILL.md +1 -9
- package/.agent-src/skills/test-performance/SKILL.md +1 -9
- package/.agent-src/skills/testing-anti-patterns/SKILL.md +1 -9
- package/.agent-src/skills/threat-modeling/SKILL.md +1 -9
- package/.agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -5
- package/.agent-src/skills/token-optimizer/SKILL.md +1 -9
- package/.agent-src/skills/traefik/SKILL.md +1 -9
- package/.agent-src/skills/ui-component-architect/SKILL.md +1 -9
- package/.agent-src/skills/unit-economics-modeling/SKILL.md +1 -5
- package/.agent-src/skills/universal-project-analysis/SKILL.md +2 -9
- package/.agent-src/skills/upstream-contribute/SKILL.md +1 -9
- package/.agent-src/skills/using-git-worktrees/SKILL.md +1 -9
- package/.agent-src/skills/validate-feature-fit/SKILL.md +1 -9
- package/.agent-src/skills/verify-completion-evidence/SKILL.md +1 -9
- package/.agent-src/skills/video-director/SKILL.md +1 -3
- package/.agent-src/skills/vision-articulation/SKILL.md +1 -7
- package/.agent-src/skills/voc-extract/SKILL.md +1 -4
- package/.agent-src/skills/voice-and-tone-design/SKILL.md +1 -5
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +27 -206
- package/README.md +5 -0
- package/config/agent-settings.template.yml +13 -0
- package/dist/cli/registry.js +2 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +358 -358
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +2 -2
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +3 -3
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +3 -3
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/server/schemas/settings.js +4 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/ui/assets/{index-Tk7lkVH8.js → index-DVsyUMZe.js} +2 -2
- package/dist/ui/assets/index-DVsyUMZe.js.map +1 -0
- package/dist/ui/index.html +1 -1
- package/docs/archive/CHANGELOG-pre-5.4.0.md +260 -0
- package/docs/contracts/consumer-bridge.md +2 -0
- package/docs/contracts/multi-tool-projection-fidelity.md +19 -0
- package/docs/contracts/release-pr-gating.md +6 -1
- package/docs/decisions/ADR-020-global-only-consumer-scope.md +24 -0
- package/docs/decisions/ADR-034-per-skill-model-recommendation-transport.md +63 -0
- package/docs/decisions/ADR-035-model-capability-tiers.md +104 -0
- package/docs/decisions/INDEX.md +2 -0
- package/docs/getting-started.md +23 -0
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +25 -0
- package/package.json +1 -1
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_cli/cmd_doctor.py +44 -1
- package/scripts/_cli/cmd_refresh.py +173 -0
- package/scripts/_cli/cmd_upgrade.py +142 -0
- package/scripts/_dispatch.bash +20 -0
- package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
- package/scripts/backfill_model_tier.py +182 -0
- package/scripts/build_discovery_manifest.py +20 -3
- package/scripts/check_artefact_checksums.py +11 -4
- package/scripts/check_release_pr_shape.py +7 -0
- package/scripts/condense.py +148 -18
- package/scripts/hooks/dispatch_hook.py +39 -0
- package/scripts/install +14 -0
- package/scripts/lint_framework_leakage_allowlist.json +108 -78
- package/scripts/lint_frontmatter_boilerplate.py +77 -0
- package/scripts/lint_model_tier_coverage.py +73 -0
- package/scripts/migrate_frontmatter_defaults.py +245 -0
- package/scripts/roadmap_progress_hook.py +28 -2
- package/scripts/schemas/command.schema.json +17 -5
- package/scripts/schemas/persona.schema.json +4 -2
- package/scripts/schemas/rule.schema.json +8 -6
- package/scripts/schemas/skill.schema.json +18 -6
- package/scripts/skill_linter.py +21 -9
- package/scripts/smoke/skills.sh +4 -1
- package/scripts/validate_frontmatter.py +74 -0
- package/dist/ui/assets/index-Tk7lkVH8.js.map +0 -1
|
@@ -49,7 +49,7 @@ import sys
|
|
|
49
49
|
from pathlib import Path
|
|
50
50
|
from typing import Any
|
|
51
51
|
|
|
52
|
-
from scripts._lib import installed_tools
|
|
52
|
+
from scripts._lib import installed_lock, installed_tools
|
|
53
53
|
from scripts._lib.agent_settings import (
|
|
54
54
|
PROJECT_ROOT_ENV,
|
|
55
55
|
ROOT_OVERRIDE_ENV,
|
|
@@ -440,6 +440,7 @@ def _foreign_records(
|
|
|
440
440
|
#: a runner below and an entry in :func:`_run_checks`.
|
|
441
441
|
CHECK_IDS = (
|
|
442
442
|
"scope",
|
|
443
|
+
"global-binary",
|
|
443
444
|
"manifest-integrity",
|
|
444
445
|
"lockfile-freshness",
|
|
445
446
|
"bridge-drift",
|
|
@@ -587,6 +588,47 @@ def _check_lockfile_freshness(manifest: dict[str, Any]) -> dict[str, Any]:
|
|
|
587
588
|
}
|
|
588
589
|
|
|
589
590
|
|
|
591
|
+
def _check_global_binary(project_root: Path) -> dict[str, Any]:
|
|
592
|
+
"""`agent-config` PATH resolution + global-install version parity.
|
|
593
|
+
|
|
594
|
+
The Claude plugin hook resolves `agent-config` from PATH (ADR-020
|
|
595
|
+
global-only); if it is missing, every PostToolUse hook fails silently —
|
|
596
|
+
this is the root cause of the "dashboard never updates" report. Version
|
|
597
|
+
drift between the binary on PATH and the global install root means the
|
|
598
|
+
plugin may emit a hook spec the installed binary predates.
|
|
599
|
+
"""
|
|
600
|
+
binary = shutil.which("agent-config")
|
|
601
|
+
if not binary:
|
|
602
|
+
return {
|
|
603
|
+
"id": "global-binary", "status": "fail",
|
|
604
|
+
"message": "`agent-config` is not on PATH — Claude plugin hooks "
|
|
605
|
+
"cannot resolve it (hooks silently no-op)",
|
|
606
|
+
"remedy": "npm install -g @event4u/agent-config, then re-run doctor",
|
|
607
|
+
}
|
|
608
|
+
lock = installed_lock.read_lockfile()
|
|
609
|
+
global_v = ""
|
|
610
|
+
if isinstance(lock, dict):
|
|
611
|
+
raw = lock.get("agent_config_version")
|
|
612
|
+
global_v = raw.strip().lstrip("v") if isinstance(raw, str) else ""
|
|
613
|
+
binary_v = (_current_package_version() or "").lstrip("v")
|
|
614
|
+
if global_v and binary_v and global_v != binary_v:
|
|
615
|
+
return {
|
|
616
|
+
"id": "global-binary", "status": "warn",
|
|
617
|
+
"message": f"version drift — binary {binary_v}, global install "
|
|
618
|
+
f"{global_v}",
|
|
619
|
+
"remedy": "agent-config upgrade (refresh the global install + plugin)",
|
|
620
|
+
}
|
|
621
|
+
bridge = project_root / "agents" / ".event4u-bridge.yml"
|
|
622
|
+
bridge_note = "" if bridge.is_file() else " · no project bridge marker"
|
|
623
|
+
return {
|
|
624
|
+
"id": "global-binary", "status": "ok",
|
|
625
|
+
"message": f"on PATH ({binary}); version {binary_v or 'unknown'}"
|
|
626
|
+
f"{bridge_note}",
|
|
627
|
+
"remedy": "" if not bridge_note else
|
|
628
|
+
"agent-config refresh --project (scaffold the bridge marker)",
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
|
|
590
632
|
def _check_bridge_drift(
|
|
591
633
|
missing: list[dict[str, Any]],
|
|
592
634
|
modified: list[dict[str, Any]],
|
|
@@ -1092,6 +1134,7 @@ def _run_checks(
|
|
|
1092
1134
|
"""
|
|
1093
1135
|
runners: dict[str, Any] = {
|
|
1094
1136
|
"scope": lambda: _check_scope(project_root),
|
|
1137
|
+
"global-binary": lambda: _check_global_binary(project_root),
|
|
1095
1138
|
"manifest-integrity": lambda: _check_manifest_integrity(manifest),
|
|
1096
1139
|
"lockfile-freshness": lambda: _check_lockfile_freshness(manifest),
|
|
1097
1140
|
"bridge-drift": lambda: _check_bridge_drift(
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"""``agent-config refresh`` — idempotent re-install, no version change.
|
|
2
|
+
|
|
3
|
+
The same-version counterpart to ``agent-config upgrade`` (which fetches
|
|
4
|
+
the latest). Two scopes, exactly one required:
|
|
5
|
+
|
|
6
|
+
* ``--global`` — re-run the global install (``scripts/install --global``)
|
|
7
|
+
so the global root + Claude plugin hooks are rewritten from the
|
|
8
|
+
currently-installed package. Idempotent: a second run is a no-op diff.
|
|
9
|
+
* ``--project`` — refresh the **minimal** project surface ADR-020 permits
|
|
10
|
+
for a consumer: the ``agents/.event4u-bridge.yml`` marker, an
|
|
11
|
+
``agents/overrides/`` scaffold, and the managed ``agents/`` block in
|
|
12
|
+
``.gitignore``. Writes **no** distributed content (no ``.augment/`` /
|
|
13
|
+
``.claude/`` / skills / hooks). No wizard.
|
|
14
|
+
|
|
15
|
+
Bare ``agent-config refresh`` (no scope flag) errors — never a silent
|
|
16
|
+
global default (council 2026-05-30).
|
|
17
|
+
|
|
18
|
+
Exit codes: ``0`` success · ``1`` a step failed / bad invocation.
|
|
19
|
+
"""
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import argparse
|
|
23
|
+
import subprocess
|
|
24
|
+
import sys
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from typing import Callable, Optional
|
|
27
|
+
|
|
28
|
+
PACKAGE_ROOT = Path(__file__).resolve().parents[2]
|
|
29
|
+
|
|
30
|
+
Runner = Callable[[list[str]], int]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _default_runner(cmd: list[str]) -> int:
|
|
34
|
+
try:
|
|
35
|
+
return subprocess.run(cmd, check=False).returncode
|
|
36
|
+
except OSError as exc:
|
|
37
|
+
sys.stderr.write(f"agent-config refresh: cannot run {cmd[0]}: {exc}\n")
|
|
38
|
+
return 1
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _refresh_global(runner: Runner, out, err) -> int:
|
|
42
|
+
install_sh = PACKAGE_ROOT / "scripts" / "install"
|
|
43
|
+
if not install_sh.is_file():
|
|
44
|
+
print(f"❌ agent-config refresh: installer not found at {install_sh}",
|
|
45
|
+
file=err)
|
|
46
|
+
return 1
|
|
47
|
+
print("→ refreshing global install (scripts/install --global)", file=out)
|
|
48
|
+
rc = runner(["bash", str(install_sh), "--global"])
|
|
49
|
+
if rc != 0:
|
|
50
|
+
print(f"❌ agent-config refresh --global: install failed (exit {rc})",
|
|
51
|
+
file=err)
|
|
52
|
+
return 1
|
|
53
|
+
print("✅ global install refreshed.", file=out)
|
|
54
|
+
return 0
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _is_source_repo(project_root: Path) -> bool:
|
|
58
|
+
"""True when project_root is the agent-config package itself.
|
|
59
|
+
|
|
60
|
+
``_write_consumer_bridge_marker`` only guards on a root-level
|
|
61
|
+
``.agent-src.uncondensed/``, which the monorepo keeps under
|
|
62
|
+
``packages/*/`` instead — so the narrow guard misses here and would
|
|
63
|
+
write a consumer marker into the maintainer tree. This broader check
|
|
64
|
+
(condensed output, packaged source, or the package's own
|
|
65
|
+
``package.json`` name) makes ``refresh --project`` a no-op in any
|
|
66
|
+
agent-config checkout. Consumers use dev-mode, not refresh.
|
|
67
|
+
"""
|
|
68
|
+
if (project_root / ".agent-src").is_dir():
|
|
69
|
+
return True
|
|
70
|
+
if any((project_root / "packages").glob("*/.agent-src.uncondensed")):
|
|
71
|
+
return True
|
|
72
|
+
pkg = project_root / "package.json"
|
|
73
|
+
if pkg.is_file():
|
|
74
|
+
try:
|
|
75
|
+
import json
|
|
76
|
+
if json.loads(pkg.read_text(encoding="utf-8")).get("name") == \
|
|
77
|
+
"@event4u/agent-config":
|
|
78
|
+
return True
|
|
79
|
+
except (OSError, ValueError):
|
|
80
|
+
pass
|
|
81
|
+
return False
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _refresh_project(project_root: Path, out, err) -> int:
|
|
85
|
+
# Imported lazily: scripts.install is large and only needed for --project.
|
|
86
|
+
from scripts import install as installer
|
|
87
|
+
from scripts._lib import installed_lock
|
|
88
|
+
|
|
89
|
+
if _is_source_repo(project_root):
|
|
90
|
+
print("ℹ️ refresh --project skipped: this is the agent-config package "
|
|
91
|
+
"itself (or a checkout of it). Maintainers use "
|
|
92
|
+
"AGENT_CONFIG_DEV_MODE=1, not a consumer refresh.", file=out)
|
|
93
|
+
return 0
|
|
94
|
+
|
|
95
|
+
version = installed_lock.current_package_version() or "0.0.0"
|
|
96
|
+
marker = installer._write_consumer_bridge_marker(project_root, version)
|
|
97
|
+
if marker is None:
|
|
98
|
+
print("ℹ️ refresh --project skipped the bridge marker: this is the "
|
|
99
|
+
"agent-config source repo (or AGENT_CONFIG_DEV_MODE=1). Nothing "
|
|
100
|
+
"to scaffold in a maintainer checkout.", file=out)
|
|
101
|
+
return 0
|
|
102
|
+
|
|
103
|
+
print(f"✅ bridge marker: {marker}", file=out)
|
|
104
|
+
|
|
105
|
+
overrides = project_root / "agents" / "overrides"
|
|
106
|
+
overrides.mkdir(parents=True, exist_ok=True)
|
|
107
|
+
keep = overrides / "README.md"
|
|
108
|
+
if not keep.exists():
|
|
109
|
+
keep.write_text(
|
|
110
|
+
"# Project overrides\n\n"
|
|
111
|
+
"Project-local overrides/extensions of shared skills, rules, and "
|
|
112
|
+
"commands. The only project-side agent surface ADR-020 permits "
|
|
113
|
+
"besides the bridge marker. See the `override-management` skill.\n",
|
|
114
|
+
encoding="utf-8")
|
|
115
|
+
print(f"✅ overrides scaffold: {overrides}", file=out)
|
|
116
|
+
|
|
117
|
+
rc = _sync_gitignore(project_root, out, err)
|
|
118
|
+
if rc != 0:
|
|
119
|
+
return rc
|
|
120
|
+
print("✅ refresh --project complete.", file=out)
|
|
121
|
+
return 0
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _sync_gitignore(project_root: Path, out, err) -> int:
|
|
125
|
+
try:
|
|
126
|
+
from scripts import sync_gitignore
|
|
127
|
+
except ImportError as exc:
|
|
128
|
+
print(f"⚠️ refresh --project: gitignore sync unavailable ({exc})",
|
|
129
|
+
file=err)
|
|
130
|
+
return 0 # advisory — do not fail the refresh on a missing helper
|
|
131
|
+
rc = sync_gitignore.main(["--path", str(project_root / ".gitignore")])
|
|
132
|
+
if rc not in (0, None):
|
|
133
|
+
print(f"⚠️ refresh --project: gitignore sync returned {rc}", file=err)
|
|
134
|
+
else:
|
|
135
|
+
print("✅ .gitignore agents/ block synced.", file=out)
|
|
136
|
+
return 0
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def main(
|
|
140
|
+
argv: Optional[list[str]] = None,
|
|
141
|
+
*,
|
|
142
|
+
runner: Runner = _default_runner,
|
|
143
|
+
project_root: Optional[Path] = None,
|
|
144
|
+
out=sys.stdout,
|
|
145
|
+
err=sys.stderr,
|
|
146
|
+
) -> int:
|
|
147
|
+
parser = argparse.ArgumentParser(
|
|
148
|
+
prog="agent-config refresh",
|
|
149
|
+
description="Idempotent re-install (no version change). Requires a scope.",
|
|
150
|
+
)
|
|
151
|
+
parser.add_argument("--global", dest="is_global", action="store_true",
|
|
152
|
+
help="Re-run the global install (root + Claude plugin).")
|
|
153
|
+
parser.add_argument("--project", dest="is_project", action="store_true",
|
|
154
|
+
help="Refresh the minimal project surface (bridge "
|
|
155
|
+
"marker, overrides scaffold, .gitignore).")
|
|
156
|
+
args = parser.parse_args(argv)
|
|
157
|
+
|
|
158
|
+
if not args.is_global and not args.is_project:
|
|
159
|
+
print("❌ agent-config refresh: specify a scope — --global "
|
|
160
|
+
"and/or --project (never a silent default).", file=err)
|
|
161
|
+
return 1
|
|
162
|
+
|
|
163
|
+
root = project_root or Path.cwd()
|
|
164
|
+
rc = 0
|
|
165
|
+
if args.is_global:
|
|
166
|
+
rc = _refresh_global(runner, out, err) or rc
|
|
167
|
+
if args.is_project and rc == 0:
|
|
168
|
+
rc = _refresh_project(root, out, err) or rc
|
|
169
|
+
return rc
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
if __name__ == "__main__":
|
|
173
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"""``agent-config upgrade`` — fetch + install the latest global binary + refresh.
|
|
2
|
+
|
|
3
|
+
Distinct from ``agent-config update`` (which only flips the
|
|
4
|
+
``agent_config_version`` pin in ``.agent-settings.yml`` — a project
|
|
5
|
+
decision, see :mod:`scripts._cli.cmd_update`). ``upgrade`` is the
|
|
6
|
+
**global** self-update path mandated by ADR-020's "no per-repo bump"
|
|
7
|
+
goal: it installs the latest published package globally and re-runs the
|
|
8
|
+
global install so new skills / rules / hooks reach every consumer at
|
|
9
|
+
once.
|
|
10
|
+
|
|
11
|
+
Two side effects, in order:
|
|
12
|
+
|
|
13
|
+
1. ``npm install -g @event4u/agent-config@latest`` — refresh the global
|
|
14
|
+
binary on PATH (the binary the Claude plugin hook resolves).
|
|
15
|
+
2. ``agent-config global`` (→ ``install.py --global``) — refresh the
|
|
16
|
+
global root (``~/.event4u/agent-config/``) + regenerate plugin hooks.
|
|
17
|
+
|
|
18
|
+
The **Claude marketplace plugin** updates on Claude Code's own cadence,
|
|
19
|
+
independent of npm; ``upgrade`` cannot drive it. ``agent-config doctor``
|
|
20
|
+
surfaces binary↔plugin drift so the user knows when to update the plugin
|
|
21
|
+
from the marketplace.
|
|
22
|
+
|
|
23
|
+
Flags:
|
|
24
|
+
|
|
25
|
+
* ``--check`` — report installed vs latest; install nothing. Exit 0.
|
|
26
|
+
* ``--dry-run`` — print the exact commands that would run; execute none.
|
|
27
|
+
* (no flag) — perform the upgrade.
|
|
28
|
+
|
|
29
|
+
Exit codes: ``0`` success / already-latest / check / dry-run · ``1`` a
|
|
30
|
+
step failed.
|
|
31
|
+
"""
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
import argparse
|
|
35
|
+
import subprocess
|
|
36
|
+
import sys
|
|
37
|
+
from pathlib import Path
|
|
38
|
+
from typing import Callable, Optional
|
|
39
|
+
|
|
40
|
+
from scripts._lib import installed_lock, update_check
|
|
41
|
+
|
|
42
|
+
PACKAGE_NAME = "@event4u/agent-config"
|
|
43
|
+
|
|
44
|
+
# A runner is injected in tests so the global-mutating commands are never
|
|
45
|
+
# executed in CI / sandbox. Returns the subprocess return code.
|
|
46
|
+
Runner = Callable[[list[str]], int]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _default_runner(cmd: list[str]) -> int:
|
|
50
|
+
try:
|
|
51
|
+
return subprocess.run(cmd, check=False).returncode
|
|
52
|
+
except OSError as exc: # npm / bash missing
|
|
53
|
+
sys.stderr.write(f"agent-config upgrade: cannot run {cmd[0]}: {exc}\n")
|
|
54
|
+
return 1
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _installed_version() -> str:
|
|
58
|
+
lock = installed_lock.read_lockfile()
|
|
59
|
+
if isinstance(lock, dict):
|
|
60
|
+
v = lock.get("agent_config_version")
|
|
61
|
+
if isinstance(v, str) and v:
|
|
62
|
+
return v.strip().lstrip("v")
|
|
63
|
+
return ""
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _agent_config_bin() -> str:
|
|
67
|
+
"""The global wrapper the second step invokes. Prefer the binary on
|
|
68
|
+
PATH; fall back to the package-local wrapper so a maintainer dev-loop
|
|
69
|
+
(no global install yet) still refreshes."""
|
|
70
|
+
from shutil import which
|
|
71
|
+
return which("agent-config") or str(
|
|
72
|
+
Path(__file__).resolve().parents[2] / "agent-config")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def main(
|
|
76
|
+
argv: Optional[list[str]] = None,
|
|
77
|
+
*,
|
|
78
|
+
runner: Runner = _default_runner,
|
|
79
|
+
fetcher=update_check.fetch_latest_from_npm,
|
|
80
|
+
installed: Optional[str] = None,
|
|
81
|
+
out=sys.stdout,
|
|
82
|
+
err=sys.stderr,
|
|
83
|
+
) -> int:
|
|
84
|
+
parser = argparse.ArgumentParser(
|
|
85
|
+
prog="agent-config upgrade",
|
|
86
|
+
description="Install the latest @event4u/agent-config globally and "
|
|
87
|
+
"refresh the global install.",
|
|
88
|
+
)
|
|
89
|
+
parser.add_argument("--check", action="store_true",
|
|
90
|
+
help="Report installed vs latest; install nothing.")
|
|
91
|
+
parser.add_argument("--dry-run", action="store_true",
|
|
92
|
+
help="Print the commands that would run; execute none.")
|
|
93
|
+
args = parser.parse_args(argv)
|
|
94
|
+
|
|
95
|
+
installed = installed if installed is not None else _installed_version()
|
|
96
|
+
latest = fetcher() or ""
|
|
97
|
+
|
|
98
|
+
if args.check:
|
|
99
|
+
if not latest:
|
|
100
|
+
print("agent-config upgrade: latest version unavailable "
|
|
101
|
+
"(registry unreachable).", file=err)
|
|
102
|
+
return 0
|
|
103
|
+
if installed and not installed_lock_is_newer(latest, installed):
|
|
104
|
+
print(f"✅ agent-config is up to date ({installed}).", file=out)
|
|
105
|
+
else:
|
|
106
|
+
print(f"ℹ️ agent-config {latest} available "
|
|
107
|
+
f"(installed: {installed or 'unknown'}). Run "
|
|
108
|
+
f"`agent-config upgrade`.", file=out)
|
|
109
|
+
return 0
|
|
110
|
+
|
|
111
|
+
target = f"{PACKAGE_NAME}@latest"
|
|
112
|
+
steps = [
|
|
113
|
+
["npm", "install", "-g", target],
|
|
114
|
+
[_agent_config_bin(), "global"],
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
if args.dry_run:
|
|
118
|
+
print("agent-config upgrade — dry run, would execute:", file=out)
|
|
119
|
+
for cmd in steps:
|
|
120
|
+
print(" " + " ".join(cmd), file=out)
|
|
121
|
+
return 0
|
|
122
|
+
|
|
123
|
+
for cmd in steps:
|
|
124
|
+
print("→ " + " ".join(cmd), file=out)
|
|
125
|
+
rc = runner(cmd)
|
|
126
|
+
if rc != 0:
|
|
127
|
+
print(f"❌ agent-config upgrade: step failed (exit {rc}): "
|
|
128
|
+
f"{' '.join(cmd)}", file=err)
|
|
129
|
+
return 1
|
|
130
|
+
|
|
131
|
+
print("✅ agent-config upgraded. Run `agent-config doctor` to verify "
|
|
132
|
+
"PATH + plugin parity.", file=out)
|
|
133
|
+
return 0
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def installed_lock_is_newer(latest: str, installed: str) -> bool:
|
|
137
|
+
"""Thin wrapper around update_check._is_newer for one import site."""
|
|
138
|
+
return update_check._is_newer(latest, installed)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
if __name__ == "__main__":
|
|
142
|
+
raise SystemExit(main())
|
package/scripts/_dispatch.bash
CHANGED
|
@@ -72,11 +72,19 @@ EOF
|
|
|
72
72
|
Tier 1 — power-user (release shape, audit, migration):
|
|
73
73
|
update Update the agent_config_version pin in .agent-settings.yml
|
|
74
74
|
Flags: --check (read-only) | --to <version> (explicit pin)
|
|
75
|
+
upgrade Install the latest @event4u/agent-config globally
|
|
76
|
+
(npm i -g) and refresh the global install + plugin.
|
|
77
|
+
Flags: --check (report only) | --dry-run
|
|
78
|
+
refresh Idempotent re-install, no version change.
|
|
79
|
+
--global (root + plugin) | --project (bridge
|
|
80
|
+
marker + overrides + .gitignore). Scope required.
|
|
75
81
|
versions List available @event4u/agent-config versions
|
|
76
82
|
on npm. Marks the current pin and latest.
|
|
77
83
|
Flags: --offline | --limit=N | --json
|
|
78
84
|
global Install to user-scope paths (~/.claude/, ~/.cursor/, …)
|
|
79
85
|
Forwards to `scripts/install --global` (ADR-007).
|
|
86
|
+
`refresh --global` is the clearer name for a re-run;
|
|
87
|
+
`global` is retained as the original alias.
|
|
80
88
|
Flags: --tools=<list> | --ai=<list> | --yes | --force
|
|
81
89
|
export Eject a tool's canonical content into a chosen path
|
|
82
90
|
(real file, no symlink). Idempotent; --force overrides
|
|
@@ -773,6 +781,16 @@ cmd_update() {
|
|
|
773
781
|
exec env PYTHONPATH="$PACKAGE_ROOT" python3 -m scripts._cli.cmd_update "$@"
|
|
774
782
|
}
|
|
775
783
|
|
|
784
|
+
cmd_upgrade() {
|
|
785
|
+
require_python3
|
|
786
|
+
exec env PYTHONPATH="$PACKAGE_ROOT" python3 -m scripts._cli.cmd_upgrade "$@"
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
cmd_refresh() {
|
|
790
|
+
require_python3
|
|
791
|
+
exec env PYTHONPATH="$PACKAGE_ROOT" python3 -m scripts._cli.cmd_refresh "$@"
|
|
792
|
+
}
|
|
793
|
+
|
|
776
794
|
# `agent-config migrate` — one-shot migration off legacy composer / npm
|
|
777
795
|
# install paths onto the npx-only runtime. See scripts/_cli/cmd_migrate.py
|
|
778
796
|
# (P3.5 of road-to-portable-runtime-and-update-check.md).
|
|
@@ -932,6 +950,8 @@ main() {
|
|
|
932
950
|
council:run) cmd_council run "$@" ;;
|
|
933
951
|
council:render) cmd_council render "$@" ;;
|
|
934
952
|
update) cmd_update "$@" ;;
|
|
953
|
+
upgrade) cmd_upgrade "$@" ;;
|
|
954
|
+
refresh) cmd_refresh "$@" ;;
|
|
935
955
|
migrate) cmd_migrate "$@" ;;
|
|
936
956
|
init) cmd_init "$@" ;;
|
|
937
957
|
global) cmd_global "$@" ;;
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Backfill / migrate `model_tier` on every skill and command (ADR-035).
|
|
3
|
+
|
|
4
|
+
Vendor-neutral capability band `lite | medium | high | inherit` (replaces the
|
|
5
|
+
concrete-model `recommended_model` from ADR-034). Behaviour per artefact:
|
|
6
|
+
|
|
7
|
+
- **Has `recommended_model`** (ADR-034 legacy) → migrate via the value map
|
|
8
|
+
(`opus→high`, `sonnet→medium`, `gpt→high`, `inherit→inherit`) and rename the
|
|
9
|
+
key to `model_tier`. Same line count — no body shift.
|
|
10
|
+
- **Already `model_tier`** → leave (idempotent).
|
|
11
|
+
- **Untagged** → classify fresh from the task→tier heuristic
|
|
12
|
+
(`contexts/model-recommendations.md`): deep reasoning → high; mechanical /
|
|
13
|
+
impl / docs / tests / quality → medium; clearly-trivial → lite; meta /
|
|
14
|
+
ambiguous → inherit.
|
|
15
|
+
|
|
16
|
+
A small explicit `_LITE` set demotes obviously-trivial mechanical skills to the
|
|
17
|
+
cheapest band; `_CONTEXT_LARGE` adds the orthogonal `context: large` modifier to
|
|
18
|
+
genuinely long-context skills. Writes BOTH the source and its `.agent-src` copy
|
|
19
|
+
(frontmatter stays byte-identical); refresh condensation hashes afterwards.
|
|
20
|
+
|
|
21
|
+
CLI: python3 scripts/backfill_model_tier.py [--dry-run]
|
|
22
|
+
"""
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import argparse
|
|
26
|
+
import re
|
|
27
|
+
import sys
|
|
28
|
+
from collections import Counter
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
|
|
31
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
32
|
+
from validate_frontmatter import parse_frontmatter # noqa: E402
|
|
33
|
+
from _lib.agent_src import artefact_roots # noqa: E402
|
|
34
|
+
|
|
35
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
36
|
+
CONDENSED = ROOT / ".agent-src"
|
|
37
|
+
|
|
38
|
+
# ADR-034 → ADR-035 value map.
|
|
39
|
+
_MIGRATE = {"opus": "high", "sonnet": "medium", "gpt": "high", "inherit": "inherit"}
|
|
40
|
+
|
|
41
|
+
# Fresh-classification slug signals (deep reasoning / large-analysis → high).
|
|
42
|
+
_HIGH = (
|
|
43
|
+
"architect", "refactor", "debug", "threat", "authz", "adversarial",
|
|
44
|
+
"blast-radius", "defense-in-depth", "data-flow", "decision-record",
|
|
45
|
+
"adr-create", "security-audit", "privacy-review", "review", "judge-",
|
|
46
|
+
"bug-analyzer", "systematic-debugging", "incident", "risk-officer",
|
|
47
|
+
"migration-architect", "moat", "analysis", "analyze", "analyzer",
|
|
48
|
+
"research", "deep-reading", "repomix", "sequential-thinking",
|
|
49
|
+
"project-analysis", "universal-project", "market-entry",
|
|
50
|
+
"scenario-modeling", "forecast", "dcf-modeling", "unit-economics",
|
|
51
|
+
"funnel-analysis",
|
|
52
|
+
)
|
|
53
|
+
_MEDIUM = (
|
|
54
|
+
"test", "pest", "playwright", "lint", "quality-tools", "format", "docs",
|
|
55
|
+
"readme-writing", "commit", "conventional", "css", "tailwind", "blade",
|
|
56
|
+
"flux", "livewire", "form-handler", "api-endpoint", "api-testing",
|
|
57
|
+
"eloquent", "laravel", "dto", "mail", "notification", "migration",
|
|
58
|
+
"middleware", "scheduling", "websocket", "reverb", "horizon", "pulse",
|
|
59
|
+
"pennant", "validation", "docker", "terraform", "terragrunt", "github-ci",
|
|
60
|
+
"traefik", "grafana", "dashboard", "openapi", "sql", "artisan", "composer",
|
|
61
|
+
"jobs-events", "multi-tenancy", "secrets", "logging", "database",
|
|
62
|
+
"php-coder", "php-service", "nextjs", "react", "symfony", "mcp",
|
|
63
|
+
"devcontainer", "copilot", "module",
|
|
64
|
+
)
|
|
65
|
+
_DOMAIN_DEFAULT = {
|
|
66
|
+
"engineering": "medium", "quality": "medium", "devops": "medium",
|
|
67
|
+
"discovery": "high", "product": "inherit", "process": "inherit",
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# Clearly-trivial, no-reasoning mechanical skills → cheapest band.
|
|
71
|
+
_LITE = {"file-editor", "md-language-check"}
|
|
72
|
+
# Genuinely long-context skills → orthogonal context modifier (ADR-035).
|
|
73
|
+
_CONTEXT_LARGE = {
|
|
74
|
+
"project-analysis-core", "project-analysis-hypothesis-driven",
|
|
75
|
+
"project-analyzer", "universal-project-analysis", "repomix-packer",
|
|
76
|
+
"deep-reading-analyst",
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
_RM_RE = re.compile(r'^recommended_model:[ \t]*"?[a-z0-9-]+"?[ \t]*$', re.MULTILINE)
|
|
80
|
+
_MT_RE = re.compile(r'^model_tier:', re.MULTILINE)
|
|
81
|
+
_CTX_RE = re.compile(r'^context:', re.MULTILINE)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _classify(slug: str, domain: str | None) -> str:
|
|
85
|
+
s = slug.lower()
|
|
86
|
+
if s in _LITE:
|
|
87
|
+
return "lite"
|
|
88
|
+
if any(k in s for k in _HIGH):
|
|
89
|
+
return "high"
|
|
90
|
+
if any(k in s for k in _MEDIUM):
|
|
91
|
+
return "medium"
|
|
92
|
+
return _DOMAIN_DEFAULT.get(domain or "", "inherit")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _resolve_tier(slug: str, fm: dict | None) -> str:
|
|
96
|
+
existing_mt = fm.get("model_tier") if isinstance(fm, dict) else None
|
|
97
|
+
if existing_mt:
|
|
98
|
+
tier = existing_mt
|
|
99
|
+
else:
|
|
100
|
+
existing_rm = fm.get("recommended_model") if isinstance(fm, dict) else None
|
|
101
|
+
if existing_rm:
|
|
102
|
+
tier = _MIGRATE.get(existing_rm, "inherit")
|
|
103
|
+
else:
|
|
104
|
+
tier = _classify(slug, fm.get("domain") if isinstance(fm, dict) else None)
|
|
105
|
+
return "lite" if slug in _LITE else tier
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _apply(path: Path, tier: str, want_context: bool) -> bool:
|
|
109
|
+
text = path.read_text(encoding="utf-8")
|
|
110
|
+
if not text.startswith("---\n"):
|
|
111
|
+
return False
|
|
112
|
+
end = text.find("\n---\n", 4)
|
|
113
|
+
if end == -1:
|
|
114
|
+
return False
|
|
115
|
+
fm, body = text[4:end], text[end:]
|
|
116
|
+
changed = False
|
|
117
|
+
if _MT_RE.search(fm):
|
|
118
|
+
pass # already migrated — idempotent
|
|
119
|
+
elif _RM_RE.search(fm):
|
|
120
|
+
fm = _RM_RE.sub(f"model_tier: {tier}", fm, count=1)
|
|
121
|
+
changed = True
|
|
122
|
+
else:
|
|
123
|
+
fm = f"model_tier: {tier}\n" + fm
|
|
124
|
+
changed = True
|
|
125
|
+
if want_context and not _CTX_RE.search(fm):
|
|
126
|
+
fm = re.sub(r'(^model_tier:.*$)', r'\1\ncontext: large', fm, count=1, flags=re.MULTILINE)
|
|
127
|
+
changed = True
|
|
128
|
+
if changed:
|
|
129
|
+
path.write_text("---\n" + fm + body, encoding="utf-8")
|
|
130
|
+
return changed
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _iter():
|
|
134
|
+
for root in artefact_roots():
|
|
135
|
+
sdir = root / "skills"
|
|
136
|
+
if sdir.exists():
|
|
137
|
+
for p in sorted(sdir.rglob("SKILL.md")):
|
|
138
|
+
slug = p.parent.name
|
|
139
|
+
yield p, CONDENSED / "skills" / slug / "SKILL.md", slug
|
|
140
|
+
cdir = root / "commands"
|
|
141
|
+
if cdir.exists():
|
|
142
|
+
for p in sorted(cdir.rglob("*.md")):
|
|
143
|
+
if p.name == "AGENTS.md":
|
|
144
|
+
continue
|
|
145
|
+
rel = p.relative_to(cdir)
|
|
146
|
+
slug = "-".join(rel.with_suffix("").parts)
|
|
147
|
+
yield p, CONDENSED / "commands" / rel, slug
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def run(apply: bool) -> int:
|
|
151
|
+
dist: Counter = Counter()
|
|
152
|
+
ctx = 0
|
|
153
|
+
touched = 0
|
|
154
|
+
for src, cond, slug in _iter():
|
|
155
|
+
fm, _ = parse_frontmatter(src.read_text(encoding="utf-8"))
|
|
156
|
+
tier = _resolve_tier(slug, fm)
|
|
157
|
+
want_ctx = slug in _CONTEXT_LARGE
|
|
158
|
+
dist[tier] += 1
|
|
159
|
+
if want_ctx:
|
|
160
|
+
ctx += 1
|
|
161
|
+
if apply:
|
|
162
|
+
if _apply(src, tier, want_ctx):
|
|
163
|
+
touched += 1
|
|
164
|
+
if cond.exists():
|
|
165
|
+
_apply(cond, tier, want_ctx)
|
|
166
|
+
verb = "would set" if not apply else "set"
|
|
167
|
+
print(f"model_tier backfill ({'dry-run' if not apply else 'apply'}):")
|
|
168
|
+
for t in ("lite", "medium", "high", "inherit"):
|
|
169
|
+
print(f" {t:8s}: {dist[t]}")
|
|
170
|
+
print(f" context:large on {ctx} skills · {verb} {touched} newly · total {sum(dist.values())}")
|
|
171
|
+
return 0
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def main(argv=None) -> int:
|
|
175
|
+
ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
|
|
176
|
+
ap.add_argument("--dry-run", action="store_true")
|
|
177
|
+
args = ap.parse_args(argv)
|
|
178
|
+
return run(apply=not args.dry_run)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
if __name__ == "__main__":
|
|
182
|
+
sys.exit(main())
|
|
@@ -25,7 +25,12 @@ from typing import Any, Iterable
|
|
|
25
25
|
import yaml
|
|
26
26
|
|
|
27
27
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
28
|
-
from validate_frontmatter import
|
|
28
|
+
from validate_frontmatter import ( # noqa: E402
|
|
29
|
+
_FRONTMATTER_RE,
|
|
30
|
+
apply_schema_defaults,
|
|
31
|
+
load_schema,
|
|
32
|
+
parse_frontmatter,
|
|
33
|
+
)
|
|
29
34
|
from _lib.agent_src import artefact_roots, logical_relpath, resolve_logical, strip_source_prefix # noqa: E402
|
|
30
35
|
|
|
31
36
|
ROOT = Path(__file__).resolve().parents[1]
|
|
@@ -146,11 +151,23 @@ def _trusted(path: Path) -> bool:
|
|
|
146
151
|
return any(rel.startswith(r + "/") for r in TRUST_ROOTS)
|
|
147
152
|
|
|
148
153
|
|
|
149
|
-
|
|
154
|
+
# Discovery category → frontmatter schema name. `template` has no schema and
|
|
155
|
+
# carries none of the defaulted fields, so it is left raw.
|
|
156
|
+
_CATEGORY_SCHEMA = {"skill": "skill", "rule": "rule", "command": "command"}
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _parse(path: Path, category: str | None = None) -> dict[str, Any] | None:
|
|
150
160
|
text = path.read_text(encoding="utf-8", errors="replace")
|
|
151
161
|
fm, _ = parse_frontmatter(text)
|
|
152
162
|
if not isinstance(fm, dict):
|
|
153
163
|
return None
|
|
164
|
+
# Inject schema defaults so an artefact that omits a field equal to its
|
|
165
|
+
# default (post abstraction-reduction migration) still presents the field
|
|
166
|
+
# to the required-key checks AND the drift checksum — keeping the checksum
|
|
167
|
+
# byte-stable across the migration (preflight Decision B).
|
|
168
|
+
schema_name = _CATEGORY_SCHEMA.get(category or "")
|
|
169
|
+
if schema_name is not None:
|
|
170
|
+
apply_schema_defaults(fm, load_schema(schema_name))
|
|
154
171
|
return fm
|
|
155
172
|
|
|
156
173
|
|
|
@@ -252,7 +269,7 @@ def _build(strict: bool) -> tuple[dict[str, Any], list[dict[str, Any]]]:
|
|
|
252
269
|
if rel in overrides:
|
|
253
270
|
documented_unassigned.append({"path": rel, "category": category, "reason": overrides[rel]})
|
|
254
271
|
continue
|
|
255
|
-
fm = _parse(path)
|
|
272
|
+
fm = _parse(path, category)
|
|
256
273
|
payload, reason = _classify(fm, ws_ids, pack_ids)
|
|
257
274
|
if reason is not None:
|
|
258
275
|
unassigned.append({"path": rel, "category": category, "reason": reason})
|