@event4u/agent-config 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent-src/README.md +64 -0
- package/.agent-src/commands/agent-handoff.md +64 -0
- package/.agent-src/commands/agent-status.md +83 -0
- package/.agent-src/commands/agents-audit.md +243 -0
- package/.agent-src/commands/agents-cleanup.md +169 -0
- package/.agent-src/commands/agents-prepare.md +137 -0
- package/.agent-src/commands/analyze-reference-repo.md +191 -0
- package/.agent-src/commands/bug-fix.md +181 -0
- package/.agent-src/commands/bug-investigate.md +175 -0
- package/.agent-src/commands/commit.md +121 -0
- package/.agent-src/commands/compress.md +177 -0
- package/.agent-src/commands/config-agent-settings.md +126 -0
- package/.agent-src/commands/context-create.md +167 -0
- package/.agent-src/commands/context-refactor.md +170 -0
- package/.agent-src/commands/copilot-agents-init.md +150 -0
- package/.agent-src/commands/copilot-agents-optimize.md +251 -0
- package/.agent-src/commands/create-pr-description.md +112 -0
- package/.agent-src/commands/create-pr.md +76 -0
- package/.agent-src/commands/do-and-judge.md +114 -0
- package/.agent-src/commands/do-in-steps.md +84 -0
- package/.agent-src/commands/e2e-heal.md +98 -0
- package/.agent-src/commands/e2e-plan.md +85 -0
- package/.agent-src/commands/estimate-ticket.md +80 -0
- package/.agent-src/commands/feature-dev.md +111 -0
- package/.agent-src/commands/feature-explore.md +180 -0
- package/.agent-src/commands/feature-plan.md +288 -0
- package/.agent-src/commands/feature-refactor.md +181 -0
- package/.agent-src/commands/feature-roadmap.md +184 -0
- package/.agent-src/commands/fix-ci.md +48 -0
- package/.agent-src/commands/fix-portability.md +97 -0
- package/.agent-src/commands/fix-pr-bot-comments.md +146 -0
- package/.agent-src/commands/fix-pr-comments.md +58 -0
- package/.agent-src/commands/fix-pr-developer-comments.md +152 -0
- package/.agent-src/commands/fix-references.md +94 -0
- package/.agent-src/commands/fix-seeder.md +146 -0
- package/.agent-src/commands/implement-ticket.md +133 -0
- package/.agent-src/commands/jira-ticket.md +71 -0
- package/.agent-src/commands/judge.md +86 -0
- package/.agent-src/commands/memory-add.md +130 -0
- package/.agent-src/commands/memory-full.md +97 -0
- package/.agent-src/commands/memory-promote.md +144 -0
- package/.agent-src/commands/mode.md +121 -0
- package/.agent-src/commands/module-create.md +132 -0
- package/.agent-src/commands/module-explore.md +157 -0
- package/.agent-src/commands/optimize-agents.md +139 -0
- package/.agent-src/commands/optimize-augmentignore.md +262 -0
- package/.agent-src/commands/optimize-rtk-filters.md +120 -0
- package/.agent-src/commands/optimize-skills.md +121 -0
- package/.agent-src/commands/override-create.md +97 -0
- package/.agent-src/commands/override-manage.md +96 -0
- package/.agent-src/commands/package-reset.md +154 -0
- package/.agent-src/commands/package-test.md +154 -0
- package/.agent-src/commands/prepare-for-review.md +91 -0
- package/.agent-src/commands/project-analyze.md +300 -0
- package/.agent-src/commands/project-health.md +95 -0
- package/.agent-src/commands/propose-memory.md +108 -0
- package/.agent-src/commands/quality-fix.md +106 -0
- package/.agent-src/commands/refine-ticket.md +81 -0
- package/.agent-src/commands/review-changes.md +130 -0
- package/.agent-src/commands/review-routing.md +111 -0
- package/.agent-src/commands/roadmap-create.md +110 -0
- package/.agent-src/commands/roadmap-execute.md +68 -0
- package/.agent-src/commands/rule-compliance-audit.md +139 -0
- package/.agent-src/commands/tests-create.md +73 -0
- package/.agent-src/commands/tests-execute.md +58 -0
- package/.agent-src/commands/threat-model.md +115 -0
- package/.agent-src/commands/update-form-request-messages.md +189 -0
- package/.agent-src/commands/upstream-contribute.md +171 -0
- package/.agent-src/contexts/augment-infrastructure.md +181 -0
- package/.agent-src/contexts/documentation-hierarchy.md +142 -0
- package/.agent-src/contexts/model-recommendations.md +142 -0
- package/.agent-src/contexts/override-system.md +187 -0
- package/.agent-src/contexts/skills-and-commands.md +154 -0
- package/.agent-src/contexts/subagent-configuration.md +62 -0
- package/.agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +110 -0
- package/.agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
- package/.agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
- package/.agent-src/guidelines/agent-infra/engineering-memory-data-format.md +117 -0
- package/.agent-src/guidelines/agent-infra/layered-settings.md +158 -0
- package/.agent-src/guidelines/agent-infra/memory-access.md +121 -0
- package/.agent-src/guidelines/agent-infra/naming.md +69 -0
- package/.agent-src/guidelines/agent-infra/output-patterns.md +117 -0
- package/.agent-src/guidelines/agent-infra/review-routing-data-format.md +144 -0
- package/.agent-src/guidelines/agent-infra/role-contracts.md +211 -0
- package/.agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
- package/.agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
- package/.agent-src/guidelines/agent-infra/self-improvement-pipeline.md +135 -0
- package/.agent-src/guidelines/agent-infra/size-and-scope.md +189 -0
- package/.agent-src/guidelines/agent-infra/tool-integration.md +73 -0
- package/.agent-src/guidelines/docs/readme-size-and-splitting.md +153 -0
- package/.agent-src/guidelines/e2e/playwright.md +363 -0
- package/.agent-src/guidelines/php/api-design.md +115 -0
- package/.agent-src/guidelines/php/artisan-commands.md +81 -0
- package/.agent-src/guidelines/php/blade-ui.md +78 -0
- package/.agent-src/guidelines/php/controllers.md +90 -0
- package/.agent-src/guidelines/php/database.md +111 -0
- package/.agent-src/guidelines/php/eloquent.md +208 -0
- package/.agent-src/guidelines/php/flux.md +80 -0
- package/.agent-src/guidelines/php/general.md +191 -0
- package/.agent-src/guidelines/php/git.md +96 -0
- package/.agent-src/guidelines/php/jobs.md +111 -0
- package/.agent-src/guidelines/php/livewire.md +71 -0
- package/.agent-src/guidelines/php/logging.md +79 -0
- package/.agent-src/guidelines/php/naming.md +89 -0
- package/.agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
- package/.agent-src/guidelines/php/patterns/dtos.md +199 -0
- package/.agent-src/guidelines/php/patterns/events.md +67 -0
- package/.agent-src/guidelines/php/patterns/factory.md +53 -0
- package/.agent-src/guidelines/php/patterns/pipelines.md +66 -0
- package/.agent-src/guidelines/php/patterns/policies.md +66 -0
- package/.agent-src/guidelines/php/patterns/repositories.md +122 -0
- package/.agent-src/guidelines/php/patterns/service-layer.md +64 -0
- package/.agent-src/guidelines/php/patterns/strategy.md +69 -0
- package/.agent-src/guidelines/php/patterns.md +28 -0
- package/.agent-src/guidelines/php/performance.md +92 -0
- package/.agent-src/guidelines/php/resources.md +100 -0
- package/.agent-src/guidelines/php/security.md +110 -0
- package/.agent-src/guidelines/php/sql.md +97 -0
- package/.agent-src/guidelines/php/validations.md +119 -0
- package/.agent-src/guidelines/php/websocket.md +100 -0
- package/.agent-src/personas/README.md +104 -0
- package/.agent-src/personas/ai-agent.md +77 -0
- package/.agent-src/personas/critical-challenger.md +73 -0
- package/.agent-src/personas/developer.md +73 -0
- package/.agent-src/personas/product-owner.md +78 -0
- package/.agent-src/personas/qa.md +67 -0
- package/.agent-src/personas/senior-engineer.md +77 -0
- package/.agent-src/personas/stakeholder.md +78 -0
- package/.agent-src/rules/agent-docs.md +61 -0
- package/.agent-src/rules/analysis-skill-routing.md +48 -0
- package/.agent-src/rules/architecture.md +62 -0
- package/.agent-src/rules/artifact-drafting-protocol.md +73 -0
- package/.agent-src/rules/ask-when-uncertain.md +52 -0
- package/.agent-src/rules/augment-portability.md +38 -0
- package/.agent-src/rules/augment-source-of-truth.md +128 -0
- package/.agent-src/rules/capture-learnings.md +89 -0
- package/.agent-src/rules/cli-output-handling.md +94 -0
- package/.agent-src/rules/commit-conventions.md +64 -0
- package/.agent-src/rules/context-hygiene.md +90 -0
- package/.agent-src/rules/docker-commands.md +55 -0
- package/.agent-src/rules/docs-sync.md +79 -0
- package/.agent-src/rules/downstream-changes.md +70 -0
- package/.agent-src/rules/e2e-testing.md +53 -0
- package/.agent-src/rules/guidelines.md +90 -0
- package/.agent-src/rules/improve-before-implement.md +94 -0
- package/.agent-src/rules/language-and-tone.md +104 -0
- package/.agent-src/rules/laravel-translations.md +48 -0
- package/.agent-src/rules/markdown-safe-codeblocks.md +18 -0
- package/.agent-src/rules/minimal-safe-diff.md +87 -0
- package/.agent-src/rules/missing-tool-handling.md +62 -0
- package/.agent-src/rules/model-recommendation.md +70 -0
- package/.agent-src/rules/package-ci-checks.md +80 -0
- package/.agent-src/rules/php-coding.md +63 -0
- package/.agent-src/rules/preservation-guard.md +29 -0
- package/.agent-src/rules/review-routing-awareness.md +125 -0
- package/.agent-src/rules/reviewer-awareness.md +92 -0
- package/.agent-src/rules/roadmap-progress-sync.md +56 -0
- package/.agent-src/rules/role-mode-adherence.md +54 -0
- package/.agent-src/rules/rule-type-governance.md +46 -0
- package/.agent-src/rules/runtime-safety.md +42 -0
- package/.agent-src/rules/scope-control.md +40 -0
- package/.agent-src/rules/security-sensitive-stop.md +77 -0
- package/.agent-src/rules/size-enforcement.md +29 -0
- package/.agent-src/rules/skill-improvement-trigger.md +58 -0
- package/.agent-src/rules/skill-quality.md +110 -0
- package/.agent-src/rules/slash-commands.md +30 -0
- package/.agent-src/rules/think-before-action.md +91 -0
- package/.agent-src/rules/token-efficiency.md +99 -0
- package/.agent-src/rules/tool-safety.md +36 -0
- package/.agent-src/rules/upstream-proposal.md +76 -0
- package/.agent-src/rules/user-interaction.md +79 -0
- package/.agent-src/rules/verify-before-complete.md +120 -0
- package/.agent-src/scripts/scan-seeder-violations.php +145 -0
- package/.agent-src/scripts/update_roadmap_progress.py +244 -0
- package/.agent-src/skills/adversarial-review/SKILL.md +149 -0
- package/.agent-src/skills/agent-docs-writing/SKILL.md +234 -0
- package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +197 -0
- package/.agent-src/skills/analysis-skill-router/SKILL.md +134 -0
- package/.agent-src/skills/api-design/SKILL.md +104 -0
- package/.agent-src/skills/api-endpoint/SKILL.md +185 -0
- package/.agent-src/skills/api-testing/SKILL.md +206 -0
- package/.agent-src/skills/artisan-commands/SKILL.md +78 -0
- package/.agent-src/skills/authz-review/SKILL.md +171 -0
- package/.agent-src/skills/aws-infrastructure/SKILL.md +152 -0
- package/.agent-src/skills/blade-ui/SKILL.md +75 -0
- package/.agent-src/skills/blast-radius-analyzer/SKILL.md +185 -0
- package/.agent-src/skills/bug-analyzer/SKILL.md +256 -0
- package/.agent-src/skills/check-refs/SKILL.md +72 -0
- package/.agent-src/skills/code-refactoring/SKILL.md +200 -0
- package/.agent-src/skills/code-review/SKILL.md +214 -0
- package/.agent-src/skills/command-routing/SKILL.md +96 -0
- package/.agent-src/skills/command-writing/SKILL.md +143 -0
- package/.agent-src/skills/composer-packages/SKILL.md +172 -0
- package/.agent-src/skills/context-authoring/SKILL.md +157 -0
- package/.agent-src/skills/context-document/SKILL.md +153 -0
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +70 -0
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +220 -0
- package/.agent-src/skills/copilot-config/SKILL.md +203 -0
- package/.agent-src/skills/dashboard-design/SKILL.md +116 -0
- package/.agent-src/skills/data-flow-mapper/SKILL.md +160 -0
- package/.agent-src/skills/database/SKILL.md +91 -0
- package/.agent-src/skills/dependency-upgrade/SKILL.md +204 -0
- package/.agent-src/skills/description-assist/SKILL.md +169 -0
- package/.agent-src/skills/design-review/SKILL.md +228 -0
- package/.agent-src/skills/devcontainer/SKILL.md +121 -0
- package/.agent-src/skills/developer-like-execution/SKILL.md +276 -0
- package/.agent-src/skills/docker/SKILL.md +245 -0
- package/.agent-src/skills/dto-creator/SKILL.md +117 -0
- package/.agent-src/skills/eloquent/SKILL.md +92 -0
- package/.agent-src/skills/eloquent/evals/last-run.json +99 -0
- package/.agent-src/skills/eloquent/evals/triggers.json +16 -0
- package/.agent-src/skills/estimate-ticket/SKILL.md +186 -0
- package/.agent-src/skills/estimate-ticket/evals/output-schema.yml +20 -0
- package/.agent-src/skills/estimate-ticket/evals/triggers.json +18 -0
- package/.agent-src/skills/fe-design/SKILL.md +223 -0
- package/.agent-src/skills/feature-planning/SKILL.md +226 -0
- package/.agent-src/skills/file-editor/SKILL.md +129 -0
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/.agent-src/skills/flux/SKILL.md +64 -0
- package/.agent-src/skills/git-workflow/SKILL.md +102 -0
- package/.agent-src/skills/github-ci/SKILL.md +122 -0
- package/.agent-src/skills/grafana/SKILL.md +168 -0
- package/.agent-src/skills/guideline-writing/SKILL.md +147 -0
- package/.agent-src/skills/jira-integration/SKILL.md +182 -0
- package/.agent-src/skills/jobs-events/SKILL.md +87 -0
- package/.agent-src/skills/judge-bug-hunter/SKILL.md +157 -0
- package/.agent-src/skills/judge-code-quality/SKILL.md +158 -0
- package/.agent-src/skills/judge-security-auditor/SKILL.md +167 -0
- package/.agent-src/skills/judge-test-coverage/SKILL.md +154 -0
- package/.agent-src/skills/laravel/SKILL.md +195 -0
- package/.agent-src/skills/laravel-horizon/SKILL.md +169 -0
- package/.agent-src/skills/laravel-mail/SKILL.md +193 -0
- package/.agent-src/skills/laravel-middleware/SKILL.md +185 -0
- package/.agent-src/skills/laravel-notifications/SKILL.md +168 -0
- package/.agent-src/skills/laravel-pennant/SKILL.md +188 -0
- package/.agent-src/skills/laravel-pulse/SKILL.md +160 -0
- package/.agent-src/skills/laravel-reverb/SKILL.md +205 -0
- package/.agent-src/skills/laravel-scheduling/SKILL.md +167 -0
- package/.agent-src/skills/laravel-validation/SKILL.md +71 -0
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +249 -0
- package/.agent-src/skills/lint-skills/SKILL.md +72 -0
- package/.agent-src/skills/livewire/SKILL.md +79 -0
- package/.agent-src/skills/logging-monitoring/SKILL.md +100 -0
- package/.agent-src/skills/mcp/SKILL.md +193 -0
- package/.agent-src/skills/merge-conflicts/SKILL.md +158 -0
- package/.agent-src/skills/migration-creator/SKILL.md +160 -0
- package/.agent-src/skills/module-management/SKILL.md +154 -0
- package/.agent-src/skills/multi-tenancy/SKILL.md +129 -0
- package/.agent-src/skills/openapi/SKILL.md +154 -0
- package/.agent-src/skills/override-management/SKILL.md +186 -0
- package/.agent-src/skills/performance/SKILL.md +69 -0
- package/.agent-src/skills/performance-analysis/SKILL.md +118 -0
- package/.agent-src/skills/pest-testing/SKILL.md +321 -0
- package/.agent-src/skills/php-coder/SKILL.md +78 -0
- package/.agent-src/skills/php-coder/evals/triggers.json +16 -0
- package/.agent-src/skills/php-debugging/SKILL.md +184 -0
- package/.agent-src/skills/php-service/SKILL.md +96 -0
- package/.agent-src/skills/playwright-testing/SKILL.md +244 -0
- package/.agent-src/skills/project-analysis-core/SKILL.md +138 -0
- package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +130 -0
- package/.agent-src/skills/project-analysis-laravel/SKILL.md +119 -0
- package/.agent-src/skills/project-analysis-nextjs/SKILL.md +123 -0
- package/.agent-src/skills/project-analysis-node-express/SKILL.md +111 -0
- package/.agent-src/skills/project-analysis-react/SKILL.md +119 -0
- package/.agent-src/skills/project-analysis-symfony/SKILL.md +111 -0
- package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +108 -0
- package/.agent-src/skills/project-analyzer/SKILL.md +341 -0
- package/.agent-src/skills/project-docs/SKILL.md +137 -0
- package/.agent-src/skills/quality-tools/SKILL.md +411 -0
- package/.agent-src/skills/readme-reviewer/SKILL.md +187 -0
- package/.agent-src/skills/readme-writing/SKILL.md +142 -0
- package/.agent-src/skills/readme-writing-package/SKILL.md +185 -0
- package/.agent-src/skills/receiving-code-review/SKILL.md +190 -0
- package/.agent-src/skills/refine-ticket/SKILL.md +310 -0
- package/.agent-src/skills/refine-ticket/detection-map.yml +124 -0
- package/.agent-src/skills/refine-ticket/evals/output-schema.yml +16 -0
- package/.agent-src/skills/refine-ticket/evals/triggers.json +16 -0
- package/.agent-src/skills/requesting-code-review/SKILL.md +199 -0
- package/.agent-src/skills/review-routing/SKILL.md +195 -0
- package/.agent-src/skills/roadmap-management/SKILL.md +303 -0
- package/.agent-src/skills/rtk-output-filtering/SKILL.md +184 -0
- package/.agent-src/skills/rule-writing/SKILL.md +148 -0
- package/.agent-src/skills/security/SKILL.md +79 -0
- package/.agent-src/skills/security-audit/SKILL.md +123 -0
- package/.agent-src/skills/sentry-integration/SKILL.md +170 -0
- package/.agent-src/skills/sequential-thinking/SKILL.md +158 -0
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +155 -0
- package/.agent-src/skills/skill-management/SKILL.md +121 -0
- package/.agent-src/skills/skill-reviewer/SKILL.md +218 -0
- package/.agent-src/skills/skill-writing/SKILL.md +291 -0
- package/.agent-src/skills/skill-writing/evals/triggers.json +16 -0
- package/.agent-src/skills/sql-writing/SKILL.md +74 -0
- package/.agent-src/skills/subagent-orchestration/SKILL.md +190 -0
- package/.agent-src/skills/systematic-debugging/SKILL.md +244 -0
- package/.agent-src/skills/technical-specification/SKILL.md +185 -0
- package/.agent-src/skills/terraform/SKILL.md +137 -0
- package/.agent-src/skills/terragrunt/SKILL.md +217 -0
- package/.agent-src/skills/test-driven-development/SKILL.md +252 -0
- package/.agent-src/skills/test-performance/SKILL.md +172 -0
- package/.agent-src/skills/threat-modeling/SKILL.md +189 -0
- package/.agent-src/skills/traefik/SKILL.md +319 -0
- package/.agent-src/skills/universal-project-analysis/SKILL.md +179 -0
- package/.agent-src/skills/upstream-contribute/SKILL.md +255 -0
- package/.agent-src/skills/using-git-worktrees/SKILL.md +148 -0
- package/.agent-src/skills/validate-feature-fit/SKILL.md +113 -0
- package/.agent-src/skills/verify-before-complete/SKILL.md +188 -0
- package/.agent-src/skills/websocket/SKILL.md +75 -0
- package/.agent-src/templates/AGENTS.md +146 -0
- package/.agent-src/templates/agent-settings.md +256 -0
- package/.agent-src/templates/agents/.gitattributes.fragment +16 -0
- package/.agent-src/templates/agents/agent-project-settings.example.yml +138 -0
- package/.agent-src/templates/agents/memory/architecture-decisions.example.yml +95 -0
- package/.agent-src/templates/agents/memory/domain-invariants.example.yml +80 -0
- package/.agent-src/templates/agents/memory/historical-patterns.example.yml +82 -0
- package/.agent-src/templates/agents/memory/incident-learnings.example.yml +113 -0
- package/.agent-src/templates/agents/memory/ownership.example.yml +75 -0
- package/.agent-src/templates/agents/memory/product-rules.example.yml +87 -0
- package/.agent-src/templates/agents/proposal.example.md +143 -0
- package/.agent-src/templates/command.md +84 -0
- package/.agent-src/templates/contexts/auth-model.md +59 -0
- package/.agent-src/templates/contexts/data-sensitivity.md +60 -0
- package/.agent-src/templates/contexts/deployment-order.md +72 -0
- package/.agent-src/templates/contexts/observability.md +64 -0
- package/.agent-src/templates/contexts/tenant-boundaries.md +68 -0
- package/.agent-src/templates/contexts.md +116 -0
- package/.agent-src/templates/copilot-instructions.md +115 -0
- package/.agent-src/templates/features.md +125 -0
- package/.agent-src/templates/github-workflows/memory-hygiene.yml +133 -0
- package/.agent-src/templates/github-workflows/pr-risk-review.yml +123 -0
- package/.agent-src/templates/github-workflows/proposal-drift.yml +118 -0
- package/.agent-src/templates/overrides/command.md +24 -0
- package/.agent-src/templates/overrides/guideline.md +21 -0
- package/.agent-src/templates/overrides/rule.md +19 -0
- package/.agent-src/templates/overrides/skill.md +24 -0
- package/.agent-src/templates/overrides/template.md +21 -0
- package/.agent-src/templates/persona.md +99 -0
- package/.agent-src/templates/roadmaps.md +109 -0
- package/.agent-src/templates/scripts/README.md +195 -0
- package/.agent-src/templates/scripts/check_memory.py +283 -0
- package/.agent-src/templates/scripts/check_memory_proposal.py +180 -0
- package/.agent-src/templates/scripts/historical-bug-patterns.example.yml +84 -0
- package/.agent-src/templates/scripts/implement_ticket/__init__.py +57 -0
- package/.agent-src/templates/scripts/implement_ticket/__main__.py +9 -0
- package/.agent-src/templates/scripts/implement_ticket/cli.py +171 -0
- package/.agent-src/templates/scripts/implement_ticket/delivery_state.py +130 -0
- package/.agent-src/templates/scripts/implement_ticket/dispatcher.py +134 -0
- package/.agent-src/templates/scripts/implement_ticket/persona_policy.py +85 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/__init__.py +49 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/analyze.py +98 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/implement.py +145 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/memory.py +136 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/plan.py +175 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/refine.py +140 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/report.py +195 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/test.py +180 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/verify.py +170 -0
- package/.agent-src/templates/scripts/memory_hash.py +75 -0
- package/.agent-src/templates/scripts/memory_lookup.py +216 -0
- package/.agent-src/templates/scripts/memory_report.py +184 -0
- package/.agent-src/templates/scripts/memory_signal.py +167 -0
- package/.agent-src/templates/scripts/memory_status.py +156 -0
- package/.agent-src/templates/scripts/ownership-map.example.yml +87 -0
- package/.agent-src/templates/scripts/pr-risk-config.example.yml +76 -0
- package/.agent-src/templates/scripts/pr_review_routing.py +340 -0
- package/.agent-src/templates/scripts/pr_risk_review.py +211 -0
- package/.agent-src/templates/skill.md +136 -0
- package/.augment-plugin/marketplace.json +32 -0
- package/.augment-plugin/plugin.json +21 -0
- package/.claude-plugin/marketplace.json +119 -0
- package/AGENTS.md +121 -0
- package/CHANGELOG.md +279 -0
- package/CONTRIBUTING.md +176 -0
- package/LICENSE +21 -0
- package/README.md +357 -0
- package/bin/install.php +38 -0
- package/composer.json +29 -0
- package/config/agent-settings.template.yml +96 -0
- package/config/profiles/balanced.ini +10 -0
- package/config/profiles/full.ini +10 -0
- package/config/profiles/minimal.ini +10 -0
- package/docs/architecture.md +144 -0
- package/docs/customization.md +88 -0
- package/docs/development.md +171 -0
- package/docs/getting-started.md +130 -0
- package/docs/github-topics.md +84 -0
- package/docs/installation.md +376 -0
- package/docs/mcp.md +133 -0
- package/docs/quality.md +98 -0
- package/docs/skills-catalog.md +136 -0
- package/docs/troubleshooting.md +167 -0
- package/llms.txt +130 -0
- package/package.json +31 -0
- package/scripts/audit_skill_descriptions.py +168 -0
- package/scripts/check_compression.py +221 -0
- package/scripts/check_memory.py +341 -0
- package/scripts/check_memory_proposal.py +180 -0
- package/scripts/check_portability.py +320 -0
- package/scripts/check_proposal.py +269 -0
- package/scripts/check_references.py +400 -0
- package/scripts/ci_summary.py +131 -0
- package/scripts/compress.py +671 -0
- package/scripts/compress.sh +18 -0
- package/scripts/first-run.sh +109 -0
- package/scripts/generate_catalog.py +116 -0
- package/scripts/install +151 -0
- package/scripts/install-hooks.sh +29 -0
- package/scripts/install.py +487 -0
- package/scripts/install.sh +637 -0
- package/scripts/install_anthropic_key.sh +101 -0
- package/scripts/inventory_frontmatter.py +164 -0
- package/scripts/lint_marketplace.py +142 -0
- package/scripts/lint_regression.py +232 -0
- package/scripts/mcp_render.py +159 -0
- package/scripts/measure_patterns.py +376 -0
- package/scripts/memory_hash.py +75 -0
- package/scripts/memory_lookup.py +441 -0
- package/scripts/memory_report.py +336 -0
- package/scripts/memory_signal.py +210 -0
- package/scripts/memory_status.py +195 -0
- package/scripts/postinstall.sh +60 -0
- package/scripts/readme_linter.py +580 -0
- package/scripts/refine_ticket_detect.py +623 -0
- package/scripts/requirements-evals.txt +7 -0
- package/scripts/runtime_dispatcher.py +265 -0
- package/scripts/runtime_handler.py +148 -0
- package/scripts/runtime_registry.py +166 -0
- package/scripts/schemas/command.schema.json +32 -0
- package/scripts/schemas/persona.schema.json +42 -0
- package/scripts/schemas/rule.schema.json +28 -0
- package/scripts/schemas/skill.schema.json +73 -0
- package/scripts/setup.sh +230 -0
- package/scripts/setup_eval_venv.sh +58 -0
- package/scripts/skill_linter.py +2175 -0
- package/scripts/skill_trigger_eval.py +651 -0
- package/scripts/tool_registry.py +146 -0
- package/scripts/tools/__init__.py +1 -0
- package/scripts/tools/adapter_errors.py +63 -0
- package/scripts/tools/base_adapter.py +91 -0
- package/scripts/tools/github_adapter.py +128 -0
- package/scripts/tools/jira_adapter.py +115 -0
- package/scripts/update_counts.py +147 -0
- package/scripts/validate_frontmatter.py +424 -0
- package/templates/consumer-settings/README.md +46 -0
- package/templates/consumer-settings/augment-settings.json +12 -0
- package/templates/consumer-settings/claude-settings.json +9 -0
- package/templates/consumer-settings/copilot-settings.json +14 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""File-based retrieval for the `absent` path.
|
|
3
|
+
|
|
4
|
+
Implements the shared `retrieve(types, keys, limit)` abstraction used
|
|
5
|
+
by skills. Reads YAML under `agents/memory/<type>/` (curated, hand-
|
|
6
|
+
reviewed) and JSONL under `agents/memory/intake/*.jsonl` (agent-written,
|
|
7
|
+
append-only, supersede-chain aware).
|
|
8
|
+
|
|
9
|
+
The returned shape is identical to the `present`-path adapter over the
|
|
10
|
+
`@event4u/agent-memory` API, so skills stay backend-agnostic.
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
python3 scripts/memory_lookup.py --types domain-invariants,ownership \\
|
|
14
|
+
--key "app/Http/Controllers/Foo" --limit 5
|
|
15
|
+
python3 scripts/memory_lookup.py --types incident-learnings --format json
|
|
16
|
+
|
|
17
|
+
from scripts.memory_lookup import retrieve
|
|
18
|
+
hits = retrieve(types=["ownership"], keys=["app/Http"], limit=3)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import argparse
|
|
24
|
+
import fnmatch
|
|
25
|
+
import json
|
|
26
|
+
import sys
|
|
27
|
+
from dataclasses import dataclass, asdict, field
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
from typing import Any, Callable, Iterable, Optional, Union
|
|
30
|
+
|
|
31
|
+
MEMORY_ROOT = Path("agents/memory")
|
|
32
|
+
INTAKE_ROOT = MEMORY_ROOT / "intake"
|
|
33
|
+
|
|
34
|
+
CURATED_TYPES = {
|
|
35
|
+
"ownership",
|
|
36
|
+
"historical-patterns",
|
|
37
|
+
"domain-invariants",
|
|
38
|
+
"architecture-decisions",
|
|
39
|
+
"incident-learnings",
|
|
40
|
+
"product-rules",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass
|
|
45
|
+
class Hit:
|
|
46
|
+
id: str
|
|
47
|
+
type: str
|
|
48
|
+
source: str # "curated" | "intake" | "operational"
|
|
49
|
+
path: str # file (or logical locator) that produced the hit
|
|
50
|
+
score: float # naive, content-match based [0..1]
|
|
51
|
+
entry: dict = field(default_factory=dict)
|
|
52
|
+
|
|
53
|
+
def as_dict(self) -> dict:
|
|
54
|
+
return asdict(self)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass
|
|
58
|
+
class Shadow:
|
|
59
|
+
"""An operational entry suppressed by the conflict rule."""
|
|
60
|
+
id: str
|
|
61
|
+
type: str
|
|
62
|
+
reason: str # "same-id" | "repo-deprecated"
|
|
63
|
+
operational_path: str # where the suppressed entry came from
|
|
64
|
+
repo_path: str # repo entry that shadowed it
|
|
65
|
+
|
|
66
|
+
def as_dict(self) -> dict:
|
|
67
|
+
return asdict(self)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@dataclass
|
|
71
|
+
class RetrievalResult:
|
|
72
|
+
"""Full retrieval payload with conflict-rule observability."""
|
|
73
|
+
hits: list
|
|
74
|
+
shadows: list = field(default_factory=list)
|
|
75
|
+
|
|
76
|
+
def as_dict(self) -> dict:
|
|
77
|
+
return {
|
|
78
|
+
"hits": [h.as_dict() for h in self.hits],
|
|
79
|
+
"shadows": [s.as_dict() for s in self.shadows],
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# An operational provider returns repo-shaped Hit objects with
|
|
84
|
+
# source="operational". Backend adapters (e.g. @event4u/agent-memory)
|
|
85
|
+
# are expected to translate their native payload into this shape.
|
|
86
|
+
OperationalProvider = Callable[[list[str], list[str]], Iterable[Hit]]
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _load_yaml(path: Path):
|
|
90
|
+
try:
|
|
91
|
+
import yaml
|
|
92
|
+
except ImportError:
|
|
93
|
+
print("error: PyYAML not installed. `pip install pyyaml`.",
|
|
94
|
+
file=sys.stderr)
|
|
95
|
+
sys.exit(2)
|
|
96
|
+
with path.open(encoding="utf-8") as fh:
|
|
97
|
+
return yaml.safe_load(fh) or {}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _iter_curated_entries(mtype: str) -> Iterable[tuple[Path, dict]]:
|
|
101
|
+
"""Yield (file, entry) pairs for curated files of `mtype`.
|
|
102
|
+
|
|
103
|
+
Supports both the content-addressed layout (`agents/memory/<type>/
|
|
104
|
+
<hash>.yml` — one entry per file) and the single-file layout
|
|
105
|
+
(`agents/memory/<type>.yml` or `<type>/entries.yml` with an
|
|
106
|
+
``entries:`` list), so consumers can adopt either.
|
|
107
|
+
"""
|
|
108
|
+
type_dir = MEMORY_ROOT / mtype
|
|
109
|
+
single_file = MEMORY_ROOT / f"{mtype}.yml"
|
|
110
|
+
if single_file.is_file():
|
|
111
|
+
data = _load_yaml(single_file)
|
|
112
|
+
for e in data.get("entries") or []:
|
|
113
|
+
if isinstance(e, dict):
|
|
114
|
+
yield single_file, e
|
|
115
|
+
if type_dir.is_dir():
|
|
116
|
+
for yml in sorted(type_dir.rglob("*.yml")):
|
|
117
|
+
data = _load_yaml(yml) or {}
|
|
118
|
+
entries = data.get("entries")
|
|
119
|
+
if isinstance(entries, list):
|
|
120
|
+
for e in entries:
|
|
121
|
+
if isinstance(e, dict):
|
|
122
|
+
yield yml, e
|
|
123
|
+
elif isinstance(data, dict) and data.get("id"):
|
|
124
|
+
# Flat, one-entry-per-file layout (content-addressed).
|
|
125
|
+
yield yml, data
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _iter_intake_entries(mtype: str) -> Iterable[tuple[Path, dict]]:
|
|
129
|
+
"""Yield (file, entry) from intake JSONL, applying supersede chains."""
|
|
130
|
+
if not INTAKE_ROOT.is_dir():
|
|
131
|
+
return
|
|
132
|
+
# Resolve supersede chains globally per file: later lines win.
|
|
133
|
+
for jsonl in sorted(INTAKE_ROOT.glob("*.jsonl")):
|
|
134
|
+
by_id: dict[str, dict] = {}
|
|
135
|
+
superseded: set[str] = set()
|
|
136
|
+
with jsonl.open(encoding="utf-8") as fh:
|
|
137
|
+
for line in fh:
|
|
138
|
+
line = line.strip()
|
|
139
|
+
if not line:
|
|
140
|
+
continue
|
|
141
|
+
try:
|
|
142
|
+
obj = json.loads(line)
|
|
143
|
+
except ValueError:
|
|
144
|
+
continue
|
|
145
|
+
if obj.get("type") == "supersede":
|
|
146
|
+
target = obj.get("supersedes")
|
|
147
|
+
if isinstance(target, str):
|
|
148
|
+
superseded.add(target)
|
|
149
|
+
continue
|
|
150
|
+
eid = obj.get("id")
|
|
151
|
+
if isinstance(eid, str):
|
|
152
|
+
by_id[eid] = obj
|
|
153
|
+
for eid, obj in by_id.items():
|
|
154
|
+
if eid in superseded:
|
|
155
|
+
continue
|
|
156
|
+
if mtype and obj.get("entry_type") and obj["entry_type"] != mtype:
|
|
157
|
+
continue
|
|
158
|
+
yield jsonl, obj
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _score(entry: dict, keys: list[str]) -> float:
|
|
162
|
+
"""Naive relevance score: max over keys of (glob-match | substring).
|
|
163
|
+
|
|
164
|
+
Good enough for the `absent` path where retrieval is best-effort.
|
|
165
|
+
The `present` path returns a real score from agent-memory.
|
|
166
|
+
"""
|
|
167
|
+
if not keys:
|
|
168
|
+
return 0.1 # any hit beats no hit when there is no key
|
|
169
|
+
hay_parts: list[str] = []
|
|
170
|
+
for field_name in ("path", "key", "symptom", "feature", "rule", "body"):
|
|
171
|
+
v = entry.get(field_name)
|
|
172
|
+
if isinstance(v, str):
|
|
173
|
+
hay_parts.append(v)
|
|
174
|
+
elif isinstance(v, list):
|
|
175
|
+
hay_parts.extend(str(x) for x in v)
|
|
176
|
+
hay = " | ".join(hay_parts).lower()
|
|
177
|
+
best = 0.0
|
|
178
|
+
for k in keys:
|
|
179
|
+
kl = k.lower()
|
|
180
|
+
if fnmatch.fnmatch(hay, f"*{kl}*"):
|
|
181
|
+
best = max(best, 0.8)
|
|
182
|
+
elif kl in hay:
|
|
183
|
+
best = max(best, 0.6)
|
|
184
|
+
return best
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def _apply_conflict_rule(
|
|
188
|
+
repo_hits: list[Hit],
|
|
189
|
+
operational_hits: list[Hit],
|
|
190
|
+
) -> tuple[list[Hit], list[Shadow]]:
|
|
191
|
+
"""Enforce REPO WINS / OPERATIONAL AUGMENTS / NEVER CONTRADICTS SILENTLY.
|
|
192
|
+
|
|
193
|
+
Reference: `agents/roadmaps/road-to-memory-self-consumption.md` §
|
|
194
|
+
"Conflict rule: repo vs. operational". The four cases mapped below
|
|
195
|
+
are covered by `tests/test_conflict_rule.py`.
|
|
196
|
+
"""
|
|
197
|
+
# Repo entries index — curated AND intake both count as "repo" for
|
|
198
|
+
# the conflict rule. The operational store is the only non-repo side.
|
|
199
|
+
repo_by_id: dict[str, Hit] = {h.id: h for h in repo_hits if h.id}
|
|
200
|
+
|
|
201
|
+
merged: list[Hit] = list(repo_hits)
|
|
202
|
+
shadows: list[Shadow] = []
|
|
203
|
+
|
|
204
|
+
for op in operational_hits:
|
|
205
|
+
if op.id and op.id in repo_by_id:
|
|
206
|
+
# Case 1+2: same id → repo wins (including when repo is
|
|
207
|
+
# status:deprecated — operational cannot revive a retired
|
|
208
|
+
# entry). Suppress the operational entry and record shadow.
|
|
209
|
+
repo = repo_by_id[op.id]
|
|
210
|
+
reason = (
|
|
211
|
+
"repo-deprecated"
|
|
212
|
+
if repo.entry.get("status") == "deprecated"
|
|
213
|
+
else "same-id"
|
|
214
|
+
)
|
|
215
|
+
shadows.append(Shadow(
|
|
216
|
+
id=op.id,
|
|
217
|
+
type=op.type,
|
|
218
|
+
reason=reason,
|
|
219
|
+
operational_path=op.path,
|
|
220
|
+
repo_path=repo.path,
|
|
221
|
+
))
|
|
222
|
+
continue
|
|
223
|
+
# Case 3 (different ids on same logical key) and Case 4 (repo
|
|
224
|
+
# has no entry) — both simply include the operational hit.
|
|
225
|
+
# Repo entries naturally rank higher because their score is not
|
|
226
|
+
# discounted (see _score / operational scoring in retrieve()).
|
|
227
|
+
merged.append(op)
|
|
228
|
+
|
|
229
|
+
return merged, shadows
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def retrieve(
|
|
233
|
+
types: list[str],
|
|
234
|
+
keys: list[str],
|
|
235
|
+
limit: int = 5,
|
|
236
|
+
operational_provider: Optional[OperationalProvider] = None,
|
|
237
|
+
with_shadows: bool = False,
|
|
238
|
+
) -> Union[list[Hit], RetrievalResult]:
|
|
239
|
+
"""Return up to `limit` hits across the requested types, highest score first.
|
|
240
|
+
|
|
241
|
+
Repo entries (curated + intake) are preferred on ties — they are
|
|
242
|
+
hand-reviewed or session-captured against the repo itself. When an
|
|
243
|
+
`operational_provider` is supplied (the `present` path of the
|
|
244
|
+
backend-detection contract), its results are merged under the
|
|
245
|
+
REPO WINS conflict rule; suppressed operational entries surface as
|
|
246
|
+
`shadows` when `with_shadows=True`.
|
|
247
|
+
|
|
248
|
+
The return type stays `list[Hit]` by default for backward
|
|
249
|
+
compatibility with existing skill call sites.
|
|
250
|
+
"""
|
|
251
|
+
repo_hits: list[Hit] = []
|
|
252
|
+
for mtype in types:
|
|
253
|
+
if mtype not in CURATED_TYPES:
|
|
254
|
+
continue
|
|
255
|
+
for path, entry in _iter_curated_entries(mtype):
|
|
256
|
+
repo_hits.append(Hit(
|
|
257
|
+
id=str(entry.get("id", "")),
|
|
258
|
+
type=mtype,
|
|
259
|
+
source="curated",
|
|
260
|
+
path=str(path),
|
|
261
|
+
score=_score(entry, keys),
|
|
262
|
+
entry=entry,
|
|
263
|
+
))
|
|
264
|
+
for path, entry in _iter_intake_entries(mtype):
|
|
265
|
+
repo_hits.append(Hit(
|
|
266
|
+
id=str(entry.get("id", "")),
|
|
267
|
+
type=mtype,
|
|
268
|
+
source="intake",
|
|
269
|
+
path=str(path),
|
|
270
|
+
score=_score(entry, keys) * 0.9, # slight discount vs curated
|
|
271
|
+
entry=entry,
|
|
272
|
+
))
|
|
273
|
+
|
|
274
|
+
operational_hits: list[Hit] = []
|
|
275
|
+
if operational_provider is not None:
|
|
276
|
+
try:
|
|
277
|
+
for oh in operational_provider(list(types), list(keys)) or []:
|
|
278
|
+
# Discount operational vs curated/intake so repo ranks
|
|
279
|
+
# higher on equal relevance. Providers may already return
|
|
280
|
+
# trust-adjusted scores; we only apply a floor discount.
|
|
281
|
+
oh.score = min(oh.score, 0.85)
|
|
282
|
+
operational_hits.append(oh)
|
|
283
|
+
except Exception as exc: # noqa: BLE001 — providers are external
|
|
284
|
+
print(f"warning: operational_provider raised "
|
|
285
|
+
f"{exc.__class__.__name__}: {exc}", file=sys.stderr)
|
|
286
|
+
|
|
287
|
+
merged, shadows = _apply_conflict_rule(repo_hits, operational_hits)
|
|
288
|
+
merged.sort(key=lambda h: (h.score, h.source == "curated"), reverse=True)
|
|
289
|
+
positives = [h for h in merged if h.score > 0]
|
|
290
|
+
final_hits = (positives or merged)[:limit]
|
|
291
|
+
|
|
292
|
+
if with_shadows:
|
|
293
|
+
return RetrievalResult(hits=final_hits, shadows=shadows)
|
|
294
|
+
return final_hits
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
CONTRACT_VERSION = 1
|
|
298
|
+
|
|
299
|
+
# Memory types this file-backed backend can answer. Types outside this
|
|
300
|
+
# set map to `unknown_type` per the retrieval contract.
|
|
301
|
+
_KNOWN_TYPES = CURATED_TYPES
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def retrieve_v1(
|
|
305
|
+
types: list[str],
|
|
306
|
+
keys: list[str],
|
|
307
|
+
limit: int = 20,
|
|
308
|
+
operational_provider: Optional[OperationalProvider] = None,
|
|
309
|
+
) -> dict:
|
|
310
|
+
"""Return a v1 retrieval-contract envelope.
|
|
311
|
+
|
|
312
|
+
Wraps :func:`retrieve` and projects the internal ``Hit`` shape into
|
|
313
|
+
the shape defined by
|
|
314
|
+
``schemas/retrieval-v1.schema.json``. Unknown types are reported as
|
|
315
|
+
``status: unknown_type`` for that slice only, rather than failing
|
|
316
|
+
the whole call.
|
|
317
|
+
"""
|
|
318
|
+
known = [t for t in types if t in _KNOWN_TYPES]
|
|
319
|
+
unknown = [t for t in types if t not in _KNOWN_TYPES]
|
|
320
|
+
|
|
321
|
+
result = retrieve(known, keys, limit=limit,
|
|
322
|
+
operational_provider=operational_provider,
|
|
323
|
+
with_shadows=True)
|
|
324
|
+
assert isinstance(result, RetrievalResult)
|
|
325
|
+
hits, shadows = result.hits, result.shadows
|
|
326
|
+
shadow_by_id = {s.id: s for s in shadows if s.id}
|
|
327
|
+
|
|
328
|
+
slice_counts: dict[str, int] = {t: 0 for t in known}
|
|
329
|
+
entries: list[dict] = []
|
|
330
|
+
for h in hits:
|
|
331
|
+
source = "operational" if h.source == "operational" else "repo"
|
|
332
|
+
envelope_entry: dict = {
|
|
333
|
+
"id": h.id,
|
|
334
|
+
"type": h.type,
|
|
335
|
+
"source": source,
|
|
336
|
+
"confidence": round(float(h.score), 4),
|
|
337
|
+
"body": dict(h.entry) if isinstance(h.entry, dict) else {},
|
|
338
|
+
"shadowed_by": None,
|
|
339
|
+
}
|
|
340
|
+
if h.type in slice_counts:
|
|
341
|
+
slice_counts[h.type] += 1
|
|
342
|
+
entries.append(envelope_entry)
|
|
343
|
+
|
|
344
|
+
# Surface shadowed operational entries as additional entries carrying
|
|
345
|
+
# `shadowed_by`. The conformance harness checks that only
|
|
346
|
+
# source="operational" entries ever set this field.
|
|
347
|
+
for sid, s in shadow_by_id.items():
|
|
348
|
+
entries.append({
|
|
349
|
+
"id": sid,
|
|
350
|
+
"type": s.type,
|
|
351
|
+
"source": "operational",
|
|
352
|
+
"confidence": 0.0,
|
|
353
|
+
"body": {},
|
|
354
|
+
"shadowed_by": f"repo:{sid}",
|
|
355
|
+
})
|
|
356
|
+
if s.type in slice_counts:
|
|
357
|
+
slice_counts[s.type] += 1
|
|
358
|
+
|
|
359
|
+
slices: dict[str, dict] = {
|
|
360
|
+
t: {"status": "ok", "count": slice_counts.get(t, 0)}
|
|
361
|
+
for t in known
|
|
362
|
+
}
|
|
363
|
+
errors: list[dict] = []
|
|
364
|
+
for t in unknown:
|
|
365
|
+
slices[t] = {"status": "unknown_type", "count": 0}
|
|
366
|
+
errors.append({
|
|
367
|
+
"type": t,
|
|
368
|
+
"code": "unknown_type",
|
|
369
|
+
"message": f"file-backed backend does not know type {t!r}",
|
|
370
|
+
})
|
|
371
|
+
|
|
372
|
+
oks = [s for s in slices.values() if s["status"] == "ok"]
|
|
373
|
+
fails = [s for s in slices.values() if s["status"] != "ok"]
|
|
374
|
+
envelope_status = (
|
|
375
|
+
"ok" if not fails
|
|
376
|
+
else "error" if not oks
|
|
377
|
+
else "partial"
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
envelope: dict = {
|
|
381
|
+
"contract_version": CONTRACT_VERSION,
|
|
382
|
+
"status": envelope_status,
|
|
383
|
+
"entries": entries,
|
|
384
|
+
"slices": slices,
|
|
385
|
+
}
|
|
386
|
+
if errors:
|
|
387
|
+
envelope["errors"] = errors
|
|
388
|
+
return envelope
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def main() -> int:
|
|
392
|
+
ap = argparse.ArgumentParser(description=__doc__)
|
|
393
|
+
ap.add_argument("--types", default="",
|
|
394
|
+
help="Comma-separated memory types (e.g., ownership,domain-invariants)")
|
|
395
|
+
ap.add_argument("--key", action="append", default=[],
|
|
396
|
+
help="Retrieval key (repeatable)")
|
|
397
|
+
ap.add_argument("--limit", type=int, default=5)
|
|
398
|
+
ap.add_argument("--format", choices=["text", "json"], default="text")
|
|
399
|
+
ap.add_argument("--envelope", choices=["legacy", "v1"], default="legacy",
|
|
400
|
+
help="Output shape: `legacy` (Hit list) or `v1` "
|
|
401
|
+
"(retrieval contract v1 envelope). `v1` implies JSON output.")
|
|
402
|
+
ap.add_argument("--with-shadows", action="store_true",
|
|
403
|
+
help="Include shadowed-operational entries in the output "
|
|
404
|
+
"(no-op until an operational backend is wired)")
|
|
405
|
+
args = ap.parse_args()
|
|
406
|
+
types = [t.strip() for t in args.types.split(",") if t.strip()]
|
|
407
|
+
if not types:
|
|
408
|
+
print("error: --types is required", file=sys.stderr)
|
|
409
|
+
return 2
|
|
410
|
+
if args.envelope == "v1":
|
|
411
|
+
envelope = retrieve_v1(types, args.key, args.limit)
|
|
412
|
+
print(json.dumps(envelope, indent=2, default=str))
|
|
413
|
+
return 0
|
|
414
|
+
result = retrieve(types, args.key, args.limit, with_shadows=args.with_shadows)
|
|
415
|
+
if args.with_shadows:
|
|
416
|
+
assert isinstance(result, RetrievalResult)
|
|
417
|
+
hits, shadows = result.hits, result.shadows
|
|
418
|
+
else:
|
|
419
|
+
hits, shadows = result, [] # type: ignore[assignment]
|
|
420
|
+
if args.format == "json":
|
|
421
|
+
payload = {"hits": [h.as_dict() for h in hits],
|
|
422
|
+
"shadows": [s.as_dict() for s in shadows]}
|
|
423
|
+
print(json.dumps(payload, indent=2, default=str))
|
|
424
|
+
else:
|
|
425
|
+
if not hits:
|
|
426
|
+
print(" (no hits)")
|
|
427
|
+
for h in hits:
|
|
428
|
+
print(f" [{h.source}] {h.type} score={h.score:.2f} "
|
|
429
|
+
f"id={h.id or '-'} path={h.path}")
|
|
430
|
+
if shadows:
|
|
431
|
+
print(f"\n shadows: {len(shadows)} operational entr"
|
|
432
|
+
f"{'y' if len(shadows) == 1 else 'ies'} suppressed by "
|
|
433
|
+
f"the conflict rule")
|
|
434
|
+
for s in shadows:
|
|
435
|
+
print(f" [{s.reason}] {s.type} id={s.id} "
|
|
436
|
+
f"op={s.operational_path} repo={s.repo_path}")
|
|
437
|
+
return 0
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
if __name__ == "__main__":
|
|
441
|
+
sys.exit(main())
|