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
|
@@ -100,17 +100,6 @@ def test_clean_command_yields_no_decision_matching_the_standalone_chain() -> Non
|
|
|
100
100
|
assert dispatcher_decision == expected_decision
|
|
101
101
|
|
|
102
102
|
|
|
103
|
-
def test_destructive_command_asks_matching_the_standalone_chain() -> None:
|
|
104
|
-
"""A destructive command the chain asks on makes the dispatcher ask too."""
|
|
105
|
-
payload_text = _bash_payload("rm -rf /")
|
|
106
|
-
expected_decision = _expected_precedence(payload_text, BASH_TOOL_NAME)
|
|
107
|
-
dispatcher_decision, _reason = _decision_from_stdout(
|
|
108
|
-
_run_process(_DISPATCHER_SCRIPT, payload_text).stdout
|
|
109
|
-
)
|
|
110
|
-
assert dispatcher_decision == expected_decision
|
|
111
|
-
assert expected_decision == "ask"
|
|
112
|
-
|
|
113
|
-
|
|
114
103
|
def test_dispatcher_exits_zero_on_a_clean_command() -> None:
|
|
115
104
|
"""The dispatcher exits zero for a command no hook decides on."""
|
|
116
105
|
completed = _run_process(_DISPATCHER_SCRIPT, _bash_payload("echo hi"))
|
|
@@ -212,19 +201,6 @@ def test_additional_context_is_collected_from_deciding_hooks() -> None:
|
|
|
212
201
|
assert aggregated.all_additional_context == ["see docs/runbook.md"]
|
|
213
202
|
|
|
214
203
|
|
|
215
|
-
def test_powershell_selects_the_shared_hooks_in_registration_order() -> None:
|
|
216
|
-
"""Selecting for PowerShell yields the shared hooks in registration order."""
|
|
217
|
-
powershell_paths = [
|
|
218
|
-
each_entry.script_relative_path
|
|
219
|
-
for each_entry in select_applicable_entries(POWERSHELL_TOOL_NAME)
|
|
220
|
-
]
|
|
221
|
-
assert powershell_paths == [
|
|
222
|
-
"blocking/cursor_cli_python_misfire_blocker.py",
|
|
223
|
-
"blocking/unscoped_search_blocker.py",
|
|
224
|
-
"blocking/pii_prevention_blocker.py",
|
|
225
|
-
]
|
|
226
|
-
|
|
227
|
-
|
|
228
204
|
def test_dispatcher_imports_standalone_with_only_blocking_on_the_path() -> None:
|
|
229
205
|
"""The dispatcher's bootstrap resolves hooks_constants without hooks/ on PYTHONPATH."""
|
|
230
206
|
subprocess_environment = {**os.environ, "PYTHONPATH": str(_BLOCKING_DIR)}
|
|
@@ -259,48 +235,3 @@ def test_emit_decision_re_emits_silent_deny_fields(
|
|
|
259
235
|
assert hook_specific["additionalContext"] == "see docs/runbook.md"
|
|
260
236
|
assert emitted_payload["systemMessage"] == "[gh-gate] blocked redirected gh pr create"
|
|
261
237
|
assert emitted_payload["suppressOutput"] is True
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
def test_dispatcher_denies_subshell_disguised_as_arithmetic_expansion() -> None:
|
|
265
|
-
"""The dispatcher denies a `$((cd X) && Y)` subshell, not only the bare hook.
|
|
266
|
-
|
|
267
|
-
`echo $((cd /tmp) && pwd)` opens with a `$((` two-character lookahead
|
|
268
|
-
match, so a function-level test alone does not prove the block reaches
|
|
269
|
-
the live Bash tool path.
|
|
270
|
-
"""
|
|
271
|
-
payload_text = _bash_payload("echo $((cd /tmp) && pwd)")
|
|
272
|
-
decision, _reason = _decision_from_stdout(_run_process(_DISPATCHER_SCRIPT, payload_text).stdout)
|
|
273
|
-
assert decision == "deny"
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
def test_dispatch_emits_deny_immediately_and_skips_later_hooks(
|
|
277
|
-
monkeypatch: pytest.MonkeyPatch,
|
|
278
|
-
capsys: pytest.CaptureFixture[str],
|
|
279
|
-
) -> None:
|
|
280
|
-
"""A mid-chain deny emits at once and does not invoke later hosted hooks."""
|
|
281
|
-
all_call_paths: list[str] = []
|
|
282
|
-
|
|
283
|
-
def _fake_run_hook(script_path: str, payload_text: str) -> HostedHookRun:
|
|
284
|
-
del payload_text
|
|
285
|
-
all_call_paths.append(script_path)
|
|
286
|
-
script_name = Path(script_path).name
|
|
287
|
-
if script_name == "destructive_command_blocker.py":
|
|
288
|
-
return HostedHookRun(
|
|
289
|
-
captured_stdout=_decision_json("deny", "blocked early"),
|
|
290
|
-
did_crash=False,
|
|
291
|
-
)
|
|
292
|
-
if script_name == "precommit_code_rules_gate.py":
|
|
293
|
-
raise AssertionError("later hooks must not run after an early deny")
|
|
294
|
-
return HostedHookRun(captured_stdout="", did_crash=False)
|
|
295
|
-
|
|
296
|
-
monkeypatch.setattr(
|
|
297
|
-
"bash_pre_tool_use_dispatcher.run_hook_capturing_output",
|
|
298
|
-
_fake_run_hook,
|
|
299
|
-
)
|
|
300
|
-
dispatch(_bash_payload("rm -rf /"), BASH_TOOL_NAME)
|
|
301
|
-
captured = capsys.readouterr()
|
|
302
|
-
decision, reason = _decision_from_stdout(captured.out)
|
|
303
|
-
assert decision == "deny"
|
|
304
|
-
assert "blocked early" in reason
|
|
305
|
-
assert any(path.endswith("destructive_command_blocker.py") for path in all_call_paths)
|
|
306
|
-
assert not any(path.endswith("precommit_code_rules_gate.py") for path in all_call_paths)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from code_rules_banned_identifiers import (
|
|
4
|
+
_find_banned_noun_word,
|
|
5
|
+
check_banned_noun_word_boundary,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
PRODUCTION_FILE_PATH = "packages/app/services/customer_pipeline.py"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_should_return_no_banned_word_for_item_blocked_exception_suffix() -> None:
|
|
12
|
+
assert _find_banned_noun_word("AssetSizingItemBlocked") is None
|
|
13
|
+
assert _find_banned_noun_word("NinePatchGuideFrameItemBlocked") is None
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_should_return_no_banned_word_for_run_fatal_exception_suffix() -> None:
|
|
17
|
+
assert _find_banned_noun_word("AssetVariantRunFatal") is None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_should_return_banned_word_for_item_without_blast_radius_suffix() -> None:
|
|
21
|
+
assert _find_banned_noun_word("IconGridItem") == "item"
|
|
22
|
+
assert _find_banned_noun_word("item_key") == "item"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_should_allow_class_ending_with_item_blocked_suffix() -> None:
|
|
26
|
+
source = "class AssetSizingItemBlocked(Exception):\n pass\n"
|
|
27
|
+
issues = check_banned_noun_word_boundary(source, PRODUCTION_FILE_PATH)
|
|
28
|
+
assert issues == []
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_should_allow_long_class_ending_with_item_blocked_suffix() -> None:
|
|
32
|
+
source = "class NinePatchGuideFrameItemBlocked(Exception):\n pass\n"
|
|
33
|
+
issues = check_banned_noun_word_boundary(source, PRODUCTION_FILE_PATH)
|
|
34
|
+
assert issues == []
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_should_allow_class_ending_with_run_fatal_suffix() -> None:
|
|
38
|
+
source = "class AssetVariantRunFatal(Exception):\n pass\n"
|
|
39
|
+
issues = check_banned_noun_word_boundary(source, PRODUCTION_FILE_PATH)
|
|
40
|
+
assert issues == []
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_should_flag_class_ending_with_item_without_blast_radius_suffix() -> None:
|
|
44
|
+
source = "class IconGridItem:\n pass\n"
|
|
45
|
+
issues = check_banned_noun_word_boundary(source, PRODUCTION_FILE_PATH)
|
|
46
|
+
assert any("IconGridItem" in each_issue for each_issue in issues)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_should_flag_item_key_assignment() -> None:
|
|
50
|
+
source = "item_key = 'slot'\n"
|
|
51
|
+
issues = check_banned_noun_word_boundary(source, PRODUCTION_FILE_PATH)
|
|
52
|
+
assert any("item_key" in each_issue for each_issue in issues)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_should_flag_output_path_assignment() -> None:
|
|
56
|
+
source = "output_path = 'slot'\n"
|
|
57
|
+
issues = check_banned_noun_word_boundary(source, PRODUCTION_FILE_PATH)
|
|
58
|
+
assert any("output_path" in each_issue for each_issue in issues)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_should_flag_each_value_assignment() -> None:
|
|
62
|
+
source = "each_value = 1\n"
|
|
63
|
+
issues = check_banned_noun_word_boundary(source, PRODUCTION_FILE_PATH)
|
|
64
|
+
assert any("each_value" in each_issue for each_issue in issues)
|
|
@@ -19,6 +19,10 @@ _BLOCKING_DIRECTORY = Path(__file__).resolve().parent
|
|
|
19
19
|
if str(_BLOCKING_DIRECTORY) not in sys.path:
|
|
20
20
|
sys.path.insert(0, str(_BLOCKING_DIRECTORY))
|
|
21
21
|
|
|
22
|
+
from hooks_constants.paired_test_coverage_constants import ( # noqa: E402
|
|
23
|
+
MAX_TEST_FILES_SCANNED,
|
|
24
|
+
)
|
|
25
|
+
|
|
22
26
|
from code_rules_paired_test import ( # noqa: E402
|
|
23
27
|
check_public_function_missing_paired_test,
|
|
24
28
|
check_test_file_omits_module_public_function,
|
|
@@ -26,9 +30,7 @@ from code_rules_paired_test import ( # noqa: E402
|
|
|
26
30
|
|
|
27
31
|
_TWO_PUBLIC_FUNCTIONS = "def alpha():\n return 1\n\n\ndef beta():\n return 2\n"
|
|
28
32
|
_THREE_PUBLIC_FUNCTIONS = (
|
|
29
|
-
"def alpha():\n return 1\n\n\n"
|
|
30
|
-
"def beta():\n return 2\n\n\n"
|
|
31
|
-
"def gamma():\n return 3\n"
|
|
33
|
+
"def alpha():\n return 1\n\n\ndef beta():\n return 2\n\n\ndef gamma():\n return 3\n"
|
|
32
34
|
)
|
|
33
35
|
|
|
34
36
|
|
|
@@ -145,6 +147,28 @@ def test_counts_coverage_across_sibling_test_files(
|
|
|
145
147
|
assert all_issues == []
|
|
146
148
|
|
|
147
149
|
|
|
150
|
+
def test_reads_the_stem_test_when_the_suite_exceeds_the_scan_cap(
|
|
151
|
+
neutral_package_directory: Path,
|
|
152
|
+
) -> None:
|
|
153
|
+
filler_body = "def test_nothing():\n assert True\n"
|
|
154
|
+
_write_test_file(
|
|
155
|
+
neutral_package_directory,
|
|
156
|
+
"test_a0000.py",
|
|
157
|
+
"from pkg.mod import alpha\n\ndef test_alpha():\n assert alpha() == 1\n",
|
|
158
|
+
)
|
|
159
|
+
for each_index in range(1, MAX_TEST_FILES_SCANNED + 1):
|
|
160
|
+
_write_test_file(neutral_package_directory, f"test_a{each_index:04d}.py", filler_body)
|
|
161
|
+
_write_test_file(
|
|
162
|
+
neutral_package_directory,
|
|
163
|
+
"test_mod.py",
|
|
164
|
+
"from pkg.mod import beta\n\ndef test_beta():\n assert beta() == 2\n",
|
|
165
|
+
)
|
|
166
|
+
all_issues = check_public_function_missing_paired_test(
|
|
167
|
+
_TWO_PUBLIC_FUNCTIONS, str(neutral_package_directory / "mod.py")
|
|
168
|
+
)
|
|
169
|
+
assert all_issues == []
|
|
170
|
+
|
|
171
|
+
|
|
148
172
|
def test_main_and_private_functions_are_never_required(
|
|
149
173
|
neutral_package_directory: Path,
|
|
150
174
|
) -> None:
|
|
@@ -183,8 +207,7 @@ def _write_module(package_directory: Path, body: str) -> None:
|
|
|
183
207
|
|
|
184
208
|
|
|
185
209
|
_SUITE_COVERS_ALPHA_BETA = (
|
|
186
|
-
"from pkg.mod import alpha, beta\n\n"
|
|
187
|
-
"def test_pair():\n assert alpha() == 1 and beta() == 2\n"
|
|
210
|
+
"from pkg.mod import alpha, beta\n\ndef test_pair():\n assert alpha() == 1 and beta() == 2\n"
|
|
188
211
|
)
|
|
189
212
|
|
|
190
213
|
|
|
@@ -193,9 +216,7 @@ def test_flags_module_public_function_when_test_suite_omits_it(
|
|
|
193
216
|
) -> None:
|
|
194
217
|
_write_module(neutral_package_directory, _THREE_PUBLIC_FUNCTIONS)
|
|
195
218
|
test_path = str(neutral_package_directory / "tests" / "test_mod.py")
|
|
196
|
-
all_issues = check_test_file_omits_module_public_function(
|
|
197
|
-
_SUITE_COVERS_ALPHA_BETA, test_path
|
|
198
|
-
)
|
|
219
|
+
all_issues = check_test_file_omits_module_public_function(_SUITE_COVERS_ALPHA_BETA, test_path)
|
|
199
220
|
assert len(all_issues) == 1
|
|
200
221
|
assert "gamma" in all_issues[0]
|
|
201
222
|
assert "mod.py" in all_issues[0]
|
|
@@ -231,9 +252,7 @@ def test_skips_test_file_with_no_paired_production_module(
|
|
|
231
252
|
neutral_package_directory: Path,
|
|
232
253
|
) -> None:
|
|
233
254
|
test_path = str(neutral_package_directory / "tests" / "test_mod.py")
|
|
234
|
-
all_issues = check_test_file_omits_module_public_function(
|
|
235
|
-
_SUITE_COVERS_ALPHA_BETA, test_path
|
|
236
|
-
)
|
|
255
|
+
all_issues = check_test_file_omits_module_public_function(_SUITE_COVERS_ALPHA_BETA, test_path)
|
|
237
256
|
assert all_issues == []
|
|
238
257
|
|
|
239
258
|
|
|
@@ -242,9 +261,7 @@ def test_ignores_a_non_stem_matched_written_file(
|
|
|
242
261
|
) -> None:
|
|
243
262
|
_write_module(neutral_package_directory, _THREE_PUBLIC_FUNCTIONS)
|
|
244
263
|
helper_path = str(neutral_package_directory / "helper.py")
|
|
245
|
-
all_issues = check_test_file_omits_module_public_function(
|
|
246
|
-
_SUITE_COVERS_ALPHA_BETA, helper_path
|
|
247
|
-
)
|
|
264
|
+
all_issues = check_test_file_omits_module_public_function(_SUITE_COVERS_ALPHA_BETA, helper_path)
|
|
248
265
|
assert all_issues == []
|
|
249
266
|
|
|
250
267
|
|
|
@@ -274,9 +291,7 @@ def test_judges_post_edit_content_over_stale_on_disk_test(
|
|
|
274
291
|
"from pkg.mod import alpha, beta, gamma\n\n"
|
|
275
292
|
"def test_all():\n assert alpha() and beta() and gamma()\n"
|
|
276
293
|
)
|
|
277
|
-
all_issues = check_test_file_omits_module_public_function(
|
|
278
|
-
post_edit_covers_all, test_path
|
|
279
|
-
)
|
|
294
|
+
all_issues = check_test_file_omits_module_public_function(post_edit_covers_all, test_path)
|
|
280
295
|
assert all_issues == []
|
|
281
296
|
|
|
282
297
|
|
|
@@ -290,9 +305,7 @@ def test_counts_coverage_across_sibling_test_files_on_test_write(
|
|
|
290
305
|
"from pkg.mod import gamma\n\ndef test_gamma():\n assert gamma() == 3\n",
|
|
291
306
|
)
|
|
292
307
|
test_path = str(neutral_package_directory / "tests" / "test_mod.py")
|
|
293
|
-
all_issues = check_test_file_omits_module_public_function(
|
|
294
|
-
_SUITE_COVERS_ALPHA_BETA, test_path
|
|
295
|
-
)
|
|
308
|
+
all_issues = check_test_file_omits_module_public_function(_SUITE_COVERS_ALPHA_BETA, test_path)
|
|
296
309
|
assert all_issues == []
|
|
297
310
|
|
|
298
311
|
|
|
@@ -301,9 +314,7 @@ def test_test_side_message_names_module_and_function_without_line_prefix(
|
|
|
301
314
|
) -> None:
|
|
302
315
|
_write_module(neutral_package_directory, _THREE_PUBLIC_FUNCTIONS)
|
|
303
316
|
test_path = str(neutral_package_directory / "tests" / "test_mod.py")
|
|
304
|
-
all_issues = check_test_file_omits_module_public_function(
|
|
305
|
-
_SUITE_COVERS_ALPHA_BETA, test_path
|
|
306
|
-
)
|
|
317
|
+
all_issues = check_test_file_omits_module_public_function(_SUITE_COVERS_ALPHA_BETA, test_path)
|
|
307
318
|
assert len(all_issues) == 1
|
|
308
319
|
assert not all_issues[0].startswith("Line ")
|
|
309
320
|
assert "mod.py" in all_issues[0]
|
|
@@ -315,9 +326,7 @@ def test_test_side_omission_blocks_on_any_test_file_edit(
|
|
|
315
326
|
) -> None:
|
|
316
327
|
_write_module(neutral_package_directory, _THREE_PUBLIC_FUNCTIONS)
|
|
317
328
|
test_path = str(neutral_package_directory / "tests" / "test_mod.py")
|
|
318
|
-
all_issues = check_test_file_omits_module_public_function(
|
|
319
|
-
_SUITE_COVERS_ALPHA_BETA, test_path
|
|
320
|
-
)
|
|
329
|
+
all_issues = check_test_file_omits_module_public_function(_SUITE_COVERS_ALPHA_BETA, test_path)
|
|
321
330
|
assert len(all_issues) == 1
|
|
322
331
|
assert "gamma" in all_issues[0]
|
|
323
332
|
|
|
@@ -333,7 +342,5 @@ def test_skips_when_paired_production_module_is_exempt(
|
|
|
333
342
|
"from pkg import alpha, beta, gamma\n\n"
|
|
334
343
|
"def test_all():\n assert alpha() and beta() and gamma()\n"
|
|
335
344
|
)
|
|
336
|
-
all_issues = check_test_file_omits_module_public_function(
|
|
337
|
-
suite_covers_all, beside_test_path
|
|
338
|
-
)
|
|
345
|
+
all_issues = check_test_file_omits_module_public_function(suite_covers_all, beside_test_path)
|
|
339
346
|
assert all_issues == []
|
|
@@ -17,8 +17,8 @@ import pathlib
|
|
|
17
17
|
import sys
|
|
18
18
|
|
|
19
19
|
_PACKAGE_ROOT = pathlib.Path(__file__).resolve().parents[2]
|
|
20
|
-
|
|
21
|
-
_PACKAGE_ROOT
|
|
20
|
+
_ARCHIVED_CONVERGE_MJS = (
|
|
21
|
+
_PACKAGE_ROOT.parents[1] / "skill-archive" / "autoconverge" / "workflow" / "converge.mjs"
|
|
22
22
|
)
|
|
23
23
|
|
|
24
24
|
_HOOK_DIRECTORY = pathlib.Path(__file__).parent
|
|
@@ -750,8 +750,8 @@ def should_still_flag_real_dispatch_alongside_task_substring_identifier() -> Non
|
|
|
750
750
|
assert "spawnVerifierAgent" in issues[0]
|
|
751
751
|
|
|
752
752
|
|
|
753
|
-
def
|
|
754
|
-
converge_source =
|
|
753
|
+
def should_not_flag_archived_converge_regression_fixture() -> None:
|
|
754
|
+
converge_source = _ARCHIVED_CONVERGE_MJS.read_text(encoding="utf-8")
|
|
755
755
|
issues = check_js_resume_task_enumeration_coverage(
|
|
756
756
|
converge_source, "skills/autoconverge/workflow/converge.mjs"
|
|
757
757
|
)
|
|
@@ -34,8 +34,8 @@ check_js_returns_object_schemaless_branch = (
|
|
|
34
34
|
|
|
35
35
|
_MJS_PATH = "skills/autoconverge/workflow/converge.mjs"
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
_HOOK_DIRECTORY.parents[
|
|
37
|
+
_ARCHIVED_CONVERGE_MJS = (
|
|
38
|
+
_HOOK_DIRECTORY.parents[3] / "skill-archive" / "autoconverge" / "workflow" / "converge.mjs"
|
|
39
39
|
)
|
|
40
40
|
|
|
41
41
|
|
|
@@ -161,7 +161,7 @@ def test_skips_python_files() -> None:
|
|
|
161
161
|
assert issues == []
|
|
162
162
|
|
|
163
163
|
|
|
164
|
-
def
|
|
165
|
-
|
|
166
|
-
issues = check_js_returns_object_schemaless_branch(
|
|
164
|
+
def test_archived_converge_regression_fixture_passes_the_check() -> None:
|
|
165
|
+
archived_source = _ARCHIVED_CONVERGE_MJS.read_text(encoding="utf-8")
|
|
166
|
+
issues = check_js_returns_object_schemaless_branch(archived_source, _MJS_PATH)
|
|
167
167
|
assert issues == []
|