pi-dev-team 0.2.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/LICENSE +21 -0
- package/PORTING.md +134 -0
- package/README.md +207 -0
- package/UPSTREAM.json +64 -0
- package/agents/Explore.md +15 -0
- package/agents/a11y-review.md +118 -0
- package/agents/adr-author.md +70 -0
- package/agents/ai-provenance-review.md +120 -0
- package/agents/angular-reactivity-review.md +95 -0
- package/agents/arch-review.md +135 -0
- package/agents/architect.md +78 -0
- package/agents/autoship-batch-proposer.md +69 -0
- package/agents/claude-setup-review.md +136 -0
- package/agents/codebase-recon.md +184 -0
- package/agents/component-architecture-review.md +119 -0
- package/agents/concurrency-review.md +109 -0
- package/agents/correctness-review.md +290 -0
- package/agents/data-flow-tracer.md +120 -0
- package/agents/doc-review.md +165 -0
- package/agents/domain-review.md +136 -0
- package/agents/general-purpose.md +10 -0
- package/agents/gherkin-quality-critic.md +113 -0
- package/agents/js-fp-review.md +114 -0
- package/agents/mutation-kill.md +684 -0
- package/agents/naming-review.md +142 -0
- package/agents/orchestrator.md +339 -0
- package/agents/performance-review.md +105 -0
- package/agents/plan-review-acceptance.md +115 -0
- package/agents/plan-review-design.md +90 -0
- package/agents/plan-review-parallelization.md +84 -0
- package/agents/plan-review-strategic.md +96 -0
- package/agents/plan-review-ux.md +110 -0
- package/agents/platform-engineer.md +64 -0
- package/agents/product-manager.md +68 -0
- package/agents/progress-guardian.md +79 -0
- package/agents/qa-engineer.md +289 -0
- package/agents/quality-reviewer.md +132 -0
- package/agents/react-reactivity-review.md +102 -0
- package/agents/refactor-opportunity-review.md +128 -0
- package/agents/security-engineer.md +60 -0
- package/agents/security-review.md +218 -0
- package/agents/session-analysis.md +95 -0
- package/agents/software-engineer.md +105 -0
- package/agents/spec-compliance-review.md +100 -0
- package/agents/spec-reviewer.md +114 -0
- package/agents/structure-review.md +146 -0
- package/agents/tech-writer.md +84 -0
- package/agents/test-review.md +246 -0
- package/agents/test-smell-review.md +188 -0
- package/agents/token-efficiency-review.md +139 -0
- package/agents/ui-ux-designer.md +54 -0
- package/agents/vue-reactivity-review.md +95 -0
- package/bin/__pycache__/claudecpython-314.pyc +0 -0
- package/bin/claude +258 -0
- package/docs/upstream/.pages +1 -0
- package/docs/upstream/CHANGELOG.md +2586 -0
- package/docs/upstream/README.md +155 -0
- package/docs/upstream/agent-architecture.md +214 -0
- package/docs/upstream/agent_info.md +187 -0
- package/docs/upstream/artifact-migration.md +124 -0
- package/docs/upstream/code-intelligence-nudge.md +149 -0
- package/docs/upstream/code-review-process.md +294 -0
- package/docs/upstream/concurrent-use.md +73 -0
- package/docs/upstream/context-management.md +111 -0
- package/docs/upstream/developer-notes.md +280 -0
- package/docs/upstream/diagrams/architecture-overview.svg +101 -0
- package/docs/upstream/diagrams/review-dispatch.svg +139 -0
- package/docs/upstream/diagrams/team-agents.svg +128 -0
- package/docs/upstream/diagrams/test-improve-flow.svg +166 -0
- package/docs/upstream/diagrams/workflow-linear.svg +66 -0
- package/docs/upstream/diagrams/workflow-three-phase.svg +200 -0
- package/docs/upstream/eval-maintenance.md +95 -0
- package/docs/upstream/eval-running-guide.md +147 -0
- package/docs/upstream/eval-system.md +291 -0
- package/docs/upstream/session-review-oss-complements.md +75 -0
- package/docs/upstream/session-review.md +212 -0
- package/docs/upstream/skills.md +188 -0
- package/docs/upstream/team-structure.md +21 -0
- package/docs/upstream/telemetry-ci-access.md +129 -0
- package/docs/upstream/telemetry-repo-security.md +120 -0
- package/docs/upstream/test-evaluation.md +277 -0
- package/docs/upstream/test-improve.md +154 -0
- package/docs/upstream/triage-workflow.md +282 -0
- package/docs/upstream/workflows.md +289 -0
- package/extensions/dev-team/index.ts +539 -0
- package/extensions/dev-team/lib/agents.ts +272 -0
- package/extensions/dev-team/lib/ai-credits.ts +92 -0
- package/extensions/dev-team/lib/autocompact.ts +81 -0
- package/extensions/dev-team/lib/child-run.ts +102 -0
- package/extensions/dev-team/lib/config.ts +236 -0
- package/extensions/dev-team/lib/gh-command.ts +103 -0
- package/extensions/dev-team/lib/github-style.ts +307 -0
- package/extensions/dev-team/lib/hooks.ts +350 -0
- package/extensions/dev-team/lib/metrics.ts +115 -0
- package/extensions/dev-team/lib/safe-read.ts +49 -0
- package/extensions/dev-team/lib/session-files.ts +57 -0
- package/extensions/dev-team/lib/session-spend.ts +123 -0
- package/extensions/dev-team/lib/shell-scan.ts +205 -0
- package/extensions/dev-team/lib/skills.ts +213 -0
- package/extensions/dev-team/lib/subagent-render.ts +245 -0
- package/extensions/dev-team/lib/subagent-types.ts +164 -0
- package/extensions/dev-team/lib/subagent.ts +596 -0
- package/extensions/dev-team/lib/terminal-text.ts +54 -0
- package/extensions/dev-team/lib/tools-misc.ts +152 -0
- package/extensions/dev-team/lib/transcript.ts +110 -0
- package/extensions/dev-team/lib/trust.ts +52 -0
- package/extensions/dev-team/lib/usage-breakdown.ts +176 -0
- package/extensions/dev-team/lib/usage-chart.ts +153 -0
- package/extensions/dev-team/lib/usage-command.ts +107 -0
- package/extensions/dev-team/lib/usage-history.ts +203 -0
- package/extensions/dev-team/lib/usage-render.ts +225 -0
- package/extensions/dev-team/lib/usage-split-bar.ts +127 -0
- package/extensions/dev-team/lib/usage-state.ts +116 -0
- package/extensions/dev-team/lib/usage-text.ts +159 -0
- package/extensions/dev-team/lib/usage-view.ts +109 -0
- package/hooks/__pycache__/refactor_test_freeze_guard.cpython-314.pyc +0 -0
- package/hooks/agent_dispatch_ledger.py +190 -0
- package/hooks/autocompact_setup_nudge.py +99 -0
- package/hooks/bash_retry_guard.py +228 -0
- package/hooks/boundary_events_write_guard.py +352 -0
- package/hooks/code_intelligence_nudge.py +293 -0
- package/hooks/code_intelligence_turn_mark.py +317 -0
- package/hooks/codegraph_bootstrap.py +139 -0
- package/hooks/contract_version_guard.py +362 -0
- package/hooks/cost_meter.py +106 -0
- package/hooks/destructive-commands.json +62 -0
- package/hooks/destructive_guard.py +477 -0
- package/hooks/eval_compliance_check.py +440 -0
- package/hooks/guards.json +17 -0
- package/hooks/hooks.json +323 -0
- package/hooks/internal_double_gate.py +296 -0
- package/hooks/js_fp_review.py +212 -0
- package/hooks/knowledge_index.py +119 -0
- package/hooks/lib/__pycache__/artifact_paths.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/atomic_state.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/autocompact_config.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/boundary_events.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/doc_classification.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/gh_pr_create_detect.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/git_safe_diff.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/instrument_log.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/metrics_query.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/plugin_version.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/pre_commit_doc_classifier.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_agent_registry.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_gate_corroboration.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_gate_hash.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_verdicts.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/stdin_json.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/stryker_invocation.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/telemetry_consent.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/test_file_classify.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/token_efficiency_limits.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/verify_guard_state.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/xunit_v3_operator_gate.cpython-314.pyc +0 -0
- package/hooks/lib/agent_skill_hints.py +74 -0
- package/hooks/lib/artifact_paths.py +263 -0
- package/hooks/lib/atomic_state.py +557 -0
- package/hooks/lib/autocompact_config.py +103 -0
- package/hooks/lib/autoship_log.py +106 -0
- package/hooks/lib/banned_scripts_policy.py +51 -0
- package/hooks/lib/boundary_events.py +436 -0
- package/hooks/lib/build_knowledge_index.py +504 -0
- package/hooks/lib/build_skills_index.py +361 -0
- package/hooks/lib/build_state.py +116 -0
- package/hooks/lib/classify_ship_outcome.py +126 -0
- package/hooks/lib/config_changelog_schema.py +115 -0
- package/hooks/lib/cost_meter.py +955 -0
- package/hooks/lib/doc_classification.py +116 -0
- package/hooks/lib/gh_pr_create_detect.py +136 -0
- package/hooks/lib/git_safe_diff.py +123 -0
- package/hooks/lib/instrument_log.py +66 -0
- package/hooks/lib/iteration_journal_gate.py +197 -0
- package/hooks/lib/knowledge_index_paths.py +88 -0
- package/hooks/lib/mcp_json_repowise.py +177 -0
- package/hooks/lib/metrics_query.py +202 -0
- package/hooks/lib/minimal_yaml.py +434 -0
- package/hooks/lib/plugin_version.py +142 -0
- package/hooks/lib/pre_commit_detect.py +537 -0
- package/hooks/lib/pre_commit_doc_classifier.py +126 -0
- package/hooks/lib/pricing.py +118 -0
- package/hooks/lib/report_pdf.py +371 -0
- package/hooks/lib/review_agent_registry.py +142 -0
- package/hooks/lib/review_dispatch_ledger.py +101 -0
- package/hooks/lib/review_gate_corroboration.py +521 -0
- package/hooks/lib/review_gate_hash.py +252 -0
- package/hooks/lib/review_gate_normalized_hash.py +1115 -0
- package/hooks/lib/review_verdicts.py +301 -0
- package/hooks/lib/run_report.py +160 -0
- package/hooks/lib/skill_categories.yaml +125 -0
- package/hooks/lib/stdin_json.py +57 -0
- package/hooks/lib/stryker_invocation.py +102 -0
- package/hooks/lib/telemetry_consent.py +41 -0
- package/hooks/lib/telemetry_report.py +108 -0
- package/hooks/lib/test_file_classify.py +160 -0
- package/hooks/lib/token_efficiency_limits.py +51 -0
- package/hooks/lib/turn_identity.py +77 -0
- package/hooks/lib/verify_guard_state.py +110 -0
- package/hooks/lib/workflow_state.py +206 -0
- package/hooks/lib/xunit_v3_operator_gate.py +596 -0
- package/hooks/mcp_json_repowise_nudge.py +74 -0
- package/hooks/mutation_adapters/__init__.py +7 -0
- package/hooks/mutation_adapters/__pycache__/__init__.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/lib.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/mutmut.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/pitest.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/stryker.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/stryker_net.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/lib.py +478 -0
- package/hooks/mutation_adapters/mutmut.py +188 -0
- package/hooks/mutation_adapters/pitest.py +266 -0
- package/hooks/mutation_adapters/stryker.py +157 -0
- package/hooks/mutation_adapters/stryker_net.py +264 -0
- package/hooks/mutation_gate.py +193 -0
- package/hooks/mutation_testing_smoke_gate.py +371 -0
- package/hooks/pending_review_notify.py +121 -0
- package/hooks/phase_marker.py +138 -0
- package/hooks/post_compact_state_reinject.py +180 -0
- package/hooks/post_format.py +115 -0
- package/hooks/pre_commit_knowledge_index.py +128 -0
- package/hooks/pre_commit_review.py +66 -0
- package/hooks/pre_pr_review.py +694 -0
- package/hooks/pre_tool_guard.py +405 -0
- package/hooks/py.sh +73 -0
- package/hooks/refactor-bash-write-patterns.json +29 -0
- package/hooks/refactor_test_bash_guard.py +253 -0
- package/hooks/refactor_test_freeze_guard.py +139 -0
- package/hooks/refactor_test_revert_guard.py +186 -0
- package/hooks/repo_review_nudge.py +287 -0
- package/hooks/review_verdict_recorder.py +464 -0
- package/hooks/scan_bash_command_for_banned_scripts.py +428 -0
- package/hooks/scan_worktree_for_banned_scripts.py +238 -0
- package/hooks/session_learning_trigger.py +248 -0
- package/hooks/skills_index.py +126 -0
- package/hooks/stryker_xunit_shim_guard.py +571 -0
- package/hooks/subagent_completion_guard.py +309 -0
- package/hooks/subagent_skill_context.py +139 -0
- package/hooks/task_completion_metrics.py +216 -0
- package/hooks/tdd_guard.py +229 -0
- package/hooks/telemetry.py +341 -0
- package/hooks/token_efficiency_review.py +194 -0
- package/hooks/verify_guard.py +183 -0
- package/hooks/verify_guard_edit_marker.py +73 -0
- package/hooks/version_check.py +173 -0
- package/knowledge/accepted-risks-schema.md +98 -0
- package/knowledge/adr-decision-criteria.md +64 -0
- package/knowledge/adversarial-review-protocol.md +139 -0
- package/knowledge/agent-registry.md +228 -0
- package/knowledge/agent-review-methodology.md +80 -0
- package/knowledge/ai-friendly-repo-guidelines.md +67 -0
- package/knowledge/architecture-assessment.md +96 -0
- package/knowledge/artifact-lifecycle.md +57 -0
- package/knowledge/cd-maturity-model.md +82 -0
- package/knowledge/cd-test-architecture.md +190 -0
- package/knowledge/ci-cd-file-scope.md +24 -0
- package/knowledge/codegraph-vs-graphify.md +192 -0
- package/knowledge/component-test-patterns.md +139 -0
- package/knowledge/database-change-management.md +80 -0
- package/knowledge/database-test-patterns.md +79 -0
- package/knowledge/decision-defaults.md +88 -0
- package/knowledge/dependency-breaking-techniques.md +116 -0
- package/knowledge/deployment-pipeline.md +86 -0
- package/knowledge/design-smells.md +122 -0
- package/knowledge/directory-enumeration.md +38 -0
- package/knowledge/domain-modeling.md +123 -0
- package/knowledge/evidence-bundle.md +90 -0
- package/knowledge/exploratory-testing-field-guide.md +122 -0
- package/knowledge/failure-routing.md +28 -0
- package/knowledge/fixture-construction.md +56 -0
- package/knowledge/frontend-component-architecture.md +139 -0
- package/knowledge/gherkin-quality-review-dispatch.md +135 -0
- package/knowledge/index.json +6766 -0
- package/knowledge/internal-collaborator-doubling.md +101 -0
- package/knowledge/legacy-test-strategy.md +71 -0
- package/knowledge/long-run-waiting.md +66 -0
- package/knowledge/microservice-testing.md +71 -0
- package/knowledge/model-pricing.json +23 -0
- package/knowledge/mutation-score-formulas.md +60 -0
- package/knowledge/object-calisthenics.md +147 -0
- package/knowledge/oracle-provenance.md +94 -0
- package/knowledge/orchestrator-script-implementation.md +185 -0
- package/knowledge/owasp-detection.md +148 -0
- package/knowledge/plan-review-rubric.md +56 -0
- package/knowledge/proxy-connectivity.md +62 -0
- package/knowledge/reactive-effect-patterns.md +73 -0
- package/knowledge/recon-inventory-excludes.txt +32 -0
- package/knowledge/references/bdd-value-guide.md +61 -0
- package/knowledge/references/csharp-http-client-testing.md +264 -0
- package/knowledge/release-strategies.md +74 -0
- package/knowledge/report-output-location.md +117 -0
- package/knowledge/report-pdf-integration.md +63 -0
- package/knowledge/report-print.css +129 -0
- package/knowledge/report-template.md +114 -0
- package/knowledge/report-to-pdf.md +69 -0
- package/knowledge/request-processing-flow.md +63 -0
- package/knowledge/result-verification.md +52 -0
- package/knowledge/review-agent-output-contract.md +121 -0
- package/knowledge/review-lens-classification.md +113 -0
- package/knowledge/review-rubric.md +62 -0
- package/knowledge/review-template.md +104 -0
- package/knowledge/rule-fixtures/A02.insecure-random-js/negative.js +1 -0
- package/knowledge/rule-fixtures/A02.insecure-random-js/positive.js +1 -0
- package/knowledge/rule-fixtures/A02.weak-hashing-md5/negative.py +1 -0
- package/knowledge/rule-fixtures/A02.weak-hashing-md5/positive.py +1 -0
- package/knowledge/rule-fixtures/A03.command-injection/negative.js +1 -0
- package/knowledge/rule-fixtures/A03.command-injection/positive.js +1 -0
- package/knowledge/rule-fixtures/A03.sql-injection/negative.js +1 -0
- package/knowledge/rule-fixtures/A03.sql-injection/positive.js +1 -0
- package/knowledge/rule-fixtures/A03.xss-innerhtml/negative.js +1 -0
- package/knowledge/rule-fixtures/A03.xss-innerhtml/positive.js +1 -0
- package/knowledge/rule-fixtures/A05.cors-wildcard/negative.js +1 -0
- package/knowledge/rule-fixtures/A05.cors-wildcard/positive.js +1 -0
- package/knowledge/rule-fixtures/A05.default-credentials/negative.js +1 -0
- package/knowledge/rule-fixtures/A05.default-credentials/positive.js +1 -0
- package/knowledge/rule-fixtures/A07.jwt-alg-none/negative.js +1 -0
- package/knowledge/rule-fixtures/A07.jwt-alg-none/positive.js +1 -0
- package/knowledge/rule-fixtures/A08.binary-formatter/negative.cs +1 -0
- package/knowledge/rule-fixtures/A08.binary-formatter/positive.cs +1 -0
- package/knowledge/rule-fixtures/A08.js-eval/negative.js +1 -0
- package/knowledge/rule-fixtures/A08.js-eval/positive.js +1 -0
- package/knowledge/rule-fixtures/A08.object-input-stream/negative.java +1 -0
- package/knowledge/rule-fixtures/A08.object-input-stream/positive.java +1 -0
- package/knowledge/schemas/disposition-register-v1.json +65 -0
- package/knowledge/schemas/recon-envelope-v1.json +198 -0
- package/knowledge/schemas/unified-finding-v1.json +72 -0
- package/knowledge/security-primitives-contract.md +301 -0
- package/knowledge/security-review-rule-map.yaml +107 -0
- package/knowledge/skills-registry.md +72 -0
- package/knowledge/task-size-classifier.md +103 -0
- package/knowledge/telemetry-schema.md +881 -0
- package/knowledge/test-automation-maturity.md +56 -0
- package/knowledge/test-automation-principles.md +71 -0
- package/knowledge/test-cadence-tradeoffs.md +68 -0
- package/knowledge/test-doubles.md +105 -0
- package/knowledge/test-file-indicators.md +22 -0
- package/knowledge/test-layer-gates.md +35 -0
- package/knowledge/test-matrix-examples/django-batch.md +24 -0
- package/knowledge/test-matrix-examples/dotnet-grpc-fronting-api.md +90 -0
- package/knowledge/test-matrix-examples/dotnet-http-consumer.md +131 -0
- package/knowledge/test-matrix-examples/react-node-spa.md +24 -0
- package/knowledge/test-matrix-examples/spring-boot-service.md +25 -0
- package/knowledge/test-matrix-examples/ssr-htmx.md +24 -0
- package/knowledge/test-organization.md +70 -0
- package/knowledge/test-pyramid.md +84 -0
- package/knowledge/test-refactoring.md +67 -0
- package/knowledge/test-review-division-of-labor.md +85 -0
- package/knowledge/test-smells.md +80 -0
- package/knowledge/test-stack-profiles/bdd-frameworks.md +235 -0
- package/knowledge/test-stack-profiles/django.md +13 -0
- package/knowledge/test-stack-profiles/dotnet.md +18 -0
- package/knowledge/test-stack-profiles/go.md +16 -0
- package/knowledge/test-stack-profiles/node.md +16 -0
- package/knowledge/test-stack-profiles/react.md +12 -0
- package/knowledge/test-stack-profiles/spring-boot.md +16 -0
- package/knowledge/test-stack-profiles/ssr-htmx.md +14 -0
- package/knowledge/test-stack-profiles/vue.md +12 -0
- package/knowledge/test-strategy.md +70 -0
- package/knowledge/testability-patterns.md +240 -0
- package/knowledge/testing-quadrants.md +44 -0
- package/knowledge/testing-techniques/approval.md +15 -0
- package/knowledge/testing-techniques/chaos.md +17 -0
- package/knowledge/testing-techniques/fuzz.md +15 -0
- package/knowledge/testing-techniques/property-based.md +15 -0
- package/knowledge/testing-techniques/schema-validation.md +15 -0
- package/knowledge/testing-techniques/screenshot.md +15 -0
- package/knowledge/three-phase-workflow.md +198 -0
- package/knowledge/value-patterns.md +55 -0
- package/knowledge/verification-mode.md +116 -0
- package/knowledge/virtual-service-libraries.md +75 -0
- package/knowledge/wave-consolidation-guidance.md +21 -0
- package/overrides/agents/Explore.md +15 -0
- package/overrides/agents/general-purpose.md +10 -0
- package/overrides/notes/autoship.md +6 -0
- package/overrides/notes/issues-from-assessment.md +3 -0
- package/overrides/notes/issues-from-plan.md +3 -0
- package/overrides/notes/mutation-night-watch.md +3 -0
- package/overrides/notes/mutation-testing.md +3 -0
- package/overrides/notes/pr.md +7 -0
- package/overrides/notes/project-init.md +6 -0
- package/overrides/notes/setup.md +13 -0
- package/overrides/notes/specs.md +3 -0
- package/overrides/skills/headless-run/SKILL.md +45 -0
- package/overrides/skills/upgrade/SKILL.md +30 -0
- package/overrides/skills/version/SKILL.md +25 -0
- package/package.json +36 -0
- package/scripts/authoring_digest.py +93 -0
- package/scripts/autoship_discover.py +121 -0
- package/scripts/autoship_group.py +409 -0
- package/scripts/autoship_proposals.py +494 -0
- package/scripts/autoship_queue.py +291 -0
- package/scripts/autoship_reclaim.py +495 -0
- package/scripts/build_jobs.py +108 -0
- package/scripts/build_rollback_point.py +240 -0
- package/scripts/build_slice_scope.py +157 -0
- package/scripts/build_wave.py +109 -0
- package/scripts/build_wave_reconcile.py +252 -0
- package/scripts/build_worktree_baseref.py +113 -0
- package/scripts/check_agent_scope.py +117 -0
- package/scripts/check_agent_tool_mapping.py +213 -0
- package/scripts/check_review_agent_mcp_tools.py +317 -0
- package/scripts/check_security_assessment_mcp_tools.py +165 -0
- package/scripts/checkpoint_abort.py +502 -0
- package/scripts/claude_setup_review.py +438 -0
- package/scripts/codebase_recon.py +556 -0
- package/scripts/coverage_config.py +623 -0
- package/scripts/coverage_delta_steering.py +330 -0
- package/scripts/coverage_discovery_dotnet.py +315 -0
- package/scripts/coverage_discovery_java.py +742 -0
- package/scripts/coverage_discovery_js.py +546 -0
- package/scripts/coverage_gap_ranking.py +556 -0
- package/scripts/coverage_readiness.py +455 -0
- package/scripts/coverage_report_parse.py +521 -0
- package/scripts/detect_bdd_convention.py +252 -0
- package/scripts/eval_ablation.py +376 -0
- package/scripts/gherkin_analysis_coverage_gate.py +306 -0
- package/scripts/gherkin_cross_feature_duplicate_titles_gate.py +173 -0
- package/scripts/gherkin_effectiveness_rollup.py +238 -0
- package/scripts/gherkin_failure_path_gate.py +206 -0
- package/scripts/gherkin_feature_merge.py +720 -0
- package/scripts/gherkin_stub_gate.py +163 -0
- package/scripts/gherkin_stub_merge.py +479 -0
- package/scripts/git_origin_host.py +88 -0
- package/scripts/install-java-static-analysis.py +110 -0
- package/scripts/issue_deps.py +74 -0
- package/scripts/lib/_bdd_markers.py +28 -0
- package/scripts/lib/_gherkin_text.py +93 -0
- package/scripts/lib/_vendored_tree.py +70 -0
- package/scripts/lib/autoship_state.py +397 -0
- package/scripts/lib/claude_md_guard.py +226 -0
- package/scripts/lib/deterministic_recon.py +446 -0
- package/scripts/lib/mcp_tool_grants.py +211 -0
- package/scripts/lib/plan_parse.py +386 -0
- package/scripts/lib/review_result.py +84 -0
- package/scripts/lib/review_roster.py +86 -0
- package/scripts/lib/session_log/__init__.py +34 -0
- package/scripts/lib/session_log/__pycache__/__init__.cpython-314.pyc +0 -0
- package/scripts/lib/session_log/__pycache__/records.cpython-314.pyc +0 -0
- package/scripts/lib/session_log/classify.py +231 -0
- package/scripts/lib/session_log/corrections.py +194 -0
- package/scripts/lib/session_log/discovery.py +108 -0
- package/scripts/lib/session_log/records.py +218 -0
- package/scripts/lib/session_log/redact.py +76 -0
- package/scripts/lib/session_log/signals.py +373 -0
- package/scripts/lib/session_report_downstream.py +614 -0
- package/scripts/lib/session_report_maintainer.py +1273 -0
- package/scripts/lib/session_report_shared.py +262 -0
- package/scripts/lib/settings_hook_guard.py +157 -0
- package/scripts/lib/slug.py +33 -0
- package/scripts/lib/stub_extractors/__init__.py +82 -0
- package/scripts/lib/stub_extractors/_common.py +328 -0
- package/scripts/lib/stub_extractors/csharp.py +19 -0
- package/scripts/lib/stub_extractors/go.py +173 -0
- package/scripts/lib/stub_extractors/java.py +18 -0
- package/scripts/lib/stub_extractors/jsts.py +126 -0
- package/scripts/mutation_stack_sections.py +149 -0
- package/scripts/mutation_yield_steering.py +345 -0
- package/scripts/orchestrator.py +895 -0
- package/scripts/plan_gherkin_export.py +227 -0
- package/scripts/plan_waves.py +208 -0
- package/scripts/pr_close_keyword_lint.py +108 -0
- package/scripts/progress_guardian.py +888 -0
- package/scripts/recon_inventory.py +273 -0
- package/scripts/review_findings_log.py +93 -0
- package/scripts/run_invariants.py +124 -0
- package/scripts/select_lenses.py +640 -0
- package/scripts/session_report.py +486 -0
- package/scripts/set_autocompact_env.py +221 -0
- package/scripts/ship_resume_guard.py +135 -0
- package/scripts/ship_review_gate.py +63 -0
- package/scripts/specs_convention_marker.py +103 -0
- package/scripts/test_improve_resume.py +277 -0
- package/scripts/test_review_mechanics.py +958 -0
- package/scripts/token_efficiency_review.py +322 -0
- package/scripts/verdict_scope.py +285 -0
- package/scripts/verify_gherkin_quality_critic_isolation.py +296 -0
- package/scripts/verify_tier.py +157 -0
- package/skills/adr-tools/SKILL.md +118 -0
- package/skills/agent-readiness/SKILL.md +105 -0
- package/skills/agent-readiness/ai_friendly_analyzers.py +326 -0
- package/skills/agent-readiness/scanner.py +441 -0
- package/skills/agent-readiness/scorecard.yaml +88 -0
- package/skills/api-design/SKILL.md +115 -0
- package/skills/apply-fixes/SKILL.md +171 -0
- package/skills/apply-test-doubles/SKILL.md +321 -0
- package/skills/artifact-lifecycle/SKILL.md +127 -0
- package/skills/autoship/SKILL.md +1124 -0
- package/skills/benchmark/SKILL.md +105 -0
- package/skills/branch-workflow/SKILL.md +89 -0
- package/skills/browse/SKILL.md +184 -0
- package/skills/browser-testing/SKILL.md +62 -0
- package/skills/browser-testing/references/playwright-patterns.md +216 -0
- package/skills/build/SKILL.md +422 -0
- package/skills/build/references/static-self-heal.md +245 -0
- package/skills/careful/SKILL.md +72 -0
- package/skills/cd-test-architecture/SKILL.md +371 -0
- package/skills/ci-debugging/SKILL.md +105 -0
- package/skills/co-evolution-audit/SKILL.md +269 -0
- package/skills/code-review/SKILL.md +1015 -0
- package/skills/code-review/examples/aggregated-sample.json +56 -0
- package/skills/code-review/examples/sample-report.md +41 -0
- package/skills/code-review/output-format.md +478 -0
- package/skills/code-review/scripts/activation.py +86 -0
- package/skills/code-review/scripts/change_impact.py +357 -0
- package/skills/code-review/scripts/change_shape.py +372 -0
- package/skills/code-review/scripts/change_size.py +212 -0
- package/skills/code-review/scripts/changed_file_list.py +141 -0
- package/skills/code-review/scripts/closing_pass.py +187 -0
- package/skills/code-review/scripts/consolidate.py +277 -0
- package/skills/code-review/scripts/contract_failure_report.py +185 -0
- package/skills/code-review/scripts/dispatch_reconcile.py +66 -0
- package/skills/code-review/scripts/dispatch_waves.py +164 -0
- package/skills/code-review/scripts/finding_signature.py +446 -0
- package/skills/code-review/scripts/ledger.py +283 -0
- package/skills/code-review/scripts/partition.py +169 -0
- package/skills/code-review/scripts/render_tiered_findings.py +274 -0
- package/skills/code-review/scripts/repo_invariants.py +1066 -0
- package/skills/code-review/scripts/review_context_pack.py +306 -0
- package/skills/code-review/scripts/review_round_log.py +345 -0
- package/skills/code-review/scripts/review_value_coverage.py +297 -0
- package/skills/code-review/scripts/validate_review_output.py +467 -0
- package/skills/code-review/sliced-mode.md +205 -0
- package/skills/competitive-analysis/SKILL.md +191 -0
- package/skills/context-loading-protocol/SKILL.md +157 -0
- package/skills/continue/SKILL.md +90 -0
- package/skills/cost-report/SKILL.md +178 -0
- package/skills/coverage-baseline/SKILL.md +335 -0
- package/skills/coverage-baseline/references/multi-project-discovery.md +202 -0
- package/skills/coverage-delta/SKILL.md +181 -0
- package/skills/coverage-delta/references/mutation-gate.md +70 -0
- package/skills/design-doc/SKILL.md +95 -0
- package/skills/design-interrogation/SKILL.md +89 -0
- package/skills/design-it-twice/SKILL.md +91 -0
- package/skills/docker-image-audit/SKILL.md +108 -0
- package/skills/docker-image-audit/references/install-guide.md +64 -0
- package/skills/docker-image-audit/references/report-template.md +73 -0
- package/skills/docker-image-create/SKILL.md +185 -0
- package/skills/domain-analysis/SKILL.md +183 -0
- package/skills/domain-driven-design/SKILL.md +194 -0
- package/skills/exploratory-testing/SKILL.md +108 -0
- package/skills/explore/SKILL.md +51 -0
- package/skills/farley-score/SKILL.md +165 -0
- package/skills/feature-file-validation/SKILL.md +78 -0
- package/skills/feature-file-validation/references/validation-rules.md +115 -0
- package/skills/feedback-learning/SKILL.md +414 -0
- package/skills/fix/SKILL.md +450 -0
- package/skills/freeze/SKILL.md +68 -0
- package/skills/frontend-architecture/SKILL.md +113 -0
- package/skills/gherkin-derive/SKILL.md +630 -0
- package/skills/gherkin-public/SKILL.md +266 -0
- package/skills/governance-compliance/SKILL.md +150 -0
- package/skills/guard/SKILL.md +75 -0
- package/skills/handoff/SKILL.md +139 -0
- package/skills/handoff/references/summary-templates.md +242 -0
- package/skills/harness-audit/SKILL.md +751 -0
- package/skills/harness-audit/scripts/lesson_validate.py +386 -0
- package/skills/harness-audit/scripts/redundancy_criterion.py +188 -0
- package/skills/headless-run/SKILL.md +45 -0
- package/skills/headless-run/scripts/isolated_dispatch.py +381 -0
- package/skills/help/SKILL.md +72 -0
- package/skills/hexagonal-architecture/SKILL.md +85 -0
- package/skills/human-oversight-protocol/SKILL.md +224 -0
- package/skills/issues-from-assessment/SKILL.md +223 -0
- package/skills/issues-from-plan/SKILL.md +133 -0
- package/skills/legacy-code/SKILL.md +132 -0
- package/skills/mermaid-diagramming/SKILL.md +120 -0
- package/skills/mutation-night-watch/SKILL.md +154 -0
- package/skills/mutation-night-watch/references/scheduling.md +135 -0
- package/skills/mutation-testing/SKILL.md +396 -0
- package/skills/mutation-testing/references/languages/csharp-stryker-net.md +676 -0
- package/skills/mutation-testing/references/languages/go-go-mutesting.md +95 -0
- package/skills/mutation-testing/references/languages/java-pitest.md +77 -0
- package/skills/mutation-testing/references/languages/javascript-stryker.md +188 -0
- package/skills/mutation-testing/references/languages/python-mutmut.md +97 -0
- package/skills/mutation-testing/references/time-estimation.md +34 -0
- package/skills/mutation-testing/references/tool-detection.md +15 -0
- package/skills/mutation-testing/references/workflow-callers.md +23 -0
- package/skills/mutation-testing/scripts/__pycache__/xunit_v3_feature_detector.cpython-314.pyc +0 -0
- package/skills/mutation-testing/scripts/csharp_stryker_net_slice_runner.py +635 -0
- package/skills/mutation-testing/scripts/csharp_stryker_net_status_loop.py +525 -0
- package/skills/mutation-testing/scripts/csharp_stryker_net_wrapper.py +681 -0
- package/skills/mutation-testing/scripts/mutation_baseline_reuse.py +292 -0
- package/skills/mutation-testing/scripts/mutation_exclude_policy.py +268 -0
- package/skills/mutation-testing/scripts/mutation_feasibility_gate.py +463 -0
- package/skills/mutation-testing/scripts/mutation_kill_headless.py +331 -0
- package/skills/mutation-testing/scripts/mutation_kill_insert.py +199 -0
- package/skills/mutation-testing/scripts/mutation_kill_insert_python.py +150 -0
- package/skills/mutation-testing/scripts/mutation_kill_loop.py +869 -0
- package/skills/mutation-testing/scripts/mutation_kill_loop_python.py +949 -0
- package/skills/mutation-testing/scripts/mutation_kill_retry.py +592 -0
- package/skills/mutation-testing/scripts/mutation_kill_shared.py +620 -0
- package/skills/mutation-testing/scripts/mutation_nightwatch.py +462 -0
- package/skills/mutation-testing/scripts/mutation_nightwatch_stacks.py +425 -0
- package/skills/mutation-testing/scripts/mutation_report.py +743 -0
- package/skills/mutation-testing/scripts/mutation_report_cli.py +175 -0
- package/skills/mutation-testing/scripts/mutation_safety_gate.py +69 -0
- package/skills/mutation-testing/scripts/stryker_shard_pipeline.py +847 -0
- package/skills/mutation-testing/scripts/stryker_shard_setup.py +440 -0
- package/skills/mutation-testing/scripts/stryker_timeout_retry.py +142 -0
- package/skills/mutation-testing/scripts/xunit_v3_feature_detector.py +341 -0
- package/skills/performance-benchmark/SKILL.md +174 -0
- package/skills/performance-benchmark/examples/report-format.md +43 -0
- package/skills/performance-benchmark/references/benchmark-script.md +169 -0
- package/skills/performance-metrics/SKILL.md +265 -0
- package/skills/plan/SKILL.md +199 -0
- package/skills/plan/references/gherkin-persistence.md +43 -0
- package/skills/plan/references/plan-template.md +182 -0
- package/skills/pr/SKILL.md +289 -0
- package/skills/pr/scripts/gate_retry_state.py +368 -0
- package/skills/project-init/README.md +141 -0
- package/skills/project-init/SKILL.md +1197 -0
- package/skills/project-init/evals/evals.json +200 -0
- package/skills/project-init/references/capability-tools.md +55 -0
- package/skills/project-init/references/configs.md +221 -0
- package/skills/property-based-testing/SKILL.md +121 -0
- package/skills/property-based-testing/fixtures/invariant_fixture.py +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/README.md +42 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/LICENSE +21 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/README.md +263 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/fast-check.js +12147 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/package.json +3 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/types57/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/fast-check.js +12011 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/rolldown-runtime-D7D4PA-g.js +13 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/types57/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/package.json +94 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/LICENSE +21 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/README.md +168 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/RandomGenerator-DcXj09Ch.d.ts +14 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformBigInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformBigInt.js +38 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat32.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat32.js +18 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat64.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat64.js +22 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformInt.js +134 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/RandomGenerator-DcXj09Ch.d.ts +14 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformBigInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformBigInt.js +37 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat32.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat32.js +17 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat64.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat64.js +21 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformInt.js +133 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/congruential32.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/congruential32.js +44 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/mersenne.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/mersenne.js +90 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xoroshiro128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xoroshiro128plus.js +80 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xorshift128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xorshift128plus.js +78 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/package.json +3 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/JumpableRandomGenerator.d.ts +16 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/JumpableRandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/RandomGenerator.d.ts +2 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/RandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/generateN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/generateN.js +8 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/purify.d.ts +12 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/purify.js +9 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/skipN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/skipN.js +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/congruential32.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/congruential32.js +46 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/mersenne.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/mersenne.js +92 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xoroshiro128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xoroshiro128plus.js +82 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xorshift128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xorshift128plus.js +80 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/JumpableRandomGenerator.d.ts +16 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/JumpableRandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/RandomGenerator.d.ts +2 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/RandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/generateN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/generateN.js +9 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/purify.d.ts +12 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/purify.js +10 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/skipN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/skipN.js +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/package.json +133 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/package-lock.json +1179 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/package.json +14 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/roundtrip.js +29 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/roundtrip.properties.test.js +16 -0
- package/skills/property-based-testing/fixtures/no_property_fixture.py +10 -0
- package/skills/property-based-testing/fixtures/roundtrip_fixture.py +16 -0
- package/skills/property-based-testing/references/languages/javascript.md +54 -0
- package/skills/property-based-testing/scripts/detect_and_dispatch.py +80 -0
- package/skills/property-based-testing/scripts/hypothesis_scaffold.py +276 -0
- package/skills/proxy-resilience/SKILL.md +84 -0
- package/skills/quality-gate-pipeline/SKILL.md +184 -0
- package/skills/quality-targets-converge/SKILL.md +254 -0
- package/skills/repo-review/SKILL.md +159 -0
- package/skills/report-pdf/SKILL.md +66 -0
- package/skills/review/SKILL.md +47 -0
- package/skills/review-agent/SKILL.md +152 -0
- package/skills/review-summary/SKILL.md +73 -0
- package/skills/run-report/SKILL.md +70 -0
- package/skills/semantic-duplication-scan/SKILL.md +337 -0
- package/skills/semantic-scan/SKILL.md +53 -0
- package/skills/semgrep-analyze/SKILL.md +139 -0
- package/skills/setup/SKILL.md +1122 -0
- package/skills/ship/SKILL.md +240 -0
- package/skills/source-verification/SKILL.md +210 -0
- package/skills/source-verification/scripts/claim_extractor.py +155 -0
- package/skills/specs/.size-baseline.json +4 -0
- package/skills/specs/SKILL.md +243 -0
- package/skills/specs/references/completeness-checklist.md +83 -0
- package/skills/specs/references/extraction.md +58 -0
- package/skills/specs/references/glossary.md +59 -0
- package/skills/specs/references/persistence.md +115 -0
- package/skills/specs/references/predictability-check.md +77 -0
- package/skills/static-analysis-integration/SKILL.md +235 -0
- package/skills/static-analysis-integration/adapters/_envelope.py +26 -0
- package/skills/static-analysis-integration/adapters/jscpd-adapter.py +66 -0
- package/skills/static-analysis-integration/adapters/lizard-adapter.py +81 -0
- package/skills/static-analysis-integration/adapters/mypy-adapter.py +50 -0
- package/skills/static-analysis-integration/adapters/mypy-src-layout.py +93 -0
- package/skills/static-analysis-integration/adapters/security-review-adapter.py +212 -0
- package/skills/static-analysis-integration/maintenance.md +23 -0
- package/skills/static-analysis-integration/references/language-setup.md +228 -0
- package/skills/static-analysis-integration/references/sarif-parser.md +124 -0
- package/skills/static-analysis-integration/references/security-review-adapter.md +118 -0
- package/skills/static-analysis-integration/references/tool-configs.md +617 -0
- package/skills/static-analysis-integration/rulesets/pmd-quickstart.xml +24 -0
- package/skills/stryker-xunit-v2-shim/SKILL.md +274 -0
- package/skills/stryker-xunit-v2-shim/references/shim-howto.md +256 -0
- package/skills/stryker-xunit-v2-shim/scripts/generate_shim.py +143 -0
- package/skills/systematic-debugging/SKILL.md +130 -0
- package/skills/telemetry/SKILL.md +75 -0
- package/skills/test-audit-disable/SKILL.md +129 -0
- package/skills/test-design/SKILL.md +177 -0
- package/skills/test-design/scripts/__pycache__/internal_double_detector.cpython-314.pyc +0 -0
- package/skills/test-design/scripts/internal_double_detector.py +631 -0
- package/skills/test-design-advisor/SKILL.md +166 -0
- package/skills/test-driven-development/SKILL.md +169 -0
- package/skills/test-health/SKILL.md +262 -0
- package/skills/test-improve/SKILL.md +239 -0
- package/skills/test-improve/references/phase-0-approach-contract.md +228 -0
- package/skills/test-improve/references/phase-1-analyze.md +131 -0
- package/skills/test-improve/references/phase-2-baseline.md +121 -0
- package/skills/test-improve/references/phase-3-derive-gherkin.md +53 -0
- package/skills/test-improve/references/phase-4-plan-fixes.md +34 -0
- package/skills/test-improve/references/phase-5-improve.md +215 -0
- package/skills/test-improve/references/phase-6-refactor-decision.md +45 -0
- package/skills/test-improve/references/phase-7-refactor.md +44 -0
- package/skills/test-improve/references/phase-8-validate.md +66 -0
- package/skills/test-improve/references/phase-9-close-out-prompt.md +11 -0
- package/skills/test-improve/references/phase-9-report.md +62 -0
- package/skills/test-improve/references/review-loop.md +92 -0
- package/skills/test-improve/templates/executive-summary.md +123 -0
- package/skills/threat-modeling/SKILL.md +108 -0
- package/skills/triage/SKILL.md +211 -0
- package/skills/ubiquitous-language/SKILL.md +192 -0
- package/skills/ubiquitous-language/scripts/collect_domain_signals.py +300 -0
- package/skills/unfreeze/SKILL.md +37 -0
- package/skills/upgrade/SKILL.md +31 -0
- package/skills/upgrade/scripts/check_version_drift.py +113 -0
- package/skills/upgrade/scripts/enable_autoupdate.py +149 -0
- package/skills/version/SKILL.md +25 -0
- package/sync/__pycache__/sync_upstream.cpython-314.pyc +0 -0
- package/sync/sync_upstream.py +293 -0
- package/templates/ACCEPTED-RISKS.md.tmpl +46 -0
- package/templates/agents/agent-template.md +151 -0
- package/templates/agents/angular-testing.md +66 -0
- package/templates/agents/csharp-quality.md +63 -0
- package/templates/agents/esm-enforcer.md +52 -0
- package/templates/agents/front-end-testing.md +65 -0
- package/templates/agents/go-quality.md +65 -0
- package/templates/agents/python-quality.md +62 -0
- package/templates/agents/react-testing.md +61 -0
- package/templates/agents/ts-enforcer.md +60 -0
- package/templates/agents/twelve-factor-audit.md +49 -0
- package/tools/entropy-check.py +250 -0
- package/tools/model-hash-verify.py +213 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pbt-js-roundtrip-fixture",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"description": "Fixture project for /property-based-testing's fast-check (JS/TS) path (#2190) — see ../../references/languages/javascript.md",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"test": "vitest run"
|
|
9
|
+
},
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"fast-check": "^4.10.2",
|
|
12
|
+
"vitest": "^5.0.1"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixture module for the fast-check round-trip property path (#2190).
|
|
3
|
+
*
|
|
4
|
+
* Exposes `encode`/`decode` as named exports — the same literal-name
|
|
5
|
+
* round-trip heuristic `hypothesis_scaffold.py`'s Python path looks for
|
|
6
|
+
* (see `../roundtrip_fixture.py`), mirrored here for the JS/TS path
|
|
7
|
+
* documented in `../../references/languages/javascript.md`.
|
|
8
|
+
*
|
|
9
|
+
* `decode(encode(value)) === value` holds for any string because reversal
|
|
10
|
+
* is its own inverse.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Encode a string by reversing it.
|
|
15
|
+
* @param {string} value
|
|
16
|
+
* @returns {string}
|
|
17
|
+
*/
|
|
18
|
+
export function encode(value) {
|
|
19
|
+
return [...value].reverse().join('');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Decode a string produced by encode() by reversing it back.
|
|
24
|
+
* @param {string} value
|
|
25
|
+
* @returns {string}
|
|
26
|
+
*/
|
|
27
|
+
export function decode(value) {
|
|
28
|
+
return [...value].reverse().join('');
|
|
29
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated fast-check property test — round-trip property for
|
|
3
|
+
* encode/decode. Shape documented in
|
|
4
|
+
* ../../references/languages/javascript.md; do not hand-edit, regenerate if
|
|
5
|
+
* roundtrip.js changes.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it } from 'vitest';
|
|
8
|
+
import fc from 'fast-check';
|
|
9
|
+
|
|
10
|
+
import { encode, decode } from './roundtrip.js';
|
|
11
|
+
|
|
12
|
+
describe('encode/decode round-trip property', () => {
|
|
13
|
+
it('decode(encode(x)) === x for any string', () => {
|
|
14
|
+
fc.assert(fc.property(fc.string(), (x) => decode(encode(x)) === x));
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""Fixture module for hypothesis_scaffold.py's negative case (#2190).
|
|
2
|
+
|
|
3
|
+
`add_one` has no round-trip counterpart and no documented postcondition, so
|
|
4
|
+
neither heuristic matches — the scaffold should derive no property for it.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def add_one(value: int) -> int:
|
|
9
|
+
"""Add one to a value."""
|
|
10
|
+
return value + 1
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Fixture module for hypothesis_scaffold.py's round-trip heuristic (#2190).
|
|
2
|
+
|
|
3
|
+
Exposes a module-level `encode`/`decode` pair by name — the exact literal
|
|
4
|
+
names the scaffold's heuristic looks for. `decode(encode(x)) == x` holds for
|
|
5
|
+
any string because reversal is its own inverse.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def encode(value: str) -> str:
|
|
10
|
+
"""Encode a string by reversing it."""
|
|
11
|
+
return value[::-1]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def decode(value: str) -> str:
|
|
15
|
+
"""Decode a string produced by encode() by reversing it back."""
|
|
16
|
+
return value[::-1]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Property-Based Testing — JavaScript / TypeScript (fast-check)
|
|
2
|
+
|
|
3
|
+
Tool: [fast-check](https://fast-check.dev/). Detection: `package.json`/`tsconfig.json` present — project-init's own JS/TS stack-detection signal (see [`SKILL.md` → Step 1](../../SKILL.md#step-1-detect-the-target-language-reuse-project-init-never-re-derive); this doc never re-derives it).
|
|
4
|
+
|
|
5
|
+
This is the JS/TS equivalent of [Step 4.1's Python scaffold](../../scripts/hypothesis_scaffold.py) (`hypothesis` → `fast-check`). Same narrow, explicit heuristic — do not extend without updating this doc:
|
|
6
|
+
|
|
7
|
+
1. **Round-trip** — the target module exports both a function literally named `encode` and one literally named `decode` (named exports, or both methods on the same exported class/object) and the requested function is one of that pair. Generates a test asserting `decode(encode(x)) === x`.
|
|
8
|
+
2. **Invariant** — the target function's JSDoc contains a recognized postcondition phrase (the same phrase list as the Python path — `returns sorted`, `is idempotent`) documented near a type signature (a `@param`/`@returns` JSDoc tag, or a TypeScript type annotation on the function). Generates a test asserting that invariant.
|
|
9
|
+
3. **Neither matches** — no file is written; report the exact same "No property derived" message [Step 4.1](../../scripts/hypothesis_scaffold.py) defines (`NO_PROPERTY_MESSAGE`), substituting the target function name — this doc does not define a second copy of that message.
|
|
10
|
+
|
|
11
|
+
This is deliberately narrow, matching the Python path's own stated scope — not a general contract-inference engine.
|
|
12
|
+
|
|
13
|
+
## Install / detect
|
|
14
|
+
|
|
15
|
+
Per [`SKILL.md` → Step 3](../../SKILL.md#step-3-install-the-property-testing-tool-if-missing): `npm install --save-dev fast-check`, mirroring project-init's existing `npm` devDependency install shape for `oxlint`/`@playwright/test` — never a global/user-level install. Confirm it resolved:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm ls fast-check
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Generation approach
|
|
22
|
+
|
|
23
|
+
Emit a runnable `<name>.properties.test.js` using `fc.assert(fc.property(...))`, run via this repo's JS test runner convention (`npx vitest run`, per [project-init's own generated `vitest.config.js`](../../../project-init/SKILL.md) — see [`fixtures/js-roundtrip/`](../../fixtures/js-roundtrip/) for a working example project):
|
|
24
|
+
|
|
25
|
+
```js
|
|
26
|
+
import { describe, it } from 'vitest';
|
|
27
|
+
import fc from 'fast-check';
|
|
28
|
+
|
|
29
|
+
import { encode, decode } from './roundtrip.js';
|
|
30
|
+
|
|
31
|
+
describe('encode/decode round-trip property', () => {
|
|
32
|
+
it('decode(encode(x)) === x for any string', () => {
|
|
33
|
+
fc.assert(fc.property(fc.string(), (x) => decode(encode(x)) === x));
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
An invariant test follows the same `fc.assert(fc.property(<arbitrary>, (value) => <assertion>))` shape, with the arbitrary chosen from the target's parameter type the same narrow way Step 4.1's `_STRATEGY_BY_ANNOTATION` map picks a Hypothesis strategy (e.g. a `number[]` parameter → `fc.array(fc.integer())`; no recognized annotation → `fc.string()`).
|
|
39
|
+
|
|
40
|
+
## Test determinism & the vendoring boundary
|
|
41
|
+
|
|
42
|
+
`fast-check` (and its own only dependency, `pure-rand`) is **vendored into this fixture's checked-in `node_modules`** rather than installed live during a test run — this repo's deterministic-tooling standard, the same posture `chk_python_ceiling` takes as `exempt`-but-still-treated-as-blocking in [`.github/required-status-checks.json`](../../../../../../.github/required-status-checks.json). Both packages are pure JS with no native/platform-specific binaries (~1.8M total), so the vendored copy is byte-identical on every dev machine and CI runner. See [`fixtures/js-roundtrip/README.md`](../../fixtures/js-roundtrip/README.md) for the exact `git add -f` mechanics (the repo-root `.gitignore`'s blanket `node_modules/` rule otherwise excludes it, and a nested `.gitignore` cannot un-ignore a directory a parent `.gitignore` already excludes).
|
|
43
|
+
|
|
44
|
+
`vitest` itself is **not** vendored — newer vitest pulls in platform-native binaries (`@rolldown/binding-<platform>`, `lightningcss-<platform>`) that would silently break on a different host OS/arch than whatever built the vendored copy (this repo's CI is `ubuntu-*`, but maintainers develop on macOS). Resolving `vitest` via `npx vitest run` is project-init's own normal live-install path for the project's test runner, unaffected by this skill's own vendoring requirement — that requirement is scoped to `fast-check`, the property library this skill is actually generating tests against.
|
|
45
|
+
|
|
46
|
+
## Fixture
|
|
47
|
+
|
|
48
|
+
[`fixtures/js-roundtrip/`](../../fixtures/js-roundtrip/) — a minimal project with `roundtrip.js` (an `encode`/`decode` pair, string reversal) and the fast-check test a scaffold targeting it would generate (`roundtrip.properties.test.js`). Runs green via:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
cd fixtures/js-roundtrip
|
|
52
|
+
npm install # fetches vitest; fast-check/pure-rand are already vendored
|
|
53
|
+
npx vitest run
|
|
54
|
+
```
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""Thin dispatch helper for /property-based-testing's SKILL.md procedure
|
|
2
|
+
(#2190, Step 4.2).
|
|
3
|
+
|
|
4
|
+
Language detection itself is NOT implemented here. `SKILL.md` runs
|
|
5
|
+
project-init's own stack-detection step first —
|
|
6
|
+
`${CLAUDE_PLUGIN_ROOT}/skills/project-init/SKILL.md` § "Step 1: Detect the
|
|
7
|
+
stack" — and passes its result into this module via `--language`. This
|
|
8
|
+
module only decides, from that already-detected value, whether the skill
|
|
9
|
+
can proceed: it never re-derives a language from project-init's own
|
|
10
|
+
manifest-file detection signals itself.
|
|
11
|
+
|
|
12
|
+
On an unsupported or missing language it prints the exact message the
|
|
13
|
+
Gherkin "Unsupported or undetected language" scenario requires and returns
|
|
14
|
+
a non-zero exit code, so `SKILL.md`'s procedure can stop with no partial
|
|
15
|
+
run. On a supported language it prints which generator the procedure
|
|
16
|
+
should dispatch to next and returns 0.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
|
|
23
|
+
# The only two languages this skill scaffolds properties for today. `JS/TS`
|
|
24
|
+
# is project-init's own stack-detection display name (SKILL.md § "Step 1:
|
|
25
|
+
# Detect the stack") — this module matches it verbatim, never a spelled-out
|
|
26
|
+
# "JavaScript/TypeScript", since that is the actual value Step 1 hands this
|
|
27
|
+
# script. Python dispatches to Step 4.1's hypothesis_scaffold.py; JS/TS
|
|
28
|
+
# dispatches to the fast-check path (references/languages/javascript.md).
|
|
29
|
+
SUPPORTED_LANGUAGES = ("Python", "JS/TS")
|
|
30
|
+
|
|
31
|
+
UNSUPPORTED_MESSAGE = "Unsupported language: {language} — supported: Python, JS/TS."
|
|
32
|
+
|
|
33
|
+
_DISPATCH = {
|
|
34
|
+
"Python": "Hypothesis (scripts/hypothesis_scaffold.py)",
|
|
35
|
+
"JS/TS": "fast-check (references/languages/javascript.md)",
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def is_supported(language: str | None) -> bool:
|
|
40
|
+
"""True when `language` is one of the two languages this skill supports."""
|
|
41
|
+
return language in SUPPORTED_LANGUAGES
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def unsupported_language_message(language: str | None) -> str:
|
|
45
|
+
"""Render the exact unsupported-language message. `language` is the
|
|
46
|
+
value project-init's stack detection (see module docstring) returned —
|
|
47
|
+
`None`/empty when detection failed or returned nothing, in which case
|
|
48
|
+
the message interpolates the literal word "unknown"."""
|
|
49
|
+
return UNSUPPORTED_MESSAGE.format(language=language or "unknown")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def main(argv: list | None = None) -> int:
|
|
53
|
+
parser = argparse.ArgumentParser(
|
|
54
|
+
description=(
|
|
55
|
+
"Decide whether /property-based-testing can proceed for an "
|
|
56
|
+
"already-detected language (from project-init's stack "
|
|
57
|
+
"detection) and print the unsupported-language message when it "
|
|
58
|
+
"can't."
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
parser.add_argument(
|
|
62
|
+
"--language",
|
|
63
|
+
default=None,
|
|
64
|
+
help=(
|
|
65
|
+
"the language project-init's stack detection returned; omit "
|
|
66
|
+
"when detection failed or returned nothing"
|
|
67
|
+
),
|
|
68
|
+
)
|
|
69
|
+
args = parser.parse_args(argv)
|
|
70
|
+
|
|
71
|
+
if not is_supported(args.language):
|
|
72
|
+
print(unsupported_language_message(args.language))
|
|
73
|
+
return 1
|
|
74
|
+
|
|
75
|
+
print(f"Detected {args.language} — dispatching to {_DISPATCH[args.language]}")
|
|
76
|
+
return 0
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
if __name__ == "__main__":
|
|
80
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"""Hypothesis property-test scaffold for a single target Python function (#2190).
|
|
2
|
+
|
|
3
|
+
This module's own analysis is stdlib-only (`ast`), per ADR 0014 — no
|
|
4
|
+
third-party imports here. The *generated* test file it writes imports the
|
|
5
|
+
third-party `hypothesis` library; that import lives only in the emitted
|
|
6
|
+
file, never in this script.
|
|
7
|
+
|
|
8
|
+
Narrow, explicit heuristic (do not extend without updating this docstring):
|
|
9
|
+
|
|
10
|
+
1. Round-trip: the target module defines a function literally named
|
|
11
|
+
`encode` and a function literally named `decode` — either both at module
|
|
12
|
+
level, or both as methods of the same class — and the requested function
|
|
13
|
+
is one of that pair. Generates a test asserting
|
|
14
|
+
`decode(encode(x)) == x`.
|
|
15
|
+
2. Invariant: the target function's docstring contains a recognized
|
|
16
|
+
postcondition phrase (see `INVARIANT_PHRASES`) and the function carries
|
|
17
|
+
at least one type annotation (parameter or return) — the "near a type
|
|
18
|
+
hint" signal. Generates a test asserting that invariant.
|
|
19
|
+
3. Neither matches: no file is written; the exact negative message is
|
|
20
|
+
printed to stdout.
|
|
21
|
+
|
|
22
|
+
This is deliberately narrow — it is not a general contract-inference
|
|
23
|
+
engine. Extending the phrase list or the type-annotation proximity check is
|
|
24
|
+
in scope; inferring arbitrary contracts from prose is not.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import argparse
|
|
30
|
+
import ast
|
|
31
|
+
import os
|
|
32
|
+
from dataclasses import dataclass
|
|
33
|
+
|
|
34
|
+
# Postcondition phrase -> human label used only for readability; the phrase
|
|
35
|
+
# itself is the literal substring matched (case-insensitively) against the
|
|
36
|
+
# target function's docstring.
|
|
37
|
+
INVARIANT_PHRASES = ("returns sorted", "is idempotent")
|
|
38
|
+
|
|
39
|
+
NO_PROPERTY_MESSAGE = (
|
|
40
|
+
"No property derived for {function} — no round-trip pair or documented "
|
|
41
|
+
"invariant found nearby. Add a docstring postcondition (e.g. a 'returns "
|
|
42
|
+
"sorted'/'is idempotent'-style phrase) to make one derivable."
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
# Narrow annotation -> Hypothesis strategy expression map. Anything not
|
|
46
|
+
# listed here falls back to st.text() — this is not general type inference.
|
|
47
|
+
_STRATEGY_BY_ANNOTATION = {
|
|
48
|
+
"str": "st.text()",
|
|
49
|
+
"int": "st.integers()",
|
|
50
|
+
"float": "st.floats(allow_nan=False, allow_infinity=False)",
|
|
51
|
+
"bool": "st.booleans()",
|
|
52
|
+
"list[int]": "st.lists(st.integers())",
|
|
53
|
+
"List[int]": "st.lists(st.integers())",
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass
|
|
58
|
+
class RoundTripProperty:
|
|
59
|
+
encode_name: str
|
|
60
|
+
decode_name: str
|
|
61
|
+
class_name: str | None = None
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@dataclass
|
|
65
|
+
class InvariantProperty:
|
|
66
|
+
function_name: str
|
|
67
|
+
phrase: str
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _module_name(module_path: str) -> str:
|
|
71
|
+
"""Derive the importable module name a generated test's `from {module}
|
|
72
|
+
import ...` line will use.
|
|
73
|
+
|
|
74
|
+
Raises `ValueError` when the basename isn't a valid Python identifier —
|
|
75
|
+
this value is interpolated unescaped into a generated test file's import
|
|
76
|
+
statement (`_render_roundtrip_test`/`_render_invariant_test`), so a
|
|
77
|
+
filename engineered to contain e.g. a newline could otherwise inject
|
|
78
|
+
arbitrary statements into a file pytest later collects and executes
|
|
79
|
+
(security-review finding). Every other interpolated value on that path
|
|
80
|
+
is already constrained to a safe shape: `encode`/`decode` are literals,
|
|
81
|
+
`class_name`/`function_name` are `ast.FunctionDef`/`ClassDef.name`
|
|
82
|
+
values (valid identifiers by construction), and `module_dir` is
|
|
83
|
+
`repr()`-escaped at render time.
|
|
84
|
+
"""
|
|
85
|
+
base = os.path.basename(module_path)
|
|
86
|
+
name = base.removesuffix(".py")
|
|
87
|
+
if not name.isidentifier():
|
|
88
|
+
raise ValueError(
|
|
89
|
+
f"unsupported module filename {module_path!r}: {name!r} is not a "
|
|
90
|
+
"valid Python identifier, so it can't be used in a generated "
|
|
91
|
+
"test's import statement"
|
|
92
|
+
)
|
|
93
|
+
return name
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _parse_module(module_path: str) -> ast.Module:
|
|
97
|
+
with open(module_path, "r", encoding="utf-8") as handle:
|
|
98
|
+
source = handle.read()
|
|
99
|
+
return ast.parse(source, filename=module_path)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _find_function(tree: ast.Module, name: str) -> ast.FunctionDef | None:
|
|
103
|
+
"""Module-level functions only — deliberately not `ast.walk`, which
|
|
104
|
+
would also match a same-named method inside a class body. The invariant
|
|
105
|
+
render path assumes a module-level import (`from {module} import
|
|
106
|
+
{function_name}`), which is wrong for a method (no `self`/receiver, no
|
|
107
|
+
class import/instantiation) — see `find_roundtrip_pair` for the
|
|
108
|
+
separate, already class-aware handling the round-trip path has."""
|
|
109
|
+
for node in tree.body:
|
|
110
|
+
if isinstance(node, ast.FunctionDef) and node.name == name:
|
|
111
|
+
return node
|
|
112
|
+
return None
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def find_roundtrip_pair(tree: ast.Module) -> RoundTripProperty | None:
|
|
116
|
+
"""Locate a literal `encode`/`decode` pair at module level or as methods
|
|
117
|
+
of one class. Returns None when no such pair exists."""
|
|
118
|
+
module_level = {n.name for n in tree.body if isinstance(n, ast.FunctionDef)}
|
|
119
|
+
if "encode" in module_level and "decode" in module_level:
|
|
120
|
+
return RoundTripProperty(encode_name="encode", decode_name="decode")
|
|
121
|
+
|
|
122
|
+
for node in tree.body:
|
|
123
|
+
if isinstance(node, ast.ClassDef):
|
|
124
|
+
methods = {n.name for n in node.body if isinstance(n, ast.FunctionDef)}
|
|
125
|
+
if "encode" in methods and "decode" in methods:
|
|
126
|
+
return RoundTripProperty(
|
|
127
|
+
encode_name="encode", decode_name="decode", class_name=node.name
|
|
128
|
+
)
|
|
129
|
+
return None
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _has_nearby_type_hint(func: ast.FunctionDef) -> bool:
|
|
133
|
+
"""Narrow proximity check: the function carries at least one type
|
|
134
|
+
annotation (a parameter or its return type)."""
|
|
135
|
+
if func.returns is not None:
|
|
136
|
+
return True
|
|
137
|
+
return any(arg.annotation is not None for arg in func.args.args)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def find_invariant(func: ast.FunctionDef) -> InvariantProperty | None:
|
|
141
|
+
docstring = ast.get_docstring(func) or ""
|
|
142
|
+
if not docstring or not _has_nearby_type_hint(func):
|
|
143
|
+
return None
|
|
144
|
+
lowered = docstring.lower()
|
|
145
|
+
for phrase in INVARIANT_PHRASES:
|
|
146
|
+
if phrase in lowered:
|
|
147
|
+
return InvariantProperty(function_name=func.name, phrase=phrase)
|
|
148
|
+
return None
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _first_arg_strategy(func: ast.FunctionDef) -> str:
|
|
152
|
+
args = func.args.args
|
|
153
|
+
if not args or args[0].annotation is None:
|
|
154
|
+
return "st.text()"
|
|
155
|
+
annotation_text = ast.unparse(args[0].annotation)
|
|
156
|
+
return _STRATEGY_BY_ANNOTATION.get(annotation_text, "st.text()")
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _render_roundtrip_test(
|
|
160
|
+
prop: RoundTripProperty, module_path: str, module_name: str
|
|
161
|
+
) -> str:
|
|
162
|
+
module_dir = os.path.dirname(os.path.abspath(module_path))
|
|
163
|
+
if prop.class_name:
|
|
164
|
+
import_line = f"from {module_name} import {prop.class_name}"
|
|
165
|
+
setup = f" obj = {prop.class_name}()\n"
|
|
166
|
+
call_encode = f"obj.{prop.encode_name}(x)"
|
|
167
|
+
call_decode = "obj.{}({})".format(prop.decode_name, "encoded")
|
|
168
|
+
else:
|
|
169
|
+
import_line = f"from {module_name} import {prop.encode_name}, {prop.decode_name}"
|
|
170
|
+
setup = ""
|
|
171
|
+
call_encode = f"{prop.encode_name}(x)"
|
|
172
|
+
call_decode = f"{prop.decode_name}(encoded)"
|
|
173
|
+
|
|
174
|
+
return (
|
|
175
|
+
f'"""Generated by hypothesis_scaffold.py — round-trip property test\n'
|
|
176
|
+
f"for {prop.encode_name}/{prop.decode_name}. Do not hand-edit;\n"
|
|
177
|
+
f'regenerate via /property-based-testing if the source module changes.\n"""\n\n'
|
|
178
|
+
"import os\n"
|
|
179
|
+
"import sys\n\n"
|
|
180
|
+
f"sys.path.insert(0, {module_dir!r})\n\n"
|
|
181
|
+
"from hypothesis import given\n"
|
|
182
|
+
"from hypothesis import strategies as st\n\n"
|
|
183
|
+
f"{import_line}\n\n\n"
|
|
184
|
+
"@given(st.text())\n"
|
|
185
|
+
f"def test_{prop.encode_name}_{prop.decode_name}_roundtrip(x):\n"
|
|
186
|
+
f"{setup}"
|
|
187
|
+
f" encoded = {call_encode}\n"
|
|
188
|
+
f" assert {call_decode} == x\n"
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def _render_invariant_test(
|
|
193
|
+
prop: InvariantProperty, func: ast.FunctionDef, module_path: str, module_name: str
|
|
194
|
+
) -> str:
|
|
195
|
+
module_dir = os.path.dirname(os.path.abspath(module_path))
|
|
196
|
+
strategy_expr = _first_arg_strategy(func)
|
|
197
|
+
if prop.phrase == "returns sorted":
|
|
198
|
+
assertion = (
|
|
199
|
+
f" result = {prop.function_name}(value)\n"
|
|
200
|
+
" assert result == sorted(result)\n"
|
|
201
|
+
)
|
|
202
|
+
elif prop.phrase == "is idempotent":
|
|
203
|
+
assertion = (
|
|
204
|
+
f" once = {prop.function_name}(value)\n"
|
|
205
|
+
f" twice = {prop.function_name}(once)\n"
|
|
206
|
+
" assert twice == once\n"
|
|
207
|
+
)
|
|
208
|
+
else: # pragma: no cover - defensive, INVARIANT_PHRASES is exhaustive above
|
|
209
|
+
assertion = f" {prop.function_name}(value)\n"
|
|
210
|
+
|
|
211
|
+
return (
|
|
212
|
+
f'"""Generated by hypothesis_scaffold.py — invariant property test\n'
|
|
213
|
+
f'for {prop.function_name} ("{prop.phrase}"). Do not hand-edit;\n'
|
|
214
|
+
f'regenerate via /property-based-testing if the source module changes.\n"""\n\n'
|
|
215
|
+
"import sys\n\n"
|
|
216
|
+
f"sys.path.insert(0, {module_dir!r})\n\n"
|
|
217
|
+
"from hypothesis import given\n"
|
|
218
|
+
"from hypothesis import strategies as st\n\n"
|
|
219
|
+
f"from {module_name} import {prop.function_name}\n\n\n"
|
|
220
|
+
f"@given({strategy_expr})\n"
|
|
221
|
+
f"def test_{prop.function_name}_invariant(value):\n"
|
|
222
|
+
f"{assertion}"
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def scaffold(module_path: str, function_name: str, out_dir: str) -> str | None:
|
|
227
|
+
"""Analyze `module_path` for a property involving `function_name`.
|
|
228
|
+
|
|
229
|
+
On a match, writes `test_<function_name>_properties.py` into `out_dir`
|
|
230
|
+
and returns its path. On no match, prints the exact negative message to
|
|
231
|
+
stdout and returns None without writing any file.
|
|
232
|
+
"""
|
|
233
|
+
tree = _parse_module(module_path)
|
|
234
|
+
module_name = _module_name(module_path)
|
|
235
|
+
|
|
236
|
+
roundtrip = find_roundtrip_pair(tree)
|
|
237
|
+
if roundtrip and function_name in (roundtrip.encode_name, roundtrip.decode_name):
|
|
238
|
+
content = _render_roundtrip_test(roundtrip, module_path, module_name)
|
|
239
|
+
else:
|
|
240
|
+
func = _find_function(tree, function_name)
|
|
241
|
+
invariant = find_invariant(func) if func is not None else None
|
|
242
|
+
if func is not None and invariant:
|
|
243
|
+
content = _render_invariant_test(invariant, func, module_path, module_name)
|
|
244
|
+
else:
|
|
245
|
+
print(NO_PROPERTY_MESSAGE.format(function=function_name))
|
|
246
|
+
return None
|
|
247
|
+
|
|
248
|
+
os.makedirs(out_dir, exist_ok=True)
|
|
249
|
+
out_path = os.path.join(out_dir, f"test_{function_name}_properties.py")
|
|
250
|
+
with open(out_path, "w", encoding="utf-8") as handle:
|
|
251
|
+
handle.write(content)
|
|
252
|
+
return out_path
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def main(argv: list | None = None) -> int:
|
|
256
|
+
parser = argparse.ArgumentParser(
|
|
257
|
+
description="Scaffold a Hypothesis property test for a Python function."
|
|
258
|
+
)
|
|
259
|
+
parser.add_argument("module_path", help="path to the target module")
|
|
260
|
+
parser.add_argument("function_name", help="name of the function to target")
|
|
261
|
+
parser.add_argument(
|
|
262
|
+
"--out-dir",
|
|
263
|
+
default=None,
|
|
264
|
+
help="directory to write the generated test into (default: module's directory)",
|
|
265
|
+
)
|
|
266
|
+
args = parser.parse_args(argv)
|
|
267
|
+
out_dir = args.out_dir or os.path.dirname(os.path.abspath(args.module_path))
|
|
268
|
+
result = scaffold(args.module_path, args.function_name, out_dir)
|
|
269
|
+
if result:
|
|
270
|
+
print(f"Wrote {result}")
|
|
271
|
+
return 0
|
|
272
|
+
return 1
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
if __name__ == "__main__":
|
|
276
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: proxy-resilience
|
|
3
|
+
description: Bounded backoff, retry ceiling, and escalation convention for repeated failures against a corporate Anthropic proxy. Use when you observe repeated HTTP 429 rate-limit responses or connection-refused errors that reference a proxy host, or the user says "proxy is rate-limiting", "429 from the proxy", "proxy connection refused", or "corporate proxy is flaky".
|
|
4
|
+
role: worker
|
|
5
|
+
user-invocable: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Proxy Resilience
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
A corporate proxy fronting Anthropic API traffic enforces its own rate
|
|
13
|
+
limits and allowlist behavior, independent of the underlying account's tier
|
|
14
|
+
— a 429 or connection-refused error in a proxy-fronted session is a
|
|
15
|
+
different failure class than a direct-API rate limit (already retried
|
|
16
|
+
natively by the harness; do not apply this convention to those).
|
|
17
|
+
|
|
18
|
+
Covers two related failure modes sharing one root cause (transient
|
|
19
|
+
corporate-proxy unavailability) and one remedy shape (bounded backoff, a
|
|
20
|
+
hard retry ceiling, then escalate): rate-limit errors (issue #723, this
|
|
21
|
+
file) and connection-refused errors (issue #724). Documented together so
|
|
22
|
+
either failure mode is found in one place.
|
|
23
|
+
|
|
24
|
+
## Detection Signals
|
|
25
|
+
|
|
26
|
+
Treat an error as **proxy rate-limiting** when it shows *all* of:
|
|
27
|
+
|
|
28
|
+
1. The session is known to run against a corporate proxy (e.g. the
|
|
29
|
+
`anthropic-proxy` operating note, a proxy env var/base URL, or a
|
|
30
|
+
previously observed proxy hostname in error text).
|
|
31
|
+
2. The error text contains HTTP 429, "rate limit", "too many requests", or
|
|
32
|
+
"quota exceeded".
|
|
33
|
+
3. The error references the proxy host, not `api.anthropic.com` directly.
|
|
34
|
+
|
|
35
|
+
Treat an error as **proxy connection-refused** (#724) when it shows (1)
|
|
36
|
+
above plus a connection-level failure (`ECONNREFUSED`, "connection
|
|
37
|
+
refused", "could not connect", timeout connecting to the proxy host).
|
|
38
|
+
|
|
39
|
+
## Backoff Schedule
|
|
40
|
+
|
|
41
|
+
Apply exponential backoff **per call site** (one place repeatedly issuing
|
|
42
|
+
the same request — e.g. one subagent retrying one API call, not the whole
|
|
43
|
+
session): **initial delay 1s, ×2 multiplier, 60s cap, max 5 attempts.**
|
|
44
|
+
|
|
45
|
+
| Attempt | 1 | 2 | 3 | 4 | 5 (last) |
|
|
46
|
+
|---------|---|---|---|---|---|
|
|
47
|
+
| Delay | 1s | 2s | 4s | 8s | 16s |
|
|
48
|
+
|
|
49
|
+
After 5 retries at the same call site still fail with a proxy rate-limit
|
|
50
|
+
error, stop retrying and escalate (below) rather than looping further. Five
|
|
51
|
+
is deliberately far below any plausible recurrence of "28 rate-limit errors
|
|
52
|
+
in one session" — that scale breaches this ceiling on the first call site
|
|
53
|
+
alone, well before reaching 28.
|
|
54
|
+
|
|
55
|
+
## Escalation Rule
|
|
56
|
+
|
|
57
|
+
Once the retry budget (5 attempts) is exhausted at a call site:
|
|
58
|
+
|
|
59
|
+
1. **Stop retrying that call site** — no indefinite loop, no silent failure.
|
|
60
|
+
2. Surface one plain-language line naming the proxy as the suspected cause,
|
|
61
|
+
e.g.: "Repeated rate-limit errors from the corporate Anthropic proxy —
|
|
62
|
+
pausing retries here; consider reducing concurrent requests or retrying
|
|
63
|
+
later."
|
|
64
|
+
3. Let the user decide whether to continue, reduce concurrency, or pause.
|
|
65
|
+
Escalate and wait for direction rather than unilaterally abandoning the
|
|
66
|
+
task.
|
|
67
|
+
|
|
68
|
+
## Concurrency Guidance
|
|
69
|
+
|
|
70
|
+
Parallel subagent/Task fan-out against a shared proxy allowlist is a likely
|
|
71
|
+
amplifier of rate-limit bursts — concurrent requests can exhaust the
|
|
72
|
+
proxy's rate window faster than a serial stream would. If repeated 429s are
|
|
73
|
+
observed, reduce concurrent dispatch (e.g. lower
|
|
74
|
+
`DEV_TEAM_MAX_PARALLEL_BUILDS`, or serialize the specific failing call site)
|
|
75
|
+
before increasing backoff further; prefer narrow serialization over
|
|
76
|
+
session-wide serialization.
|
|
77
|
+
|
|
78
|
+
## Anti-Patterns
|
|
79
|
+
|
|
80
|
+
| Anti-pattern | Why it's wrong | What to do instead |
|
|
81
|
+
| ------------- | --------------- | ------------------- |
|
|
82
|
+
| Retrying immediately with no delay | Compounds the burst that triggered the 429 | Apply the backoff schedule above |
|
|
83
|
+
| Treating a direct Anthropic 429 the same as a proxy 429 | The harness already retries direct API limits; double-retrying wastes time | Confirm proxy involvement (Detection Signals) first |
|
|
84
|
+
| Increasing concurrency to "push through" a rate limit | Makes proxy throttling worse | Reduce concurrent dispatch instead |
|