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,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: benchmark
|
|
3
|
+
description: >-
|
|
4
|
+
Capture runtime performance metrics (Core Web Vitals, resource sizes, load
|
|
5
|
+
times) for web pages. Compare against baselines and performance budgets.
|
|
6
|
+
Use when the user says "benchmark", "check performance", "page speed",
|
|
7
|
+
"web vitals", "performance regression", or "how fast is this page".
|
|
8
|
+
argument-hint: "<url> [--baseline] [--budget] [--trend] [--mobile] [--3g] [--runs <n>]"
|
|
9
|
+
user-invocable: true
|
|
10
|
+
allowed-tools: Read, Write, Glob, Grep, Bash(npx playwright *), Bash(node *), Bash(mkdir *), Bash(date *), Bash(cat *)
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Benchmark
|
|
14
|
+
|
|
15
|
+
Role: worker. This command measures runtime performance of web pages using Playwright.
|
|
16
|
+
|
|
17
|
+
You have been invoked with the `/benchmark` command.
|
|
18
|
+
|
|
19
|
+
## Worker constraints
|
|
20
|
+
|
|
21
|
+
1. Measure only; do not modify the page or app under test.
|
|
22
|
+
2. Compare against the declared budget; do not invent thresholds.
|
|
23
|
+
3. **Be concise.** Report the metrics table and verdict, no narration.
|
|
24
|
+
|
|
25
|
+
## Parse Arguments
|
|
26
|
+
|
|
27
|
+
Arguments: $ARGUMENTS
|
|
28
|
+
|
|
29
|
+
- Positional: URL to benchmark (required). Can be a full URL or a path (prefixed with the dev server URL).
|
|
30
|
+
- `--baseline`: Capture current metrics as the new baseline (overwrites existing)
|
|
31
|
+
- `--budget`: Check against performance budgets in `performance-budget.json`
|
|
32
|
+
- `--trend`: Show performance trends from historical data
|
|
33
|
+
- `--mobile`: Simulate mobile device (375×812 viewport, 4x CPU throttle)
|
|
34
|
+
- `--3g`: Simulate slow 3G network (400 Kbps, 400ms latency, 4x CPU)
|
|
35
|
+
- `--runs <n>`: Number of measurement runs (default: 3, median reported)
|
|
36
|
+
|
|
37
|
+
If no URL is provided, look for a `performance-budget.json` file and benchmark all paths listed there.
|
|
38
|
+
|
|
39
|
+
## Prerequisites Check
|
|
40
|
+
|
|
41
|
+
1. Verify Playwright is installed: `npx playwright --version`. If not installed, tell the user: "Playwright is required. Run `/project-init` to set up this repo's tooling (it installs Playwright + Chromium for frontend projects), or install directly: `npx playwright install chromium`."
|
|
42
|
+
2. If the URL is localhost, verify the dev server is running by attempting a fetch. If not running, tell the user: "Dev server doesn't appear to be running at <url>. Start it first."
|
|
43
|
+
|
|
44
|
+
## Steps
|
|
45
|
+
|
|
46
|
+
### 1. Load the skill
|
|
47
|
+
|
|
48
|
+
Read `skills/performance-benchmark/SKILL.md` for the full metric definitions, output format, and collection methodology. Read `skills/performance-benchmark/references/benchmark-script.md` for the Playwright script template.
|
|
49
|
+
|
|
50
|
+
### 2. Generate and run the benchmark script
|
|
51
|
+
|
|
52
|
+
Generate a Node.js script based on the template that:
|
|
53
|
+
|
|
54
|
+
- Navigates to the target URL
|
|
55
|
+
- Collects Core Web Vitals (LCP, FCP, CLS, INP) via Performance Observer
|
|
56
|
+
- Collects Navigation Timing (TTFB, DOM Interactive, Load Complete)
|
|
57
|
+
- Collects Resource metrics (transfer sizes by type, request count, largest resource)
|
|
58
|
+
- Captures console errors during load
|
|
59
|
+
- Runs the specified number of times (default 3)
|
|
60
|
+
- Computes median and p95 for each metric
|
|
61
|
+
|
|
62
|
+
Run the script with `node` and capture the JSON output.
|
|
63
|
+
|
|
64
|
+
### 3. Compare against baseline (unless --baseline)
|
|
65
|
+
|
|
66
|
+
If `--baseline` is set:
|
|
67
|
+
|
|
68
|
+
- Save the metrics to `benchmarks/<page-slug>/baseline.json`
|
|
69
|
+
- Create the directory if needed
|
|
70
|
+
- Report: "Baseline saved for <url>"
|
|
71
|
+
|
|
72
|
+
If `--baseline` is NOT set:
|
|
73
|
+
|
|
74
|
+
- Read `benchmarks/<page-slug>/baseline.json` if it exists
|
|
75
|
+
- Compare each metric: regression (>10% worse) → `fail`, degradation (5-10%) → `warn`, stable (±5%) → `pass`, improvement (>10% better) → noted
|
|
76
|
+
- If no baseline exists, report metrics without comparison and suggest: "No baseline found. Run `/benchmark <url> --baseline` to establish one."
|
|
77
|
+
|
|
78
|
+
### 4. Check performance budgets (if --budget or budget file exists)
|
|
79
|
+
|
|
80
|
+
Read `performance-budget.json` from the project root. Match the benchmarked URL path against budget entries. Flag any metric that exceeds its budget.
|
|
81
|
+
|
|
82
|
+
### 5. Append to trend history
|
|
83
|
+
|
|
84
|
+
Append the current metrics to `benchmarks/<page-slug>/history.jsonl` (one JSON object per line, with timestamp).
|
|
85
|
+
|
|
86
|
+
If `--trend` is set, read the history file and produce a trend summary showing metric changes over the last 10 entries.
|
|
87
|
+
|
|
88
|
+
### 6. Generate report
|
|
89
|
+
|
|
90
|
+
Write a markdown report to `benchmarks/<page-slug>/report.md` using the report format from the skill file.
|
|
91
|
+
|
|
92
|
+
Display in chat:
|
|
93
|
+
|
|
94
|
+
- Core Web Vitals table with pass/warn/fail status
|
|
95
|
+
- Resource budget table
|
|
96
|
+
- Any regressions with severity
|
|
97
|
+
- Overall verdict
|
|
98
|
+
|
|
99
|
+
## Integration
|
|
100
|
+
|
|
101
|
+
- Complements the `performance-review` agent (static code analysis) with runtime measurement
|
|
102
|
+
- Uses Playwright infrastructure shared with `/browse` and the Browser Testing skill
|
|
103
|
+
- QA Engineer invokes this for performance validation
|
|
104
|
+
- Platform Engineer uses baselines for SLI/SLO definition
|
|
105
|
+
- Can be run as part of `/build` for performance-critical plan steps
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: branch-workflow
|
|
3
|
+
description: Clean branch completion workflow — PR creation, merge strategy, and cleanup. Use this skill when implementation is complete and it's time to ship — after Phase 3 human gate passes. Also use when the user says "create a PR", "merge this", "ship it", "finish this branch", or asks about merge strategy.
|
|
4
|
+
role: worker
|
|
5
|
+
user-invocable: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Branch Workflow
|
|
9
|
+
|
|
10
|
+
Role: worker. This command performs PR creation, merge, and branch cleanup
|
|
11
|
+
directly via git/gh commands.
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
The three-phase workflow ends at the Phase 3 human gate. This skill formalizes what happens after approval: PR creation, merge decision, and branch cleanup. Without this, branches linger and merge conflicts accumulate.
|
|
16
|
+
|
|
17
|
+
## Constraints
|
|
18
|
+
|
|
19
|
+
- Do not push to main/master directly — always use a PR
|
|
20
|
+
- Do not force-push unless the human explicitly requests it
|
|
21
|
+
- Do not delete branches that have unmerged work
|
|
22
|
+
- Do not merge without a passing CI check (if CI is configured)
|
|
23
|
+
- Do not switch branches (checkout, worktree enter) without first checking working-tree state and confirming with the human if dirty
|
|
24
|
+
|
|
25
|
+
## Workflow
|
|
26
|
+
|
|
27
|
+
### 1. Pre-PR Checklist
|
|
28
|
+
|
|
29
|
+
Before creating the PR, verify:
|
|
30
|
+
|
|
31
|
+
- [ ] All tests pass (fresh run, not cached)
|
|
32
|
+
- [ ] `/code-review` passed or warnings are documented
|
|
33
|
+
- [ ] Documentation is current (tech-writer verified in Phase 3)
|
|
34
|
+
- [ ] Branch is rebased on latest main (resolve conflicts if needed)
|
|
35
|
+
|
|
36
|
+
### 2. Create the PR
|
|
37
|
+
|
|
38
|
+
- Title: concise, under 70 characters, describes the change
|
|
39
|
+
- Body: Summary (what and why), test plan, link to design doc if one exists
|
|
40
|
+
- Labels: add relevant labels (bug, feature, refactor, docs)
|
|
41
|
+
- Reviewers: assign based on who should review (human decides)
|
|
42
|
+
|
|
43
|
+
### 3. Present Options
|
|
44
|
+
|
|
45
|
+
After confirming the base branch, present exactly four choices. If this session entered a worktree via `EnterWorktree` for this branch, each option's cleanup step is performed with the paired `ExitWorktree` call below — never raw `git worktree remove`. If no worktree was entered via `EnterWorktree` (branch-workflow can also run directly in the primary checkout), the `ExitWorktree` steps are a no-op — skip them.
|
|
46
|
+
|
|
47
|
+
1. **Merge locally** — Integrate feature branch into base, run tests on merged result, delete feature branch, then call `ExitWorktree(action="remove")`
|
|
48
|
+
2. **Push and create PR** — Push branch and create pull request via `gh pr create`. Once the PR is opened, call `ExitWorktree(action="keep")` so the worktree persists on disk while the session's CWD bookkeeping is closed
|
|
49
|
+
3. **Keep as-is** — Preserve branch and worktree for later handling; call `ExitWorktree(action="keep")` immediately after the option is confirmed — do not leave the worktree silently "entered" for the rest of the session
|
|
50
|
+
4. **Discard** — Permanently delete branch and all commits. **Requires the human to type "discard" to confirm.** Never discard without typed confirmation. After confirmation, call `ExitWorktree(action="remove", discard_changes=true)`
|
|
51
|
+
|
|
52
|
+
### 3a. Pre-Switch Verification (Option 1 only)
|
|
53
|
+
|
|
54
|
+
Before performing the checkout/merge that Option 1 ("Merge locally") requires, verify the working tree is safe to switch:
|
|
55
|
+
|
|
56
|
+
1. Run a working-tree status check (`git status --short`, or the worktree-tool equivalent) covering the feature branch's tree. This surfaces both tracked changes (modified/staged) and untracked files — not just tracked ones.
|
|
57
|
+
2. Show the result to the human.
|
|
58
|
+
3. If the tree is clean, proceed with the switch.
|
|
59
|
+
4. If the tree is **not** clean (any modified, staged, or untracked files), stop. Do not switch branches silently. Require the human to explicitly say how to proceed — commit, stash, or abort — before running the checkout. This follows the same explicit-confirmation pattern as Option 4's typed "discard," not a bare warning that can be clicked through.
|
|
60
|
+
5. Re-check that the target/base branch still matches what was confirmed in step 3's "After confirming the base branch..." — this does not re-ask for that confirmation, only verifies it hasn't drifted since.
|
|
61
|
+
|
|
62
|
+
This step applies only to the branch/worktree switch Option 1 performs. It does not replace or duplicate the Pre-PR Checklist's "Branch is rebased on latest main" item (§1) — that is a rebase-currency check performed earlier, not a dirty-tree check performed at the moment of switching. It also does not modify Post-Merge Verification & Cleanup (§5), which handles branch/worktree deletion after the merge, not the switch before it.
|
|
63
|
+
|
|
64
|
+
### 4. Merge Strategy (for options 1 and 2)
|
|
65
|
+
|
|
66
|
+
| Situation | Strategy | Why |
|
|
67
|
+
| ----------- | ---------- | ----- |
|
|
68
|
+
| Single logical change, clean history | Squash merge | One commit tells the story |
|
|
69
|
+
| Multiple logical changes that should stay separate | Merge commit | Preserves the history of each change |
|
|
70
|
+
| Long-lived branch with many commits | Squash merge | Reduces noise in main history |
|
|
71
|
+
| Experimental/spike work | Squash merge | The journey doesn't matter, only the result |
|
|
72
|
+
|
|
73
|
+
Default: **squash merge** unless the human specifies otherwise.
|
|
74
|
+
|
|
75
|
+
### 5. Post-Merge Verification & Cleanup
|
|
76
|
+
|
|
77
|
+
- Run tests on the merged result — **do not skip this**. Broken code must never reach base branches.
|
|
78
|
+
- Delete the feature branch (remote and local) — only for options 1 and 4
|
|
79
|
+
- If a worktree was entered via `EnterWorktree` for this branch, call `ExitWorktree(action="remove")` for options 1 and 4 (never raw `git worktree remove`); options 2 and 3 use `ExitWorktree(action="keep")` as described in Section 3. If no worktree was entered via `EnterWorktree`, this step is a no-op.
|
|
80
|
+
- After removal, verify no orphaned worktree or branch remains — e.g. `git worktree list` and `git branch` should show nothing for the deleted branch
|
|
81
|
+
|
|
82
|
+
## Integration
|
|
83
|
+
|
|
84
|
+
- Triggered after Phase 3 human gate approval
|
|
85
|
+
- PR creation follows the git commit conventions in the project
|
|
86
|
+
|
|
87
|
+
## Output
|
|
88
|
+
|
|
89
|
+
A merged PR with clean branch history, closed issues, and deleted feature branch.
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: browse
|
|
3
|
+
description: >-
|
|
4
|
+
Launch a browser to navigate URLs, take screenshots, click elements, and fill
|
|
5
|
+
forms. Use for visual verification, e2e testing, and interactive debugging.
|
|
6
|
+
argument-hint: "<url> [--screenshot <path>] [--click <selector>] [--fill <selector> <value>] [--wait <ms>] [--viewport <WxH>]"
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read, Glob, Grep, Bash(npx playwright *), Bash(node *)
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Browse
|
|
12
|
+
|
|
13
|
+
Role: worker. This command provides browser-based interaction for visual verification and e2e testing.
|
|
14
|
+
|
|
15
|
+
You have been invoked with the `/browse` command.
|
|
16
|
+
|
|
17
|
+
## Worker constraints
|
|
18
|
+
|
|
19
|
+
1. Drive the browser only; do not edit source.
|
|
20
|
+
2. Capture evidence (screenshots/logs); do not assert pass/fail beyond what was observed.
|
|
21
|
+
3. **Be concise.** Report observations and artifacts, no preamble.
|
|
22
|
+
|
|
23
|
+
## Parse Arguments
|
|
24
|
+
|
|
25
|
+
Arguments: $ARGUMENTS
|
|
26
|
+
|
|
27
|
+
- Positional: `<url>` (required) — the URL to navigate to
|
|
28
|
+
- `--screenshot <path>`: Save screenshot to this path (default: `tmp/screenshots/<timestamp>.png`)
|
|
29
|
+
- `--click <selector>`: CSS selector to click after page load
|
|
30
|
+
- `--fill <selector> <value>`: CSS selector and value for form input (can be repeated)
|
|
31
|
+
- `--wait <ms>`: Wait this many milliseconds after page load (default: 1000)
|
|
32
|
+
- `--viewport <WxH>`: Viewport dimensions (default: `1280x720`)
|
|
33
|
+
|
|
34
|
+
## Steps
|
|
35
|
+
|
|
36
|
+
### 1. Check Playwright availability
|
|
37
|
+
|
|
38
|
+
Run:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx playwright --version 2>/dev/null
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
If Playwright is not available, ask the user:
|
|
45
|
+
> Playwright is required for browser interaction. Run `/project-init` to set up
|
|
46
|
+
> this repo's tooling (installs Playwright + Chromium for frontend projects), or
|
|
47
|
+
> install it directly now:
|
|
48
|
+
>
|
|
49
|
+
> ```
|
|
50
|
+
> npx playwright install chromium
|
|
51
|
+
> ```
|
|
52
|
+
|
|
53
|
+
Do not proceed until Playwright is confirmed available.
|
|
54
|
+
|
|
55
|
+
### 2. Ensure screenshot directory exists
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
mkdir -p tmp/screenshots
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 3. Execute browser action
|
|
62
|
+
|
|
63
|
+
Write a temporary Node.js script and execute it with `node`. Use Playwright's API directly for reliable, scriptable interaction.
|
|
64
|
+
|
|
65
|
+
**Template** (adapt based on parsed arguments):
|
|
66
|
+
|
|
67
|
+
```javascript
|
|
68
|
+
const { chromium } = require('playwright');
|
|
69
|
+
|
|
70
|
+
(async () => {
|
|
71
|
+
const browser = await chromium.launch({ headless: true });
|
|
72
|
+
const context = await browser.newContext({
|
|
73
|
+
viewport: { width: VIEWPORT_WIDTH, height: VIEWPORT_HEIGHT }
|
|
74
|
+
});
|
|
75
|
+
const page = await context.newPage();
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
await page.goto('URL', { waitUntil: 'networkidle', timeout: 30000 });
|
|
79
|
+
await page.waitForTimeout(WAIT_MS);
|
|
80
|
+
|
|
81
|
+
// -- Click actions (if --click provided) --
|
|
82
|
+
// await page.click('SELECTOR');
|
|
83
|
+
|
|
84
|
+
// -- Fill actions (if --fill provided) --
|
|
85
|
+
// await page.fill('SELECTOR', 'VALUE');
|
|
86
|
+
|
|
87
|
+
// -- Screenshot --
|
|
88
|
+
await page.screenshot({ path: 'SCREENSHOT_PATH', fullPage: true });
|
|
89
|
+
|
|
90
|
+
console.log('Screenshot saved to: SCREENSHOT_PATH');
|
|
91
|
+
console.log('Page title:', await page.title());
|
|
92
|
+
console.log('Page URL:', page.url());
|
|
93
|
+
} catch (err) {
|
|
94
|
+
console.error('Browser error:', err.message);
|
|
95
|
+
// Take a screenshot of the error state if possible
|
|
96
|
+
try {
|
|
97
|
+
await page.screenshot({ path: 'SCREENSHOT_PATH', fullPage: true });
|
|
98
|
+
console.log('Error-state screenshot saved to: SCREENSHOT_PATH');
|
|
99
|
+
} catch {}
|
|
100
|
+
} finally {
|
|
101
|
+
await browser.close();
|
|
102
|
+
}
|
|
103
|
+
})();
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Write the script to a temp file, execute it, then clean up:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
node /tmp/browse-action.js && rm /tmp/browse-action.js
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 4. Read and describe the screenshot
|
|
113
|
+
|
|
114
|
+
Use the Read tool to view the screenshot image. Claude's multimodal capabilities will interpret the visual content.
|
|
115
|
+
|
|
116
|
+
Describe what you see:
|
|
117
|
+
|
|
118
|
+
- Page layout and structure
|
|
119
|
+
- Key visible content (headings, text, images)
|
|
120
|
+
- State of interactive elements (forms, buttons, error messages)
|
|
121
|
+
- Anything that looks broken, misaligned, or unexpected
|
|
122
|
+
|
|
123
|
+
### 5. Report results
|
|
124
|
+
|
|
125
|
+
Provide a summary:
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
## Browse Results
|
|
129
|
+
- **URL**: <final URL after any redirects>
|
|
130
|
+
- **Title**: <page title>
|
|
131
|
+
- **Viewport**: <width>x<height>
|
|
132
|
+
- **Screenshot**: <path to screenshot>
|
|
133
|
+
- **Actions performed**: <list of click/fill actions, or "none">
|
|
134
|
+
- **Observations**: <what you see in the screenshot>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
If the user's goal appears to be testing or verification, note any issues found and suggest next steps.
|
|
138
|
+
|
|
139
|
+
## Error Handling
|
|
140
|
+
|
|
141
|
+
- **Navigation timeout**: Report the URL that failed and suggest checking if the server is running
|
|
142
|
+
- **Element not found**: Report the selector that failed and suggest inspecting the page structure
|
|
143
|
+
- **CAPTCHA or auth wall**: Report that manual intervention is needed — instruct the user to complete the challenge in their browser, then re-run `/browse` to continue
|
|
144
|
+
- **Playwright not installed**: Point the user at `/project-init` to set up the repo's tooling, or guide them through `npx playwright install chromium`
|
|
145
|
+
|
|
146
|
+
## Automated Smoke Test Mode
|
|
147
|
+
|
|
148
|
+
When invoked non-interactively by the inline review pipeline (Stage 3 browser verification), the caller provides:
|
|
149
|
+
|
|
150
|
+
- **URL**: The dev server URL for the page under test
|
|
151
|
+
- **Selectors to verify**: CSS selectors that should be visible after the change (e.g., `[data-testid="user-list"]`, `.dashboard-header`)
|
|
152
|
+
- **Expected state**: Brief description of what the page should look like
|
|
153
|
+
|
|
154
|
+
In this mode:
|
|
155
|
+
|
|
156
|
+
1. Navigate to the URL with a 30-second timeout
|
|
157
|
+
2. Wait for network idle
|
|
158
|
+
3. For each selector, verify it exists and is visible
|
|
159
|
+
4. Take a full-page screenshot as verification evidence
|
|
160
|
+
5. Return a structured result:
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
- url: <final URL>
|
|
164
|
+
- selectors_found: [list of selectors that were visible]
|
|
165
|
+
- selectors_missing: [list of selectors that were not found or not visible]
|
|
166
|
+
- screenshot: <path to screenshot>
|
|
167
|
+
- status: pass | fail
|
|
168
|
+
- issues: [description of any rendering problems observed]
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
If the connection times out or refuses (dev server not running), return:
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
- status: skipped
|
|
175
|
+
- reason: "Dev server not reachable at <URL>"
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
This result feeds into the review loop — `fail` triggers correction iterations (max 2), `skipped` is logged as a warning and does not block the build.
|
|
179
|
+
|
|
180
|
+
## Multi-Step Interactions
|
|
181
|
+
|
|
182
|
+
For complex flows (login → navigate → fill form → submit), chain actions in a single script rather than multiple `/browse` invocations. Build the full action sequence in the Node.js script.
|
|
183
|
+
|
|
184
|
+
If the user describes a multi-step flow conversationally, translate it into the appropriate Playwright action sequence.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: browser-testing
|
|
3
|
+
description: >-
|
|
4
|
+
Patterns and templates for browser-based QA using Playwright. Covers
|
|
5
|
+
navigation, form interaction, screenshot capture, visual verification,
|
|
6
|
+
and CAPTCHA/auth handoff.
|
|
7
|
+
role: worker
|
|
8
|
+
user-invocable: false
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Browser Testing Skill
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
This skill provides reusable patterns for browser-based testing and visual verification using Playwright. Agents load this skill when they need to interact with a running application through a real browser.
|
|
16
|
+
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
Playwright must be installed with at least the Chromium browser — `/project-init` installs it for frontend projects, or install manually:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx playwright install chromium
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Playwright Patterns
|
|
26
|
+
|
|
27
|
+
| Category | Description |
|
|
28
|
+
| ---------- | ------------- |
|
|
29
|
+
| Navigation | `goto`, `waitForSelector`, `waitForNavigation` with network-idle |
|
|
30
|
+
| Form Interaction | `fill`, `selectOption`, `check`, `setInputFiles`, submit |
|
|
31
|
+
| Click Actions | Click by selector/text, double-click, right-click, hover |
|
|
32
|
+
| Screenshots | Full page, viewport, element, and clipped region captures |
|
|
33
|
+
| Waiting Strategies | Selector appear/disappear, text match, network response |
|
|
34
|
+
| Data Extraction | `textContent`, `getAttribute`, `inputValue`, `count`, `isVisible` |
|
|
35
|
+
| Script Template | Full `/browse` boilerplate with error capture and console logging |
|
|
36
|
+
| Error Handling | Common timeout, connection, and protocol errors with resolutions |
|
|
37
|
+
| CAPTCHA/Auth Handoff | Detect walls, report to user, resume from `storageState` |
|
|
38
|
+
|
|
39
|
+
See `references/playwright-patterns.md` for full code examples, the script template, and the error handling table.
|
|
40
|
+
|
|
41
|
+
## Fast Feedback Loop
|
|
42
|
+
|
|
43
|
+
A verification pass is usually a *sequence* of related checks, not one isolated check — keep the loop cheap:
|
|
44
|
+
|
|
45
|
+
- **Batch checks into one session.** Launch the browser once, run the full sequence of actions/waits/screenshots needed for the verification pass, then close — don't relaunch a fresh browser per individual check.
|
|
46
|
+
- **Reserve `networkidle` for the first navigation.** After the initial `goto`, a re-check following a known, small change should wait on the specific signal that changed (`waitForSelector`, `waitForResponse`) rather than re-waiting on full network idle.
|
|
47
|
+
- **Skip the reload when nothing routed.** If the change under verification didn't require a new route or a fresh document, act on the already-loaded page instead of calling `page.goto()` again or relaunching; use `page.reload()` only when a fresh document is genuinely required.
|
|
48
|
+
- **Scope intermediate screenshots.** Prefer element/clip screenshots for the in-between checks in a sequence; reserve full-page screenshots for the final verification.
|
|
49
|
+
|
|
50
|
+
The underlying principle — prefer the cheapest deterministic signal over a broad, expensive wait — is the same one that governs CI-gate test-suite design, but this section applies it to a single interactive verification session, not a project's test architecture.
|
|
51
|
+
|
|
52
|
+
## Visual Verification Guidelines
|
|
53
|
+
|
|
54
|
+
When interpreting screenshots, describe:
|
|
55
|
+
|
|
56
|
+
1. **Layout**: Is the page structure correct? Any overlapping elements, broken grids, or overflow?
|
|
57
|
+
2. **Content**: Is the expected text/data visible? Any placeholder text or missing images?
|
|
58
|
+
3. **State**: Are interactive elements in the right state? (buttons enabled/disabled, forms populated, etc.)
|
|
59
|
+
4. **Responsiveness**: At the given viewport, does the layout adapt correctly?
|
|
60
|
+
5. **Errors**: Any visible error messages, 404 pages, or console errors captured?
|
|
61
|
+
|
|
62
|
+
Compare observations against acceptance criteria when available. Flag discrepancies as findings.
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# Playwright Patterns Reference
|
|
2
|
+
|
|
3
|
+
## Interaction Patterns
|
|
4
|
+
|
|
5
|
+
### Navigation
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
// Basic navigation — waits for network to settle
|
|
9
|
+
await page.goto('http://localhost:3000', { waitUntil: 'networkidle', timeout: 30000 });
|
|
10
|
+
|
|
11
|
+
// Wait for a specific element before proceeding
|
|
12
|
+
await page.waitForSelector('[data-testid="app-loaded"]', { timeout: 10000 });
|
|
13
|
+
|
|
14
|
+
// Wait for navigation after a click
|
|
15
|
+
await Promise.all([
|
|
16
|
+
page.waitForNavigation({ waitUntil: 'networkidle' }),
|
|
17
|
+
page.click('a[href="/dashboard"]')
|
|
18
|
+
]);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Form Interaction
|
|
22
|
+
|
|
23
|
+
```javascript
|
|
24
|
+
// Fill a text input
|
|
25
|
+
await page.fill('input[name="email"]', 'user@example.com');
|
|
26
|
+
|
|
27
|
+
// Fill and submit a form
|
|
28
|
+
await page.fill('input[name="username"]', 'testuser');
|
|
29
|
+
await page.fill('input[name="password"]', 'testpass');
|
|
30
|
+
await page.click('button[type="submit"]');
|
|
31
|
+
|
|
32
|
+
// Select from a dropdown
|
|
33
|
+
await page.selectOption('select#country', 'US');
|
|
34
|
+
|
|
35
|
+
// Check a checkbox
|
|
36
|
+
await page.check('input[type="checkbox"]#agree');
|
|
37
|
+
|
|
38
|
+
// Upload a file
|
|
39
|
+
await page.setInputFiles('input[type="file"]', '/path/to/file.pdf');
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Click and Interact
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
// Click a button
|
|
46
|
+
await page.click('button.submit');
|
|
47
|
+
|
|
48
|
+
// Click by text content
|
|
49
|
+
await page.click('text=Sign In');
|
|
50
|
+
|
|
51
|
+
// Double-click
|
|
52
|
+
await page.dblclick('.editable-cell');
|
|
53
|
+
|
|
54
|
+
// Right-click
|
|
55
|
+
await page.click('.context-menu-target', { button: 'right' });
|
|
56
|
+
|
|
57
|
+
// Hover
|
|
58
|
+
await page.hover('.tooltip-trigger');
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Screenshots
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
// Full page screenshot
|
|
65
|
+
await page.screenshot({ path: 'tmp/screenshots/full.png', fullPage: true });
|
|
66
|
+
|
|
67
|
+
// Viewport-only screenshot
|
|
68
|
+
await page.screenshot({ path: 'tmp/screenshots/viewport.png' });
|
|
69
|
+
|
|
70
|
+
// Element screenshot
|
|
71
|
+
const element = await page.locator('.hero-section');
|
|
72
|
+
await element.screenshot({ path: 'tmp/screenshots/hero.png' });
|
|
73
|
+
|
|
74
|
+
// Screenshot with custom clip region
|
|
75
|
+
await page.screenshot({
|
|
76
|
+
path: 'tmp/screenshots/region.png',
|
|
77
|
+
clip: { x: 0, y: 0, width: 800, height: 600 }
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Waiting Strategies
|
|
82
|
+
|
|
83
|
+
```javascript
|
|
84
|
+
// Wait for element to appear
|
|
85
|
+
await page.waitForSelector('.results-loaded');
|
|
86
|
+
|
|
87
|
+
// Wait for element to disappear (e.g., loading spinner)
|
|
88
|
+
await page.waitForSelector('.spinner', { state: 'hidden' });
|
|
89
|
+
|
|
90
|
+
// Wait for specific text
|
|
91
|
+
await page.waitForSelector('text=Results found');
|
|
92
|
+
|
|
93
|
+
// Wait for network request to complete
|
|
94
|
+
await page.waitForResponse(resp =>
|
|
95
|
+
resp.url().includes('/api/data') && resp.status() === 200
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
// Fixed delay (use sparingly — prefer selector/response waits)
|
|
99
|
+
await page.waitForTimeout(2000);
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### Batched re-check session (fast feedback loop)
|
|
103
|
+
|
|
104
|
+
For a QA pass with several related checks, reuse one browser/page instead of relaunching per check. Use `networkidle` only for the first navigation; wait on the specific signal that changed for each re-check after that.
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
const browser = await chromium.launch({ headless: true });
|
|
108
|
+
const page = await (await browser.newContext()).newPage();
|
|
109
|
+
|
|
110
|
+
// First navigation: full network-idle wait
|
|
111
|
+
await page.goto('http://localhost:3000/form', { waitUntil: 'networkidle' });
|
|
112
|
+
await page.screenshot({ path: 'tmp/screenshots/01-initial.png', fullPage: true });
|
|
113
|
+
|
|
114
|
+
// Re-check 1: same page, small change — wait on the specific signal, not networkidle
|
|
115
|
+
await page.fill('input[name="email"]', 'user@example.com');
|
|
116
|
+
await page.click('button[type="submit"]');
|
|
117
|
+
await page.waitForSelector('.confirmation-banner');
|
|
118
|
+
await page.locator('.confirmation-banner').screenshot({ path: 'tmp/screenshots/02-confirmation.png' });
|
|
119
|
+
|
|
120
|
+
// Re-check 2: still no route change — no goto/reload needed
|
|
121
|
+
await page.waitForResponse(resp => resp.url().includes('/api/status') && resp.status() === 200);
|
|
122
|
+
await page.locator('.status-panel').screenshot({ path: 'tmp/screenshots/03-status.png' });
|
|
123
|
+
|
|
124
|
+
await browser.close();
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Extracting Information
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
// Get text content
|
|
131
|
+
const heading = await page.textContent('h1');
|
|
132
|
+
|
|
133
|
+
// Get attribute
|
|
134
|
+
const href = await page.getAttribute('a.primary', 'href');
|
|
135
|
+
|
|
136
|
+
// Get input value
|
|
137
|
+
const value = await page.inputValue('input[name="search"]');
|
|
138
|
+
|
|
139
|
+
// Count elements
|
|
140
|
+
const count = await page.locator('.list-item').count();
|
|
141
|
+
|
|
142
|
+
// Get all text from a list
|
|
143
|
+
const items = await page.locator('.list-item').allTextContents();
|
|
144
|
+
|
|
145
|
+
// Check visibility
|
|
146
|
+
const isVisible = await page.locator('.error-message').isVisible();
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Script Template
|
|
150
|
+
|
|
151
|
+
Full template for a `/browse` action script:
|
|
152
|
+
|
|
153
|
+
```javascript
|
|
154
|
+
const { chromium } = require('playwright');
|
|
155
|
+
|
|
156
|
+
(async () => {
|
|
157
|
+
const browser = await chromium.launch({ headless: true });
|
|
158
|
+
const context = await browser.newContext({
|
|
159
|
+
viewport: { width: 1280, height: 720 },
|
|
160
|
+
// Uncomment for mobile testing:
|
|
161
|
+
// ...require('playwright').devices['iPhone 13']
|
|
162
|
+
});
|
|
163
|
+
const page = await context.newPage();
|
|
164
|
+
|
|
165
|
+
// Capture console messages for debugging
|
|
166
|
+
page.on('console', msg => {
|
|
167
|
+
if (msg.type() === 'error') console.log('CONSOLE ERROR:', msg.text());
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// Capture uncaught errors
|
|
171
|
+
page.on('pageerror', err => console.log('PAGE ERROR:', err.message));
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
await page.goto('TARGET_URL', { waitUntil: 'networkidle', timeout: 30000 });
|
|
175
|
+
|
|
176
|
+
// --- Actions go here ---
|
|
177
|
+
|
|
178
|
+
await page.screenshot({ path: 'SCREENSHOT_PATH', fullPage: true });
|
|
179
|
+
console.log('Page title:', await page.title());
|
|
180
|
+
console.log('Page URL:', page.url());
|
|
181
|
+
} catch (err) {
|
|
182
|
+
console.error('Error:', err.message);
|
|
183
|
+
try {
|
|
184
|
+
await page.screenshot({ path: 'SCREENSHOT_PATH', fullPage: true });
|
|
185
|
+
} catch {}
|
|
186
|
+
process.exitCode = 1;
|
|
187
|
+
} finally {
|
|
188
|
+
await browser.close();
|
|
189
|
+
}
|
|
190
|
+
})();
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Error Handling
|
|
194
|
+
|
|
195
|
+
| Error | Cause | Resolution |
|
|
196
|
+
| ------- | ------- | ------------ |
|
|
197
|
+
| `TimeoutError: page.goto` | Server not running or URL wrong | Check if dev server is up; verify URL |
|
|
198
|
+
| `TimeoutError: waiting for selector` | Element doesn't exist or is hidden | Inspect page HTML; check selector syntax |
|
|
199
|
+
| `net::ERR_CONNECTION_REFUSED` | No server at the target port | Start the dev server first |
|
|
200
|
+
| `Protocol error: Target closed` | Page crashed or browser closed | Simplify the script; check for infinite loops |
|
|
201
|
+
|
|
202
|
+
## CAPTCHA and Authentication Handoff
|
|
203
|
+
|
|
204
|
+
When automated browsing hits a CAPTCHA, MFA, or OAuth login wall:
|
|
205
|
+
|
|
206
|
+
1. **Detect**: Page contains CAPTCHA iframe, MFA form, or redirected to OAuth provider
|
|
207
|
+
2. **Report**: Tell the user what was encountered and where
|
|
208
|
+
3. **Handoff**: Instruct the user to complete the challenge manually in their browser
|
|
209
|
+
4. **Resume**: After manual completion, re-run `/browse` from the authenticated state
|
|
210
|
+
|
|
211
|
+
For recurring auth needs, suggest the user:
|
|
212
|
+
|
|
213
|
+
- Set up a test account with MFA disabled
|
|
214
|
+
- Use session cookies via Playwright's `storageState`
|
|
215
|
+
- Pre-authenticate and save state: `await context.storageState({ path: 'auth.json' })`
|
|
216
|
+
- Load saved state: `browser.newContext({ storageState: 'auth.json' })`
|