claude-dev-env 4.3.0 → 7.0.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/.agents/agents/pr-description-writer.md +2 -2
- package/.agents/agents/test_agent_frontmatter.py +2 -2
- package/.agents/agents/test_pr_description_writer_style.py +1 -3
- package/.agents/skills/e-code-review/SKILL.md +12 -12
- package/.agents/skills/e-code-review/preflight-proposal.contract.test.mjs +20 -0
- package/.agents/skills/e-code-review/reference/fix.md +15 -17
- package/.agents/skills/e-code-review/reference/loop.md +35 -39
- package/.agents/skills/e-code-review/reference/mode-contract.test.mjs +2 -1
- package/.agents/skills/e-code-review/reference/preflight-proposal.md +44 -9
- package/.agents/skills/e-code-review/reference/runner-selection.md +13 -14
- package/.agents/skills/issue-tracker/SKILL.md +5 -4
- package/.agents/skills/pull-request/SKILL.md +11 -13
- package/.agents/skills/pull-request/reference/publication-tasks.md +3 -3
- package/.agents/skills/pull-request/scripts/github_pr_command_constants/config/constants.py +9 -1
- package/.agents/skills/pull-request/scripts/pull_request.py +33 -44
- package/.agents/skills/pull-request/scripts/test_github_pr_command_constants.py +9 -0
- package/.agents/skills/pull-request/scripts/test_pull_request.py +1 -3
- package/.agents/skills/skill-builder/SKILL.md +3 -196
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/terminology_sweep_constants.py +6 -0
- package/_shared/pr-loop/scripts/terminology_sweep.py +64 -19
- package/_shared/pr-loop/scripts/tests/test_terminology_sweep.py +59 -0
- package/bin/install.agents-home.test.mjs +15 -13
- package/bin/install.mjs +28 -0
- package/bin/install.policy-lint.test.mjs +78 -0
- package/bin/install.prune.test.mjs +59 -20
- package/bin/install.pstack-plugin.test.mjs +114 -0
- package/bin/install.test.mjs +37 -0
- package/bin/refresh-pstack-plugin-skills.test.mjs +211 -0
- package/hooks/advisory/pr_done_reminder.py +342 -0
- package/hooks/advisory/test_pr_done_reminder.py +249 -0
- package/hooks/blocking/bash_post_call_dispatcher.py +53 -6
- package/hooks/blocking/code_rules_paired_test.py +22 -15
- package/hooks/blocking/test_bash_post_call_dispatcher.py +65 -4
- package/hooks/blocking/test_code_rules_enforcer_paired_test.py +36 -29
- package/hooks/blocking/test_code_rules_js_resume_task_enumeration.py +4 -4
- package/hooks/blocking/test_code_rules_js_returns_object_schemaless.py +5 -5
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +68 -133
- package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +20 -51
- package/hooks/blocking/test_precommit_code_rules_gate_native_owner.py +18 -18
- package/hooks/git-hooks/git_hooks_constants/staged_policy_lint.py +12 -0
- package/hooks/git-hooks/pre_commit.py +52 -11
- package/hooks/git-hooks/test_installed_policy_lint.py +159 -0
- package/hooks/git-hooks/test_native_policy_commit.py +87 -0
- package/hooks/git-hooks/test_pre_commit.py +246 -0
- package/hooks/hooks.json +1 -1
- package/hooks/hooks_constants/bash_post_call_dispatcher_constants.py +14 -1
- package/hooks/hooks_constants/pr_done_reminder_constants.py +98 -0
- package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +10 -43
- package/hooks/hooks_constants/test_bash_post_call_dispatcher_constants.py +19 -2
- package/hooks/hooks_constants/test_pr_done_reminder_constants.py +40 -0
- package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +20 -32
- package/package.json +2 -2
- package/rules/durable-post-artifacts.md +2 -1
- package/rules/git-workflow.md +6 -6
- package/scripts/check.ps1 +0 -1
- package/{.agents/skills/run-claude-dev-env/driver.mjs → scripts/ci/installer-lifecycle.mjs} +3 -28
- package/scripts/ci/installer-lifecycle.test.mjs +26 -0
- package/scripts/ci/windows-installer-lifecycle.ps1 +1 -11
- package/scripts/dev_env_scripts_constants/shared_tree_constants.py +4 -5
- package/{.agents/skills/_shared/pr-loop/scripts → scripts}/durable_post_lint.py +5 -41
- package/{.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/durable_post_lint_constants.py → scripts/durable_post_lint_config/config/constants.py} +0 -10
- package/{.agents/skills/_shared/pr-loop/scripts/test_durable_post_lint_constants.py → scripts/durable_post_lint_config/config/test_constants.py} +1 -1
- package/scripts/policy_lint/adapter_detectors.py +13 -6
- package/scripts/policy_lint/adapters.py +7 -4
- package/scripts/policy_lint/config/constants.py +5 -0
- package/scripts/policy_lint/engine.py +48 -4
- package/scripts/policy_lint/model.py +1 -0
- package/scripts/policy_lint/registry.py +1 -1
- package/scripts/policy_lint/selection.py +2 -1
- package/scripts/policy_lint/selection_git.py +2 -0
- package/scripts/refresh_pstack_plugin_skills.mjs +200 -0
- package/scripts/shared_tree_paths.py +32 -3
- package/scripts/test_shared_tree_paths.py +33 -0
- package/scripts/tests/test_policy_lint_rules_archive.py +120 -0
- package/scripts/tests/test_policy_lint_rules_engine.py +25 -4
- package/scripts/tests/test_policy_lint_rules_installed_loader.py +29 -0
- package/scripts/tests/test_policy_lint_rules_registry.py +227 -13
- package/scripts/tests/test_policy_lint_selection.py +25 -2
- package/scripts/tests/test_policy_lint_selection_native_index.py +30 -0
- package/scripts/tests/test_rules.py +3 -7
- package/.agents/skills/_shared/pr-loop/.claude/CLAUDE.md +0 -1
- package/.agents/skills/_shared/pr-loop/AGENTS.md +0 -1
- package/.agents/skills/_shared/pr-loop/audit-contract.md +0 -5
- package/.agents/skills/_shared/pr-loop/audit-reply-template.md +0 -5
- package/.agents/skills/_shared/pr-loop/code-rules-gate.md +0 -5
- package/.agents/skills/_shared/pr-loop/fix-protocol.md +0 -5
- package/.agents/skills/_shared/pr-loop/gh-payloads.md +0 -5
- package/.agents/skills/_shared/pr-loop/portable-driver.md +0 -149
- package/.agents/skills/_shared/pr-loop/post-audit-thread-contract.md +0 -5
- package/.agents/skills/_shared/pr-loop/precatch-rubric.md +0 -5
- package/.agents/skills/_shared/pr-loop/preflight-proposal.contract.test.mjs +0 -119
- package/.agents/skills/_shared/pr-loop/preflight-proposal.md +0 -5
- package/.agents/skills/_shared/pr-loop/prompts/.claude/CLAUDE.md +0 -1
- package/.agents/skills/_shared/pr-loop/prompts/AGENTS.md +0 -1
- package/.agents/skills/_shared/pr-loop/prompts/pr-consistency-audit.xml +0 -324
- package/.agents/skills/_shared/pr-loop/scripts/.claude/CLAUDE.md +0 -1
- package/.agents/skills/_shared/pr-loop/scripts/AGENTS.md +0 -1
- package/.agents/skills/_shared/pr-loop/scripts/RUNTIME_SCRIPTS.md +0 -29
- package/.agents/skills/_shared/pr-loop/scripts/_cli_utils.py +0 -22
- package/.agents/skills/_shared/pr-loop/scripts/_path_resolver.py +0 -186
- package/.agents/skills/_shared/pr-loop/scripts/_xml_utils.py +0 -20
- package/.agents/skills/_shared/pr-loop/scripts/audit_category_schema.py +0 -355
- package/.agents/skills/_shared/pr-loop/scripts/build_audit_prompt.py +0 -289
- package/.agents/skills/_shared/pr-loop/scripts/build_converge_task_list.py +0 -310
- package/.agents/skills/_shared/pr-loop/scripts/build_fix_prompt.py +0 -292
- package/.agents/skills/_shared/pr-loop/scripts/init_loop_state.py +0 -134
- package/.agents/skills/_shared/pr-loop/scripts/portable_converge_driver.py +0 -1646
- package/.agents/skills/_shared/pr-loop/scripts/preflight_worktree.py +0 -392
- package/.agents/skills/_shared/pr-loop/scripts/select_converge_pacer.py +0 -215
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/.claude/CLAUDE.md +0 -1
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/AGENTS.md +0 -1
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/__init__.py +0 -0
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/audit_category_schema_constants.py +0 -37
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/converge_task_list_constants.py +0 -56
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/handoff_constants.py +0 -45
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/pacer_constants.py +0 -47
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/path_resolver_constants.py +0 -157
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +0 -177
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/preflight_constants.py +0 -70
- package/.agents/skills/_shared/pr-loop/scripts/teardown_worktrees.py +0 -172
- package/.agents/skills/_shared/pr-loop/scripts/test__path_resolver.py +0 -106
- package/.agents/skills/_shared/pr-loop/scripts/test_audit_category_schema.py +0 -94
- package/.agents/skills/_shared/pr-loop/scripts/test_build_audit_prompt.py +0 -499
- package/.agents/skills/_shared/pr-loop/scripts/test_build_converge_task_list.py +0 -140
- package/.agents/skills/_shared/pr-loop/scripts/test_build_fix_prompt.py +0 -262
- package/.agents/skills/_shared/pr-loop/scripts/test_init_loop_state.py +0 -71
- package/.agents/skills/_shared/pr-loop/scripts/test_portable_converge_driver.py +0 -1119
- package/.agents/skills/_shared/pr-loop/scripts/test_preflight_worktree.py +0 -287
- package/.agents/skills/_shared/pr-loop/scripts/test_select_converge_pacer.py +0 -207
- package/.agents/skills/_shared/pr-loop/scripts/test_teardown_worktrees.py +0 -59
- package/.agents/skills/_shared/pr-loop/scripts/test_write_handoff.py +0 -201
- package/.agents/skills/_shared/pr-loop/scripts/write_audit_outcomes.py +0 -182
- package/.agents/skills/_shared/pr-loop/scripts/write_fix_outcomes.py +0 -206
- package/.agents/skills/_shared/pr-loop/scripts/write_handoff.py +0 -309
- package/.agents/skills/_shared/pr-loop/state-schema.md +0 -5
- package/.agents/skills/_shared/pr-loop/worker-spawn.md +0 -5
- package/.agents/skills/autoconverge/.claude/CLAUDE.md +0 -1
- package/.agents/skills/autoconverge/AGENTS.md +0 -1
- package/.agents/skills/autoconverge/SKILL.md +0 -431
- package/.agents/skills/autoconverge/reference/.claude/CLAUDE.md +0 -1
- package/.agents/skills/autoconverge/reference/AGENTS.md +0 -1
- package/.agents/skills/autoconverge/reference/closing-report.md +0 -93
- package/.agents/skills/autoconverge/reference/convergence-gates.md +0 -31
- package/.agents/skills/autoconverge/reference/convergence.md +0 -219
- package/.agents/skills/autoconverge/reference/copilot-findings.md +0 -51
- package/.agents/skills/autoconverge/reference/gotchas.md +0 -66
- package/.agents/skills/autoconverge/reference/headless-safety.md +0 -44
- package/.agents/skills/autoconverge/reference/multi-pr.md +0 -128
- package/.agents/skills/autoconverge/reference/self-closing-loop.md +0 -84
- package/.agents/skills/autoconverge/reference/stop-conditions.md +0 -127
- package/.agents/skills/autoconverge/test_portable_pacer_gate.py +0 -54
- package/.agents/skills/autoconverge/workflow/.claude/CLAUDE.md +0 -1
- package/.agents/skills/autoconverge/workflow/AGENTS.md +0 -1
- package/.agents/skills/autoconverge/workflow/aggregate_runs.py +0 -371
- package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/.claude/CLAUDE.md +0 -1
- package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/AGENTS.md +0 -1
- package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/__init__.py +0 -0
- package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +0 -250
- package/.agents/skills/autoconverge/workflow/converge.clean-audit.test.mjs +0 -665
- package/.agents/skills/autoconverge/workflow/converge.codex-gate.test.mjs +0 -472
- package/.agents/skills/autoconverge/workflow/converge.contract.test.mjs +0 -64
- package/.agents/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +0 -1009
- package/.agents/skills/autoconverge/workflow/converge.fix-progress.test.mjs +0 -107
- package/.agents/skills/autoconverge/workflow/converge.fix-recovery.test.mjs +0 -33
- package/.agents/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +0 -15
- package/.agents/skills/autoconverge/workflow/converge.mjs +0 -3132
- package/.agents/skills/autoconverge/workflow/converge.p2-advance.test.mjs +0 -202
- package/.agents/skills/autoconverge/workflow/converge.path-aware.test.mjs +0 -47
- package/.agents/skills/autoconverge/workflow/converge.precatch.test.mjs +0 -152
- package/.agents/skills/autoconverge/workflow/converge.run-input.test.mjs +0 -116
- package/.agents/skills/autoconverge/workflow/converge_multi.mjs +0 -169
- package/.agents/skills/autoconverge/workflow/converge_multi.run-input.test.mjs +0 -173
- package/.agents/skills/autoconverge/workflow/convergence_summary.py +0 -110
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ab1c2d3e4f5a6b7c8.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +0 -266
- package/.agents/skills/autoconverge/workflow/render_report.py +0 -1024
- package/.agents/skills/autoconverge/workflow/test_aggregate_runs.py +0 -134
- package/.agents/skills/autoconverge/workflow/test_convergence_summary.py +0 -149
- package/.agents/skills/autoconverge/workflow/test_render_report.py +0 -812
- package/.agents/skills/hitl/SKILL.md +0 -45
- package/.agents/skills/pr-cleanup/SKILL.md +0 -140
- package/.agents/skills/pr-cleanup/reference/process-inventory.md +0 -17
- package/.agents/skills/pr-cleanup/reference/task-seeds.md +0 -22
- package/.agents/skills/pr-name-by-capability/SKILL.md +0 -73
- package/.agents/skills/pr-name-by-capability/reference/fetch-commands.md +0 -29
- package/.agents/skills/pr-name-by-capability/reference/offense-examples.md +0 -32
- package/.agents/skills/pr-name-by-capability/reference/report-template.md +0 -29
- package/.agents/skills/pr-name-by-capability/reference/rule-checklist.md +0 -38
- package/.agents/skills/pr-name-by-capability/reference/task-seeds.md +0 -10
- package/.agents/skills/pr-plain-language-cleanup/SKILL.md +0 -93
- package/.agents/skills/pr-refinement/SKILL.md +0 -31
- package/.agents/skills/pr-shared-extraction/SKILL.md +0 -177
- package/.agents/skills/pr-shared-extraction/reference/examples.md +0 -46
- package/.agents/skills/pr-shared-extraction/reference/offense-taxonomy.md +0 -100
- package/.agents/skills/pr-small-cl/SKILL.md +0 -52
- package/.agents/skills/pr-title-description/SKILL.md +0 -96
- package/.agents/skills/prototype/SKILL.md +0 -85
- package/.agents/skills/prototype/reference/honest-limitations.md +0 -23
- package/.agents/skills/prototype/reference/promotion-tasks.md +0 -23
- package/.agents/skills/prototype/scripts/build_sandbox_settings.py +0 -249
- package/.agents/skills/prototype/scripts/conftest.py +0 -15
- package/.agents/skills/prototype/scripts/launch_sandbox.py +0 -205
- package/.agents/skills/prototype/scripts/probe_sandbox_safety.py +0 -311
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/__init__.py +0 -1
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/__init__.py +0 -0
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/build_sandbox_settings_constants.py +0 -41
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/launch_sandbox_constants.py +0 -23
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/probe_sandbox_safety_constants.py +0 -45
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/prototype_common_constants.py +0 -10
- package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +0 -275
- package/.agents/skills/prototype/scripts/test_launch_sandbox.py +0 -303
- package/.agents/skills/prototype/scripts/test_probe_sandbox_safety.py +0 -312
- package/.agents/skills/prototype/workflows/promotion.md +0 -25
- package/.agents/skills/prototype/workflows/sandbox.md +0 -35
- package/.agents/skills/rebase/.claude/CLAUDE.md +0 -1
- package/.agents/skills/rebase/AGENTS.md +0 -1
- package/.agents/skills/rebase/SKILL.md +0 -178
- package/.agents/skills/review-router/SKILL.md +0 -51
- package/.agents/skills/review-router/reference/route-policy.json +0 -7
- package/.agents/skills/review-router/reference/task-seeds.md +0 -1
- package/.agents/skills/review-router/scripts/conftest.py +0 -4
- package/.agents/skills/review-router/scripts/review_router.py +0 -50
- package/.agents/skills/review-router/scripts/review_router_cli.py +0 -211
- package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +0 -1
- package/.agents/skills/review-router/scripts/review_router_constants/config/__init__.py +0 -0
- package/.agents/skills/review-router/scripts/review_router_constants/config/constants.py +0 -13
- package/.agents/skills/review-router/scripts/test_review_router.py +0 -23
- package/.agents/skills/review-router/scripts/test_review_router_cli.py +0 -47
- package/.agents/skills/review-tier/SKILL.md +0 -56
- package/.agents/skills/review-tier/reference/task-seeds.md +0 -1
- package/.agents/skills/review-tier/reference/tier-policy.json +0 -9
- package/.agents/skills/review-tier/scripts/conftest.py +0 -4
- package/.agents/skills/review-tier/scripts/review_tier.py +0 -359
- package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +0 -1
- package/.agents/skills/review-tier/scripts/review_tier_constants/config/__init__.py +0 -0
- package/.agents/skills/review-tier/scripts/review_tier_constants/config/constants.py +0 -29
- package/.agents/skills/review-tier/scripts/test_generation.py +0 -159
- package/.agents/skills/review-tier/scripts/test_review_tier.py +0 -33
- package/.agents/skills/run-claude-dev-env/SKILL.md +0 -84
- package/.agents/skills/session-log/.claude/CLAUDE.md +0 -1
- package/.agents/skills/session-log/AGENTS.md +0 -1
- package/.agents/skills/session-log/SKILL.md +0 -170
- package/.agents/skills/session-log/templates/frontmatter.md +0 -40
- package/.agents/skills/session-tidy/.claude/CLAUDE.md +0 -1
- package/.agents/skills/session-tidy/AGENTS.md +0 -1
- package/.agents/skills/session-tidy/SKILL.md +0 -191
- package/.agents/skills/skill-builder/references/.claude/CLAUDE.md +0 -1
- package/.agents/skills/skill-builder/references/AGENTS.md +0 -1
- package/.agents/skills/skill-builder/references/delegation-map.md +0 -130
- package/.agents/skills/skill-builder/references/description-field.md +0 -111
- package/.agents/skills/skill-builder/references/deterministic-elements.md +0 -218
- package/.agents/skills/skill-builder/references/progressive-disclosure.md +0 -122
- package/.agents/skills/skill-builder/references/self-audit-checklist.md +0 -126
- package/.agents/skills/skill-builder/references/skill-modularity.md +0 -111
- package/.agents/skills/skill-builder/references/skill-types.md +0 -232
- package/.agents/skills/skill-builder/references/thariq-x-post-skills.json +0 -33
- package/.agents/skills/skill-builder/templates/.claude/CLAUDE.md +0 -1
- package/.agents/skills/skill-builder/templates/AGENTS.md +0 -1
- package/.agents/skills/skill-builder/templates/gap-analysis.md +0 -87
- package/.agents/skills/skill-builder/workflows/.claude/CLAUDE.md +0 -1
- package/.agents/skills/skill-builder/workflows/AGENTS.md +0 -1
- package/.agents/skills/skill-builder/workflows/improve-skill.md +0 -136
- package/.agents/skills/skill-builder/workflows/new-skill.md +0 -179
- package/.agents/skills/skill-builder/workflows/polish-skill.md +0 -139
- package/.agents/skills/source-command-sr-loop/SKILL.md +0 -82
- package/.agents/skills/update/.claude/CLAUDE.md +0 -1
- package/.agents/skills/update/AGENTS.md +0 -1
- package/.agents/skills/update/SKILL.md +0 -190
- package/_shared/pr-loop/AGENTS.md +0 -1
- package/_shared/pr-loop/CLAUDE.md +0 -1
- package/_shared/pr-loop/audit-contract.md +0 -183
- package/_shared/pr-loop/audit-reply-template.md +0 -151
- package/_shared/pr-loop/code-rules-gate.md +0 -65
- package/_shared/pr-loop/fix-protocol.md +0 -60
- package/_shared/pr-loop/gh-payloads.md +0 -75
- package/_shared/pr-loop/post-audit-thread-contract.md +0 -51
- package/_shared/pr-loop/precatch-rubric.md +0 -66
- package/_shared/pr-loop/preflight-proposal.md +0 -56
- package/_shared/pr-loop/scripts/post_audit_thread.py +0 -1242
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/post_audit_thread_constants.py +0 -199
- package/_shared/pr-loop/scripts/tests/test_post_audit_thread.py +0 -1115
- package/_shared/pr-loop/scripts/tests/test_post_audit_thread_constants.py +0 -129
- package/_shared/pr-loop/state-schema.md +0 -45
- package/_shared/pr-loop/worker-spawn.md +0 -189
- /package/{.agents/skills/_shared/pr-loop/scripts → scripts}/test_durable_post_lint.py +0 -0
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
"""Emit the complete FIX spawn prompt XML to stdout.
|
|
2
|
-
|
|
3
|
-
Populates <bug> entries from findings JSON, plus <execution> checklist
|
|
4
|
-
and <constraints>. <comment_posting> and <output_format> follow
|
|
5
|
-
``--flavor`` (agent or headless).
|
|
6
|
-
|
|
7
|
-
Usage:
|
|
8
|
-
python scripts/build_fix_prompt.py --owner jl-cmd --repo claude-dev-env --pr-number 422 --loop 1 --head-ref feat/branch --base-ref main --worktree-path <PATH> --findings-json <PATH> [--flavor agent|headless]
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
from __future__ import annotations
|
|
12
|
-
|
|
13
|
-
import argparse
|
|
14
|
-
import json
|
|
15
|
-
import sys
|
|
16
|
-
from xml.etree.ElementTree import Element, SubElement
|
|
17
|
-
from pathlib import Path
|
|
18
|
-
|
|
19
|
-
_self_dir = Path(__file__).resolve().parent
|
|
20
|
-
if str(_self_dir) not in sys.path:
|
|
21
|
-
sys.path.insert(0, str(_self_dir))
|
|
22
|
-
|
|
23
|
-
from _cli_utils import require_file
|
|
24
|
-
from _path_resolver import fix_outcome_xml_path
|
|
25
|
-
from _xml_utils import emit_pretty_xml
|
|
26
|
-
from skills_pr_loop_constants.path_resolver_constants import (
|
|
27
|
-
ALL_FIX_CONSTRAINT_TEXTS,
|
|
28
|
-
ALL_FIX_CONSTRAINT_TEXTS_HEADLESS,
|
|
29
|
-
ALL_FIX_EXECUTION_STEPS,
|
|
30
|
-
ALL_FIX_EXECUTION_STEPS_HEADLESS,
|
|
31
|
-
ALL_FIX_PROMPT_FLAVORS,
|
|
32
|
-
FINDINGS_JSON_MUST_BE_LIST_MESSAGE,
|
|
33
|
-
FIX_COMMENT_POSTING_AGENT_TEXT,
|
|
34
|
-
FIX_COMMENT_POSTING_HEADLESS_TEXT,
|
|
35
|
-
FIX_OUTPUT_FORMAT_AGENT_TEXT,
|
|
36
|
-
FIX_OUTPUT_FORMAT_HEADLESS_TEMPLATE,
|
|
37
|
-
FIX_PROMPT_FLAVOR_AGENT,
|
|
38
|
-
FIX_PROMPT_FLAVOR_HEADLESS,
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def _comment_posting_text(flavor: str) -> str:
|
|
43
|
-
"""Return the <comment_posting> body for the given prompt flavor.
|
|
44
|
-
|
|
45
|
-
Args:
|
|
46
|
-
flavor: ``agent`` or ``headless`` prompt flavor.
|
|
47
|
-
|
|
48
|
-
Returns:
|
|
49
|
-
Comment-posting instruction text for that flavor.
|
|
50
|
-
"""
|
|
51
|
-
if flavor == FIX_PROMPT_FLAVOR_HEADLESS:
|
|
52
|
-
return FIX_COMMENT_POSTING_HEADLESS_TEXT
|
|
53
|
-
return FIX_COMMENT_POSTING_AGENT_TEXT
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def _format_instruction_text(
|
|
57
|
-
*,
|
|
58
|
-
flavor: str,
|
|
59
|
-
worktree_path: Path,
|
|
60
|
-
pr_number: int,
|
|
61
|
-
loop: int,
|
|
62
|
-
) -> str:
|
|
63
|
-
"""Return the <output_format> body for the given prompt flavor.
|
|
64
|
-
|
|
65
|
-
Args:
|
|
66
|
-
flavor: ``agent`` or ``headless`` prompt flavor.
|
|
67
|
-
worktree_path: Path to the git worktree.
|
|
68
|
-
pr_number: Pull request number.
|
|
69
|
-
loop: Loop iteration number.
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
Format-instruction text for that flavor.
|
|
73
|
-
"""
|
|
74
|
-
if flavor == FIX_PROMPT_FLAVOR_HEADLESS:
|
|
75
|
-
outcome_path = fix_outcome_xml_path(worktree_path, pr_number, loop)
|
|
76
|
-
return FIX_OUTPUT_FORMAT_HEADLESS_TEMPLATE.format(
|
|
77
|
-
outcome_path=outcome_path.as_posix(),
|
|
78
|
-
)
|
|
79
|
-
return FIX_OUTPUT_FORMAT_AGENT_TEXT
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
def _all_execution_steps(flavor: str) -> list[str]:
|
|
83
|
-
"""Return the execution checklist for the given prompt flavor.
|
|
84
|
-
|
|
85
|
-
Args:
|
|
86
|
-
flavor: ``agent`` or ``headless`` prompt flavor.
|
|
87
|
-
|
|
88
|
-
Returns:
|
|
89
|
-
Ordered execution step texts for that flavor.
|
|
90
|
-
"""
|
|
91
|
-
if flavor == FIX_PROMPT_FLAVOR_HEADLESS:
|
|
92
|
-
return list(ALL_FIX_EXECUTION_STEPS_HEADLESS)
|
|
93
|
-
return list(ALL_FIX_EXECUTION_STEPS)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
def _all_constraint_texts(flavor: str) -> list[str]:
|
|
97
|
-
"""Return the constraint texts for the given prompt flavor.
|
|
98
|
-
|
|
99
|
-
Args:
|
|
100
|
-
flavor: ``agent`` or ``headless`` prompt flavor.
|
|
101
|
-
|
|
102
|
-
Returns:
|
|
103
|
-
Ordered constraint texts for that flavor.
|
|
104
|
-
"""
|
|
105
|
-
if flavor == FIX_PROMPT_FLAVOR_HEADLESS:
|
|
106
|
-
return list(ALL_FIX_CONSTRAINT_TEXTS_HEADLESS)
|
|
107
|
-
return list(ALL_FIX_CONSTRAINT_TEXTS)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
def build_fix_prompt_xml(
|
|
111
|
-
*,
|
|
112
|
-
owner: str,
|
|
113
|
-
repo: str,
|
|
114
|
-
pr_number: int,
|
|
115
|
-
loop: int,
|
|
116
|
-
head_ref: str,
|
|
117
|
-
base_ref: str,
|
|
118
|
-
worktree_path: Path,
|
|
119
|
-
findings_json_path: Path,
|
|
120
|
-
flavor: str = FIX_PROMPT_FLAVOR_AGENT,
|
|
121
|
-
) -> Element:
|
|
122
|
-
"""Build the complete FIX spawn prompt XML.
|
|
123
|
-
|
|
124
|
-
Args:
|
|
125
|
-
owner: GitHub repository owner.
|
|
126
|
-
repo: GitHub repository name.
|
|
127
|
-
pr_number: Pull request number.
|
|
128
|
-
loop: Loop iteration number.
|
|
129
|
-
head_ref: Head branch ref.
|
|
130
|
-
base_ref: Base branch ref.
|
|
131
|
-
worktree_path: Path to the git worktree.
|
|
132
|
-
findings_json_path: Path to the findings JSON file.
|
|
133
|
-
flavor: Prompt flavor — ``agent`` (in-agent commit/post) or
|
|
134
|
-
``headless`` (outcome file, lead-owned commit/post).
|
|
135
|
-
|
|
136
|
-
Returns:
|
|
137
|
-
Root <spawn_prompt> element.
|
|
138
|
-
"""
|
|
139
|
-
findings_data = json.loads(findings_json_path.read_text(encoding="utf-8"))
|
|
140
|
-
if not isinstance(findings_data, list):
|
|
141
|
-
findings_type_name = type(findings_data).__name__
|
|
142
|
-
raise TypeError(
|
|
143
|
-
FINDINGS_JSON_MUST_BE_LIST_MESSAGE % findings_type_name
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
root = Element("spawn_prompt", {"role": "fix", "loop": str(loop)})
|
|
147
|
-
|
|
148
|
-
context = SubElement(root, "context")
|
|
149
|
-
SubElement(context, "owner").text = owner
|
|
150
|
-
SubElement(context, "repo").text = repo
|
|
151
|
-
SubElement(context, "pr_number").text = str(pr_number)
|
|
152
|
-
SubElement(context, "head_ref").text = head_ref
|
|
153
|
-
SubElement(context, "base_ref").text = base_ref
|
|
154
|
-
SubElement(context, "worktree_path").text = worktree_path.as_posix()
|
|
155
|
-
|
|
156
|
-
bugs_elem = SubElement(root, "bugs")
|
|
157
|
-
for each_finding in findings_data:
|
|
158
|
-
if isinstance(each_finding, dict):
|
|
159
|
-
bug = SubElement(bugs_elem, "bug")
|
|
160
|
-
for each_key, each_field_detail in each_finding.items():
|
|
161
|
-
child = SubElement(bug, each_key)
|
|
162
|
-
child.text = (
|
|
163
|
-
str(each_field_detail) if each_field_detail is not None else ""
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
execution = SubElement(root, "execution")
|
|
167
|
-
for each_step in _all_execution_steps(flavor):
|
|
168
|
-
SubElement(execution, "step").text = each_step
|
|
169
|
-
|
|
170
|
-
constraints = SubElement(root, "constraints")
|
|
171
|
-
for each_constraint in _all_constraint_texts(flavor):
|
|
172
|
-
SubElement(constraints, "constraint").text = each_constraint
|
|
173
|
-
|
|
174
|
-
comment_posting = SubElement(root, "comment_posting")
|
|
175
|
-
comment_posting.text = _comment_posting_text(flavor)
|
|
176
|
-
|
|
177
|
-
format_section = SubElement(root, "output_format")
|
|
178
|
-
format_section.text = _format_instruction_text(
|
|
179
|
-
flavor=flavor,
|
|
180
|
-
worktree_path=worktree_path,
|
|
181
|
-
pr_number=pr_number,
|
|
182
|
-
loop=loop,
|
|
183
|
-
)
|
|
184
|
-
|
|
185
|
-
return root
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
def emit_fix_prompt(
|
|
189
|
-
*,
|
|
190
|
-
owner: str,
|
|
191
|
-
repo: str,
|
|
192
|
-
pr_number: int,
|
|
193
|
-
loop: int,
|
|
194
|
-
head_ref: str,
|
|
195
|
-
base_ref: str,
|
|
196
|
-
worktree_path: Path,
|
|
197
|
-
findings_json_path: Path,
|
|
198
|
-
flavor: str = FIX_PROMPT_FLAVOR_AGENT,
|
|
199
|
-
) -> str:
|
|
200
|
-
"""Build and serialize the FIX spawn prompt to a pretty-printed XML string.
|
|
201
|
-
|
|
202
|
-
Args:
|
|
203
|
-
owner: GitHub repository owner.
|
|
204
|
-
repo: GitHub repository name.
|
|
205
|
-
pr_number: Pull request number.
|
|
206
|
-
loop: Loop iteration number.
|
|
207
|
-
head_ref: Head branch ref.
|
|
208
|
-
base_ref: Base branch ref.
|
|
209
|
-
worktree_path: Path to the git worktree.
|
|
210
|
-
findings_json_path: Path to the findings JSON file.
|
|
211
|
-
flavor: Prompt flavor — ``agent`` or ``headless``.
|
|
212
|
-
|
|
213
|
-
Returns:
|
|
214
|
-
Pretty-printed XML string.
|
|
215
|
-
"""
|
|
216
|
-
root = build_fix_prompt_xml(
|
|
217
|
-
owner=owner,
|
|
218
|
-
repo=repo,
|
|
219
|
-
pr_number=pr_number,
|
|
220
|
-
loop=loop,
|
|
221
|
-
head_ref=head_ref,
|
|
222
|
-
base_ref=base_ref,
|
|
223
|
-
worktree_path=worktree_path,
|
|
224
|
-
findings_json_path=findings_json_path,
|
|
225
|
-
flavor=flavor,
|
|
226
|
-
)
|
|
227
|
-
return emit_pretty_xml(root)
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
def parse_arguments(all_argv: list[str]) -> argparse.Namespace:
|
|
231
|
-
"""Parse command-line arguments.
|
|
232
|
-
|
|
233
|
-
Args:
|
|
234
|
-
all_argv: Command-line argument list.
|
|
235
|
-
|
|
236
|
-
Returns:
|
|
237
|
-
Parsed namespace with all required fix prompt parameters.
|
|
238
|
-
"""
|
|
239
|
-
parser = argparse.ArgumentParser(description=__doc__)
|
|
240
|
-
parser.add_argument("--owner", required=True)
|
|
241
|
-
parser.add_argument("--repo", required=True)
|
|
242
|
-
parser.add_argument("--pr-number", type=int, required=True)
|
|
243
|
-
parser.add_argument("--loop", type=int, required=True)
|
|
244
|
-
parser.add_argument("--head-ref", required=True)
|
|
245
|
-
parser.add_argument("--base-ref", required=True)
|
|
246
|
-
parser.add_argument("--worktree-path", type=Path, required=True)
|
|
247
|
-
parser.add_argument("--findings-json", type=Path, required=True)
|
|
248
|
-
parser.add_argument(
|
|
249
|
-
"--flavor",
|
|
250
|
-
choices=sorted(ALL_FIX_PROMPT_FLAVORS),
|
|
251
|
-
default=FIX_PROMPT_FLAVOR_AGENT,
|
|
252
|
-
)
|
|
253
|
-
return parser.parse_args(all_argv)
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
def main(all_arguments: list[str]) -> int:
|
|
257
|
-
"""Entry point: emit FIX spawn prompt XML to stdout.
|
|
258
|
-
|
|
259
|
-
Args:
|
|
260
|
-
all_arguments: Command-line arguments.
|
|
261
|
-
|
|
262
|
-
Returns:
|
|
263
|
-
0 on success, 1 on failure.
|
|
264
|
-
"""
|
|
265
|
-
arguments = parse_arguments(all_arguments)
|
|
266
|
-
findings_path = getattr(arguments, "findings_json")
|
|
267
|
-
|
|
268
|
-
early_exit = require_file(findings_path, "findings-json")
|
|
269
|
-
if early_exit is not None:
|
|
270
|
-
return early_exit
|
|
271
|
-
|
|
272
|
-
try:
|
|
273
|
-
xml_output = emit_fix_prompt(
|
|
274
|
-
owner=arguments.owner,
|
|
275
|
-
repo=arguments.repo,
|
|
276
|
-
pr_number=getattr(arguments, "pr_number"),
|
|
277
|
-
loop=arguments.loop,
|
|
278
|
-
head_ref=getattr(arguments, "head_ref"),
|
|
279
|
-
base_ref=getattr(arguments, "base_ref"),
|
|
280
|
-
worktree_path=getattr(arguments, "worktree_path"),
|
|
281
|
-
findings_json_path=findings_path,
|
|
282
|
-
flavor=arguments.flavor,
|
|
283
|
-
)
|
|
284
|
-
except (json.JSONDecodeError, OSError, TypeError) as exc:
|
|
285
|
-
print(f"emit_fix_prompt failed: {exc}", file=sys.stderr)
|
|
286
|
-
return 1
|
|
287
|
-
sys.stdout.write(xml_output)
|
|
288
|
-
return 0
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
if __name__ == "__main__":
|
|
292
|
-
raise SystemExit(main(sys.argv[1:]))
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
"""Create a loop-state.json file for a bugteam run.
|
|
2
|
-
|
|
3
|
-
Usage:
|
|
4
|
-
python scripts/init_loop_state.py --pr-number 422 --head-ref feat/branch --starting-sha abc1234 [--is-multi-pr]
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import argparse
|
|
10
|
-
import json
|
|
11
|
-
import sys
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
|
|
14
|
-
_self_dir = Path(__file__).resolve().parent
|
|
15
|
-
if str(_self_dir) not in sys.path:
|
|
16
|
-
sys.path.insert(0, str(_self_dir))
|
|
17
|
-
|
|
18
|
-
from _path_resolver import (
|
|
19
|
-
build_run_name,
|
|
20
|
-
per_pr_workspace,
|
|
21
|
-
resolve_run_temp_dir,
|
|
22
|
-
)
|
|
23
|
-
from skills_pr_loop_constants.path_resolver_constants import LOOP_STATE_JSON_INDENT
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def create_loop_state(
|
|
27
|
-
*,
|
|
28
|
-
pr_number: int,
|
|
29
|
-
head_ref: str,
|
|
30
|
-
starting_sha: str,
|
|
31
|
-
is_multi_pr: bool = False,
|
|
32
|
-
) -> Path:
|
|
33
|
-
"""Create the loop-state.json file and return its path.
|
|
34
|
-
|
|
35
|
-
The written state dict carries the subset of the keys documented
|
|
36
|
-
in `_shared/pr-loop/state-schema.md` common-fields table that are
|
|
37
|
-
initialized at loop creation. Fields populated only during the loop
|
|
38
|
-
(e.g. `audit_log`) are added by later steps and are not written
|
|
39
|
-
here:
|
|
40
|
-
|
|
41
|
-
- `loop_count: 0` (int counter, bumps on each AUDIT or tick)
|
|
42
|
-
- `last_action: "fresh"` (enum: fresh | audited | fixed)
|
|
43
|
-
- `last_findings: {p0: 0, p1: 0, p2: 0, total: 0}` (count dict
|
|
44
|
-
populated by AUDIT)
|
|
45
|
-
- `starting_sha: <str>` (the SHA passed in)
|
|
46
|
-
- `loop_comment_index: {}` (dict keyed by finding_id; AUDIT
|
|
47
|
-
populates `finding_comment_id`, `finding_comment_url`, and
|
|
48
|
-
`thread_node_id` per entry when it posts the per-loop review,
|
|
49
|
-
and FIX sets `fix_status` when its commit lands)
|
|
50
|
-
|
|
51
|
-
Args:
|
|
52
|
-
pr_number: Pull request number.
|
|
53
|
-
head_ref: Head branch ref.
|
|
54
|
-
starting_sha: Starting commit SHA.
|
|
55
|
-
is_multi_pr: Whether multi-PR mode is active.
|
|
56
|
-
|
|
57
|
-
Returns:
|
|
58
|
-
Path to the created loop-state.json file.
|
|
59
|
-
"""
|
|
60
|
-
run_name = build_run_name(pr_number, head_ref, is_multi_pr=is_multi_pr)
|
|
61
|
-
run_temp_dir = resolve_run_temp_dir(run_name)
|
|
62
|
-
workspace = per_pr_workspace(run_temp_dir, "", "", pr_number)
|
|
63
|
-
worktree_path = workspace.worktree
|
|
64
|
-
|
|
65
|
-
worktree_path.mkdir(parents=True, exist_ok=True)
|
|
66
|
-
state_path = worktree_path / "loop-state.json"
|
|
67
|
-
|
|
68
|
-
state = {
|
|
69
|
-
"loop_count": 0,
|
|
70
|
-
"last_action": "fresh",
|
|
71
|
-
"last_findings": {"p0": 0, "p1": 0, "p2": 0, "total": 0},
|
|
72
|
-
"starting_sha": starting_sha,
|
|
73
|
-
"loop_comment_index": {},
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
state_path.write_text(
|
|
77
|
-
json.dumps(state, indent=LOOP_STATE_JSON_INDENT) + "\n",
|
|
78
|
-
encoding="utf-8",
|
|
79
|
-
)
|
|
80
|
-
return state_path
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def parse_arguments(all_argv: list[str]) -> argparse.Namespace:
|
|
84
|
-
"""Parse command-line arguments.
|
|
85
|
-
|
|
86
|
-
Args:
|
|
87
|
-
all_argv: Command-line argument list.
|
|
88
|
-
|
|
89
|
-
Returns:
|
|
90
|
-
Parsed namespace with pr_number, head_ref, starting_sha, and is_multi_pr.
|
|
91
|
-
"""
|
|
92
|
-
parser = argparse.ArgumentParser(description=__doc__)
|
|
93
|
-
parser.add_argument("--pr-number", type=int, required=True)
|
|
94
|
-
parser.add_argument("--head-ref", required=True)
|
|
95
|
-
parser.add_argument("--starting-sha", required=True)
|
|
96
|
-
parser.add_argument(
|
|
97
|
-
"--is-multi-pr",
|
|
98
|
-
action="store_true",
|
|
99
|
-
default=False,
|
|
100
|
-
)
|
|
101
|
-
return parser.parse_args(all_argv)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def main(
|
|
105
|
-
all_arguments: list[str], *, is_multi_pr: bool | None = None
|
|
106
|
-
) -> int:
|
|
107
|
-
"""Entry point: create loop-state.json and print its path.
|
|
108
|
-
|
|
109
|
-
Args:
|
|
110
|
-
all_arguments: Command-line arguments.
|
|
111
|
-
is_multi_pr: Override for multi-PR mode (default: from CLI).
|
|
112
|
-
|
|
113
|
-
Returns:
|
|
114
|
-
0 on success.
|
|
115
|
-
"""
|
|
116
|
-
arguments = parse_arguments(all_arguments)
|
|
117
|
-
if arguments.starting_sha is None:
|
|
118
|
-
return 1
|
|
119
|
-
state_path = create_loop_state(
|
|
120
|
-
pr_number=getattr(arguments, "pr_number"),
|
|
121
|
-
head_ref=getattr(arguments, "head_ref"),
|
|
122
|
-
starting_sha=arguments.starting_sha,
|
|
123
|
-
is_multi_pr=(
|
|
124
|
-
arguments.is_multi_pr if is_multi_pr is None else is_multi_pr
|
|
125
|
-
),
|
|
126
|
-
)
|
|
127
|
-
print(state_path.as_posix())
|
|
128
|
-
return 0
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
if __name__ == "__main__":
|
|
132
|
-
all_argv = sys.argv[1:]
|
|
133
|
-
arguments = parse_arguments(all_argv)
|
|
134
|
-
raise SystemExit(main(all_argv, is_multi_pr=arguments.is_multi_pr))
|