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,328 @@
|
|
|
1
|
+
"""stub_extractors._common — shared lexical-scanning primitives, the two
|
|
2
|
+
structural-error sentinels, and the dataclasses every per-language extractor
|
|
3
|
+
in this package returns.
|
|
4
|
+
|
|
5
|
+
Hoisted out of a single `_stub_extractors.py` once that file grew past the
|
|
6
|
+
~300-line size ceiling (plan-review structure finding) — one shared module
|
|
7
|
+
plus one file per language keeps each file's responsibility narrow, mirroring
|
|
8
|
+
how `_vendored_tree.py` and `_gherkin_text.py` were already extracted from
|
|
9
|
+
their own call sites once a second/third occurrence appeared.
|
|
10
|
+
|
|
11
|
+
Stdlib-only. (ADR 0014/0015).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
|
|
18
|
+
# The two structural-error sentinels every extractor (and gherkin_stub_merge.py
|
|
19
|
+
# itself) shares — named once so call sites and tests reference the constant,
|
|
20
|
+
# never a repeated raw literal.
|
|
21
|
+
ERROR_UNBALANCED_BRACES = "unbalanced-braces"
|
|
22
|
+
ERROR_DANGLING_ANNOTATION = "dangling-annotation"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class StepBinding:
|
|
27
|
+
"""One parsed step-definition binding: its step-pattern text, the full
|
|
28
|
+
bounded verbatim source span (`text[start:end]`), and whether its body
|
|
29
|
+
contains a pending marker.
|
|
30
|
+
|
|
31
|
+
`decl_start`/`decl_text` are Go-only (`None` for JS/TS, Java, C#, where
|
|
32
|
+
the callback/method body is adjacent to the call/annotation, so
|
|
33
|
+
`text[start:end]` already captures everything). Go's registration
|
|
34
|
+
(`sc.Step(pattern, funcName)`) and the `funcName` function it references
|
|
35
|
+
are non-adjacent source regions — `decl_start` is where that referenced
|
|
36
|
+
function's own declaration begins, and `decl_text` is its full verbatim
|
|
37
|
+
source. Without these, reusing `text` as a new candidate's insertable
|
|
38
|
+
content silently drops the function declaration a Go step needs to
|
|
39
|
+
compile (bug caught by this module's own runtime CLI verification,
|
|
40
|
+
fixed here rather than shipped)."""
|
|
41
|
+
|
|
42
|
+
pattern: str
|
|
43
|
+
text: str
|
|
44
|
+
start: int # char offset into the parsed text, inclusive
|
|
45
|
+
end: int # char offset, exclusive — always a line boundary (see extend_to_line_end)
|
|
46
|
+
is_pending: bool
|
|
47
|
+
decl_start: int | None = None
|
|
48
|
+
decl_text: str | None = None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass
|
|
52
|
+
class ParseResult:
|
|
53
|
+
bindings: list | None
|
|
54
|
+
error: str | None
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# ---------------------------------------------------------------------------
|
|
58
|
+
# Shared lexical scanning — string/char-literal/comment awareness so brace and
|
|
59
|
+
# paren counting never miscounts a bracket embedded in either.
|
|
60
|
+
# ---------------------------------------------------------------------------
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def skip_quoted(text: str, i: int, quote: str) -> int:
|
|
64
|
+
"""`text[i] == quote`. Return the index just past the matching unescaped
|
|
65
|
+
closing `quote` (backslash-escaping honored), or `len(text)` if the
|
|
66
|
+
string never closes before EOF."""
|
|
67
|
+
j = i + 1
|
|
68
|
+
n = len(text)
|
|
69
|
+
while j < n:
|
|
70
|
+
if text[j] == "\\":
|
|
71
|
+
j += 2
|
|
72
|
+
continue
|
|
73
|
+
if text[j] == quote:
|
|
74
|
+
return j + 1
|
|
75
|
+
j += 1
|
|
76
|
+
return n
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def skip_verbatim_string(text: str, i: int) -> int:
|
|
80
|
+
"""`text[i:i+2] == '@\"'` (a C# verbatim string). A doubled `\"\"` inside
|
|
81
|
+
is an escaped quote, not the terminator — distinct from `skip_quoted`'s
|
|
82
|
+
backslash-escaping rule."""
|
|
83
|
+
j = i + 2
|
|
84
|
+
n = len(text)
|
|
85
|
+
while j < n:
|
|
86
|
+
if text[j] == '"':
|
|
87
|
+
if j + 1 < n and text[j + 1] == '"':
|
|
88
|
+
j += 2
|
|
89
|
+
continue
|
|
90
|
+
return j + 1
|
|
91
|
+
j += 1
|
|
92
|
+
return n
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def skip_regex_literal(text: str, i: int) -> int:
|
|
96
|
+
"""`text[i] == '/'` starting a JS/TS regex literal (e.g.
|
|
97
|
+
`/^I have (\\d+) cukes$/`) — a real, common cucumber-js step-pattern
|
|
98
|
+
convention alongside a quoted string. Return the index just past the
|
|
99
|
+
matching unescaped closing `/` (backslash-escaping honored, mirroring
|
|
100
|
+
`skip_quoted`), or `len(text)` if it never closes. Only called from
|
|
101
|
+
`extract_first_string` at a pattern-argument position, where a leading
|
|
102
|
+
`/` unambiguously starts a regex literal (comments are `//`/`/*`,
|
|
103
|
+
already dispatched to `skip_lexical_token` before this is ever
|
|
104
|
+
reached)."""
|
|
105
|
+
j = i + 1
|
|
106
|
+
n = len(text)
|
|
107
|
+
while j < n:
|
|
108
|
+
if text[j] == "\\":
|
|
109
|
+
j += 2
|
|
110
|
+
continue
|
|
111
|
+
if text[j] == "/":
|
|
112
|
+
return j + 1
|
|
113
|
+
j += 1
|
|
114
|
+
return n
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def skip_lexical_token(text: str, i: int, language: str) -> int | None:
|
|
118
|
+
"""If a string/char literal or comment starts at `text[i]`, return the
|
|
119
|
+
index just past its end. Otherwise `None` — `text[i]` is ordinary code
|
|
120
|
+
and should be scanned normally."""
|
|
121
|
+
ch = text[i]
|
|
122
|
+
nxt = text[i + 1] if i + 1 < len(text) else ""
|
|
123
|
+
|
|
124
|
+
if ch == "/" and nxt == "/":
|
|
125
|
+
end = text.find("\n", i)
|
|
126
|
+
return len(text) if end == -1 else end
|
|
127
|
+
if ch == "/" and nxt == "*":
|
|
128
|
+
end = text.find("*/", i + 2)
|
|
129
|
+
return len(text) if end == -1 else end + 2
|
|
130
|
+
if language == "C#" and ch == "@" and nxt == '"':
|
|
131
|
+
return skip_verbatim_string(text, i)
|
|
132
|
+
if language == "Go" and ch == "`":
|
|
133
|
+
j = text.find("`", i + 1)
|
|
134
|
+
return len(text) if j == -1 else j + 1
|
|
135
|
+
if language == "JS/TS" and ch == "`":
|
|
136
|
+
return skip_quoted(text, i, "`")
|
|
137
|
+
if ch == '"':
|
|
138
|
+
return skip_quoted(text, i, '"')
|
|
139
|
+
if ch == "'":
|
|
140
|
+
return skip_quoted(text, i, "'")
|
|
141
|
+
return None
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def scan_balanced(text: str, open_idx: int, open_ch: str, close_ch: str, language: str) -> int | None:
|
|
145
|
+
"""`text[open_idx] == open_ch`. Scan forward tracking `open_ch`/`close_ch`
|
|
146
|
+
depth, skipping any lexical token (string/char literal/comment)
|
|
147
|
+
encountered along the way. Return the index just past the matching
|
|
148
|
+
`close_ch`, or `None` if depth never returns to zero before EOF —
|
|
149
|
+
the file's brackets don't lexically balance."""
|
|
150
|
+
depth = 0
|
|
151
|
+
i = open_idx
|
|
152
|
+
n = len(text)
|
|
153
|
+
while i < n:
|
|
154
|
+
skip_to = skip_lexical_token(text, i, language)
|
|
155
|
+
if skip_to is not None:
|
|
156
|
+
i = skip_to
|
|
157
|
+
continue
|
|
158
|
+
ch = text[i]
|
|
159
|
+
if ch == open_ch:
|
|
160
|
+
depth += 1
|
|
161
|
+
elif ch == close_ch:
|
|
162
|
+
depth -= 1
|
|
163
|
+
if depth == 0:
|
|
164
|
+
return i + 1
|
|
165
|
+
i += 1
|
|
166
|
+
return None
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def find_next_brace(text: str, start: int, limit: int, language: str) -> int | None:
|
|
170
|
+
"""Return the index of the next `{` in `text[start:limit]` that is not
|
|
171
|
+
inside a string/char literal or comment, or `None` if none precedes
|
|
172
|
+
`limit`."""
|
|
173
|
+
i = start
|
|
174
|
+
while i < limit:
|
|
175
|
+
skip_to = skip_lexical_token(text, i, language)
|
|
176
|
+
if skip_to is not None:
|
|
177
|
+
i = skip_to
|
|
178
|
+
continue
|
|
179
|
+
if text[i] == "{":
|
|
180
|
+
return i
|
|
181
|
+
i += 1
|
|
182
|
+
return None
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def lexically_skip_to(text: str, pos: int, target: int, language: str) -> int:
|
|
186
|
+
"""Scan forward from `pos` (assumed to be ordinary-code position) to
|
|
187
|
+
`target`, skipping any string/char literal/comment encountered. Returns
|
|
188
|
+
a position >= `target`; a result strictly greater than `target` means
|
|
189
|
+
`target` sat *inside* a skipped token — e.g. a marker-like substring
|
|
190
|
+
appearing in a string or comment, which must not be mistaken for a real
|
|
191
|
+
binding boundary."""
|
|
192
|
+
i = pos
|
|
193
|
+
while i < target:
|
|
194
|
+
skip_to = skip_lexical_token(text, i, language)
|
|
195
|
+
if skip_to is not None:
|
|
196
|
+
i = skip_to
|
|
197
|
+
continue
|
|
198
|
+
i += 1
|
|
199
|
+
return i
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def extend_to_line_end(text: str, idx: int) -> int:
|
|
203
|
+
"""Return an index >= `idx` landing just past the next newline at or
|
|
204
|
+
after `idx`, or `len(text)` if none remains — so a binding's span always
|
|
205
|
+
ends at a line boundary, giving `gherkin_stub_merge.py` a clean splice
|
|
206
|
+
point for appending new stubs."""
|
|
207
|
+
nl = text.find("\n", idx)
|
|
208
|
+
return len(text) if nl == -1 else nl + 1
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def extract_first_string(text: str, start: int, limit: int, language: str) -> tuple:
|
|
212
|
+
"""Scan `text[start:limit]` for the first string or (JS/TS only) regex
|
|
213
|
+
literal (skipping any comment encountered first) and return
|
|
214
|
+
`(pattern_text, end_index)` — the dequoted/de-slashed contents and the
|
|
215
|
+
index just past the closing delimiter. Returns `("", start)` if neither
|
|
216
|
+
is found before `limit`.
|
|
217
|
+
|
|
218
|
+
A JS/TS regex-literal pattern (`Given(/^I have (\\d+) cukes$/, ...)`,
|
|
219
|
+
a real cucumber-js convention) is not a quoted string at all — without
|
|
220
|
+
explicit recognition here it falls through to the `("", start)` no-match
|
|
221
|
+
case, recording an empty pattern. Since `merge_steps` dedups by exact
|
|
222
|
+
pattern-text match, an empty string can never match anything, so an
|
|
223
|
+
already-implemented regex-pattern step gets a duplicate pending stub
|
|
224
|
+
appended on every re-run (issue #1421 bug 4 — the clobber-equivalent
|
|
225
|
+
this module exists to prevent, for one pattern syntax)."""
|
|
226
|
+
i = start
|
|
227
|
+
while i < limit:
|
|
228
|
+
ch = text[i]
|
|
229
|
+
nxt = text[i + 1] if i + 1 < len(text) else ""
|
|
230
|
+
if ch == "/" and nxt in ("/", "*"):
|
|
231
|
+
skip_to = skip_lexical_token(text, i, language)
|
|
232
|
+
i = skip_to if skip_to is not None else i + 1
|
|
233
|
+
continue
|
|
234
|
+
is_verbatim = language == "C#" and ch == "@" and nxt == '"'
|
|
235
|
+
is_regex_literal = language == "JS/TS" and ch == "/"
|
|
236
|
+
is_string_start = (
|
|
237
|
+
is_verbatim
|
|
238
|
+
or is_regex_literal
|
|
239
|
+
or ch in ("'", '"')
|
|
240
|
+
or (ch == "`" and language in ("JS/TS", "Go"))
|
|
241
|
+
)
|
|
242
|
+
if is_string_start:
|
|
243
|
+
end = skip_regex_literal(text, i) if is_regex_literal else skip_lexical_token(text, i, language)
|
|
244
|
+
quote_len = 2 if is_verbatim else 1
|
|
245
|
+
return text[i + quote_len : end - 1], end
|
|
246
|
+
i += 1
|
|
247
|
+
return "", start
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def extract_identifier(text: str, start: int, limit: int) -> str:
|
|
251
|
+
"""Skip leading whitespace/commas from `start`, then read an
|
|
252
|
+
identifier (`[A-Za-z0-9_]+`). Returns `""` if none found immediately."""
|
|
253
|
+
i = start
|
|
254
|
+
while i < limit and text[i] in " \t\r\n,":
|
|
255
|
+
i += 1
|
|
256
|
+
j = i
|
|
257
|
+
while j < limit and (text[j].isalnum() or text[j] == "_"):
|
|
258
|
+
j += 1
|
|
259
|
+
return text[i:j]
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def is_pending(body_text: str, markers: tuple) -> bool:
|
|
263
|
+
return any(marker in body_text for marker in markers)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def build_binding(
|
|
267
|
+
text: str, start: int, pattern: str, body_start: int, body_end: int, markers: tuple
|
|
268
|
+
) -> tuple:
|
|
269
|
+
"""Construct a `StepBinding` once a binding's brace-bounded body span
|
|
270
|
+
`[body_start, body_end)` has been located, and return `(binding,
|
|
271
|
+
next_pos)` — `next_pos` is where the caller's scan should resume.
|
|
272
|
+
Identical across all three parse functions (`jsts.py`, `parse_annotation_
|
|
273
|
+
style`, `go.py`), hoisted here rather than repeated three times."""
|
|
274
|
+
body_text = text[body_start:body_end]
|
|
275
|
+
end = extend_to_line_end(text, body_end)
|
|
276
|
+
binding = StepBinding(
|
|
277
|
+
pattern=pattern,
|
|
278
|
+
text=text[start:end],
|
|
279
|
+
start=start,
|
|
280
|
+
end=end,
|
|
281
|
+
is_pending=is_pending(body_text, markers),
|
|
282
|
+
)
|
|
283
|
+
return binding, end
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def parse_annotation_style(text: str, markers: tuple, language: str, annotation_re) -> ParseResult:
|
|
287
|
+
"""Shared control flow for Java's `@Given(`/`@When(`/`@Then(` annotation
|
|
288
|
+
and C#'s `[Given(`/`[When(`/`[Then(` attribute (`java.py`/`csharp.py`) —
|
|
289
|
+
both bind a step to the *next* method's brace-bounded body, differing
|
|
290
|
+
only in the marker syntax (`annotation_re`) and the per-language lexer
|
|
291
|
+
profile (`language`, for C#'s verbatim-string awareness). Factored out
|
|
292
|
+
once the two extractors turned out identical apart from that one regex
|
|
293
|
+
(structure-review: semantic, not just structural, duplication)."""
|
|
294
|
+
bindings = []
|
|
295
|
+
pos = 0
|
|
296
|
+
n = len(text)
|
|
297
|
+
while pos < n:
|
|
298
|
+
match = annotation_re.search(text, pos)
|
|
299
|
+
if match is None:
|
|
300
|
+
break
|
|
301
|
+
start = match.start()
|
|
302
|
+
landed = lexically_skip_to(text, pos, start, language)
|
|
303
|
+
if landed > start:
|
|
304
|
+
pos = landed
|
|
305
|
+
continue
|
|
306
|
+
|
|
307
|
+
ann_open = match.end() - 1
|
|
308
|
+
ann_close = scan_balanced(text, ann_open, "(", ")", language)
|
|
309
|
+
if ann_close is None:
|
|
310
|
+
return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
|
|
311
|
+
|
|
312
|
+
pattern, _pattern_end = extract_first_string(text, ann_open + 1, ann_close, language)
|
|
313
|
+
|
|
314
|
+
next_match = annotation_re.search(text, ann_close)
|
|
315
|
+
search_limit = next_match.start() if next_match else n
|
|
316
|
+
brace_open = find_next_brace(text, ann_close, search_limit, language)
|
|
317
|
+
if brace_open is None:
|
|
318
|
+
# No method body found before the next annotation (or EOF) — a
|
|
319
|
+
# dangling annotation, not an unbalanced count.
|
|
320
|
+
return ParseResult(bindings=None, error=ERROR_DANGLING_ANNOTATION)
|
|
321
|
+
brace_close = scan_balanced(text, brace_open, "{", "}", language)
|
|
322
|
+
if brace_close is None:
|
|
323
|
+
return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
|
|
324
|
+
|
|
325
|
+
binding, pos = build_binding(text, start, pattern, brace_open, brace_close, markers)
|
|
326
|
+
bindings.append(binding)
|
|
327
|
+
|
|
328
|
+
return ParseResult(bindings=bindings, error=None)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""stub_extractors.csharp — C# `[Given(`/`[When(`/`[Then(` attribute step
|
|
2
|
+
bindings, method body bounded by lexically-aware brace balance (including
|
|
3
|
+
C# verbatim `@"..."` string patterns, handled by the shared lexer). Thin
|
|
4
|
+
wrapper around `_common.parse_annotation_style`, the control flow it shares
|
|
5
|
+
byte-for-byte with Java's annotation-style bindings (`java.py`).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import re
|
|
11
|
+
|
|
12
|
+
from ._common import ParseResult, parse_annotation_style
|
|
13
|
+
|
|
14
|
+
_LANGUAGE = "C#"
|
|
15
|
+
_ATTRIBUTE_RE = re.compile(r"\[(?:Given|When|Then)\s*\(")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def parse(text: str, markers: tuple) -> ParseResult:
|
|
19
|
+
return parse_annotation_style(text, markers, _LANGUAGE, _ATTRIBUTE_RE)
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"""stub_extractors.go — Go `sc.Step(` registration: a top-level-only,
|
|
2
|
+
one-registration-per-call convention, distinct from the brace-balance
|
|
3
|
+
boundary the other three languages use. The registration call itself has no
|
|
4
|
+
brace-bounded body (its second argument is a bare function reference); the
|
|
5
|
+
referenced top-level `func` declaration's own brace-bounded body is looked
|
|
6
|
+
up separately to check for a pending marker.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import re
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
|
|
14
|
+
from ._common import (
|
|
15
|
+
ERROR_DANGLING_ANNOTATION,
|
|
16
|
+
ERROR_UNBALANCED_BRACES,
|
|
17
|
+
ParseResult,
|
|
18
|
+
StepBinding,
|
|
19
|
+
extend_to_line_end,
|
|
20
|
+
extract_first_string,
|
|
21
|
+
extract_identifier,
|
|
22
|
+
find_next_brace,
|
|
23
|
+
is_pending,
|
|
24
|
+
lexically_skip_to,
|
|
25
|
+
scan_balanced,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
_LANGUAGE = "Go"
|
|
29
|
+
_STEP_RE = re.compile(r"\bsc\.Step\s*\(")
|
|
30
|
+
_FUNC_DECL_RE = re.compile(r"\bfunc\s+([A-Za-z0-9_]+)\s*\(")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class _GoFuncBody:
|
|
35
|
+
decl_start: int # where 'func <name>(' itself begins — the declaration anchor
|
|
36
|
+
start: int # brace-bounded body start (for is_pending scanning)
|
|
37
|
+
end: int # brace-bounded body end, extended to its own line boundary
|
|
38
|
+
error: str | None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _index_func_decls(text: str) -> dict:
|
|
42
|
+
"""One-time pass over `text` collecting every top-level `func <name>(`
|
|
43
|
+
declaration, keyed by name, as `{name: (decl_start, params_open)}`.
|
|
44
|
+
Built once per `parse()` call so the per-binding lookup below is a dict
|
|
45
|
+
lookup instead of re-searching the whole file from offset 0 for every
|
|
46
|
+
`sc.Step(...)` registration found — the previous approach was
|
|
47
|
+
O(bindings * file size) on a large Go file (issue #1421 bug 7). The
|
|
48
|
+
first declaration of a given name wins; a duplicate is a Go compile
|
|
49
|
+
error regardless of which one this index picks."""
|
|
50
|
+
index: dict = {}
|
|
51
|
+
for match in _FUNC_DECL_RE.finditer(text):
|
|
52
|
+
name = match.group(1)
|
|
53
|
+
if name not in index:
|
|
54
|
+
index[name] = (match.start(), match.end() - 1)
|
|
55
|
+
return index
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _bound_func_body(text: str, decl_start: int, params_open: int) -> _GoFuncBody:
|
|
59
|
+
"""Bound a known `func <name>(...) { ... }` declaration's parameter list
|
|
60
|
+
and body via paren/brace balance, given positions already located by
|
|
61
|
+
`_index_func_decls` (or a direct one-off regex search) — the balance-
|
|
62
|
+
scanning logic shared by both the indexed (`parse`) and single-name
|
|
63
|
+
(`find_scenario_initializer_body`) lookup paths."""
|
|
64
|
+
params_close = scan_balanced(text, params_open, "(", ")", _LANGUAGE)
|
|
65
|
+
if params_close is None:
|
|
66
|
+
return _GoFuncBody(decl_start=decl_start, start=0, end=0, error=ERROR_UNBALANCED_BRACES)
|
|
67
|
+
|
|
68
|
+
body_open = find_next_brace(text, params_close, len(text), _LANGUAGE)
|
|
69
|
+
if body_open is None:
|
|
70
|
+
return _GoFuncBody(decl_start=decl_start, start=0, end=0, error=ERROR_UNBALANCED_BRACES)
|
|
71
|
+
body_close = scan_balanced(text, body_open, "{", "}", _LANGUAGE)
|
|
72
|
+
if body_close is None:
|
|
73
|
+
return _GoFuncBody(decl_start=decl_start, start=0, end=0, error=ERROR_UNBALANCED_BRACES)
|
|
74
|
+
|
|
75
|
+
return _GoFuncBody(decl_start=decl_start, start=body_open, end=body_close, error=None)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _find_func_body(text: str, func_name: str) -> _GoFuncBody | None:
|
|
79
|
+
"""Locate the top-level `func <func_name>(...) { ... }` declaration via a
|
|
80
|
+
direct one-off regex search and return its brace-bounded body span plus
|
|
81
|
+
its own declaration start. `None` means no such function was ever
|
|
82
|
+
declared — the registration references nothing, i.e. dangling. Used
|
|
83
|
+
only by `find_scenario_initializer_body` below — a single standalone
|
|
84
|
+
lookup outside `parse()`'s main loop, where building a full index would
|
|
85
|
+
be pure overhead; `parse()` itself uses `_index_func_decls` +
|
|
86
|
+
`_bound_func_body` instead (issue #1421 bug 7)."""
|
|
87
|
+
func_re = re.compile(r"\bfunc\s+" + re.escape(func_name) + r"\s*\(")
|
|
88
|
+
match = func_re.search(text)
|
|
89
|
+
if match is None:
|
|
90
|
+
return None
|
|
91
|
+
return _bound_func_body(text, match.start(), match.end() - 1)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# The conventional godog `ScenarioInitializer` entry-point function name
|
|
95
|
+
# (see knowledge/test-stack-profiles/bdd-frameworks.md's Go section and
|
|
96
|
+
# godog.TestSuite.ScenarioInitializer) — this plugin's own stub template
|
|
97
|
+
# always names it this. Used only as a fallback anchor by
|
|
98
|
+
# `find_scenario_initializer_body` below, for the "existing Go file with
|
|
99
|
+
# zero sc.Step(...) bindings yet" case (issue #1421 bug 1); the main `parse`
|
|
100
|
+
# loop above never assumes this name.
|
|
101
|
+
SCENARIO_INITIALIZER_NAME = "InitializeScenario"
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def find_scenario_initializer_body(text: str) -> _GoFuncBody | None:
|
|
105
|
+
"""Public wrapper around `_find_func_body`, for callers outside this
|
|
106
|
+
module (`gherkin_stub_merge.py`) that need to anchor a splice against
|
|
107
|
+
the conventional `InitializeScenario(sc *godog.ScenarioContext)`
|
|
108
|
+
registration function directly, when there are no existing `sc.Step(...)`
|
|
109
|
+
bindings to anchor against instead."""
|
|
110
|
+
return _find_func_body(text, SCENARIO_INITIALIZER_NAME)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def parse(text: str, markers: tuple) -> ParseResult:
|
|
114
|
+
bindings = []
|
|
115
|
+
pos = 0
|
|
116
|
+
n = len(text)
|
|
117
|
+
func_index = _index_func_decls(text) # one pass, not one per binding (bug 7)
|
|
118
|
+
while pos < n:
|
|
119
|
+
match = _STEP_RE.search(text, pos)
|
|
120
|
+
if match is None:
|
|
121
|
+
break
|
|
122
|
+
start = match.start()
|
|
123
|
+
landed = lexically_skip_to(text, pos, start, _LANGUAGE)
|
|
124
|
+
if landed > start:
|
|
125
|
+
pos = landed
|
|
126
|
+
continue
|
|
127
|
+
|
|
128
|
+
call_open = match.end() - 1
|
|
129
|
+
call_end = scan_balanced(text, call_open, "(", ")", _LANGUAGE)
|
|
130
|
+
if call_end is None:
|
|
131
|
+
return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
|
|
132
|
+
|
|
133
|
+
pattern, pattern_end = extract_first_string(text, call_open + 1, call_end, _LANGUAGE)
|
|
134
|
+
func_name = extract_identifier(text, pattern_end, call_end)
|
|
135
|
+
if not func_name:
|
|
136
|
+
return ParseResult(bindings=None, error=ERROR_DANGLING_ANNOTATION)
|
|
137
|
+
|
|
138
|
+
func_entry = func_index.get(func_name)
|
|
139
|
+
if func_entry is None:
|
|
140
|
+
# The registration names a function that was never declared —
|
|
141
|
+
# a marker with no attached, boundable body.
|
|
142
|
+
return ParseResult(bindings=None, error=ERROR_DANGLING_ANNOTATION)
|
|
143
|
+
func_result = _bound_func_body(text, *func_entry)
|
|
144
|
+
if func_result.error is not None:
|
|
145
|
+
return ParseResult(bindings=None, error=func_result.error)
|
|
146
|
+
|
|
147
|
+
body_text = text[func_result.start : func_result.end]
|
|
148
|
+
end = call_end
|
|
149
|
+
if end < n and text[end] == ";":
|
|
150
|
+
end += 1
|
|
151
|
+
end = extend_to_line_end(text, end)
|
|
152
|
+
|
|
153
|
+
# The referenced function's own declaration lives at a different,
|
|
154
|
+
# non-adjacent position than the registration call (start:end) —
|
|
155
|
+
# captured separately so a caller reusing this binding as new
|
|
156
|
+
# candidate content (gherkin_stub_merge.merge_steps) can insert the
|
|
157
|
+
# declaration and the registration at their two correct positions
|
|
158
|
+
# instead of silently dropping the declaration.
|
|
159
|
+
decl_end_line = extend_to_line_end(text, func_result.end)
|
|
160
|
+
bindings.append(
|
|
161
|
+
StepBinding(
|
|
162
|
+
pattern=pattern,
|
|
163
|
+
text=text[start:end],
|
|
164
|
+
start=start,
|
|
165
|
+
end=end,
|
|
166
|
+
is_pending=is_pending(body_text, markers),
|
|
167
|
+
decl_start=func_result.decl_start,
|
|
168
|
+
decl_text=text[func_result.decl_start : decl_end_line],
|
|
169
|
+
)
|
|
170
|
+
)
|
|
171
|
+
pos = end
|
|
172
|
+
|
|
173
|
+
return ParseResult(bindings=bindings, error=None)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""stub_extractors.java — Java `@Given(`/`@When(`/`@Then(` annotation step
|
|
2
|
+
bindings, method body bounded by lexically-aware brace balance. Thin
|
|
3
|
+
wrapper around `_common.parse_annotation_style`, the control flow it shares
|
|
4
|
+
byte-for-byte with C#'s attribute-style bindings (`csharp.py`).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import re
|
|
10
|
+
|
|
11
|
+
from ._common import ParseResult, parse_annotation_style
|
|
12
|
+
|
|
13
|
+
_LANGUAGE = "Java"
|
|
14
|
+
_ANNOTATION_RE = re.compile(r"@(?:Given|When|Then)\s*\(")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def parse(text: str, markers: tuple) -> ParseResult:
|
|
18
|
+
return parse_annotation_style(text, markers, _LANGUAGE, _ANNOTATION_RE)
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"""stub_extractors.jsts — JS/TS `Given(`/`When(`/`Then(` call-style step
|
|
2
|
+
bindings, callback body bounded by lexically-aware brace balance.
|
|
3
|
+
|
|
4
|
+
Known scope limitation (self-identified, correctness-review lens): this
|
|
5
|
+
extractor assumes the convention `gherkin-derive/SKILL.md` Step 4 and
|
|
6
|
+
`gherkin_stub_gate.py`'s own pending-marker table both assume — an inline
|
|
7
|
+
callback literal (`function () { ... }` or `() => { ... }`) as the second
|
|
8
|
+
argument. A step bound to a *named* function reference (`Given('x',
|
|
9
|
+
stepImpl);`, no inline braces) has no brace-bounded body for this extractor
|
|
10
|
+
to find, and is reported as `dangling-annotation` (a marker with no
|
|
11
|
+
attached, boundable body — the same sentinel `go.py` and
|
|
12
|
+
`_common.parse_annotation_style` use for their equivalent case), not
|
|
13
|
+
`unbalanced-braces` — the file's braces genuinely balance; there is simply
|
|
14
|
+
no callback to bound. Out of scope for this module's stated design
|
|
15
|
+
(brace-balance bounding), not silently mishandled — noted here rather than
|
|
16
|
+
guessed around.
|
|
17
|
+
|
|
18
|
+
The callback's own parameter list is always located and skipped via paren
|
|
19
|
+
balance *before* searching for its body brace, so a destructured parameter
|
|
20
|
+
(`({ page }) => { ... }`) is never mistaken for the body — the destructure's
|
|
21
|
+
own `{`/`}` pair sits inside the parameter list's parens, which paren
|
|
22
|
+
balance clears in one step regardless of what braces it contains
|
|
23
|
+
(issue #1421 bug 3).
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import re
|
|
29
|
+
|
|
30
|
+
from ._common import (
|
|
31
|
+
ERROR_DANGLING_ANNOTATION,
|
|
32
|
+
ERROR_UNBALANCED_BRACES,
|
|
33
|
+
ParseResult,
|
|
34
|
+
build_binding,
|
|
35
|
+
extract_first_string,
|
|
36
|
+
find_next_brace,
|
|
37
|
+
lexically_skip_to,
|
|
38
|
+
scan_balanced,
|
|
39
|
+
skip_lexical_token,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
_LANGUAGE = "JS/TS"
|
|
43
|
+
_KEYWORD_RE = re.compile(r"\b(?:Given|When|Then)\s*\(")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _find_next_paren(text: str, start: int, limit: int, language: str) -> int | None:
|
|
47
|
+
"""Return the index of the next `(` in `text[start:limit]` that is not
|
|
48
|
+
inside a string/char literal or comment, or `None` if none precedes
|
|
49
|
+
`limit`. Used to locate a callback's own parameter list — its opening
|
|
50
|
+
paren — so it can be fully skipped via paren balance (see `parse`
|
|
51
|
+
below) before searching for the callback's real body brace."""
|
|
52
|
+
i = start
|
|
53
|
+
while i < limit:
|
|
54
|
+
skip_to = skip_lexical_token(text, i, language)
|
|
55
|
+
if skip_to is not None:
|
|
56
|
+
i = skip_to
|
|
57
|
+
continue
|
|
58
|
+
if text[i] == "(":
|
|
59
|
+
return i
|
|
60
|
+
i += 1
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def parse(text: str, markers: tuple) -> ParseResult:
|
|
65
|
+
bindings = []
|
|
66
|
+
pos = 0
|
|
67
|
+
n = len(text)
|
|
68
|
+
while pos < n:
|
|
69
|
+
match = _KEYWORD_RE.search(text, pos)
|
|
70
|
+
if match is None:
|
|
71
|
+
break
|
|
72
|
+
start = match.start()
|
|
73
|
+
landed = lexically_skip_to(text, pos, start, _LANGUAGE)
|
|
74
|
+
if landed > start:
|
|
75
|
+
pos = landed
|
|
76
|
+
continue
|
|
77
|
+
|
|
78
|
+
call_open = match.end() - 1 # the '(' the regex matched up to
|
|
79
|
+
call_end = scan_balanced(text, call_open, "(", ")", _LANGUAGE)
|
|
80
|
+
if call_end is None:
|
|
81
|
+
return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
|
|
82
|
+
|
|
83
|
+
pattern, pattern_end = extract_first_string(text, call_open + 1, call_end, _LANGUAGE)
|
|
84
|
+
|
|
85
|
+
# Locate the callback's own parameter list first (its opening '(')
|
|
86
|
+
# and skip past it via paren balance before searching for the
|
|
87
|
+
# callback's real body brace. A destructured parameter
|
|
88
|
+
# (`({ page }) => { ... }`) has its own '{'/'}' pair *inside* that
|
|
89
|
+
# parameter list — searching for "the first '{' after the pattern"
|
|
90
|
+
# (the previous approach) finds the destructure's brace instead of
|
|
91
|
+
# the body, mis-binding the span onto a few characters of parameter
|
|
92
|
+
# syntax rather than the real callback (issue #1421 bug 3: a
|
|
93
|
+
# silent-corruption risk — a subsequent merge could splice a new
|
|
94
|
+
# stub into the middle of this existing callback body). Paren
|
|
95
|
+
# balance ignores nested braces entirely, so this correctly clears
|
|
96
|
+
# the whole parameter list — destructured or not — regardless of
|
|
97
|
+
# whether the callback is `function (...) { ... }` or an arrow.
|
|
98
|
+
param_open = _find_next_paren(text, pattern_end, call_end, _LANGUAGE)
|
|
99
|
+
if param_open is None:
|
|
100
|
+
# No callback signature at all between the pattern and the
|
|
101
|
+
# call's own closing paren — e.g. a named-function reference
|
|
102
|
+
# (`Given('x', stepImpl);`). The file's braces balance fine;
|
|
103
|
+
# there's simply no attached body to bound.
|
|
104
|
+
return ParseResult(bindings=None, error=ERROR_DANGLING_ANNOTATION)
|
|
105
|
+
param_close = scan_balanced(text, param_open, "(", ")", _LANGUAGE)
|
|
106
|
+
if param_close is None or param_close > call_end:
|
|
107
|
+
return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
|
|
108
|
+
|
|
109
|
+
brace_open = find_next_brace(text, param_close, call_end, _LANGUAGE)
|
|
110
|
+
if brace_open is None:
|
|
111
|
+
# No block body follows the callback's own parameter list —
|
|
112
|
+
# e.g. an expression-bodied arrow (`() => doSomething()`).
|
|
113
|
+
# Refuse to guess a span rather than risk mis-splicing.
|
|
114
|
+
return ParseResult(bindings=None, error=ERROR_DANGLING_ANNOTATION)
|
|
115
|
+
brace_close = scan_balanced(text, brace_open, "{", "}", _LANGUAGE)
|
|
116
|
+
if brace_close is None or brace_close > call_end:
|
|
117
|
+
return ParseResult(bindings=None, error=ERROR_UNBALANCED_BRACES)
|
|
118
|
+
|
|
119
|
+
# build_binding extends to the next line boundary from brace_close,
|
|
120
|
+
# which already carries the call's own closing ')' and any trailing
|
|
121
|
+
# ';' along with it for the common single-line-close convention
|
|
122
|
+
# (`});`) — no separate call-tail handling needed.
|
|
123
|
+
binding, pos = build_binding(text, start, pattern, brace_open, brace_close, markers)
|
|
124
|
+
bindings.append(binding)
|
|
125
|
+
|
|
126
|
+
return ParseResult(bindings=bindings, error=None)
|