@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,168 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Audit skill descriptions for triggering quality.
|
|
4
|
+
|
|
5
|
+
Flags descriptions that are:
|
|
6
|
+
- too short (< 150 chars) or too long (> 200 chars, the linter limit)
|
|
7
|
+
- missing an explicit trigger verb prefix ("use when", "use if", "creates", ...)
|
|
8
|
+
- containing hedge terms ("may help", "can be useful", "covers various", ...)
|
|
9
|
+
|
|
10
|
+
Context:
|
|
11
|
+
`archive/road-to-anthropic-alignment.md` Phase 2.2 — "pushy description" pattern from
|
|
12
|
+
anthropics/skills/skills/skill-creator (roadmap archived 2026-04-21).
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
python3 scripts/audit_skill_descriptions.py # human table
|
|
16
|
+
python3 scripts/audit_skill_descriptions.py --json # machine-readable
|
|
17
|
+
python3 scripts/audit_skill_descriptions.py --root DIR # audit another tree
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import argparse
|
|
23
|
+
import json
|
|
24
|
+
import re
|
|
25
|
+
import sys
|
|
26
|
+
from dataclasses import asdict, dataclass, field
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import List
|
|
29
|
+
|
|
30
|
+
DEFAULT_ROOT = Path(".agent-src.uncompressed/skills")
|
|
31
|
+
MIN_LENGTH = 150
|
|
32
|
+
# Mirrors scripts/skill_linter.py `description_too_long` threshold.
|
|
33
|
+
MAX_LENGTH = 200
|
|
34
|
+
|
|
35
|
+
FRONTMATTER_RE = re.compile(r"^---\n(.*?)\n---", re.DOTALL)
|
|
36
|
+
DESCRIPTION_RE = re.compile(r'^description:\s*"?(.*?)"?\s*$', re.MULTILINE)
|
|
37
|
+
|
|
38
|
+
TRIGGER_PREFIX_RE = re.compile(
|
|
39
|
+
r"^\s*("
|
|
40
|
+
r"use\s+(when|if|for)\b|only\s+when\b|"
|
|
41
|
+
r"creates?\b|reviews?\b|writes?\b|handles?\b|generates?\b|runs?\b|"
|
|
42
|
+
r"builds?\b|fetches?\b|validates?\b|audits?\b|analyzes?\b|detects?\b|"
|
|
43
|
+
r"plans?\b|deploys?\b|configures?\b|scaffolds?\b|fixes?\b|refactors?\b|"
|
|
44
|
+
r"optimizes?\b|renders?\b|syncs?\b|explores?\b|installs?\b|updates?\b|"
|
|
45
|
+
r"manages?\b|orchestrates?\b|prepares?\b|finds?\b|executes?\b|reads?\b|"
|
|
46
|
+
r"checks?\b|tracks?\b"
|
|
47
|
+
r")",
|
|
48
|
+
re.IGNORECASE,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
HEDGE_PHRASES = (
|
|
52
|
+
"may help",
|
|
53
|
+
"can be useful",
|
|
54
|
+
"covers various",
|
|
55
|
+
"might be",
|
|
56
|
+
"generally",
|
|
57
|
+
"as needed",
|
|
58
|
+
"when appropriate",
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class Finding:
|
|
64
|
+
skill: str
|
|
65
|
+
path: str
|
|
66
|
+
description: str
|
|
67
|
+
length: int
|
|
68
|
+
flags: List[str] = field(default_factory=list)
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def score(self) -> int:
|
|
72
|
+
# Higher score = worse. Used for sorting.
|
|
73
|
+
penalty = 0
|
|
74
|
+
if "no-trigger-prefix" in self.flags:
|
|
75
|
+
penalty += 30
|
|
76
|
+
if "too-short" in self.flags:
|
|
77
|
+
penalty += 20
|
|
78
|
+
if "very-short" in self.flags:
|
|
79
|
+
penalty += 10
|
|
80
|
+
penalty += sum(10 for f in self.flags if f.startswith("hedge:"))
|
|
81
|
+
return penalty
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def extract_description(text: str) -> str:
|
|
85
|
+
m = FRONTMATTER_RE.search(text)
|
|
86
|
+
if not m:
|
|
87
|
+
return ""
|
|
88
|
+
d = DESCRIPTION_RE.search(m.group(1))
|
|
89
|
+
return d.group(1).strip() if d else ""
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def audit_description(description: str) -> List[str]:
|
|
93
|
+
flags: List[str] = []
|
|
94
|
+
if not description:
|
|
95
|
+
flags.append("missing")
|
|
96
|
+
return flags
|
|
97
|
+
length = len(description)
|
|
98
|
+
if length < 80:
|
|
99
|
+
flags.append("very-short")
|
|
100
|
+
elif length < MIN_LENGTH:
|
|
101
|
+
flags.append("too-short")
|
|
102
|
+
if length > MAX_LENGTH:
|
|
103
|
+
flags.append("too-long")
|
|
104
|
+
if not TRIGGER_PREFIX_RE.match(description):
|
|
105
|
+
flags.append("no-trigger-prefix")
|
|
106
|
+
lowered = description.lower()
|
|
107
|
+
for phrase in HEDGE_PHRASES:
|
|
108
|
+
if phrase in lowered:
|
|
109
|
+
flags.append(f"hedge:{phrase}")
|
|
110
|
+
return flags
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def collect_findings(root: Path) -> List[Finding]:
|
|
114
|
+
findings: List[Finding] = []
|
|
115
|
+
for skill_md in sorted(root.glob("*/SKILL.md")):
|
|
116
|
+
text = skill_md.read_text(encoding="utf-8")
|
|
117
|
+
description = extract_description(text)
|
|
118
|
+
flags = audit_description(description)
|
|
119
|
+
findings.append(
|
|
120
|
+
Finding(
|
|
121
|
+
skill=skill_md.parent.name,
|
|
122
|
+
path=str(skill_md),
|
|
123
|
+
description=description,
|
|
124
|
+
length=len(description),
|
|
125
|
+
flags=flags,
|
|
126
|
+
)
|
|
127
|
+
)
|
|
128
|
+
return findings
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def render_text(findings: List[Finding], worst_only: bool) -> str:
|
|
132
|
+
flagged = [f for f in findings if f.flags]
|
|
133
|
+
flagged.sort(key=lambda f: (-f.score, f.skill))
|
|
134
|
+
lines = [f"Audited {len(findings)} skills, {len(flagged)} flagged.\n"]
|
|
135
|
+
if not flagged:
|
|
136
|
+
lines.append("✅ All descriptions look reasonable.")
|
|
137
|
+
return "\n".join(lines)
|
|
138
|
+
lines.append(f"{'SCORE':>5} {'LEN':>4} {'SKILL':<40} FLAGS")
|
|
139
|
+
lines.append("-" * 90)
|
|
140
|
+
shown = flagged[:15] if worst_only else flagged
|
|
141
|
+
for f in shown:
|
|
142
|
+
lines.append(
|
|
143
|
+
f"{f.score:>5} {f.length:>4} {f.skill:<40} {', '.join(f.flags)}"
|
|
144
|
+
)
|
|
145
|
+
if worst_only and len(flagged) > 15:
|
|
146
|
+
lines.append(f"\n... {len(flagged) - 15} more (use --full to show all)")
|
|
147
|
+
return "\n".join(lines)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def main() -> int:
|
|
151
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
152
|
+
parser.add_argument("--root", type=Path, default=DEFAULT_ROOT)
|
|
153
|
+
parser.add_argument("--json", action="store_true", help="emit JSON")
|
|
154
|
+
parser.add_argument("--full", action="store_true", help="show all flagged, not just top 15")
|
|
155
|
+
args = parser.parse_args()
|
|
156
|
+
if not args.root.exists():
|
|
157
|
+
print(f"error: {args.root} does not exist", file=sys.stderr)
|
|
158
|
+
return 2
|
|
159
|
+
findings = collect_findings(args.root)
|
|
160
|
+
if args.json:
|
|
161
|
+
print(json.dumps([asdict(f) for f in findings], indent=2))
|
|
162
|
+
else:
|
|
163
|
+
print(render_text(findings, worst_only=not args.full))
|
|
164
|
+
return 0
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
if __name__ == "__main__":
|
|
168
|
+
sys.exit(main())
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Compression quality checker for agent-config packages.
|
|
4
|
+
|
|
5
|
+
Compares .agent-src.uncompressed/ source files with their .agent-src/ compressed versions.
|
|
6
|
+
Checks that compression preserved structural integrity:
|
|
7
|
+
- All headings from source present in compressed
|
|
8
|
+
- All code blocks preserved exactly
|
|
9
|
+
- YAML frontmatter identical
|
|
10
|
+
- Word count reduction within healthy range (10-60%)
|
|
11
|
+
|
|
12
|
+
Exit codes: 0 = clean, 1 = issues found, 3 = internal error
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
import json
|
|
19
|
+
import re
|
|
20
|
+
import sys
|
|
21
|
+
from dataclasses import dataclass, asdict
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
from typing import List, Literal
|
|
24
|
+
|
|
25
|
+
Severity = Literal["error", "warning", "info"]
|
|
26
|
+
|
|
27
|
+
SOURCE_DIR = Path(".agent-src.uncompressed")
|
|
28
|
+
TARGET_DIR = Path(".agent-src")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass
|
|
32
|
+
class Issue:
|
|
33
|
+
file: str
|
|
34
|
+
check: str
|
|
35
|
+
severity: Severity
|
|
36
|
+
message: str
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def extract_headings(text: str) -> list[str]:
|
|
40
|
+
"""Extract all markdown headings (outside code blocks)."""
|
|
41
|
+
headings = []
|
|
42
|
+
in_code = False
|
|
43
|
+
for line in text.splitlines():
|
|
44
|
+
if line.strip().startswith("```"):
|
|
45
|
+
in_code = not in_code
|
|
46
|
+
continue
|
|
47
|
+
if not in_code and re.match(r"^#{1,6}\s+.+$", line):
|
|
48
|
+
headings.append(line)
|
|
49
|
+
return headings
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def extract_code_blocks(text: str) -> list[str]:
|
|
53
|
+
"""Extract content of fenced code blocks."""
|
|
54
|
+
return re.findall(r"```[^\n]*\n(.*?)```", text, re.DOTALL)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def extract_frontmatter(text: str) -> str:
|
|
58
|
+
"""Extract YAML frontmatter."""
|
|
59
|
+
m = re.match(r"^---\n(.*?\n)---", text, re.DOTALL)
|
|
60
|
+
return m.group(1).strip() if m else ""
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def check_pair(rel_path: str, source: str, compressed: str) -> List[Issue]:
|
|
64
|
+
"""Compare source and compressed versions of a file."""
|
|
65
|
+
issues: List[Issue] = []
|
|
66
|
+
|
|
67
|
+
# Frontmatter check
|
|
68
|
+
src_fm = extract_frontmatter(source)
|
|
69
|
+
cmp_fm = extract_frontmatter(compressed)
|
|
70
|
+
if src_fm and src_fm != cmp_fm:
|
|
71
|
+
issues.append(Issue(rel_path, "frontmatter_mismatch", "error",
|
|
72
|
+
"YAML frontmatter differs between source and compressed"))
|
|
73
|
+
|
|
74
|
+
# Heading preservation — check H1 and H2 headings (H3+ may be merged during compression)
|
|
75
|
+
src_headings = extract_headings(source)
|
|
76
|
+
cmp_headings = extract_headings(compressed)
|
|
77
|
+
for h in src_headings:
|
|
78
|
+
# Only check H1 and H2 (## level) — H3+ subheadings may be merged
|
|
79
|
+
if h.startswith("# ") or (h.startswith("## ") and not h.startswith("### ")):
|
|
80
|
+
if h not in cmp_headings:
|
|
81
|
+
issues.append(Issue(rel_path, "missing_heading", "warning",
|
|
82
|
+
f"H1/H2 heading lost during compression: {h}"))
|
|
83
|
+
# Also flag if comment lines inside code blocks are being treated as headings
|
|
84
|
+
# Filter out false positives from code blocks
|
|
85
|
+
|
|
86
|
+
# Code block preservation
|
|
87
|
+
src_blocks = extract_code_blocks(source)
|
|
88
|
+
cmp_blocks = extract_code_blocks(compressed)
|
|
89
|
+
if len(src_blocks) > len(cmp_blocks):
|
|
90
|
+
issues.append(Issue(rel_path, "lost_code_blocks", "error",
|
|
91
|
+
f"Code blocks lost: source has {len(src_blocks)}, compressed has {len(cmp_blocks)}"))
|
|
92
|
+
for i, block in enumerate(src_blocks):
|
|
93
|
+
if i < len(cmp_blocks) and block.strip() != cmp_blocks[i].strip():
|
|
94
|
+
# Only flag if content actually changed (not just whitespace)
|
|
95
|
+
if block.replace(" ", "").replace("\n", "") != cmp_blocks[i].replace(" ", "").replace("\n", ""):
|
|
96
|
+
issues.append(Issue(rel_path, "modified_code_block", "error",
|
|
97
|
+
f"Code block {i+1} content changed during compression"))
|
|
98
|
+
|
|
99
|
+
# Word count ratio
|
|
100
|
+
src_words = len(source.split())
|
|
101
|
+
cmp_words = len(compressed.split())
|
|
102
|
+
if src_words > 0:
|
|
103
|
+
reduction = (1 - cmp_words / src_words) * 100
|
|
104
|
+
if reduction > 60:
|
|
105
|
+
issues.append(Issue(rel_path, "excessive_reduction", "warning",
|
|
106
|
+
f"Compression reduced {reduction:.0f}% — possible content loss "
|
|
107
|
+
f"({src_words} → {cmp_words} words)"))
|
|
108
|
+
elif reduction < 5 and src_words > 100:
|
|
109
|
+
issues.append(Issue(rel_path, "minimal_reduction", "info",
|
|
110
|
+
f"Compression only reduced {reduction:.0f}% "
|
|
111
|
+
f"({src_words} → {cmp_words} words)"))
|
|
112
|
+
|
|
113
|
+
return issues
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def scan_all(root: Path) -> List[Issue]:
|
|
117
|
+
"""Scan all .md file pairs for compression quality issues."""
|
|
118
|
+
issues: List[Issue] = []
|
|
119
|
+
source_dir = root / SOURCE_DIR
|
|
120
|
+
target_dir = root / TARGET_DIR
|
|
121
|
+
|
|
122
|
+
if not source_dir.exists() or not target_dir.exists():
|
|
123
|
+
return issues
|
|
124
|
+
|
|
125
|
+
for source_file in sorted(source_dir.rglob("*.md")):
|
|
126
|
+
rel = source_file.relative_to(source_dir)
|
|
127
|
+
target_file = target_dir / rel
|
|
128
|
+
|
|
129
|
+
if not target_file.exists():
|
|
130
|
+
continue # sync-check handles missing files
|
|
131
|
+
|
|
132
|
+
# Skip commands — they are copied verbatim, not compressed
|
|
133
|
+
rel_str = str(rel)
|
|
134
|
+
if rel_str.startswith("commands/"):
|
|
135
|
+
continue
|
|
136
|
+
|
|
137
|
+
source_text = source_file.read_text(encoding="utf-8")
|
|
138
|
+
target_text = target_file.read_text(encoding="utf-8")
|
|
139
|
+
issues.extend(check_pair(rel_str, source_text, target_text))
|
|
140
|
+
|
|
141
|
+
return issues
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def format_text(issues: List[Issue]) -> str:
|
|
145
|
+
if not issues:
|
|
146
|
+
return "✅ Compression quality check passed."
|
|
147
|
+
icons = {"error": "🔴", "warning": "🟡", "info": "ℹ️"}
|
|
148
|
+
lines = [f"Found {len(issues)} compression quality issue(s):\n"]
|
|
149
|
+
for i in issues:
|
|
150
|
+
lines.append(f" {icons[i.severity]} [{i.check}] {i.file}: {i.message}")
|
|
151
|
+
errors = sum(1 for i in issues if i.severity == "error")
|
|
152
|
+
if errors:
|
|
153
|
+
lines.append(f"\n❌ {errors} error(s) must be fixed.")
|
|
154
|
+
return "\n".join(lines)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def scan_summary(root: Path) -> str:
|
|
158
|
+
"""Generate per-category compression summary stats."""
|
|
159
|
+
source_dir = root / SOURCE_DIR
|
|
160
|
+
target_dir = root / TARGET_DIR
|
|
161
|
+
if not source_dir.exists() or not target_dir.exists():
|
|
162
|
+
return "No source/target directories found."
|
|
163
|
+
|
|
164
|
+
categories: dict[str, list[tuple[int, int]]] = {}
|
|
165
|
+
for source_file in sorted(source_dir.rglob("*.md")):
|
|
166
|
+
rel = source_file.relative_to(source_dir)
|
|
167
|
+
target_file = target_dir / rel
|
|
168
|
+
if not target_file.exists() or str(rel).startswith("commands/"):
|
|
169
|
+
continue
|
|
170
|
+
src_words = len(source_file.read_text(encoding="utf-8").split())
|
|
171
|
+
cmp_words = len(target_file.read_text(encoding="utf-8").split())
|
|
172
|
+
parts = str(rel).split("/")
|
|
173
|
+
cat = parts[0] if len(parts) > 1 else "root"
|
|
174
|
+
categories.setdefault(cat, []).append((src_words, cmp_words))
|
|
175
|
+
|
|
176
|
+
lines = ["Category | Files | Avg Source | Avg Compressed | Avg Reduction",
|
|
177
|
+
"--- | --- | --- | --- | ---"]
|
|
178
|
+
total_src = total_cmp = total_files = 0
|
|
179
|
+
for cat in sorted(categories):
|
|
180
|
+
pairs = categories[cat]
|
|
181
|
+
n = len(pairs)
|
|
182
|
+
avg_src = sum(s for s, _ in pairs) // n
|
|
183
|
+
avg_cmp = sum(c for _, c in pairs) // n
|
|
184
|
+
reduction = (1 - avg_cmp / avg_src) * 100 if avg_src > 0 else 0
|
|
185
|
+
lines.append(f"{cat:<17}| {n:>5} | {avg_src:>10} | {avg_cmp:>14} | {reduction:>5.0f}%")
|
|
186
|
+
total_src += sum(s for s, _ in pairs)
|
|
187
|
+
total_cmp += sum(c for _, c in pairs)
|
|
188
|
+
total_files += n
|
|
189
|
+
overall = (1 - total_cmp / total_src) * 100 if total_src > 0 else 0
|
|
190
|
+
lines.append(f"{'TOTAL':<17}| {total_files:>5} | {total_src // max(total_files, 1):>10} | {total_cmp // max(total_files, 1):>14} | {overall:>5.0f}%")
|
|
191
|
+
return "\n".join(lines)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def main() -> int:
|
|
195
|
+
parser = argparse.ArgumentParser(description="Check compression quality")
|
|
196
|
+
parser.add_argument("--format", choices=["text", "json"], default="text")
|
|
197
|
+
parser.add_argument("--summary", action="store_true", help="Show per-category compression stats")
|
|
198
|
+
parser.add_argument("--root", type=Path, default=Path("."))
|
|
199
|
+
args = parser.parse_args()
|
|
200
|
+
|
|
201
|
+
if args.summary:
|
|
202
|
+
print(scan_summary(args.root))
|
|
203
|
+
return 0
|
|
204
|
+
|
|
205
|
+
try:
|
|
206
|
+
issues = scan_all(args.root)
|
|
207
|
+
except Exception as e:
|
|
208
|
+
print(f"Internal error: {e}", file=sys.stderr)
|
|
209
|
+
return 3
|
|
210
|
+
|
|
211
|
+
if args.format == "json":
|
|
212
|
+
print(json.dumps([asdict(i) for i in issues], indent=2))
|
|
213
|
+
else:
|
|
214
|
+
print(format_text(issues))
|
|
215
|
+
|
|
216
|
+
errors = [i for i in issues if i.severity == "error"]
|
|
217
|
+
return 1 if errors else 0
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
if __name__ == "__main__":
|
|
221
|
+
sys.exit(main())
|