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,200 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "project-init",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "I need a new Node.js project for a CLI tool that processes CSV files. Just set up the project structure and tooling, I'll add the CSV logic myself.",
|
|
7
|
+
"expected_output": "A scaffolded JS project with package.json (type: module), eslint.config.js with functional rules, prettier.config.js, .editorconfig, .gitignore, vitest.config.js, and a starter src/index.js + src/index.test.js. No Playwright since this is a backend project. All lint/format/test commands should pass.",
|
|
8
|
+
"files": [],
|
|
9
|
+
"expectations": [
|
|
10
|
+
"package.json has \"type\": \"module\"",
|
|
11
|
+
"eslint.config.js exists and uses flat config format (export default [])",
|
|
12
|
+
"ESLint config bans ClassDeclaration and ClassExpression",
|
|
13
|
+
"prettier.config.js exists with singleQuote: true",
|
|
14
|
+
".editorconfig exists with indent_size = 2",
|
|
15
|
+
".gitignore includes node_modules and .env",
|
|
16
|
+
"vitest.config.js exists",
|
|
17
|
+
"No playwright.config.js (backend project)",
|
|
18
|
+
"src/index.js exports a pure function",
|
|
19
|
+
"src/index.test.js imports from src/index.js and has passing tests",
|
|
20
|
+
"npm run lint succeeds",
|
|
21
|
+
"npm test succeeds",
|
|
22
|
+
"The skill presented defaults and asked for confirmation before scaffolding"
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": 2,
|
|
27
|
+
"prompt": "Set up a new React project for a dashboard app. I want the full tooling — linting, formatting, testing, the works.",
|
|
28
|
+
"expected_output": "A scaffolded JS project with all standard configs plus Playwright for e2e testing. Should include playwright.config.js and an e2e/ directory. The package.json should have a test:e2e script.",
|
|
29
|
+
"files": [],
|
|
30
|
+
"expectations": [
|
|
31
|
+
"package.json has \"type\": \"module\"",
|
|
32
|
+
"playwright.config.js exists (frontend project detected)",
|
|
33
|
+
"e2e/ directory exists with at least one spec file",
|
|
34
|
+
"package.json scripts include test:e2e",
|
|
35
|
+
"eslint.config.js bans classes",
|
|
36
|
+
".gitignore includes .env",
|
|
37
|
+
"vitest.config.js exists",
|
|
38
|
+
"The skill presented defaults and asked for confirmation before scaffolding"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": 3,
|
|
43
|
+
"prompt": "Init a JS project but I want tabs instead of spaces, semicolons on, and 4-space tab width. Everything else can be default.",
|
|
44
|
+
"expected_output": "Standard scaffold but with customized formatting: prettier uses tabs, semicolons, tabWidth 4. EditorConfig uses tab indent. ESLint still has functional rules.",
|
|
45
|
+
"files": [],
|
|
46
|
+
"expectations": [
|
|
47
|
+
"prettier.config.js has useTabs: true",
|
|
48
|
+
"prettier.config.js has semi: true",
|
|
49
|
+
"prettier.config.js has tabWidth: 4",
|
|
50
|
+
".editorconfig has indent_style = tab",
|
|
51
|
+
".editorconfig has indent_size = 4 or tab_width = 4",
|
|
52
|
+
"eslint.config.js still bans ClassDeclaration",
|
|
53
|
+
"package.json has \"type\": \"module\"",
|
|
54
|
+
"npm run lint succeeds",
|
|
55
|
+
"npm test succeeds"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": 4,
|
|
60
|
+
"prompt": "Get this repo ready for the plugin.",
|
|
61
|
+
"expected_output": "Python detected from pyproject.toml + .py sources. The three-column plan shows ruff and mypy (and pytest, since no test runner is present) under 'missing and will add'; after confirmation they are added to the project's dev-dependency mechanism, nothing user-level or global. Post-install probes (command -v ruff / command -v mypy) reported.",
|
|
62
|
+
"files": [
|
|
63
|
+
{ "path": "pyproject.toml", "contents": "[project]\nname = \"csvkit-lite\"\nversion = \"0.1.0\"\n" },
|
|
64
|
+
{ "path": "src/app.py", "contents": "def add(a, b):\n return a + b\n" }
|
|
65
|
+
],
|
|
66
|
+
"expectations": [
|
|
67
|
+
"Detected stack is Python only",
|
|
68
|
+
"A three-column plan (found and keeping / missing and will add / found but can't participate) is presented before any write or install",
|
|
69
|
+
"ruff, mypy, and pytest appear under 'missing and will add'",
|
|
70
|
+
"The install lands in the project's dev-dependency mechanism (pyproject.toml dev group or requirements-dev.txt)",
|
|
71
|
+
"No pip install --user, pipx, or other user-level/global install is run",
|
|
72
|
+
"pyproject.toml's existing [project] section is not rewritten",
|
|
73
|
+
"The skill ends by running command -v ruff and command -v mypy and reporting per-lane status"
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": 5,
|
|
78
|
+
"prompt": "Set up my project's toolchain.",
|
|
79
|
+
"expected_output": "C# detected from the .csproj. Nothing is installed — the skill verifies the .NET SDK is present (honoring the global.json pin) and that dotnet format responds, then reports the lane bound to the SDK-builtin tools.",
|
|
80
|
+
"files": [
|
|
81
|
+
{ "path": "Api.csproj", "contents": "<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <TargetFramework>net8.0</TargetFramework>\n </PropertyGroup>\n</Project>" },
|
|
82
|
+
{ "path": "global.json", "contents": "{ \"sdk\": { \"version\": \"8.0.100\" } }" },
|
|
83
|
+
{ "path": "Program.cs", "contents": "System.Console.WriteLine(\"hi\");\n" }
|
|
84
|
+
],
|
|
85
|
+
"expectations": [
|
|
86
|
+
"Detected stack is C# only",
|
|
87
|
+
"The plan states there is nothing to install for C#",
|
|
88
|
+
"The global.json SDK pin is honored, not overwritten",
|
|
89
|
+
"dotnet format --version is verified to respond",
|
|
90
|
+
"The probe command -v dotnet is run and per-lane status reported"
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": 6,
|
|
95
|
+
"prompt": "Install the linters for this repo.",
|
|
96
|
+
"expected_output": "Java detected from pom.xml + .java sources. After confirmation the skill verifies a JDK, runs the plugin's pinned-PMD installer into repo-local .pmd/, and adds .pmd/ to .gitignore. The user never invokes the installer script by hand.",
|
|
97
|
+
"files": [
|
|
98
|
+
{ "path": "pom.xml", "contents": "<project><modelVersion>4.0.0</modelVersion><groupId>x</groupId><artifactId>demo</artifactId><version>1.0</version></project>" },
|
|
99
|
+
{ "path": "src/main/java/App.java", "contents": "public class App { public static void main(String[] a) {} }" }
|
|
100
|
+
],
|
|
101
|
+
"expectations": [
|
|
102
|
+
"Detected stack is Java only",
|
|
103
|
+
"The plan shows PMD under 'missing and will add' before anything runs",
|
|
104
|
+
"The pinned-PMD installer script is run for the user (no manual script invocation asked of them)",
|
|
105
|
+
"PMD lands in repo-local .pmd/, and .pmd/ is added to .gitignore",
|
|
106
|
+
"No user-level or global install occurs",
|
|
107
|
+
"The probe checks .pmd/pmd-bin-*/bin/pmd first, then command -v pmd, and reports status"
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": 7,
|
|
112
|
+
"prompt": "Get this repo ready for the dev-team toolchain.",
|
|
113
|
+
"expected_output": "Mixed Python + TypeScript repo: both lanes are detected and both appear in one three-column plan; each lane's missing tools are installed repo-level after a single confirmation.",
|
|
114
|
+
"files": [
|
|
115
|
+
{ "path": "pyproject.toml", "contents": "[project]\nname = \"mixed\"\nversion = \"0.1.0\"\n" },
|
|
116
|
+
{ "path": "etl/main.py", "contents": "print(\"etl\")\n" },
|
|
117
|
+
{ "path": "tsconfig.json", "contents": "{ \"compilerOptions\": { \"strict\": true } }" },
|
|
118
|
+
{ "path": "src/index.ts", "contents": "export const add = (a: number, b: number): number => a + b;\n" },
|
|
119
|
+
{ "path": "package.json", "contents": "{ \"name\": \"mixed\", \"private\": true, \"type\": \"module\" }" }
|
|
120
|
+
],
|
|
121
|
+
"expectations": [
|
|
122
|
+
"Both Python and JS/TS lanes are detected (multi-stack setup)",
|
|
123
|
+
"One three-column plan covers both lanes before any install",
|
|
124
|
+
"Python: ruff and mypy under 'missing and will add', installed into the project's dev-dependency mechanism",
|
|
125
|
+
"JS/TS: oxlint under 'missing and will add', installed with npm install --save-dev oxlint",
|
|
126
|
+
"Post-install probes run for both lanes and per-lane status is reported"
|
|
127
|
+
]
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"id": 8,
|
|
131
|
+
"prompt": "Set up my project's toolchain. (If asked which stack, answer: something else — it's a Rust project.)",
|
|
132
|
+
"expected_output": "The directory has no detectable stack, so the skill asks the user, presenting the four supported stacks plus 'something else'. On 'something else' it explains what's supported and exits gracefully — no files written, nothing installed.",
|
|
133
|
+
"files": [
|
|
134
|
+
{ "path": "README.md", "contents": "# my project\n" }
|
|
135
|
+
],
|
|
136
|
+
"expectations": [
|
|
137
|
+
"The skill asks the user instead of assuming a stack",
|
|
138
|
+
"The four supported stacks (JS/TS, Python, C#, Java) plus 'something else' are offered",
|
|
139
|
+
"On 'something else' the skill explains what's supported",
|
|
140
|
+
"The skill exits without writing any file or installing anything"
|
|
141
|
+
]
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"id": 9,
|
|
145
|
+
"prompt": "Get this repo ready for the plugin.",
|
|
146
|
+
"expected_output": "Brownfield Python repo already configured with black + flake8: the inventory binds the pair as the autofix slot's provider (bind-don't-replace), so the plan shows them under 'found and keeping' and installs nothing for that slot; only mypy (the empty diagnostic slot) appears under 'missing and will add'.",
|
|
147
|
+
"files": [
|
|
148
|
+
{ "path": "pyproject.toml", "contents": "[project]\nname = \"legacy\"\nversion = \"2.3.0\"\n\n[tool.black]\nline-length = 100\n" },
|
|
149
|
+
{ "path": ".flake8", "contents": "[flake8]\nmax-line-length = 100\n" },
|
|
150
|
+
{ "path": "requirements-dev.txt", "contents": "black==24.4.2\nflake8==7.0.0\npytest==8.2.0\n" },
|
|
151
|
+
{ "path": "legacy/core.py", "contents": "def run():\n return 42\n" }
|
|
152
|
+
],
|
|
153
|
+
"expectations": [
|
|
154
|
+
"black + flake8 are bound as the autofix slot's provider and shown under 'found and keeping' (with the partial-mapping caveat noted)",
|
|
155
|
+
"ruff is NOT installed — the bound pair satisfies the slot",
|
|
156
|
+
"mypy appears under 'missing and will add' (empty diagnostic slot) and is the only install",
|
|
157
|
+
"pytest is not re-added (a test runner is already present)",
|
|
158
|
+
"The install goes into requirements-dev.txt (the mechanism the project already uses)",
|
|
159
|
+
"pyproject.toml's [tool.black] section and .flake8 are left untouched"
|
|
160
|
+
]
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"id": 10,
|
|
164
|
+
"prompt": "Install the linters for this repo.",
|
|
165
|
+
"expected_output": "Brownfield Python repo with pyright configured: pyright fails the qualification contract (its recognition adapter does not exist yet), so the plan surfaces it under 'found but can't participate' with that reason stated and mypy offered alongside — never silently replaced. Only the 'missing and will add' column installs.",
|
|
166
|
+
"files": [
|
|
167
|
+
{ "path": "pyproject.toml", "contents": "[project]\nname = \"typed-app\"\nversion = \"0.5.0\"\n" },
|
|
168
|
+
{ "path": "pyrightconfig.json", "contents": "{ \"typeCheckingMode\": \"strict\" }" },
|
|
169
|
+
{ "path": "app/main.py", "contents": "def greet(name: str) -> str:\n return f\"hi {name}\"\n" }
|
|
170
|
+
],
|
|
171
|
+
"expectations": [
|
|
172
|
+
"pyright is listed under 'found but can't participate' with the reason (no recognition adapter yet) stated",
|
|
173
|
+
"mypy is offered alongside as the diagnostic default, not silently swapped in",
|
|
174
|
+
"Only tools in 'missing and will add' are installed",
|
|
175
|
+
"pyrightconfig.json is left untouched",
|
|
176
|
+
"The user confirms the plan before any install runs"
|
|
177
|
+
]
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"id": 11,
|
|
181
|
+
"prompt": "Set up my project's toolchain.",
|
|
182
|
+
"expected_output": "Mixed brownfield repo with an existing eslint.config.js and pyproject.toml: tools-only mode installs missing dependencies without modifying either file; the plan shows the existing configs under 'found and keeping' and the summary names them as left alone.",
|
|
183
|
+
"files": [
|
|
184
|
+
{ "path": "package.json", "contents": "{ \"name\": \"web\", \"private\": true, \"type\": \"module\", \"devDependencies\": { \"eslint\": \"^9.0.0\" } }" },
|
|
185
|
+
{ "path": "eslint.config.js", "contents": "export default [{ rules: { 'prefer-const': 'error' } }];\n" },
|
|
186
|
+
{ "path": "src/index.js", "contents": "export const id = (x) => x;\n" },
|
|
187
|
+
{ "path": "pyproject.toml", "contents": "[project]\nname = \"web-tools\"\nversion = \"1.0.0\"\n\n[tool.ruff]\nline-length = 100\n" },
|
|
188
|
+
{ "path": "tools/gen.py", "contents": "print(\"gen\")\n" }
|
|
189
|
+
],
|
|
190
|
+
"expectations": [
|
|
191
|
+
"Tools-only mode: no scaffold, no config file created or overwritten",
|
|
192
|
+
"eslint.config.js and pyproject.toml appear under 'found and keeping' and are byte-identical afterwards",
|
|
193
|
+
"ESLint binds with demotion noted (slice-boundary granularity) and one info line mentions the fast default (oxlint)",
|
|
194
|
+
"ruff binds from the existing [tool.ruff] config — not reinstalled over",
|
|
195
|
+
"Only genuinely empty slots' defaults are installed, into devDependencies / the project's Python dev mechanism",
|
|
196
|
+
"The summary names the untouched configs explicitly"
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
]
|
|
200
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Capability-tools registry
|
|
2
|
+
|
|
3
|
+
Single source of truth for the **capability tools** that `/project-init`
|
|
4
|
+
installs beyond the four static-analysis lanes (JS/TS, Python, C#, Java).
|
|
5
|
+
These are the CLIs and browsers that other skills and agents depend on. The
|
|
6
|
+
skill's Step 4b reads this table: it runs each tool's **offer-when** signal,
|
|
7
|
+
presents the warranted tools as their own group in the three-column plan,
|
|
8
|
+
installs only the missing + confirmed ones with the **OS-aware install**
|
|
9
|
+
command, and probes them with the **verify** command in Step 5.
|
|
10
|
+
|
|
11
|
+
Detection-gated by design: a tool is only offered when its signal fires, so a
|
|
12
|
+
Python-only repo with no Dockerfile is never asked about the docker scanners.
|
|
13
|
+
Every offer is confirmed before anything installs — same gate as the lanes.
|
|
14
|
+
|
|
15
|
+
## Install-level honesty
|
|
16
|
+
|
|
17
|
+
The "always repo-level, never user/system" rule of the static-analysis lanes
|
|
18
|
+
applies to **lane tools + Playwright**. The other capability tools are CLIs
|
|
19
|
+
that are user/system-level by nature (`brew`, `pipx`, apt) — there is no
|
|
20
|
+
repo-local install for a general-purpose CLI like `gh` or `semgrep`. So:
|
|
21
|
+
|
|
22
|
+
- **Playwright** is the **repo-level exception among capability tools**: it
|
|
23
|
+
installs as an `npm` devDependency (`@playwright/test`), versioned with the
|
|
24
|
+
project, exactly like a lane tool. Only its Chromium browser download is
|
|
25
|
+
machine-level (a Playwright cache, not a repo file).
|
|
26
|
+
- **semgrep, adr, gh, hadolint, trivy, grype** are **user/system-level**
|
|
27
|
+
CLIs. Install them with the OS package manager (or pipx/user-pip on Linux).
|
|
28
|
+
This is the deliberate, documented exception to "always repo-level".
|
|
29
|
+
|
|
30
|
+
## Registry
|
|
31
|
+
|
|
32
|
+
| Tool | Skills that need it | Offer-when signal | OS-aware install command | Verify probe |
|
|
33
|
+
| --- | --- | --- | --- | --- |
|
|
34
|
+
| **semgrep** | `/semgrep-analyze`, security-assessment | Any source lane detected (universal SAST) — opt-in, confirmable | macOS: `brew install semgrep`. Linux: `pipx install semgrep` (fallback `python3 -m pip install --user semgrep`). Windows: `pipx install semgrep`. | `semgrep --version` |
|
|
35
|
+
| **Playwright + Chromium** | `/benchmark`, `/browse`, `/browser-testing`, `/performance-benchmark` | Frontend signals in an **existing** project: React/Svelte/Vue/Angular/Next/Nuxt/SvelteKit/Astro deps, or an `e2e/` dir, or a `playwright.config.*` file. (Greenfield JS scaffold installs it separately.) | Repo-level (npm devDependency): `npm i -D @playwright/test && npx playwright install chromium` | `npx --no-install playwright --version` |
|
|
36
|
+
| **adr** (npryce/adr-tools) | `/adr-tools`, adr-author agent | `docs/adr/`, `docs/decisions/`, or existing ADR `*.md` files present | macOS: `brew install adr-tools`. Linux/Windows: `git clone https://github.com/npryce/adr-tools` and put its `src/` on `PATH` (e.g. symlink into `~/.local/bin`). | `adr help` |
|
|
37
|
+
| **gh** (GitHub CLI) | `/issues-from-assessment` and other issue/PR skills | Git repo with a GitHub remote — `git remote -v` shows `github.com` | macOS: `brew install gh`. Linux: official apt repo (`cli.github.com`), or `webi`/binary download. Windows: `winget install GitHub.cli`. | `gh --version` |
|
|
38
|
+
| **hadolint** | `/docker-image-audit` | A `Dockerfile`, `*.dockerfile`, or `compose.y*ml` present | macOS: `brew install hadolint`. Linux/Windows: official release binary from `hadolint/hadolint`. | `hadolint --version` |
|
|
39
|
+
| **trivy** | `/docker-image-audit` | Same docker signal as hadolint | macOS: `brew install trivy`. Linux/Windows: official install script / release binary from `aquasecurity/trivy`. | `trivy --version` |
|
|
40
|
+
| **grype** | `/docker-image-audit` | Same docker signal as hadolint | macOS: `brew install grype`. Linux/Windows: official install script / release binary from `anchore/grype`. | `grype --version` |
|
|
41
|
+
| **codegraph** | code-intelligence (`codegraph_explore` MCP tool, `code-intelligence-nudge` hook) | Universal — opt-in, confirmable, offered on every repo like semgrep | Install/init is a multi-step state machine, not a single command — see Step 4c and [`codegraph-vs-graphify.md`](../../../knowledge/codegraph-vs-graphify.md). Manual install: `https://github.com/colbymchenry/codegraph#installation`. | `command -v codegraph`, `.codegraph/` present |
|
|
42
|
+
| **graphify** | `/graphify` (native skill, this repo's own `.claude/skills/graphify/`), architecture/onboarding questions spanning code + docs | Universal — opt-in, confirmable | `uv tool install graphifyy` (fallback `pipx install graphifyy`, fallback `python3 -m pip install --user graphifyy`), then `graphify install --project` and `graphify hook install` — see Step 4c for the CLAUDE.md corruption guard this install requires. | `graphify --version` |
|
|
43
|
+
|
|
44
|
+
macOS one-liner for the docker scanners: `brew install hadolint trivy grype`.
|
|
45
|
+
|
|
46
|
+
**codegraph and graphify get their own step (4c)**, not just a table row: codegraph's install+init flow is a stateful branch (installed × initialized), and graphify's install writes to the target repo's own `CLAUDE.md` and needs a corruption guard — both too complex for a single table row's install command. See `SKILL.md` Step 4c.
|
|
47
|
+
|
|
48
|
+
## OS awareness
|
|
49
|
+
|
|
50
|
+
Mirror the OS detection used by `/setup` — `uname -s` → `Darwin`
|
|
51
|
+
(macOS, brew), `Linux` (apt/dnf/yum/pacman, else pipx/user-pip/binary),
|
|
52
|
+
`MINGW*`/`MSYS*` (Windows Git Bash, winget/choco/scoop). WSL reports `Linux`
|
|
53
|
+
and follows the Linux column. When no package manager is detected, print the
|
|
54
|
+
manual install pointer from the table and continue — a missing capability
|
|
55
|
+
tool degrades the dependent skill gracefully; it never fails `/project-init`.
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Configuration File Templates
|
|
2
|
+
|
|
3
|
+
Exact contents for each config file created by the project-init skill. Use these as-is unless the user requested customizations at the confirmation gate.
|
|
4
|
+
|
|
5
|
+
## eslint.config.js
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
import js from '@eslint/js'
|
|
9
|
+
import prettier from 'eslint-config-prettier'
|
|
10
|
+
|
|
11
|
+
export default [
|
|
12
|
+
js.configs.recommended,
|
|
13
|
+
prettier,
|
|
14
|
+
{
|
|
15
|
+
rules: {
|
|
16
|
+
// Functional style: no classes
|
|
17
|
+
'no-restricted-syntax': [
|
|
18
|
+
'error',
|
|
19
|
+
{
|
|
20
|
+
selector: 'ClassDeclaration',
|
|
21
|
+
message: 'Use functions and closures instead of classes.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
selector: 'ClassExpression',
|
|
25
|
+
message: 'Use functions and closures instead of classes.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
selector: 'ThisExpression',
|
|
29
|
+
message: 'Avoid "this" — use closures and explicit parameters instead.',
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
|
|
33
|
+
// Immutability
|
|
34
|
+
'prefer-const': 'error',
|
|
35
|
+
'no-var': 'error',
|
|
36
|
+
'no-param-reassign': 'error',
|
|
37
|
+
|
|
38
|
+
// Clean code
|
|
39
|
+
'no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
|
|
40
|
+
eqeqeq: ['error', 'always'],
|
|
41
|
+
'no-console': 'warn',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
ignores: ['node_modules/', 'dist/', 'build/', 'coverage/'],
|
|
46
|
+
},
|
|
47
|
+
]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## prettier.config.js
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
export default {
|
|
54
|
+
semi: false,
|
|
55
|
+
singleQuote: true,
|
|
56
|
+
trailingComma: 'all',
|
|
57
|
+
printWidth: 100,
|
|
58
|
+
tabWidth: 2,
|
|
59
|
+
useTabs: false,
|
|
60
|
+
arrowParens: 'always',
|
|
61
|
+
endOfLine: 'lf',
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## .editorconfig
|
|
66
|
+
|
|
67
|
+
```ini
|
|
68
|
+
root = true
|
|
69
|
+
|
|
70
|
+
[*]
|
|
71
|
+
indent_style = space
|
|
72
|
+
indent_size = 2
|
|
73
|
+
end_of_line = lf
|
|
74
|
+
charset = utf-8
|
|
75
|
+
trim_trailing_whitespace = true
|
|
76
|
+
insert_final_newline = true
|
|
77
|
+
|
|
78
|
+
[*.md]
|
|
79
|
+
trim_trailing_whitespace = false
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## .gitignore
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
# Dependencies
|
|
86
|
+
node_modules/
|
|
87
|
+
|
|
88
|
+
# Build output
|
|
89
|
+
dist/
|
|
90
|
+
build/
|
|
91
|
+
|
|
92
|
+
# Test coverage
|
|
93
|
+
coverage/
|
|
94
|
+
|
|
95
|
+
# Environment variables
|
|
96
|
+
.env
|
|
97
|
+
.env.*
|
|
98
|
+
!.env.example
|
|
99
|
+
|
|
100
|
+
# OS files
|
|
101
|
+
.DS_Store
|
|
102
|
+
Thumbs.db
|
|
103
|
+
|
|
104
|
+
# Editor directories
|
|
105
|
+
.idea/
|
|
106
|
+
.vscode/
|
|
107
|
+
*.swp
|
|
108
|
+
*.swo
|
|
109
|
+
|
|
110
|
+
# Logs
|
|
111
|
+
*.log
|
|
112
|
+
npm-debug.log*
|
|
113
|
+
|
|
114
|
+
# dev-team plugin: shared human-invoked report output (/review-agent,
|
|
115
|
+
# /code-review, /triage) — local-only, regenerated per run. Anchored
|
|
116
|
+
# deny-all + re-included tracked exception for /test-improve's
|
|
117
|
+
# git-tracked report data/ sibling directory (issue #1412). The
|
|
118
|
+
# re-include must stay directory-level (test-improve/), not narrowed to
|
|
119
|
+
# e.g. */data/ — git never re-includes a path whose parent directory is
|
|
120
|
+
# itself excluded, so a narrower exception would silently match nothing.
|
|
121
|
+
/.dev-team-reports/*
|
|
122
|
+
!/.dev-team-reports/test-improve/
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## vitest.config.js
|
|
126
|
+
|
|
127
|
+
```js
|
|
128
|
+
import { defineConfig } from 'vitest/config'
|
|
129
|
+
|
|
130
|
+
export default defineConfig({
|
|
131
|
+
test: {
|
|
132
|
+
include: ['src/**/*.test.js'],
|
|
133
|
+
},
|
|
134
|
+
})
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## playwright.config.js (frontend projects only)
|
|
138
|
+
|
|
139
|
+
```js
|
|
140
|
+
import { defineConfig } from '@playwright/test'
|
|
141
|
+
|
|
142
|
+
export default defineConfig({
|
|
143
|
+
testDir: './e2e',
|
|
144
|
+
timeout: 30000,
|
|
145
|
+
retries: 0,
|
|
146
|
+
use: {
|
|
147
|
+
headless: true,
|
|
148
|
+
baseURL: 'http://localhost:3000',
|
|
149
|
+
},
|
|
150
|
+
projects: [
|
|
151
|
+
{
|
|
152
|
+
name: 'chromium',
|
|
153
|
+
use: { browserName: 'chromium' },
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
})
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## .husky/pre-commit
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
npx lint-staged
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## .husky/pre-push
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
npm test
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Frontend projects append the e2e suite:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
npm test
|
|
175
|
+
npm run test:e2e
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## src/index.js (starter file)
|
|
179
|
+
|
|
180
|
+
```js
|
|
181
|
+
/**
|
|
182
|
+
* Add two numbers together.
|
|
183
|
+
*
|
|
184
|
+
* @param {number} a
|
|
185
|
+
* @param {number} b
|
|
186
|
+
* @returns {number} The sum of a and b
|
|
187
|
+
*/
|
|
188
|
+
export const add = (a, b) => a + b
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## src/index.test.js (starter test)
|
|
192
|
+
|
|
193
|
+
```js
|
|
194
|
+
import { describe, it, expect } from 'vitest'
|
|
195
|
+
import { add } from './index.js'
|
|
196
|
+
|
|
197
|
+
describe('add', () => {
|
|
198
|
+
it('adds two positive numbers', () => {
|
|
199
|
+
expect(add(2, 3)).toBe(5)
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
it('handles zero', () => {
|
|
203
|
+
expect(add(0, 5)).toBe(5)
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
it('handles negative numbers', () => {
|
|
207
|
+
expect(add(-1, 1)).toBe(0)
|
|
208
|
+
})
|
|
209
|
+
})
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## e2e/example.spec.js (frontend projects only)
|
|
213
|
+
|
|
214
|
+
```js
|
|
215
|
+
import { test, expect } from '@playwright/test'
|
|
216
|
+
|
|
217
|
+
test('homepage loads', async ({ page }) => {
|
|
218
|
+
await page.goto('/')
|
|
219
|
+
await expect(page).toHaveTitle(/.+/)
|
|
220
|
+
})
|
|
221
|
+
```
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: property-based-testing
|
|
3
|
+
description: Generate a runnable property-based test for a target function from its signature/docstring — a round-trip test when an encode/decode pair exists, or an invariant test when the docstring documents a postcondition (e.g. "returns sorted", "is idempotent"). Detects the project's language via project-init's stack detection, uses Hypothesis for Python and fast-check for JavaScript/TypeScript, and recommends running /mutation-testing against the generated suite afterward. Use when the user says "generate a property test", "property-based test this function", "add Hypothesis/fast-check tests", or wants round-trip/invariant coverage for a pure function rather than hand-written example-based tests.
|
|
4
|
+
role: worker
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: "<module_path> <function_name>"
|
|
7
|
+
allowed-tools: Read, Write, Bash(python3 "${CLAUDE_PLUGIN_ROOT}/skills/property-based-testing/scripts/detect_and_dispatch.py" *, python3 "${CLAUDE_PLUGIN_ROOT}/skills/property-based-testing/scripts/hypothesis_scaffold.py" *, npm install *, npx vitest *)
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Property-Based Testing
|
|
11
|
+
|
|
12
|
+
Role: worker. This command derives and generates property-based tests
|
|
13
|
+
directly — it does not replace example-based tests, and it does not
|
|
14
|
+
fabricate a weak "doesn't crash" property when no round-trip pair or
|
|
15
|
+
documented invariant can be found.
|
|
16
|
+
|
|
17
|
+
## Procedure
|
|
18
|
+
|
|
19
|
+
### Step 1: Detect the target language (reuse project-init — never re-derive)
|
|
20
|
+
|
|
21
|
+
Run project-init's own stack detection —
|
|
22
|
+
`${CLAUDE_PLUGIN_ROOT}/skills/project-init/SKILL.md` § "Step 1: Detect the
|
|
23
|
+
stack" — over the target project. That section is this repo's canonical,
|
|
24
|
+
single source of truth for stack detection (its own frontmatter says so);
|
|
25
|
+
this skill reuses its result and never re-implements the filesystem-signal
|
|
26
|
+
table (`package.json`/`tsconfig.json` for JS/TS, `pyproject.toml`/
|
|
27
|
+
`requirements*.txt`/`setup.py` for Python, `*.sln`/`*.csproj` for C#,
|
|
28
|
+
`pom.xml`/`build.gradle` for Java) itself.
|
|
29
|
+
|
|
30
|
+
Reduce that step's result to a single detected-language value:
|
|
31
|
+
|
|
32
|
+
- Exactly one stack detected → its display name, verbatim as project-init's
|
|
33
|
+
own stack table spells it (`Python`, `JS/TS`, `C#`, `Java`).
|
|
34
|
+
- Zero or ambiguous signals (project-init's own "ask the user" branch) →
|
|
35
|
+
no detected language.
|
|
36
|
+
|
|
37
|
+
### Step 2: Gate on support
|
|
38
|
+
|
|
39
|
+
Pass the detected language (or nothing, when Step 1 found none) to
|
|
40
|
+
[`scripts/detect_and_dispatch.py`](scripts/detect_and_dispatch.py):
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/skills/property-based-testing/scripts/detect_and_dispatch.py" --language "<detected language>"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
This script decides support — it does not detect anything itself (see its
|
|
47
|
+
own module docstring). When the language is neither `Python` nor `JS/TS`,
|
|
48
|
+
or no language was passed at all, it prints the exact message below and
|
|
49
|
+
exits non-zero. **Stop here — no partial run, no file written**, exactly as
|
|
50
|
+
the Gherkin "Unsupported or undetected language" scenario requires:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
Unsupported language: <detected|unknown> — supported: Python, JS/TS.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`<detected>` is the actual detected language name (e.g. `Go`, `C#`) when
|
|
57
|
+
Step 1 found one but it isn't supported; the literal word `unknown` when
|
|
58
|
+
Step 1 found nothing at all.
|
|
59
|
+
|
|
60
|
+
On a supported language, the script prints which generator to dispatch to
|
|
61
|
+
next and exits `0` — continue to Step 3.
|
|
62
|
+
|
|
63
|
+
### Step 3: Install the property-testing tool if missing
|
|
64
|
+
|
|
65
|
+
Follow project-init's own detection-gated-tool install pattern (`Step 4:
|
|
66
|
+
Install missing tools` of `project-init/SKILL.md`) rather than inventing a
|
|
67
|
+
new install mechanism — the tool is only installed when it's actually
|
|
68
|
+
missing from the target project:
|
|
69
|
+
|
|
70
|
+
- **Python — Hypothesis.** Add `hypothesis` to the project's own
|
|
71
|
+
dev-dependency mechanism (`pyproject.toml` dev group or
|
|
72
|
+
`requirements-dev.txt`, creating the latter if neither exists), exactly
|
|
73
|
+
as project-init's Python lane already does for `ruff`/`mypy`/`pytest`.
|
|
74
|
+
- **JS/TS — fast-check.** `npm install --save-dev fast-check`, mirroring
|
|
75
|
+
project-init's existing `npm` devDependency install shape for
|
|
76
|
+
`oxlint`/`@playwright/test`.
|
|
77
|
+
|
|
78
|
+
Never a global/user-level install — same repo-level-only rule project-init
|
|
79
|
+
states for every lane and capability tool.
|
|
80
|
+
|
|
81
|
+
### Step 4: Generate the property test
|
|
82
|
+
|
|
83
|
+
- **Python** — invoke Step 4.1's scaffold directly:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/skills/property-based-testing/scripts/hypothesis_scaffold.py" <module_path> <function_name> [--out-dir <dir>]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
It derives a round-trip property (a literal `encode`/`decode` pair) or an
|
|
90
|
+
invariant property (a recognized docstring postcondition phrase near a
|
|
91
|
+
type hint), writes `test_<function_name>_properties.py`, and prints its
|
|
92
|
+
path. When neither heuristic matches, it prints the exact "No property
|
|
93
|
+
derived" message and writes nothing — report that message verbatim rather
|
|
94
|
+
than fabricating a property.
|
|
95
|
+
|
|
96
|
+
- **JS/TS** — follow
|
|
97
|
+
[`references/languages/javascript.md`](references/languages/javascript.md)
|
|
98
|
+
for the fast-check equivalent of the Python scaffold above: the same
|
|
99
|
+
round-trip/invariant heuristic (an `encode`/`decode` export pair, or a
|
|
100
|
+
recognized postcondition phrase in a JSDoc comment near a type
|
|
101
|
+
signature), emitting a runnable `fc.assert(fc.property(...))` test file.
|
|
102
|
+
|
|
103
|
+
### Step 5: Recommend the mutation-testing follow-up (documentation only)
|
|
104
|
+
|
|
105
|
+
After Step 4 writes a test file, **recommend** — do not auto-run —
|
|
106
|
+
verifying it actually catches behavioral changes:
|
|
107
|
+
|
|
108
|
+
> Run `/mutation-testing` against the generated test file and report the
|
|
109
|
+
> resulting mutation score.
|
|
110
|
+
|
|
111
|
+
This skill never invokes `/mutation-testing` itself; that stays a separate,
|
|
112
|
+
user-initiated step so this skill doesn't re-implement mutation-testing's
|
|
113
|
+
own orchestration.
|
|
114
|
+
|
|
115
|
+
## When not to apply
|
|
116
|
+
|
|
117
|
+
- A function with no obvious round-trip pair or documented invariant — see
|
|
118
|
+
Step 4's "No property derived" message rather than generating a weak
|
|
119
|
+
"doesn't crash" test.
|
|
120
|
+
- A language other than Python or JS/TS, or a project whose stack detection
|
|
121
|
+
is ambiguous — see Step 2's unsupported-language message.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Fixture module for hypothesis_scaffold.py's invariant heuristic (#2190).
|
|
2
|
+
|
|
3
|
+
`sort_values`'s docstring documents a "returns sorted" postcondition next to
|
|
4
|
+
a type-hinted return value — the exact narrow signal the scaffold's
|
|
5
|
+
invariant heuristic looks for.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def sort_values(values: list[int]) -> list[int]:
|
|
10
|
+
"""Sort a list of integers.
|
|
11
|
+
|
|
12
|
+
Returns sorted output: a non-decreasing list containing the same
|
|
13
|
+
elements as ``values``.
|
|
14
|
+
"""
|
|
15
|
+
return sorted(values)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# fast-check round-trip fixture (#2190)
|
|
2
|
+
|
|
3
|
+
Minimal JS fixture project for `/property-based-testing`'s fast-check
|
|
4
|
+
(JS/TS) path, documented in
|
|
5
|
+
[`../../references/languages/javascript.md`](../../references/languages/javascript.md).
|
|
6
|
+
|
|
7
|
+
- `roundtrip.js` — a pure `encode`/`decode` pair (string reversal; its own
|
|
8
|
+
inverse), the same literal-name round-trip heuristic Python's
|
|
9
|
+
`hypothesis_scaffold.py` looks for, mirrored here for JS/TS.
|
|
10
|
+
- `roundtrip.properties.test.js` — the fast-check property test a scaffold
|
|
11
|
+
targeting `encode`/`decode` would generate: `fc.assert(fc.property(...))`
|
|
12
|
+
asserting `decode(encode(x)) === x`.
|
|
13
|
+
|
|
14
|
+
## Test determinism & the vendoring boundary
|
|
15
|
+
|
|
16
|
+
`node_modules/fast-check/` and `node_modules/pure-rand/` (fast-check's only
|
|
17
|
+
dependency) are **vendored and checked into this repo** — `git add -f`, since
|
|
18
|
+
the repo-root `.gitignore`'s blanket `node_modules/` rule normally excludes
|
|
19
|
+
them and a nested `.gitignore` cannot un-ignore a directory a parent
|
|
20
|
+
`.gitignore` already excludes. Both are pure JS with no native/platform
|
|
21
|
+
binaries, ~1.8M total, so they're identical on every dev machine and CI
|
|
22
|
+
runner — this is what satisfies this skill's "no live install of fast-check
|
|
23
|
+
during a test run" determinism requirement.
|
|
24
|
+
|
|
25
|
+
`vitest` (and its transitive deps) is **not** vendored. Newer vitest pulls
|
|
26
|
+
in platform-native binaries (`@rolldown/binding-<platform>`,
|
|
27
|
+
`lightningcss-<platform>`) that are specific to the host OS/arch — checking
|
|
28
|
+
one platform's build into git would silently break on a maintainer's
|
|
29
|
+
different platform (this repo's CI is `ubuntu-*`, but maintainers develop on
|
|
30
|
+
macOS — see the repo `CLAUDE.md` "Gates are platform-bound too" note), and
|
|
31
|
+
covering every platform would multiply the vendored size for no determinism
|
|
32
|
+
benefit `fast-check` itself doesn't already provide. Resolving `vitest` via
|
|
33
|
+
`npx vitest run` (or `npm install` first) is project-init's own normal
|
|
34
|
+
live-install path for the project's test runner — a repo-level concern this
|
|
35
|
+
fixture doesn't re-litigate.
|
|
36
|
+
|
|
37
|
+
## Run
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install # fetches vitest + fast-check/pure-rand (already vendored) if missing
|
|
41
|
+
npx vitest run
|
|
42
|
+
```
|