claude-dev-env 4.3.0 → 7.1.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 +35 -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 +35 -3
- package/.agents/skills/session-continuity/README.md +189 -0
- package/.agents/skills/session-continuity/SKILL.md +114 -0
- package/.agents/skills/session-continuity/continuity.mjs +375 -0
- package/.agents/skills/session-continuity/continuity.test.mjs +303 -0
- package/.agents/skills/skill-builder/SKILL.md +3 -196
- package/.agents/skills/syncing-submodules/scripts/test_sync_parent_pointer.py +0 -7
- package/.agents/skills/windows-scheduled-task/SKILL.md +153 -0
- 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/cde.mjs +36 -8
- package/bin/cde.test.mjs +48 -0
- package/bin/ever-shipped-skills.mjs +2 -20
- package/bin/ever-shipped-skills.test.mjs +8 -0
- package/bin/expand_home_directory_tokens.mjs +4 -5
- package/bin/expand_home_directory_tokens.test.mjs +128 -0
- package/bin/git_hooks_installer.mjs +22 -3
- package/bin/git_hooks_installer.test.mjs +159 -5
- package/bin/install-session-continuity.mjs +78 -0
- package/bin/install-session-continuity.test.mjs +42 -0
- package/bin/install.agents-home.test.mjs +15 -13
- package/bin/install.codex-rules.test.mjs +5 -2
- package/bin/install.cursor-rules.test.mjs +5 -2
- package/bin/install.mjs +506 -63
- package/bin/install.policy-lint.test.mjs +130 -0
- package/bin/install.profiles.test.mjs +10 -0
- package/bin/install.prune.test.mjs +286 -37
- package/bin/install.pstack-plugin.test.mjs +114 -0
- package/bin/install.test.mjs +537 -120
- package/bin/install.transaction.test.mjs +3 -3
- package/bin/refresh-pstack-plugin-skills.test.mjs +211 -0
- package/docs/CODE_RULES.md +1 -1
- 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_banned_identifiers.py +3 -0
- package/hooks/blocking/code_rules_paired_test.py +22 -15
- package/hooks/blocking/precommit_code_rules_gate.py +5 -8
- package/hooks/blocking/test_bash_dispatcher_interpreter_starts.py +7 -52
- package/hooks/blocking/test_bash_post_call_dispatcher.py +65 -4
- package/hooks/blocking/test_bash_pre_tool_use_dispatcher.py +0 -69
- package/hooks/blocking/test_code_rules_banned_identifiers.py +64 -0
- 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 +43 -342
- package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +20 -51
- package/hooks/blocking/test_shared_stdin_adoption.py +1 -47
- package/hooks/git-hooks/git_hooks_constants/staged_policy_lint.py +12 -0
- package/hooks/git-hooks/git_hooks_constants/verification_notice_constants.py +116 -0
- package/hooks/git-hooks/post_commit.py +33 -0
- package/hooks/git-hooks/pre_commit.py +18 -49
- package/hooks/git-hooks/pre_push.py +45 -541
- package/hooks/git-hooks/test_installed_policy_lint.py +208 -0
- package/hooks/git-hooks/test_native_hook_support.py +129 -0
- package/hooks/git-hooks/test_native_policy_commit.py +120 -0
- package/hooks/git-hooks/test_post_commit.py +43 -0
- package/hooks/git-hooks/test_pre_commit.py +38 -148
- package/hooks/git-hooks/test_pre_push.py +48 -1631
- package/hooks/git-hooks/test_verification_notice.py +60 -0
- package/hooks/git-hooks/test_verification_start.py +173 -0
- package/hooks/git-hooks/verification_notice.py +192 -0
- package/hooks/git-hooks/verification_notice_context.py +253 -0
- package/hooks/git-hooks/verification_notice_state.py +237 -0
- package/hooks/git-hooks/verification_start.py +100 -0
- package/hooks/hooks.json +1 -120
- package/hooks/hooks_constants/banned_identifiers_constants.py +4 -0
- package/hooks/hooks_constants/bash_post_call_dispatcher_constants.py +14 -1
- package/hooks/hooks_constants/bash_pre_tool_use_dispatcher_constants.py +1 -15
- package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +0 -4
- package/hooks/hooks_constants/pr_done_reminder_constants.py +98 -0
- package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +10 -93
- package/hooks/hooks_constants/stop_dispatcher_constants.py +1 -4
- package/hooks/hooks_constants/test_bash_post_call_dispatcher_constants.py +19 -2
- package/hooks/hooks_constants/test_bash_pre_tool_use_dispatcher_constants.py +3 -66
- package/hooks/hooks_constants/test_pr_done_reminder_constants.py +40 -0
- package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +46 -201
- package/hooks/hooks_constants/test_stop_dispatcher_constants.py +3 -25
- package/hooks/validation/test_post_tool_use_dispatcher.py +35 -298
- package/hooks/validators/run_all_validators.py +5 -1
- package/hooks/validators/security_checks.py +57 -2
- package/hooks/validators/test_hook_timing_harness.py +2 -5
- package/hooks/validators/test_run_all_validators_mutation_tool_parity.py +3 -11
- package/hooks/validators/test_run_all_validators_policy_lint.py +36 -0
- package/hooks/validators/test_security_checks.py +57 -0
- package/package.json +2 -2
- package/rules/confirm-implementation-forks.md +2 -0
- package/rules/durable-post-artifacts.md +2 -1
- package/rules/git-workflow.md +18 -6
- package/rules/pstack-host-mapping.md +48 -0
- package/rules/vault-context.md +3 -5
- package/rules/verify-runtime-state.md +7 -0
- package/scripts/audit-hooks-cli.mjs +5 -0
- package/scripts/audit-hooks.mjs +72 -16
- package/scripts/automatic_advisory/__init__.py +1 -0
- package/scripts/automatic_advisory/checkout.py +51 -0
- package/scripts/automatic_advisory/cli.py +334 -0
- package/scripts/automatic_advisory/config/__init__.py +1 -0
- package/scripts/automatic_advisory/config/constants.py +93 -0
- package/scripts/automatic_advisory/config/timing.py +4 -0
- package/scripts/automatic_advisory/configuration.py +197 -0
- package/scripts/automatic_advisory/execution.py +350 -0
- package/scripts/automatic_advisory/git.py +69 -0
- package/scripts/automatic_advisory/model.py +107 -0
- package/scripts/automatic_advisory/process_host.py +32 -0
- package/scripts/automatic_advisory/publisher.py +84 -0
- package/scripts/automatic_advisory/runner.py +399 -0
- package/scripts/automatic_advisory/state.py +116 -0
- package/scripts/automatic_advisory/window_flags.py +41 -0
- package/scripts/automatic_advisory/windows_job.py +122 -0
- 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/codex_compat_materializer.py +99 -13
- package/scripts/dev_env_scripts_constants/shared_tree_constants.py +4 -5
- package/{.agents/skills/_shared/pr-loop/scripts → scripts}/durable_post_lint.py +35 -43
- package/{.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/durable_post_lint_constants.py → scripts/durable_post_lint_config/config/constants.py} +10 -10
- package/{.agents/skills/_shared/pr-loop/scripts/test_durable_post_lint_constants.py → scripts/durable_post_lint_config/config/test_constants.py} +14 -1
- package/scripts/local_report_cli.py +184 -0
- package/scripts/local_report_core.py +247 -0
- package/scripts/local_report_publisher.py +12 -0
- package/scripts/local_report_validation.py +357 -0
- package/scripts/local_verification/__init__.py +23 -0
- package/scripts/local_verification/check_runner.py +364 -0
- package/scripts/local_verification/check_support.py +99 -0
- package/scripts/local_verification/cli.py +158 -0
- package/scripts/local_verification/command_runner.py +84 -0
- package/scripts/local_verification/config/__init__.py +1 -0
- package/scripts/local_verification/config/constants.py +89 -0
- package/scripts/local_verification/config/timing.py +1 -0
- package/scripts/local_verification/git_state.py +146 -0
- package/scripts/local_verification/manifest.py +224 -0
- package/scripts/local_verification/model.py +174 -0
- package/scripts/local_verification/runner.py +234 -0
- package/scripts/policy_lint/adapter_detectors.py +13 -6
- package/scripts/policy_lint/adapter_pairing.py +58 -3
- package/scripts/policy_lint/adapters.py +7 -4
- package/scripts/policy_lint/config/approved_test_pairs.py +323 -0
- 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/pr_verification/__init__.py +1 -0
- package/scripts/pr_verification/branch_refs.py +114 -0
- package/scripts/pr_verification/config/__init__.py +1 -0
- package/scripts/pr_verification/config/constants.py +84 -0
- package/scripts/pr_verification/config/timing.py +5 -0
- package/scripts/pr_verification/github.py +137 -0
- package/scripts/pr_verification/github_api.py +376 -0
- package/scripts/pr_verification/github_labels.py +88 -0
- package/scripts/pr_verification/github_parsing.py +182 -0
- package/scripts/pr_verification/github_transport.py +91 -0
- package/scripts/pr_verification/lock.py +122 -0
- package/scripts/pr_verification/model.py +43 -0
- package/scripts/pr_verification/requirements.txt +1 -0
- package/scripts/refresh_pstack_plugin_skills.mjs +200 -0
- package/scripts/shared_tree_paths.py +32 -3
- package/{.agents/skills/_shared/pr-loop/scripts → scripts}/test_durable_post_lint.py +97 -0
- package/scripts/test_shared_tree_paths.py +33 -0
- package/scripts/tests/test-audit-hooks-cli.mjs +150 -0
- package/scripts/tests/test-audit-hooks.mjs +94 -2
- package/scripts/tests/test_automatic_advisory.py +376 -0
- package/scripts/tests/test_automatic_advisory_job_cleanup.py +71 -0
- package/scripts/tests/test_automatic_advisory_polling.py +216 -0
- package/scripts/tests/test_automatic_advisory_recovery.py +320 -0
- package/scripts/tests/test_automatic_advisory_repairs.py +400 -0
- package/scripts/tests/test_automatic_advisory_settings.py +48 -0
- package/scripts/tests/test_automatic_advisory_window_flags.py +163 -0
- package/scripts/tests/test_closed_pr_label.py +157 -0
- package/scripts/tests/test_codex_compat_materializer.py +189 -6
- package/scripts/tests/test_github_labels.py +101 -0
- package/scripts/tests/test_github_transport.py +125 -0
- package/scripts/tests/test_local_report_publisher.py +396 -0
- package/scripts/tests/test_local_report_publisher_cli.py +85 -0
- package/scripts/tests/test_local_verification.py +348 -0
- package/scripts/tests/test_local_verification_cli.py +98 -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_pairing.py +163 -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_pr_verification_github.py +392 -0
- package/scripts/tests/test_pr_verification_lock.py +168 -0
- package/scripts/tests/test_rules.py +3 -7
- package/scripts/tests/test_verification_notice.py +347 -0
- package/.agents/skills/_shared/pr-loop/.claude/CLAUDE.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/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/hooks/blocking/ask_user_question_shape_blocker.py +0 -83
- package/hooks/blocking/bot_mention_comment_blocker.py +0 -76
- package/hooks/blocking/claude_md_orphan_file_blocker.py +0 -129
- package/hooks/blocking/cursor_cli_python_misfire_blocker.py +0 -108
- package/hooks/blocking/destructive_command_blocker.py +0 -2073
- package/hooks/blocking/fable_spawn_gate.py +0 -187
- package/hooks/blocking/luna_fast_mode_gate.py +0 -160
- package/hooks/blocking/nas_ssh_binary_enforcer.py +0 -163
- package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +0 -260
- package/hooks/blocking/package_inventory_stale_blocker.py +0 -107
- package/hooks/blocking/pii_prevention_blocker.py +0 -365
- package/hooks/blocking/piped_pytest_blocker.py +0 -1223
- package/hooks/blocking/question_to_user_enforcer.py +0 -130
- package/hooks/blocking/send_user_file_open_locally_blocker.py +0 -71
- package/hooks/blocking/sensitive_file_protector.py +0 -167
- package/hooks/blocking/session_edit_stage_gate.py +0 -684
- package/hooks/blocking/session_handoff_blocker.py +0 -182
- package/hooks/blocking/shell_substitution_blocker.py +0 -350
- package/hooks/blocking/test_ask_user_question_shape.py +0 -69
- package/hooks/blocking/test_bot_mention_comment_blocker.py +0 -131
- package/hooks/blocking/test_claude_md_orphan_file_blocker.py +0 -1277
- package/hooks/blocking/test_cursor_cli_python_misfire_blocker.py +0 -208
- package/hooks/blocking/test_destructive_command_blocker.py +0 -2024
- package/hooks/blocking/test_destructive_command_blocker_deny_mode.py +0 -105
- package/hooks/blocking/test_destructive_command_blocker_no_verify.py +0 -122
- package/hooks/blocking/test_destructive_command_blocker_patterns.py +0 -133
- package/hooks/blocking/test_fable_spawn_gate.py +0 -381
- package/hooks/blocking/test_inventory_deadlock_resolution.py +0 -154
- package/hooks/blocking/test_luna_fast_mode_gate.py +0 -211
- package/hooks/blocking/test_nas_ssh_binary_enforcer.py +0 -225
- package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +0 -231
- package/hooks/blocking/test_package_inventory_stale_blocker.py +0 -382
- package/hooks/blocking/test_pii_prevention_blocker.py +0 -1222
- package/hooks/blocking/test_pii_prevention_windows_git_path.py +0 -41
- package/hooks/blocking/test_pii_write_surface_ephemeral.py +0 -221
- package/hooks/blocking/test_piped_pytest_blocker.py +0 -587
- package/hooks/blocking/test_precommit_code_rules_gate_native_owner.py +0 -233
- package/hooks/blocking/test_question_to_user_enforcer.py +0 -169
- package/hooks/blocking/test_send_user_file_open_locally_blocker.py +0 -118
- package/hooks/blocking/test_sensitive_file_protector.py +0 -365
- package/hooks/blocking/test_session_edit_stage_gate.py +0 -537
- package/hooks/blocking/test_session_edit_stage_gate_staging.py +0 -64
- package/hooks/blocking/test_session_edit_stage_gate_support.py +0 -204
- package/hooks/blocking/test_session_edit_stage_gate_tracker.py +0 -116
- package/hooks/blocking/test_session_handoff_blocker.py +0 -318
- package/hooks/blocking/test_shell_substitution_blocker.py +0 -298
- package/hooks/blocking/test_unscoped_search_blocker.py +0 -102
- package/hooks/blocking/test_write_existing_file_blocker.py +0 -122
- package/hooks/blocking/tests/test_pii_prevention_blocker.py +0 -259
- package/hooks/blocking/unscoped_search_blocker.py +0 -391
- package/hooks/blocking/write_existing_file_blocker.py +0 -124
- package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +0 -19
- package/hooks/hooks_constants/cursor_cli_python_misfire_blocker_constants.py +0 -79
- package/hooks/hooks_constants/fable_spawn_gate_constants.py +0 -61
- package/hooks/hooks_constants/luna_fast_mode_gate_constants.py +0 -45
- package/hooks/hooks_constants/nas_ssh_binary_enforcer_constants.py +0 -20
- package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +0 -57
- package/hooks/hooks_constants/send_user_file_open_locally_blocker_constants.py +0 -17
- package/hooks/hooks_constants/sensitive_file_protector_constants.py +0 -40
- package/hooks/hooks_constants/session_handoff_blocker_constants.py +0 -10
- package/hooks/hooks_constants/shell_substitution_blocker_constants.py +0 -80
- /package/.agents/skills/{_shared/pr-loop → session-continuity}/AGENTS.md +0 -0
- /package/{_shared/pr-loop → .agents/skills/session-continuity}/CLAUDE.md +0 -0
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"""Thin route orchestrator for review-tier decisions."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import json
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
|
|
8
|
-
from review_router_constants.config.constants import UNSUPPORTED_ROUTE, UNSUPPORTED_TIER
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def load_route_policy() -> dict:
|
|
12
|
-
"""Load versioned route policy data.
|
|
13
|
-
|
|
14
|
-
Args:
|
|
15
|
-
Returns:
|
|
16
|
-
Route policy mapping.
|
|
17
|
-
Raises:
|
|
18
|
-
ValueError: If the policy schema is invalid.
|
|
19
|
-
"""
|
|
20
|
-
policy_path = Path(__file__).parent.parent / "reference" / "route-policy.json"
|
|
21
|
-
policy = json.loads(policy_path.read_text(encoding="utf-8"))
|
|
22
|
-
if policy.get("version") != 1 or not isinstance(policy.get("routes"), dict):
|
|
23
|
-
raise ValueError("malformed route policy")
|
|
24
|
-
return policy
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def resolve_route(route: str, tier: str, policy: dict | None = None) -> dict:
|
|
28
|
-
"""Resolve one route or return a stable unsupported result.
|
|
29
|
-
|
|
30
|
-
Args:
|
|
31
|
-
route: Requested route name.
|
|
32
|
-
tier: Effective tier.
|
|
33
|
-
policy: Optional route policy.
|
|
34
|
-
Returns:
|
|
35
|
-
Dispatch record or unsupported status.
|
|
36
|
-
"""
|
|
37
|
-
selected_policy = policy or load_route_policy()
|
|
38
|
-
route_record = selected_policy["routes"].get(route)
|
|
39
|
-
if route_record is None or route_record["status"] != "SUPPORTED":
|
|
40
|
-
return {"status": UNSUPPORTED_ROUTE, "route": route, "tier": tier}
|
|
41
|
-
if tier not in route_record["tiers"]:
|
|
42
|
-
return {"status": UNSUPPORTED_TIER, "route": route, "tier": tier}
|
|
43
|
-
dispatch = route_record["models"][tier]
|
|
44
|
-
return {
|
|
45
|
-
"status": "SUPPORTED",
|
|
46
|
-
"route": route,
|
|
47
|
-
"tier": tier,
|
|
48
|
-
"skill": route_record["skill"],
|
|
49
|
-
"dispatch": dispatch,
|
|
50
|
-
}
|
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
"""CLI for signed review decisions and one-time spawn permits."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import argparse
|
|
6
|
-
import hashlib
|
|
7
|
-
import hmac
|
|
8
|
-
import json
|
|
9
|
-
import os
|
|
10
|
-
import shlex
|
|
11
|
-
import secrets
|
|
12
|
-
import sys
|
|
13
|
-
from pathlib import Path
|
|
14
|
-
|
|
15
|
-
tier_script = Path(__file__).resolve().parents[1].parent / "review-tier" / "scripts"
|
|
16
|
-
if str(tier_script) not in sys.path:
|
|
17
|
-
sys.path.insert(0, str(tier_script))
|
|
18
|
-
from review_router_constants.config.constants import ( # noqa: E402
|
|
19
|
-
ALL_OVERRIDE_VALUES,
|
|
20
|
-
CLEANUP_CONTRACT,
|
|
21
|
-
DECISION_ID_BYTES,
|
|
22
|
-
INTEGRITY_KEY_BYTES,
|
|
23
|
-
INVALID_ROUTE_ARM,
|
|
24
|
-
INVALID_ROUTE_RECORD,
|
|
25
|
-
MALFORMED_TIER_OVERRIDE,
|
|
26
|
-
ROUTE_SPAWN_ARMED,
|
|
27
|
-
UNKNOWN_ROUTE_SLOT,
|
|
28
|
-
UNSUPPORTED_ROUTE,
|
|
29
|
-
)
|
|
30
|
-
from review_tier import ( # noqa: E402
|
|
31
|
-
build_generation,
|
|
32
|
-
canonical_json_hash,
|
|
33
|
-
inventory_generation,
|
|
34
|
-
policy_hash,
|
|
35
|
-
router_state_directory,
|
|
36
|
-
router_state_root,
|
|
37
|
-
router_state_root_id,
|
|
38
|
-
)
|
|
39
|
-
from review_router import load_route_policy, resolve_route # noqa: E402
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def _write_signed(directory: Path, name: str, record: dict, secret: bytes) -> None:
|
|
43
|
-
encoded = _encode_record(record)
|
|
44
|
-
temporary = directory / f".{name}.tmp"
|
|
45
|
-
temporary.write_bytes(encoded)
|
|
46
|
-
temporary.replace(directory / name)
|
|
47
|
-
(directory / f"{name}.hmac").write_text(hmac.new(secret, encoded, hashlib.sha256).hexdigest(), encoding="ascii")
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def _read_signed(directory: Path, name: str) -> dict:
|
|
51
|
-
secret = (directory / "integrity.key").read_bytes()
|
|
52
|
-
record_path = directory / name
|
|
53
|
-
encoded = record_path.read_bytes()
|
|
54
|
-
expected = hmac.new(secret, encoded, hashlib.sha256).hexdigest()
|
|
55
|
-
if not hmac.compare_digest(expected, (directory / f"{name}.hmac").read_text(encoding="ascii")):
|
|
56
|
-
raise ValueError(INVALID_ROUTE_RECORD)
|
|
57
|
-
return json.loads(encoded)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def _encode_record(record: dict) -> bytes:
|
|
61
|
-
return json.dumps(record, sort_keys=True, separators=(",", ":")).encode()
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def _override(arguments: str) -> str | None:
|
|
65
|
-
tokens = shlex.split(arguments)
|
|
66
|
-
matches = [token for token in tokens if token == "--tier" or token.startswith("--tier=")]
|
|
67
|
-
if len(matches) > 1:
|
|
68
|
-
raise ValueError(MALFORMED_TIER_OVERRIDE)
|
|
69
|
-
if not matches:
|
|
70
|
-
return None
|
|
71
|
-
if matches[0] == "--tier":
|
|
72
|
-
index = tokens.index("--tier")
|
|
73
|
-
if index + 1 >= len(tokens) or tokens[index + 1] not in ALL_OVERRIDE_VALUES:
|
|
74
|
-
raise ValueError(MALFORMED_TIER_OVERRIDE)
|
|
75
|
-
return f"T{tokens[index + 1]}"
|
|
76
|
-
override = matches[0].split("=", 1)[1]
|
|
77
|
-
if override not in ALL_OVERRIDE_VALUES:
|
|
78
|
-
raise ValueError(MALFORMED_TIER_OVERRIDE)
|
|
79
|
-
return f"T{override}"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
def resolve(cwd: str, review_kind: str, arguments: str, base_ref: str | None) -> dict:
|
|
83
|
-
"""Create a signed review decision.
|
|
84
|
-
|
|
85
|
-
Args:
|
|
86
|
-
cwd: Repository path.
|
|
87
|
-
review_kind: Requested review route.
|
|
88
|
-
arguments: Review command arguments.
|
|
89
|
-
base_ref: Optional base reference.
|
|
90
|
-
Returns:
|
|
91
|
-
Decision summary.
|
|
92
|
-
Raises:
|
|
93
|
-
ValueError: If the override or base reference is invalid.
|
|
94
|
-
"""
|
|
95
|
-
route_policy = load_route_policy()
|
|
96
|
-
route_record = route_policy["routes"].get(review_kind)
|
|
97
|
-
if route_record is None or route_record.get("status") != "SUPPORTED":
|
|
98
|
-
return {"status": UNSUPPORTED_ROUTE}
|
|
99
|
-
override = _override(arguments)
|
|
100
|
-
directory = router_state_directory(cwd)
|
|
101
|
-
if (directory / "armed-spawn.json").exists():
|
|
102
|
-
raise ValueError(ROUTE_SPAWN_ARMED)
|
|
103
|
-
directory.mkdir(parents=True, exist_ok=True)
|
|
104
|
-
key_path = directory / "integrity.key"
|
|
105
|
-
if not key_path.exists():
|
|
106
|
-
key_path.write_bytes(secrets.token_bytes(INTEGRITY_KEY_BYTES))
|
|
107
|
-
secret = key_path.read_bytes()
|
|
108
|
-
state_root = router_state_root(cwd)
|
|
109
|
-
generation = build_generation(cwd, requested_override=override, base_ref=base_ref, state_root=state_root)
|
|
110
|
-
route = resolve_route(review_kind, generation["effective_tier"], route_policy)
|
|
111
|
-
decision_id = secrets.token_hex(DECISION_ID_BYTES)
|
|
112
|
-
dispatch = route["dispatch"]
|
|
113
|
-
slots = [{"slot_id": each_slot_id, "model": dispatch["model"], "effort": dispatch["effort"]} for each_slot_id in dispatch["pass_ids"]]
|
|
114
|
-
decision = {**generation, "decision_id": decision_id, "review_kind": review_kind, "route_policy_hash": policy_hash(route_policy), "state_root_id": router_state_root_id(state_root), "slots": slots}
|
|
115
|
-
_write_signed(directory, "decision.json", decision, secret)
|
|
116
|
-
return {"status": "SUPPORTED", "decision_id": decision_id, "effective_tier": decision["effective_tier"], "automatic_tier": decision["calculated_tier"], "slot_ids": [slot["slot_id"] for slot in slots]}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
def arm(cwd: str, decision_id: str, slot_id: str) -> dict:
|
|
120
|
-
"""Create a one-time spawn permit.
|
|
121
|
-
|
|
122
|
-
Args:
|
|
123
|
-
cwd: Repository path.
|
|
124
|
-
decision_id: Decision identifier.
|
|
125
|
-
slot_id: Selected dispatch slot.
|
|
126
|
-
Returns:
|
|
127
|
-
Agent tool payload.
|
|
128
|
-
Raises:
|
|
129
|
-
OSError: If signed state is unavailable.
|
|
130
|
-
ValueError: If the decision or slot is invalid.
|
|
131
|
-
"""
|
|
132
|
-
directory = router_state_directory(cwd)
|
|
133
|
-
secret = (directory / "integrity.key").read_bytes()
|
|
134
|
-
decision = _read_signed(directory, "decision.json")
|
|
135
|
-
if decision["decision_id"] != decision_id or (directory / "armed-spawn.json").exists():
|
|
136
|
-
raise ValueError(INVALID_ROUTE_ARM)
|
|
137
|
-
consumed_prefix = f"{decision_id}--{slot_id}"
|
|
138
|
-
if any(path.name.startswith(consumed_prefix) for path in (directory / "consumed").glob(f"{consumed_prefix}*")):
|
|
139
|
-
raise ValueError(INVALID_ROUTE_ARM)
|
|
140
|
-
slot = next((each_slot for each_slot in decision["slots"] if each_slot["slot_id"] == slot_id), None)
|
|
141
|
-
if slot is None:
|
|
142
|
-
raise ValueError(UNKNOWN_ROUTE_SLOT)
|
|
143
|
-
consumed_slots = {path.name.split("--", 1)[1].split(".", 1)[0] for path in (directory / "consumed").glob(f"{decision_id}--*.json")}
|
|
144
|
-
expected_slots = [each_slot["slot_id"] for each_slot in decision["slots"] if each_slot["slot_id"] not in consumed_slots]
|
|
145
|
-
if expected_slots and slot_id != expected_slots[0]:
|
|
146
|
-
raise ValueError(INVALID_ROUTE_ARM)
|
|
147
|
-
decision_base = decision.get("base_ref") if decision.get("base_source") == "explicit" else None
|
|
148
|
-
state_root = router_state_root(cwd)
|
|
149
|
-
current_hash = str(inventory_generation(cwd, decision_base, state_root=state_root)["diff_hash"])
|
|
150
|
-
if current_hash != decision["diff_hash"]:
|
|
151
|
-
raise ValueError(INVALID_ROUTE_ARM)
|
|
152
|
-
prompt = f"{CLEANUP_CONTRACT} Review {decision['review_kind']} for {decision['worktree']}. Angles: Reuse, Simplification, Efficiency, Altitude. Apply direct fixes within scope. Skip correctness, security, behavior-changing, and out-of-scope findings. Decision {decision_id}; slot {slot_id}."
|
|
153
|
-
spawn = {"decision_id": decision_id, "decision_hash": canonical_json_hash(decision), "state_root_id": router_state_root_id(state_root), "slot_id": slot_id, "tool_name": "Agent", "executor_type": "Luna", "model": slot["model"], "effort": slot["effort"], "prompt": prompt, "prompt_hash": hashlib.sha256(prompt.encode()).hexdigest(), "diff_hash": decision["diff_hash"]}
|
|
154
|
-
_write_signed(directory, "armed-spawn.json", spawn, secret)
|
|
155
|
-
return {"tool_name": "Agent", "tool_input": {"executor_type": "Luna", "model": spawn["model"], "effort": spawn["effort"], "prompt": prompt}}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
def close(cwd: str, decision_id: str) -> dict:
|
|
159
|
-
"""Close a decision after its permit is consumed.
|
|
160
|
-
|
|
161
|
-
Args:
|
|
162
|
-
cwd: Repository path.
|
|
163
|
-
decision_id: Decision identifier.
|
|
164
|
-
Returns:
|
|
165
|
-
Closure summary.
|
|
166
|
-
Raises:
|
|
167
|
-
OSError: If signed state is unavailable.
|
|
168
|
-
ValueError: If the decision is invalid or still armed.
|
|
169
|
-
"""
|
|
170
|
-
directory = router_state_directory(cwd)
|
|
171
|
-
decision = _read_signed(directory, "decision.json")
|
|
172
|
-
if decision["decision_id"] != decision_id or (directory / "armed-spawn.json").exists():
|
|
173
|
-
raise ValueError(ROUTE_SPAWN_ARMED)
|
|
174
|
-
(directory / "decision.json").unlink()
|
|
175
|
-
(directory / "decision.json.hmac").unlink()
|
|
176
|
-
return {"status": "CLOSED", "decision_id": decision_id}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def main() -> int:
|
|
180
|
-
"""Run the review-routing command line interface.
|
|
181
|
-
|
|
182
|
-
Returns:
|
|
183
|
-
Process exit status.
|
|
184
|
-
"""
|
|
185
|
-
parser = argparse.ArgumentParser()
|
|
186
|
-
parser.add_argument("command", choices=("resolve", "arm", "close"))
|
|
187
|
-
parser.add_argument("--review-kind", default="e-simplify")
|
|
188
|
-
parser.add_argument("--cwd", default=os.getcwd())
|
|
189
|
-
parser.add_argument("--arguments", default="")
|
|
190
|
-
parser.add_argument("--base-ref")
|
|
191
|
-
parser.add_argument("--decision-id")
|
|
192
|
-
parser.add_argument("--slot")
|
|
193
|
-
parser.add_argument("--requested", action="store_true")
|
|
194
|
-
options = parser.parse_args()
|
|
195
|
-
if options.requested:
|
|
196
|
-
parser.error("--requested is not supported")
|
|
197
|
-
try:
|
|
198
|
-
if options.command == "resolve":
|
|
199
|
-
dispatch_record = resolve(options.cwd, options.review_kind, options.arguments, base_ref=options.base_ref)
|
|
200
|
-
elif options.command == "arm":
|
|
201
|
-
dispatch_record = arm(options.cwd, options.decision_id, options.slot)
|
|
202
|
-
else:
|
|
203
|
-
dispatch_record = close(options.cwd, options.decision_id)
|
|
204
|
-
except (OSError, ValueError) as error:
|
|
205
|
-
parser.error(str(error))
|
|
206
|
-
print(json.dumps(dispatch_record, sort_keys=True))
|
|
207
|
-
return 0
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
if __name__ == "__main__":
|
|
211
|
-
raise SystemExit(main())
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"""Review-router constants package."""
|
|
File without changes
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"""Constants for route_review_config."""
|
|
2
|
-
|
|
3
|
-
UNSUPPORTED_ROUTE = "UNSUPPORTED_ROUTE"
|
|
4
|
-
UNSUPPORTED_TIER = "UNSUPPORTED_TIER"
|
|
5
|
-
INVALID_ROUTE_RECORD = "INVALID_ROUTE_RECORD"
|
|
6
|
-
MALFORMED_TIER_OVERRIDE = "MALFORMED_TIER_OVERRIDE"
|
|
7
|
-
INVALID_ROUTE_ARM = "INVALID_ROUTE_ARM"
|
|
8
|
-
UNKNOWN_ROUTE_SLOT = "UNKNOWN_ROUTE_SLOT"
|
|
9
|
-
ROUTE_SPAWN_ARMED = "ROUTE_SPAWN_ARMED"
|
|
10
|
-
ALL_OVERRIDE_VALUES = ("1", "2", "3")
|
|
11
|
-
INTEGRITY_KEY_BYTES = 32
|
|
12
|
-
DECISION_ID_BYTES = 16
|
|
13
|
-
CLEANUP_CONTRACT = """This is a cleanup-only review of the current diff, not a correctness or security bug hunt. Gather the diff and include uncommitted changes. Review reuse, simplification, efficiency, and altitude. Reuse existing helpers and adjacent patterns. Simplify redundant state, copy-paste, nesting, dead code, and unnecessary complexity. Remove redundant computation, repeated I/O, sequential independent work, and long-lived captured objects. Fix each issue at the owning abstraction and preserve the intended behavior. Apply safe fixes directly within the reviewed diff. Each finding has file, line, summary, and concrete cost. Skip findings whose fix changes intended behavior, reaches outside the diff, or belongs to correctness review. Respond exactly: That's a correctness review — use /e-code-review, not this skill. Finish with what was fixed and what was skipped."""
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
from review_router import load_route_policy, resolve_route
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def test_load_route_policy_returns_versioned_policy() -> None:
|
|
5
|
-
assert load_route_policy()["version"] == 1
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def test_e_simplify_route_and_unsupported_e_code_review() -> None:
|
|
9
|
-
assert resolve_route("e-simplify", "T1")["status"] == "SUPPORTED"
|
|
10
|
-
assert resolve_route("e-code-review", "T1")["status"] == "UNSUPPORTED_ROUTE"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def test_route_has_only_current_dispatch_fields() -> None:
|
|
14
|
-
route_result = resolve_route("e-simplify", "T1")
|
|
15
|
-
assert route_result["dispatch"]["pass_ids"] == ["simplify-01"]
|
|
16
|
-
assert "advisor" not in route_result
|
|
17
|
-
assert "same_executor_redirect" not in route_result
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def test_t3_has_six_ordered_slots() -> None:
|
|
21
|
-
assert resolve_route("e-simplify", "T3")["dispatch"]["pass_ids"] == [
|
|
22
|
-
"simplify-01", "simplify-02", "simplify-03", "simplify-04", "simplify-05", "simplify-06"
|
|
23
|
-
]
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"""CLI production-path acceptance tests."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import os
|
|
6
|
-
import subprocess
|
|
7
|
-
import sys
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
import pytest
|
|
10
|
-
|
|
11
|
-
from review_router_cli import arm, close, resolve
|
|
12
|
-
from review_router_constants.config.constants import UNSUPPORTED_ROUTE
|
|
13
|
-
|
|
14
|
-
CLI = Path(__file__).with_name("review_router_cli.py")
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def test_public_arm_and_close_reject_missing_signed_state(tmp_path: Path) -> None:
|
|
18
|
-
with pytest.raises(OSError):
|
|
19
|
-
arm(str(tmp_path), "missing", "slot")
|
|
20
|
-
with pytest.raises(OSError):
|
|
21
|
-
close(str(tmp_path), "missing")
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def test_resolve_returns_unsupported_for_unknown_route(tmp_path: Path) -> None:
|
|
25
|
-
resolve_response = resolve(str(tmp_path), "unknown-route", "", None)
|
|
26
|
-
assert resolve_response["status"] == UNSUPPORTED_ROUTE
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def test_cli_rejects_requested_dispatch(tmp_path: Path) -> None:
|
|
30
|
-
command_result = subprocess.run(
|
|
31
|
-
[sys.executable, str(CLI), "next", "--cwd", str(tmp_path)],
|
|
32
|
-
capture_output=True,
|
|
33
|
-
text=True,
|
|
34
|
-
)
|
|
35
|
-
assert command_result.returncode != 0
|
|
36
|
-
assert "invalid choice" in command_result.stderr
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
@pytest.mark.parametrize("arguments", ["--tier 4", "--tier", "--tier x", "--tier 1 --tier 2"])
|
|
40
|
-
def test_malformed_tier_override_writes_no_artifacts(tmp_path: Path, arguments: str) -> None:
|
|
41
|
-
repository = tmp_path / "repository"
|
|
42
|
-
repository.mkdir()
|
|
43
|
-
subprocess.run(["git", "init", "-q"], cwd=repository, check=True)
|
|
44
|
-
environment = {**os.environ, "CLAUDE_PLUGIN_DATA": str(tmp_path / "data")}
|
|
45
|
-
command_result = subprocess.run([sys.executable, str(CLI), "resolve", "--cwd", str(repository), "--arguments", arguments], capture_output=True, text=True, env=environment)
|
|
46
|
-
assert command_result.returncode != 0
|
|
47
|
-
assert not (tmp_path / "data").exists()
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: review-tier
|
|
3
|
-
description: >-
|
|
4
|
-
Classify `review_tier_constants` from change axes, hard triggers, and user overrides. Triggers: /review-tier, tier override, and review classification.
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Review Tier
|
|
8
|
-
|
|
9
|
-
Classify one current change surface into T1, T2, or T3 using `reference/tier-policy.json` and `scripts/review_tier.py`.
|
|
10
|
-
|
|
11
|
-
## Composition
|
|
12
|
-
|
|
13
|
-
| Skill | When | Produces |
|
|
14
|
-
|---|---|---|
|
|
15
|
-
| `/review-router` | After classification | Current decision route and guarded execution |
|
|
16
|
-
| `/task-build` | At workflow start | Registered classification tasks |
|
|
17
|
-
|
|
18
|
-
If `/review-router` is unavailable, return the current classification.
|
|
19
|
-
|
|
20
|
-
## When this applies
|
|
21
|
-
|
|
22
|
-
Use for `/review-tier` and automatic review classification. Refuse execution requests with: `This is a route execution request — use /review-router.` Refuse malformed policy with: `The review-tier policy is invalid; repair the policy before classification.`
|
|
23
|
-
|
|
24
|
-
## Process
|
|
25
|
-
|
|
26
|
-
1. Register `reference/task-seeds.md` with the host task tool.
|
|
27
|
-
2. Run `scripts/review_tier.py` and record the current decision fields.
|
|
28
|
-
3. Hand the current decision to `/review-router` when route execution is requested.
|
|
29
|
-
|
|
30
|
-
## Examples
|
|
31
|
-
|
|
32
|
-
Input `{"packages": 0, "risk": 0}` produces `T1`. Input `{"hard_triggers": ["migration"]}` produces `T3`. An empty input with override `T2` produces calculated `T1` and effective `T2`.
|
|
33
|
-
|
|
34
|
-
## Dependencies
|
|
35
|
-
|
|
36
|
-
Requires Python 3.11+ and the standard library only. Treat a non-zero script exit as a failed classification.
|
|
37
|
-
|
|
38
|
-
## File index
|
|
39
|
-
|
|
40
|
-
| File | Purpose |
|
|
41
|
-
|---|---|
|
|
42
|
-
| `SKILL.md` | Classification workflow and boundaries |
|
|
43
|
-
| `reference/tier-policy.json` | Versioned axes, thresholds, and hard triggers |
|
|
44
|
-
| `reference/task-seeds.md` | Ordered classification tasks |
|
|
45
|
-
| `scripts/review_tier.py` | Deterministic classifier |
|
|
46
|
-
| `scripts/test_review_tier.py` | Classifier behavior tests |
|
|
47
|
-
| `scripts/test_generation.py` | Inventory generation tests |
|
|
48
|
-
| `scripts/conftest.py` | Test import setup |
|
|
49
|
-
| `scripts/review_tier_constants/__init__.py` | Constants package |
|
|
50
|
-
| `scripts/review_tier_constants/config/__init__.py` | Runtime configuration package |
|
|
51
|
-
| `scripts/review_tier_constants/config/constants.py` | Portable tier constants |
|
|
52
|
-
|
|
53
|
-
## Folder map
|
|
54
|
-
|
|
55
|
-
- `reference/` — policy and task data.
|
|
56
|
-
- `scripts/` — executable classifier and paired tests.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Register classification inputs, policy validation, tier selection, and override resolution as host tasks. Complete each with command output or the current decision.
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 1,
|
|
3
|
-
"tiers": ["T1", "T2", "T3"],
|
|
4
|
-
"thresholds": {"T1": 0, "T2": 2, "T3": 5},
|
|
5
|
-
"hard_triggers": ["security", "migration", "public-api", "release"],
|
|
6
|
-
"axes": ["packages", "risk", "public_api", "dependencies"],
|
|
7
|
-
"axis_weights": {"packages": 2, "risk": 2, "public_api": 2, "dependencies": 1},
|
|
8
|
-
"approved_downgrades": ["T1", "T2"]
|
|
9
|
-
}
|