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.
Files changed (480) hide show
  1. package/.agents/agents/pr-description-writer.md +2 -2
  2. package/.agents/agents/test_agent_frontmatter.py +2 -2
  3. package/.agents/agents/test_pr_description_writer_style.py +1 -3
  4. package/.agents/skills/e-code-review/SKILL.md +12 -12
  5. package/.agents/skills/e-code-review/preflight-proposal.contract.test.mjs +20 -0
  6. package/.agents/skills/e-code-review/reference/fix.md +15 -17
  7. package/.agents/skills/e-code-review/reference/loop.md +35 -39
  8. package/.agents/skills/e-code-review/reference/mode-contract.test.mjs +2 -1
  9. package/.agents/skills/e-code-review/reference/preflight-proposal.md +44 -9
  10. package/.agents/skills/e-code-review/reference/runner-selection.md +13 -14
  11. package/.agents/skills/issue-tracker/SKILL.md +5 -4
  12. package/.agents/skills/pull-request/SKILL.md +11 -13
  13. package/.agents/skills/pull-request/reference/publication-tasks.md +3 -3
  14. package/.agents/skills/pull-request/scripts/github_pr_command_constants/config/constants.py +9 -1
  15. package/.agents/skills/pull-request/scripts/pull_request.py +35 -44
  16. package/.agents/skills/pull-request/scripts/test_github_pr_command_constants.py +9 -0
  17. package/.agents/skills/pull-request/scripts/test_pull_request.py +35 -3
  18. package/.agents/skills/session-continuity/README.md +189 -0
  19. package/.agents/skills/session-continuity/SKILL.md +114 -0
  20. package/.agents/skills/session-continuity/continuity.mjs +375 -0
  21. package/.agents/skills/session-continuity/continuity.test.mjs +303 -0
  22. package/.agents/skills/skill-builder/SKILL.md +3 -196
  23. package/.agents/skills/syncing-submodules/scripts/test_sync_parent_pointer.py +0 -7
  24. package/.agents/skills/windows-scheduled-task/SKILL.md +153 -0
  25. package/_shared/pr-loop/scripts/pr_loop_shared_constants/terminology_sweep_constants.py +6 -0
  26. package/_shared/pr-loop/scripts/terminology_sweep.py +64 -19
  27. package/_shared/pr-loop/scripts/tests/test_terminology_sweep.py +59 -0
  28. package/bin/cde.mjs +36 -8
  29. package/bin/cde.test.mjs +48 -0
  30. package/bin/ever-shipped-skills.mjs +2 -20
  31. package/bin/ever-shipped-skills.test.mjs +8 -0
  32. package/bin/expand_home_directory_tokens.mjs +4 -5
  33. package/bin/expand_home_directory_tokens.test.mjs +128 -0
  34. package/bin/git_hooks_installer.mjs +22 -3
  35. package/bin/git_hooks_installer.test.mjs +159 -5
  36. package/bin/install-session-continuity.mjs +78 -0
  37. package/bin/install-session-continuity.test.mjs +42 -0
  38. package/bin/install.agents-home.test.mjs +15 -13
  39. package/bin/install.codex-rules.test.mjs +5 -2
  40. package/bin/install.cursor-rules.test.mjs +5 -2
  41. package/bin/install.mjs +506 -63
  42. package/bin/install.policy-lint.test.mjs +130 -0
  43. package/bin/install.profiles.test.mjs +10 -0
  44. package/bin/install.prune.test.mjs +286 -37
  45. package/bin/install.pstack-plugin.test.mjs +114 -0
  46. package/bin/install.test.mjs +537 -120
  47. package/bin/install.transaction.test.mjs +3 -3
  48. package/bin/refresh-pstack-plugin-skills.test.mjs +211 -0
  49. package/docs/CODE_RULES.md +1 -1
  50. package/hooks/advisory/pr_done_reminder.py +342 -0
  51. package/hooks/advisory/test_pr_done_reminder.py +249 -0
  52. package/hooks/blocking/bash_post_call_dispatcher.py +53 -6
  53. package/hooks/blocking/code_rules_banned_identifiers.py +3 -0
  54. package/hooks/blocking/code_rules_paired_test.py +22 -15
  55. package/hooks/blocking/precommit_code_rules_gate.py +5 -8
  56. package/hooks/blocking/test_bash_dispatcher_interpreter_starts.py +7 -52
  57. package/hooks/blocking/test_bash_post_call_dispatcher.py +65 -4
  58. package/hooks/blocking/test_bash_pre_tool_use_dispatcher.py +0 -69
  59. package/hooks/blocking/test_code_rules_banned_identifiers.py +64 -0
  60. package/hooks/blocking/test_code_rules_enforcer_paired_test.py +36 -29
  61. package/hooks/blocking/test_code_rules_js_resume_task_enumeration.py +4 -4
  62. package/hooks/blocking/test_code_rules_js_returns_object_schemaless.py +5 -5
  63. package/hooks/blocking/test_pre_tool_use_dispatcher.py +43 -342
  64. package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +20 -51
  65. package/hooks/blocking/test_shared_stdin_adoption.py +1 -47
  66. package/hooks/git-hooks/git_hooks_constants/staged_policy_lint.py +12 -0
  67. package/hooks/git-hooks/git_hooks_constants/verification_notice_constants.py +116 -0
  68. package/hooks/git-hooks/post_commit.py +33 -0
  69. package/hooks/git-hooks/pre_commit.py +18 -49
  70. package/hooks/git-hooks/pre_push.py +45 -541
  71. package/hooks/git-hooks/test_installed_policy_lint.py +208 -0
  72. package/hooks/git-hooks/test_native_hook_support.py +129 -0
  73. package/hooks/git-hooks/test_native_policy_commit.py +120 -0
  74. package/hooks/git-hooks/test_post_commit.py +43 -0
  75. package/hooks/git-hooks/test_pre_commit.py +38 -148
  76. package/hooks/git-hooks/test_pre_push.py +48 -1631
  77. package/hooks/git-hooks/test_verification_notice.py +60 -0
  78. package/hooks/git-hooks/test_verification_start.py +173 -0
  79. package/hooks/git-hooks/verification_notice.py +192 -0
  80. package/hooks/git-hooks/verification_notice_context.py +253 -0
  81. package/hooks/git-hooks/verification_notice_state.py +237 -0
  82. package/hooks/git-hooks/verification_start.py +100 -0
  83. package/hooks/hooks.json +1 -120
  84. package/hooks/hooks_constants/banned_identifiers_constants.py +4 -0
  85. package/hooks/hooks_constants/bash_post_call_dispatcher_constants.py +14 -1
  86. package/hooks/hooks_constants/bash_pre_tool_use_dispatcher_constants.py +1 -15
  87. package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +0 -4
  88. package/hooks/hooks_constants/pr_done_reminder_constants.py +98 -0
  89. package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +10 -93
  90. package/hooks/hooks_constants/stop_dispatcher_constants.py +1 -4
  91. package/hooks/hooks_constants/test_bash_post_call_dispatcher_constants.py +19 -2
  92. package/hooks/hooks_constants/test_bash_pre_tool_use_dispatcher_constants.py +3 -66
  93. package/hooks/hooks_constants/test_pr_done_reminder_constants.py +40 -0
  94. package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +46 -201
  95. package/hooks/hooks_constants/test_stop_dispatcher_constants.py +3 -25
  96. package/hooks/validation/test_post_tool_use_dispatcher.py +35 -298
  97. package/hooks/validators/run_all_validators.py +5 -1
  98. package/hooks/validators/security_checks.py +57 -2
  99. package/hooks/validators/test_hook_timing_harness.py +2 -5
  100. package/hooks/validators/test_run_all_validators_mutation_tool_parity.py +3 -11
  101. package/hooks/validators/test_run_all_validators_policy_lint.py +36 -0
  102. package/hooks/validators/test_security_checks.py +57 -0
  103. package/package.json +2 -2
  104. package/rules/confirm-implementation-forks.md +2 -0
  105. package/rules/durable-post-artifacts.md +2 -1
  106. package/rules/git-workflow.md +18 -6
  107. package/rules/pstack-host-mapping.md +48 -0
  108. package/rules/vault-context.md +3 -5
  109. package/rules/verify-runtime-state.md +7 -0
  110. package/scripts/audit-hooks-cli.mjs +5 -0
  111. package/scripts/audit-hooks.mjs +72 -16
  112. package/scripts/automatic_advisory/__init__.py +1 -0
  113. package/scripts/automatic_advisory/checkout.py +51 -0
  114. package/scripts/automatic_advisory/cli.py +334 -0
  115. package/scripts/automatic_advisory/config/__init__.py +1 -0
  116. package/scripts/automatic_advisory/config/constants.py +93 -0
  117. package/scripts/automatic_advisory/config/timing.py +4 -0
  118. package/scripts/automatic_advisory/configuration.py +197 -0
  119. package/scripts/automatic_advisory/execution.py +350 -0
  120. package/scripts/automatic_advisory/git.py +69 -0
  121. package/scripts/automatic_advisory/model.py +107 -0
  122. package/scripts/automatic_advisory/process_host.py +32 -0
  123. package/scripts/automatic_advisory/publisher.py +84 -0
  124. package/scripts/automatic_advisory/runner.py +399 -0
  125. package/scripts/automatic_advisory/state.py +116 -0
  126. package/scripts/automatic_advisory/window_flags.py +41 -0
  127. package/scripts/automatic_advisory/windows_job.py +122 -0
  128. package/scripts/check.ps1 +0 -1
  129. package/{.agents/skills/run-claude-dev-env/driver.mjs → scripts/ci/installer-lifecycle.mjs} +3 -28
  130. package/scripts/ci/installer-lifecycle.test.mjs +26 -0
  131. package/scripts/ci/windows-installer-lifecycle.ps1 +1 -11
  132. package/scripts/codex_compat_materializer.py +99 -13
  133. package/scripts/dev_env_scripts_constants/shared_tree_constants.py +4 -5
  134. package/{.agents/skills/_shared/pr-loop/scripts → scripts}/durable_post_lint.py +35 -43
  135. 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
  136. package/{.agents/skills/_shared/pr-loop/scripts/test_durable_post_lint_constants.py → scripts/durable_post_lint_config/config/test_constants.py} +14 -1
  137. package/scripts/local_report_cli.py +184 -0
  138. package/scripts/local_report_core.py +247 -0
  139. package/scripts/local_report_publisher.py +12 -0
  140. package/scripts/local_report_validation.py +357 -0
  141. package/scripts/local_verification/__init__.py +23 -0
  142. package/scripts/local_verification/check_runner.py +364 -0
  143. package/scripts/local_verification/check_support.py +99 -0
  144. package/scripts/local_verification/cli.py +158 -0
  145. package/scripts/local_verification/command_runner.py +84 -0
  146. package/scripts/local_verification/config/__init__.py +1 -0
  147. package/scripts/local_verification/config/constants.py +89 -0
  148. package/scripts/local_verification/config/timing.py +1 -0
  149. package/scripts/local_verification/git_state.py +146 -0
  150. package/scripts/local_verification/manifest.py +224 -0
  151. package/scripts/local_verification/model.py +174 -0
  152. package/scripts/local_verification/runner.py +234 -0
  153. package/scripts/policy_lint/adapter_detectors.py +13 -6
  154. package/scripts/policy_lint/adapter_pairing.py +58 -3
  155. package/scripts/policy_lint/adapters.py +7 -4
  156. package/scripts/policy_lint/config/approved_test_pairs.py +323 -0
  157. package/scripts/policy_lint/config/constants.py +5 -0
  158. package/scripts/policy_lint/engine.py +48 -4
  159. package/scripts/policy_lint/model.py +1 -0
  160. package/scripts/policy_lint/registry.py +1 -1
  161. package/scripts/policy_lint/selection.py +2 -1
  162. package/scripts/policy_lint/selection_git.py +2 -0
  163. package/scripts/pr_verification/__init__.py +1 -0
  164. package/scripts/pr_verification/branch_refs.py +114 -0
  165. package/scripts/pr_verification/config/__init__.py +1 -0
  166. package/scripts/pr_verification/config/constants.py +84 -0
  167. package/scripts/pr_verification/config/timing.py +5 -0
  168. package/scripts/pr_verification/github.py +137 -0
  169. package/scripts/pr_verification/github_api.py +376 -0
  170. package/scripts/pr_verification/github_labels.py +88 -0
  171. package/scripts/pr_verification/github_parsing.py +182 -0
  172. package/scripts/pr_verification/github_transport.py +91 -0
  173. package/scripts/pr_verification/lock.py +122 -0
  174. package/scripts/pr_verification/model.py +43 -0
  175. package/scripts/pr_verification/requirements.txt +1 -0
  176. package/scripts/refresh_pstack_plugin_skills.mjs +200 -0
  177. package/scripts/shared_tree_paths.py +32 -3
  178. package/{.agents/skills/_shared/pr-loop/scripts → scripts}/test_durable_post_lint.py +97 -0
  179. package/scripts/test_shared_tree_paths.py +33 -0
  180. package/scripts/tests/test-audit-hooks-cli.mjs +150 -0
  181. package/scripts/tests/test-audit-hooks.mjs +94 -2
  182. package/scripts/tests/test_automatic_advisory.py +376 -0
  183. package/scripts/tests/test_automatic_advisory_job_cleanup.py +71 -0
  184. package/scripts/tests/test_automatic_advisory_polling.py +216 -0
  185. package/scripts/tests/test_automatic_advisory_recovery.py +320 -0
  186. package/scripts/tests/test_automatic_advisory_repairs.py +400 -0
  187. package/scripts/tests/test_automatic_advisory_settings.py +48 -0
  188. package/scripts/tests/test_automatic_advisory_window_flags.py +163 -0
  189. package/scripts/tests/test_closed_pr_label.py +157 -0
  190. package/scripts/tests/test_codex_compat_materializer.py +189 -6
  191. package/scripts/tests/test_github_labels.py +101 -0
  192. package/scripts/tests/test_github_transport.py +125 -0
  193. package/scripts/tests/test_local_report_publisher.py +396 -0
  194. package/scripts/tests/test_local_report_publisher_cli.py +85 -0
  195. package/scripts/tests/test_local_verification.py +348 -0
  196. package/scripts/tests/test_local_verification_cli.py +98 -0
  197. package/scripts/tests/test_policy_lint_rules_archive.py +120 -0
  198. package/scripts/tests/test_policy_lint_rules_engine.py +25 -4
  199. package/scripts/tests/test_policy_lint_rules_installed_loader.py +29 -0
  200. package/scripts/tests/test_policy_lint_rules_pairing.py +163 -0
  201. package/scripts/tests/test_policy_lint_rules_registry.py +227 -13
  202. package/scripts/tests/test_policy_lint_selection.py +25 -2
  203. package/scripts/tests/test_policy_lint_selection_native_index.py +30 -0
  204. package/scripts/tests/test_pr_verification_github.py +392 -0
  205. package/scripts/tests/test_pr_verification_lock.py +168 -0
  206. package/scripts/tests/test_rules.py +3 -7
  207. package/scripts/tests/test_verification_notice.py +347 -0
  208. package/.agents/skills/_shared/pr-loop/.claude/CLAUDE.md +0 -1
  209. package/.agents/skills/_shared/pr-loop/audit-contract.md +0 -5
  210. package/.agents/skills/_shared/pr-loop/audit-reply-template.md +0 -5
  211. package/.agents/skills/_shared/pr-loop/code-rules-gate.md +0 -5
  212. package/.agents/skills/_shared/pr-loop/fix-protocol.md +0 -5
  213. package/.agents/skills/_shared/pr-loop/gh-payloads.md +0 -5
  214. package/.agents/skills/_shared/pr-loop/portable-driver.md +0 -149
  215. package/.agents/skills/_shared/pr-loop/post-audit-thread-contract.md +0 -5
  216. package/.agents/skills/_shared/pr-loop/precatch-rubric.md +0 -5
  217. package/.agents/skills/_shared/pr-loop/preflight-proposal.contract.test.mjs +0 -119
  218. package/.agents/skills/_shared/pr-loop/preflight-proposal.md +0 -5
  219. package/.agents/skills/_shared/pr-loop/prompts/.claude/CLAUDE.md +0 -1
  220. package/.agents/skills/_shared/pr-loop/prompts/AGENTS.md +0 -1
  221. package/.agents/skills/_shared/pr-loop/prompts/pr-consistency-audit.xml +0 -324
  222. package/.agents/skills/_shared/pr-loop/scripts/.claude/CLAUDE.md +0 -1
  223. package/.agents/skills/_shared/pr-loop/scripts/AGENTS.md +0 -1
  224. package/.agents/skills/_shared/pr-loop/scripts/RUNTIME_SCRIPTS.md +0 -29
  225. package/.agents/skills/_shared/pr-loop/scripts/_cli_utils.py +0 -22
  226. package/.agents/skills/_shared/pr-loop/scripts/_path_resolver.py +0 -186
  227. package/.agents/skills/_shared/pr-loop/scripts/_xml_utils.py +0 -20
  228. package/.agents/skills/_shared/pr-loop/scripts/audit_category_schema.py +0 -355
  229. package/.agents/skills/_shared/pr-loop/scripts/build_audit_prompt.py +0 -289
  230. package/.agents/skills/_shared/pr-loop/scripts/build_converge_task_list.py +0 -310
  231. package/.agents/skills/_shared/pr-loop/scripts/build_fix_prompt.py +0 -292
  232. package/.agents/skills/_shared/pr-loop/scripts/init_loop_state.py +0 -134
  233. package/.agents/skills/_shared/pr-loop/scripts/portable_converge_driver.py +0 -1646
  234. package/.agents/skills/_shared/pr-loop/scripts/preflight_worktree.py +0 -392
  235. package/.agents/skills/_shared/pr-loop/scripts/select_converge_pacer.py +0 -215
  236. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/.claude/CLAUDE.md +0 -1
  237. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/AGENTS.md +0 -1
  238. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/__init__.py +0 -0
  239. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/audit_category_schema_constants.py +0 -37
  240. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/converge_task_list_constants.py +0 -56
  241. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/handoff_constants.py +0 -45
  242. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/pacer_constants.py +0 -47
  243. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/path_resolver_constants.py +0 -157
  244. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +0 -177
  245. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/preflight_constants.py +0 -70
  246. package/.agents/skills/_shared/pr-loop/scripts/teardown_worktrees.py +0 -172
  247. package/.agents/skills/_shared/pr-loop/scripts/test__path_resolver.py +0 -106
  248. package/.agents/skills/_shared/pr-loop/scripts/test_audit_category_schema.py +0 -94
  249. package/.agents/skills/_shared/pr-loop/scripts/test_build_audit_prompt.py +0 -499
  250. package/.agents/skills/_shared/pr-loop/scripts/test_build_converge_task_list.py +0 -140
  251. package/.agents/skills/_shared/pr-loop/scripts/test_build_fix_prompt.py +0 -262
  252. package/.agents/skills/_shared/pr-loop/scripts/test_init_loop_state.py +0 -71
  253. package/.agents/skills/_shared/pr-loop/scripts/test_portable_converge_driver.py +0 -1119
  254. package/.agents/skills/_shared/pr-loop/scripts/test_preflight_worktree.py +0 -287
  255. package/.agents/skills/_shared/pr-loop/scripts/test_select_converge_pacer.py +0 -207
  256. package/.agents/skills/_shared/pr-loop/scripts/test_teardown_worktrees.py +0 -59
  257. package/.agents/skills/_shared/pr-loop/scripts/test_write_handoff.py +0 -201
  258. package/.agents/skills/_shared/pr-loop/scripts/write_audit_outcomes.py +0 -182
  259. package/.agents/skills/_shared/pr-loop/scripts/write_fix_outcomes.py +0 -206
  260. package/.agents/skills/_shared/pr-loop/scripts/write_handoff.py +0 -309
  261. package/.agents/skills/_shared/pr-loop/state-schema.md +0 -5
  262. package/.agents/skills/_shared/pr-loop/worker-spawn.md +0 -5
  263. package/.agents/skills/autoconverge/.claude/CLAUDE.md +0 -1
  264. package/.agents/skills/autoconverge/AGENTS.md +0 -1
  265. package/.agents/skills/autoconverge/SKILL.md +0 -431
  266. package/.agents/skills/autoconverge/reference/.claude/CLAUDE.md +0 -1
  267. package/.agents/skills/autoconverge/reference/AGENTS.md +0 -1
  268. package/.agents/skills/autoconverge/reference/closing-report.md +0 -93
  269. package/.agents/skills/autoconverge/reference/convergence-gates.md +0 -31
  270. package/.agents/skills/autoconverge/reference/convergence.md +0 -219
  271. package/.agents/skills/autoconverge/reference/copilot-findings.md +0 -51
  272. package/.agents/skills/autoconverge/reference/gotchas.md +0 -66
  273. package/.agents/skills/autoconverge/reference/headless-safety.md +0 -44
  274. package/.agents/skills/autoconverge/reference/multi-pr.md +0 -128
  275. package/.agents/skills/autoconverge/reference/self-closing-loop.md +0 -84
  276. package/.agents/skills/autoconverge/reference/stop-conditions.md +0 -127
  277. package/.agents/skills/autoconverge/test_portable_pacer_gate.py +0 -54
  278. package/.agents/skills/autoconverge/workflow/.claude/CLAUDE.md +0 -1
  279. package/.agents/skills/autoconverge/workflow/AGENTS.md +0 -1
  280. package/.agents/skills/autoconverge/workflow/aggregate_runs.py +0 -371
  281. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/.claude/CLAUDE.md +0 -1
  282. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/AGENTS.md +0 -1
  283. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/__init__.py +0 -0
  284. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +0 -250
  285. package/.agents/skills/autoconverge/workflow/converge.clean-audit.test.mjs +0 -665
  286. package/.agents/skills/autoconverge/workflow/converge.codex-gate.test.mjs +0 -472
  287. package/.agents/skills/autoconverge/workflow/converge.contract.test.mjs +0 -64
  288. package/.agents/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +0 -1009
  289. package/.agents/skills/autoconverge/workflow/converge.fix-progress.test.mjs +0 -107
  290. package/.agents/skills/autoconverge/workflow/converge.fix-recovery.test.mjs +0 -33
  291. package/.agents/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +0 -15
  292. package/.agents/skills/autoconverge/workflow/converge.mjs +0 -3132
  293. package/.agents/skills/autoconverge/workflow/converge.p2-advance.test.mjs +0 -202
  294. package/.agents/skills/autoconverge/workflow/converge.path-aware.test.mjs +0 -47
  295. package/.agents/skills/autoconverge/workflow/converge.precatch.test.mjs +0 -152
  296. package/.agents/skills/autoconverge/workflow/converge.run-input.test.mjs +0 -116
  297. package/.agents/skills/autoconverge/workflow/converge_multi.mjs +0 -169
  298. package/.agents/skills/autoconverge/workflow/converge_multi.run-input.test.mjs +0 -173
  299. package/.agents/skills/autoconverge/workflow/convergence_summary.py +0 -110
  300. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +0 -2
  301. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +0 -2
  302. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +0 -2
  303. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +0 -2
  304. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +0 -2
  305. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +0 -2
  306. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ab1c2d3e4f5a6b7c8.jsonl +0 -2
  307. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +0 -2
  308. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +0 -2
  309. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +0 -266
  310. package/.agents/skills/autoconverge/workflow/render_report.py +0 -1024
  311. package/.agents/skills/autoconverge/workflow/test_aggregate_runs.py +0 -134
  312. package/.agents/skills/autoconverge/workflow/test_convergence_summary.py +0 -149
  313. package/.agents/skills/autoconverge/workflow/test_render_report.py +0 -812
  314. package/.agents/skills/hitl/SKILL.md +0 -45
  315. package/.agents/skills/pr-cleanup/SKILL.md +0 -140
  316. package/.agents/skills/pr-cleanup/reference/process-inventory.md +0 -17
  317. package/.agents/skills/pr-cleanup/reference/task-seeds.md +0 -22
  318. package/.agents/skills/pr-name-by-capability/SKILL.md +0 -73
  319. package/.agents/skills/pr-name-by-capability/reference/fetch-commands.md +0 -29
  320. package/.agents/skills/pr-name-by-capability/reference/offense-examples.md +0 -32
  321. package/.agents/skills/pr-name-by-capability/reference/report-template.md +0 -29
  322. package/.agents/skills/pr-name-by-capability/reference/rule-checklist.md +0 -38
  323. package/.agents/skills/pr-name-by-capability/reference/task-seeds.md +0 -10
  324. package/.agents/skills/pr-plain-language-cleanup/SKILL.md +0 -93
  325. package/.agents/skills/pr-refinement/SKILL.md +0 -31
  326. package/.agents/skills/pr-shared-extraction/SKILL.md +0 -177
  327. package/.agents/skills/pr-shared-extraction/reference/examples.md +0 -46
  328. package/.agents/skills/pr-shared-extraction/reference/offense-taxonomy.md +0 -100
  329. package/.agents/skills/pr-small-cl/SKILL.md +0 -52
  330. package/.agents/skills/pr-title-description/SKILL.md +0 -96
  331. package/.agents/skills/prototype/SKILL.md +0 -85
  332. package/.agents/skills/prototype/reference/honest-limitations.md +0 -23
  333. package/.agents/skills/prototype/reference/promotion-tasks.md +0 -23
  334. package/.agents/skills/prototype/scripts/build_sandbox_settings.py +0 -249
  335. package/.agents/skills/prototype/scripts/conftest.py +0 -15
  336. package/.agents/skills/prototype/scripts/launch_sandbox.py +0 -205
  337. package/.agents/skills/prototype/scripts/probe_sandbox_safety.py +0 -311
  338. package/.agents/skills/prototype/scripts/prototype_scripts_constants/__init__.py +0 -1
  339. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/__init__.py +0 -0
  340. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/build_sandbox_settings_constants.py +0 -41
  341. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/launch_sandbox_constants.py +0 -23
  342. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/probe_sandbox_safety_constants.py +0 -45
  343. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/prototype_common_constants.py +0 -10
  344. package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +0 -275
  345. package/.agents/skills/prototype/scripts/test_launch_sandbox.py +0 -303
  346. package/.agents/skills/prototype/scripts/test_probe_sandbox_safety.py +0 -312
  347. package/.agents/skills/prototype/workflows/promotion.md +0 -25
  348. package/.agents/skills/prototype/workflows/sandbox.md +0 -35
  349. package/.agents/skills/rebase/.claude/CLAUDE.md +0 -1
  350. package/.agents/skills/rebase/AGENTS.md +0 -1
  351. package/.agents/skills/rebase/SKILL.md +0 -178
  352. package/.agents/skills/review-router/SKILL.md +0 -51
  353. package/.agents/skills/review-router/reference/route-policy.json +0 -7
  354. package/.agents/skills/review-router/reference/task-seeds.md +0 -1
  355. package/.agents/skills/review-router/scripts/conftest.py +0 -4
  356. package/.agents/skills/review-router/scripts/review_router.py +0 -50
  357. package/.agents/skills/review-router/scripts/review_router_cli.py +0 -211
  358. package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +0 -1
  359. package/.agents/skills/review-router/scripts/review_router_constants/config/__init__.py +0 -0
  360. package/.agents/skills/review-router/scripts/review_router_constants/config/constants.py +0 -13
  361. package/.agents/skills/review-router/scripts/test_review_router.py +0 -23
  362. package/.agents/skills/review-router/scripts/test_review_router_cli.py +0 -47
  363. package/.agents/skills/review-tier/SKILL.md +0 -56
  364. package/.agents/skills/review-tier/reference/task-seeds.md +0 -1
  365. package/.agents/skills/review-tier/reference/tier-policy.json +0 -9
  366. package/.agents/skills/review-tier/scripts/conftest.py +0 -4
  367. package/.agents/skills/review-tier/scripts/review_tier.py +0 -359
  368. package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +0 -1
  369. package/.agents/skills/review-tier/scripts/review_tier_constants/config/__init__.py +0 -0
  370. package/.agents/skills/review-tier/scripts/review_tier_constants/config/constants.py +0 -29
  371. package/.agents/skills/review-tier/scripts/test_generation.py +0 -159
  372. package/.agents/skills/review-tier/scripts/test_review_tier.py +0 -33
  373. package/.agents/skills/run-claude-dev-env/SKILL.md +0 -84
  374. package/.agents/skills/session-log/.claude/CLAUDE.md +0 -1
  375. package/.agents/skills/session-log/AGENTS.md +0 -1
  376. package/.agents/skills/session-log/SKILL.md +0 -170
  377. package/.agents/skills/session-log/templates/frontmatter.md +0 -40
  378. package/.agents/skills/session-tidy/.claude/CLAUDE.md +0 -1
  379. package/.agents/skills/session-tidy/AGENTS.md +0 -1
  380. package/.agents/skills/session-tidy/SKILL.md +0 -191
  381. package/.agents/skills/skill-builder/references/.claude/CLAUDE.md +0 -1
  382. package/.agents/skills/skill-builder/references/AGENTS.md +0 -1
  383. package/.agents/skills/skill-builder/references/delegation-map.md +0 -130
  384. package/.agents/skills/skill-builder/references/description-field.md +0 -111
  385. package/.agents/skills/skill-builder/references/deterministic-elements.md +0 -218
  386. package/.agents/skills/skill-builder/references/progressive-disclosure.md +0 -122
  387. package/.agents/skills/skill-builder/references/self-audit-checklist.md +0 -126
  388. package/.agents/skills/skill-builder/references/skill-modularity.md +0 -111
  389. package/.agents/skills/skill-builder/references/skill-types.md +0 -232
  390. package/.agents/skills/skill-builder/references/thariq-x-post-skills.json +0 -33
  391. package/.agents/skills/skill-builder/templates/.claude/CLAUDE.md +0 -1
  392. package/.agents/skills/skill-builder/templates/AGENTS.md +0 -1
  393. package/.agents/skills/skill-builder/templates/gap-analysis.md +0 -87
  394. package/.agents/skills/skill-builder/workflows/.claude/CLAUDE.md +0 -1
  395. package/.agents/skills/skill-builder/workflows/AGENTS.md +0 -1
  396. package/.agents/skills/skill-builder/workflows/improve-skill.md +0 -136
  397. package/.agents/skills/skill-builder/workflows/new-skill.md +0 -179
  398. package/.agents/skills/skill-builder/workflows/polish-skill.md +0 -139
  399. package/.agents/skills/source-command-sr-loop/SKILL.md +0 -82
  400. package/.agents/skills/update/.claude/CLAUDE.md +0 -1
  401. package/.agents/skills/update/AGENTS.md +0 -1
  402. package/.agents/skills/update/SKILL.md +0 -190
  403. package/_shared/pr-loop/AGENTS.md +0 -1
  404. package/_shared/pr-loop/audit-contract.md +0 -183
  405. package/_shared/pr-loop/audit-reply-template.md +0 -151
  406. package/_shared/pr-loop/code-rules-gate.md +0 -65
  407. package/_shared/pr-loop/fix-protocol.md +0 -60
  408. package/_shared/pr-loop/gh-payloads.md +0 -75
  409. package/_shared/pr-loop/post-audit-thread-contract.md +0 -51
  410. package/_shared/pr-loop/precatch-rubric.md +0 -66
  411. package/_shared/pr-loop/preflight-proposal.md +0 -56
  412. package/_shared/pr-loop/scripts/post_audit_thread.py +0 -1242
  413. package/_shared/pr-loop/scripts/pr_loop_shared_constants/post_audit_thread_constants.py +0 -199
  414. package/_shared/pr-loop/scripts/tests/test_post_audit_thread.py +0 -1115
  415. package/_shared/pr-loop/scripts/tests/test_post_audit_thread_constants.py +0 -129
  416. package/_shared/pr-loop/state-schema.md +0 -45
  417. package/_shared/pr-loop/worker-spawn.md +0 -189
  418. package/hooks/blocking/ask_user_question_shape_blocker.py +0 -83
  419. package/hooks/blocking/bot_mention_comment_blocker.py +0 -76
  420. package/hooks/blocking/claude_md_orphan_file_blocker.py +0 -129
  421. package/hooks/blocking/cursor_cli_python_misfire_blocker.py +0 -108
  422. package/hooks/blocking/destructive_command_blocker.py +0 -2073
  423. package/hooks/blocking/fable_spawn_gate.py +0 -187
  424. package/hooks/blocking/luna_fast_mode_gate.py +0 -160
  425. package/hooks/blocking/nas_ssh_binary_enforcer.py +0 -163
  426. package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +0 -260
  427. package/hooks/blocking/package_inventory_stale_blocker.py +0 -107
  428. package/hooks/blocking/pii_prevention_blocker.py +0 -365
  429. package/hooks/blocking/piped_pytest_blocker.py +0 -1223
  430. package/hooks/blocking/question_to_user_enforcer.py +0 -130
  431. package/hooks/blocking/send_user_file_open_locally_blocker.py +0 -71
  432. package/hooks/blocking/sensitive_file_protector.py +0 -167
  433. package/hooks/blocking/session_edit_stage_gate.py +0 -684
  434. package/hooks/blocking/session_handoff_blocker.py +0 -182
  435. package/hooks/blocking/shell_substitution_blocker.py +0 -350
  436. package/hooks/blocking/test_ask_user_question_shape.py +0 -69
  437. package/hooks/blocking/test_bot_mention_comment_blocker.py +0 -131
  438. package/hooks/blocking/test_claude_md_orphan_file_blocker.py +0 -1277
  439. package/hooks/blocking/test_cursor_cli_python_misfire_blocker.py +0 -208
  440. package/hooks/blocking/test_destructive_command_blocker.py +0 -2024
  441. package/hooks/blocking/test_destructive_command_blocker_deny_mode.py +0 -105
  442. package/hooks/blocking/test_destructive_command_blocker_no_verify.py +0 -122
  443. package/hooks/blocking/test_destructive_command_blocker_patterns.py +0 -133
  444. package/hooks/blocking/test_fable_spawn_gate.py +0 -381
  445. package/hooks/blocking/test_inventory_deadlock_resolution.py +0 -154
  446. package/hooks/blocking/test_luna_fast_mode_gate.py +0 -211
  447. package/hooks/blocking/test_nas_ssh_binary_enforcer.py +0 -225
  448. package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +0 -231
  449. package/hooks/blocking/test_package_inventory_stale_blocker.py +0 -382
  450. package/hooks/blocking/test_pii_prevention_blocker.py +0 -1222
  451. package/hooks/blocking/test_pii_prevention_windows_git_path.py +0 -41
  452. package/hooks/blocking/test_pii_write_surface_ephemeral.py +0 -221
  453. package/hooks/blocking/test_piped_pytest_blocker.py +0 -587
  454. package/hooks/blocking/test_precommit_code_rules_gate_native_owner.py +0 -233
  455. package/hooks/blocking/test_question_to_user_enforcer.py +0 -169
  456. package/hooks/blocking/test_send_user_file_open_locally_blocker.py +0 -118
  457. package/hooks/blocking/test_sensitive_file_protector.py +0 -365
  458. package/hooks/blocking/test_session_edit_stage_gate.py +0 -537
  459. package/hooks/blocking/test_session_edit_stage_gate_staging.py +0 -64
  460. package/hooks/blocking/test_session_edit_stage_gate_support.py +0 -204
  461. package/hooks/blocking/test_session_edit_stage_gate_tracker.py +0 -116
  462. package/hooks/blocking/test_session_handoff_blocker.py +0 -318
  463. package/hooks/blocking/test_shell_substitution_blocker.py +0 -298
  464. package/hooks/blocking/test_unscoped_search_blocker.py +0 -102
  465. package/hooks/blocking/test_write_existing_file_blocker.py +0 -122
  466. package/hooks/blocking/tests/test_pii_prevention_blocker.py +0 -259
  467. package/hooks/blocking/unscoped_search_blocker.py +0 -391
  468. package/hooks/blocking/write_existing_file_blocker.py +0 -124
  469. package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +0 -19
  470. package/hooks/hooks_constants/cursor_cli_python_misfire_blocker_constants.py +0 -79
  471. package/hooks/hooks_constants/fable_spawn_gate_constants.py +0 -61
  472. package/hooks/hooks_constants/luna_fast_mode_gate_constants.py +0 -45
  473. package/hooks/hooks_constants/nas_ssh_binary_enforcer_constants.py +0 -20
  474. package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +0 -57
  475. package/hooks/hooks_constants/send_user_file_open_locally_blocker_constants.py +0 -17
  476. package/hooks/hooks_constants/sensitive_file_protector_constants.py +0 -40
  477. package/hooks/hooks_constants/session_handoff_blocker_constants.py +0 -10
  478. package/hooks/hooks_constants/shell_substitution_blocker_constants.py +0 -80
  479. /package/.agents/skills/{_shared/pr-loop → session-continuity}/AGENTS.md +0 -0
  480. /package/{_shared/pr-loop → .agents/skills/session-continuity}/CLAUDE.md +0 -0
@@ -0,0 +1,153 @@
1
+ ---
2
+ name: windows-scheduled-task
3
+ description: >-
4
+ Register a repeating headless Windows scheduled task from PowerShell, with endless repetition, an S4U or Interactive principal, absolute action paths, and a documented teardown. Triggers: register a scheduled task, repeating task, headless task, S4U, Task Scheduler, RepetitionDuration, task will not register, scheduled task access denied, Unregister-ScheduledTask.
5
+ ---
6
+
7
+ # Windows scheduled task
8
+
9
+ ## Contents
10
+
11
+ - Principle
12
+ - Gotchas
13
+ - When this applies
14
+ - Process
15
+ - Endless repetition
16
+ - Headless principal
17
+ - Absolute paths in the action
18
+ - Settings
19
+ - Placement outside managed paths
20
+ - Status
21
+ - Removal and teardown
22
+ - Self-modification warning
23
+ - Verification
24
+ - Files
25
+
26
+ ## Principle
27
+
28
+ A registered task carries four decisions. How it repeats, which principal runs it, which absolute
29
+ executable it starts, and where its target files sit. Settle all four at registration time, then
30
+ prove the task by the artifact it changes.
31
+
32
+ ## Gotchas
33
+
34
+ - `New-ScheduledTaskTrigger -RepetitionDuration ([TimeSpan]::MaxValue)` fails the task XML schema with `The task XML contains a value which is incorrectly formatted or out of range. (10,42):Duration:P99999999DT23H59M59S`.
35
+ - `-LogonType S4U` requires an elevated shell. An unelevated `Register-ScheduledTask` ends with `Access is denied.`
36
+ - Task Scheduler inherits none of the shell PATH. A bare executable name in the action fails at run time.
37
+ - A helper under an installer-managed path deletes itself during an installer run.
38
+ - `LastTaskResult: 0` from a run that took the idle branch says nothing about the branch that acts.
39
+
40
+ ## When this applies
41
+
42
+ Use this skill for a repeating Windows task registered from PowerShell through the ScheduledTasks
43
+ module. Register the task in an elevated shell when the task must run while the user is signed out.
44
+
45
+ ## Process
46
+
47
+ 1. Resolve every executable in the action with `Get-Command <name>` and read `.Source`.
48
+ 2. Read `files[]` in `~/.claude/.claude-dev-env-manifest.json` and pick a directory that list omits.
49
+ 3. Build the action with the absolute executable path and `-WindowStyle Hidden` inside the argument string.
50
+ 4. Build a `-Once` trigger with a repetition interval and no duration, then clear the duration on the trigger object.
51
+ 5. Build the settings set.
52
+ 6. Register with an S4U principal, catch the registration failure, and register with an Interactive principal.
53
+ 7. Report which principal the registered task holds.
54
+ 8. Drive the branch that does the work and read the artifact it changes.
55
+ 9. Document the removal command beside the task.
56
+
57
+ ## Endless repetition
58
+
59
+ ```powershell
60
+ $Trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 30)
61
+ $Trigger.Repetition.Duration = ''
62
+ $Trigger.Repetition.StopAtDurationEnd = $false
63
+ ```
64
+
65
+ An empty duration string on the trigger object registers a repetition that keeps firing. Build the
66
+ trigger without a duration argument and set the two properties afterward.
67
+
68
+ ## Headless principal
69
+
70
+ ```powershell
71
+ $Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType S4U
72
+ try {
73
+ Register-ScheduledTask -TaskName $TaskName -Action $Action -Trigger $Trigger -Settings $Settings -Principal $Principal -Force -ErrorAction Stop
74
+ $PrincipalKind = 'S4U'
75
+ } catch {
76
+ $Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive
77
+ Register-ScheduledTask -TaskName $TaskName -Action $Action -Trigger $Trigger -Settings $Settings -Principal $Principal -Force
78
+ $PrincipalKind = 'Interactive'
79
+ }
80
+ ```
81
+
82
+ S4U runs the task with no window whether or not the user is signed in, and its registration needs an
83
+ elevated shell. The Interactive principal with `-WindowStyle Hidden` in the action runs windowless
84
+ while the user is signed in. Report `$PrincipalKind` so the operator knows which one the task holds.
85
+
86
+ ## Absolute paths in the action
87
+
88
+ ```powershell
89
+ $PwshPath = (Get-Command pwsh).Source
90
+ $Action = New-ScheduledTaskAction -Execute $PwshPath -Argument "-NoProfile -WindowStyle Hidden -File ""$ScriptPath"""
91
+ ```
92
+
93
+ Resolve each executable at registration time and store the absolute path in the action. Give the
94
+ script an absolute path too.
95
+
96
+ ## Settings
97
+
98
+ ```powershell
99
+ $Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -MultipleInstances IgnoreNew -ExecutionTimeLimit (New-TimeSpan -Hours 1)
100
+ ```
101
+
102
+ These settings keep the task firing on battery power, catch up a missed run, drop an overlapping
103
+ start, and cap a hung run.
104
+
105
+ ## Placement outside managed paths
106
+
107
+ The claude-dev-env installer records every managed path in `~/.claude/.claude-dev-env-manifest.json`
108
+ under `files[]`, and `--update` removes those paths before it reinstalls from the package. A helper
109
+ that a task starts from a managed directory disappears mid-run. Read `files[]`, then place the
110
+ helper and its state files in a directory the manifest omits, such as a path under `<user home>`
111
+ outside `~/.claude`.
112
+
113
+ ## Status
114
+
115
+ ```powershell
116
+ $Info = Get-ScheduledTaskInfo -TaskName $TaskName
117
+ $Info.LastRunTime
118
+ $Info.LastTaskResult
119
+ $Info.NextRunTime
120
+ ```
121
+
122
+ ## Removal and teardown
123
+
124
+ ```powershell
125
+ Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
126
+ ```
127
+
128
+ Put this command in the same document that describes the task.
129
+
130
+ ## Self-modification warning
131
+
132
+ A task that installs updates of the agent rules, hooks, and skills rewrites the running session
133
+ instructions on a timer. A major upgrade can land mid-session while the agent holds the older text.
134
+ Give the operator the teardown command, name the interval, and keep the interval wide enough for a
135
+ session to finish between runs.
136
+
137
+ ## Verification
138
+
139
+ A run that takes the idle branch reports `LastTaskResult: 0`, and that result covers the idle branch
140
+ alone. Prove the acting branch: create the condition the task acts on, wait one interval, then read
141
+ the artifact the task changes and its timestamp.
142
+
143
+ ## Files
144
+
145
+ - `SKILL.md`. Registration rules, worked examples, status, and teardown.
146
+
147
+ `packages/claude-dev-env/scripts/Install-SweepEmptyDirs.ps1` is the working model in this repository
148
+ for the install, `-Remove`, and `-Status` parameter sets and symmetric teardown.
149
+
150
+ ```text
151
+ windows-scheduled-task/
152
+ └── SKILL.md
153
+ ```
@@ -107,6 +107,12 @@ ALL_GIT_DIFF_CACHED_UNIFIED_ZERO_COMMAND: tuple[str, ...] = (
107
107
  "--unified=0",
108
108
  )
109
109
 
110
+ ALL_GIT_DIFF_UNIFIED_ZERO_COMMAND: tuple[str, ...] = (
111
+ "git",
112
+ "diff",
113
+ "--unified=0",
114
+ )
115
+
110
116
  GIT_DIFF_SUBPROCESS_TIMEOUT_SECONDS: int = 30
111
117
 
112
118
  GIT_NO_MATCH_EXIT_CODE: int = 1
@@ -32,6 +32,7 @@ from pr_loop_shared_constants.terminology_sweep_constants import (
32
32
  ALL_COMMON_ENGLISH_COMPOUND_TAIL_WORDS,
33
33
  ALL_DIFF_FILE_PATH_STRIP_PREFIXES,
34
34
  ALL_GIT_DIFF_CACHED_UNIFIED_ZERO_COMMAND,
35
+ ALL_GIT_DIFF_UNIFIED_ZERO_COMMAND,
35
36
  ALL_GIT_GREP_BASE_TREE_COMMAND_PREFIX,
36
37
  ALL_PROSE_STOPWORD_TOKENS,
37
38
  ALL_STRING_ESCAPE_SEQUENCES,
@@ -622,21 +623,23 @@ def _identifier_names_on_added_code_lines(diff_text: str) -> frozenset[str]:
622
623
 
623
624
 
624
625
  def _base_tree_names(
625
- repository_root: Path, all_names: frozenset[str]
626
+ repository_root: Path,
627
+ all_names: frozenset[str],
628
+ tree_revision: str,
626
629
  ) -> frozenset[str]:
627
- """Return the names the repository's base tree already contains.
630
+ """Return the names the comparison tree already contains.
628
631
 
629
- Each name is looked up as a whole word in the base revision's tree. A
630
- repository with no commits yet, or a lookup that git cannot run, reports
631
- the name as absent, so the sweep then treats it as newly introduced.
632
- That is the behaviour the sweep has with no base-tree check at all.
632
+ Each name is looked up as a whole word in ``tree_revision``. A repository
633
+ with no commits yet, or a lookup that git cannot run, reports the name as
634
+ absent, so the sweep treats it as newly introduced.
633
635
 
634
636
  Args:
635
637
  repository_root: The repository root the lookups run in.
636
638
  all_names: The identifier names to look up.
639
+ tree_revision: The revision whose tree is searched.
637
640
 
638
641
  Returns:
639
- The subset of names present in the base tree.
642
+ The subset of names present in that tree.
640
643
  """
641
644
  all_present_names: set[str] = set()
642
645
  for each_name in sorted(all_names):
@@ -645,7 +648,7 @@ def _base_tree_names(
645
648
  [
646
649
  *ALL_GIT_GREP_BASE_TREE_COMMAND_PREFIX,
647
650
  each_name,
648
- GIT_BASE_TREE_REVISION,
651
+ tree_revision,
649
652
  ],
650
653
  cwd=str(repository_root),
651
654
  capture_output=True,
@@ -695,14 +698,16 @@ def _raise_for_git_failure(
695
698
 
696
699
 
697
700
  def _strict_base_tree_names(
698
- repository_root: Path, all_names: frozenset[str]
701
+ repository_root: Path,
702
+ all_names: frozenset[str],
703
+ tree_revision: str,
699
704
  ) -> frozenset[str]:
700
705
  all_present_names: set[str] = set()
701
706
  for each_name in sorted(all_names):
702
707
  all_arguments = (
703
708
  *ALL_GIT_GREP_BASE_TREE_COMMAND_PREFIX,
704
709
  each_name,
705
- GIT_BASE_TREE_REVISION,
710
+ tree_revision,
706
711
  )
707
712
  grep_process = _run_strict_git(repository_root, all_arguments)
708
713
  if grep_process.returncode == 0:
@@ -728,14 +733,53 @@ def strict_staged_terminology_findings(repository_root: Path) -> list[str]:
728
733
  RuntimeError: Git could not read the staged diff or look up an
729
734
  identifier in HEAD.
730
735
  """
731
- diff_process = _run_strict_git(
732
- repository_root, ALL_GIT_DIFF_CACHED_UNIFIED_ZERO_COMMAND
736
+ return _strict_terminology_findings(
737
+ repository_root,
738
+ ALL_GIT_DIFF_CACHED_UNIFIED_ZERO_COMMAND,
739
+ GIT_BASE_TREE_REVISION,
733
740
  )
741
+
742
+
743
+ def strict_base_terminology_findings(
744
+ repository_root: Path, base_revision: str
745
+ ) -> list[str]:
746
+ """Return near-miss findings for worktree changes against a base revision.
747
+
748
+ Args:
749
+ repository_root: The repository root the worktree diff is read from.
750
+ base_revision: The tree that worktree changes are compared against.
751
+
752
+ Returns:
753
+ One finding string per near-miss term on an added prose line.
754
+
755
+ Raises:
756
+ RuntimeError: Git could not read the committed diff or look up an
757
+ identifier in the comparison tree.
758
+ """
759
+ all_arguments = (
760
+ *ALL_GIT_DIFF_UNIFIED_ZERO_COMMAND,
761
+ base_revision,
762
+ )
763
+ return _strict_terminology_findings(
764
+ repository_root,
765
+ all_arguments,
766
+ base_revision,
767
+ )
768
+
769
+
770
+ def _strict_terminology_findings(
771
+ repository_root: Path,
772
+ all_diff_arguments: Sequence[str],
773
+ tree_revision: str,
774
+ ) -> list[str]:
775
+ diff_process = _run_strict_git(repository_root, all_diff_arguments)
734
776
  _raise_for_git_failure(diff_process, GIT_DIFF_OPERATION)
735
777
  all_added_names = _identifier_names_on_added_code_lines(diff_process.stdout)
736
778
  preexisting_tuples = frozenset(
737
779
  _identifier_token_tuple(each_name)
738
- for each_name in _strict_base_tree_names(repository_root, all_added_names)
780
+ for each_name in _strict_base_tree_names(
781
+ repository_root, all_added_names, tree_revision
782
+ )
739
783
  )
740
784
  return _find_terminology_near_misses(diff_process.stdout, preexisting_tuples)
741
785
 
@@ -743,16 +787,15 @@ def strict_staged_terminology_findings(repository_root: Path) -> list[str]:
743
787
  def staged_terminology_findings(repository_root: Path) -> list[str]:
744
788
  """Return terminology near-miss findings for a repository's staged diff.
745
789
 
746
- An identifier the base tree already names is not one the staged diff
747
- introduces, so no prose is flagged against it. Only genuinely new
748
- identifiers are swept.
790
+ An identifier already present in HEAD is not treated as introduced, so
791
+ prose is not flagged against it.
749
792
 
750
793
  Args:
751
794
  repository_root: The repository root the staged diff is read from.
752
795
 
753
796
  Returns:
754
- One finding string per near-miss term on a staged added prose line, or
755
- an empty list when the staged diff is empty or git cannot be run.
797
+ One finding string per near-miss term on a staged prose line, or an
798
+ empty list when the staged diff is empty or git cannot be run.
756
799
  """
757
800
  diff_process = subprocess.run(
758
801
  list(ALL_GIT_DIFF_CACHED_UNIFIED_ZERO_COMMAND),
@@ -770,7 +813,9 @@ def staged_terminology_findings(repository_root: Path) -> list[str]:
770
813
  all_added_names = _identifier_names_on_added_code_lines(diff_process.stdout)
771
814
  preexisting_tuples = frozenset(
772
815
  _identifier_token_tuple(each_name)
773
- for each_name in _base_tree_names(repository_root, all_added_names)
816
+ for each_name in _base_tree_names(
817
+ repository_root, all_added_names, GIT_BASE_TREE_REVISION
818
+ )
774
819
  )
775
820
  return _find_terminology_near_misses(diff_process.stdout, preexisting_tuples)
776
821
 
@@ -31,6 +31,7 @@ sweep_module = _load_sweep_module()
31
31
  sweep_diff = sweep_module.sweep_diff
32
32
  staged_terminology_findings = sweep_module.staged_terminology_findings
33
33
  strict_staged_terminology_findings = sweep_module.strict_staged_terminology_findings
34
+ strict_base_terminology_findings = sweep_module.strict_base_terminology_findings
34
35
  main = sweep_module.main
35
36
  parse_added_lines = sweep_module._parse_added_lines
36
37
 
@@ -53,6 +54,54 @@ def _init_git_repository(repository_path: Path) -> None:
53
54
  )
54
55
 
55
56
 
57
+ def _run_repository_git(repository_path: Path, all_arguments: list[str]) -> str:
58
+ completed = subprocess.run(
59
+ all_arguments,
60
+ cwd=repository_path,
61
+ check=True,
62
+ capture_output=True,
63
+ text=True,
64
+ env=_hermetic_git_environment(),
65
+ )
66
+ return completed.stdout.strip()
67
+
68
+
69
+ def _write_repository_text(
70
+ repository_path: Path, relative_path: str, text: str
71
+ ) -> None:
72
+ (repository_path / relative_path).write_text(text, encoding="utf-8")
73
+
74
+
75
+ def _commit_all(repository_path: Path, message: str) -> None:
76
+ _run_repository_git(repository_path, ["git", "add", "-A"])
77
+ _run_repository_git(repository_path, ["git", "commit", "-m", message])
78
+
79
+
80
+ def _head_revision(repository_path: Path) -> str:
81
+ return _run_repository_git(repository_path, ["git", "rev-parse", "HEAD"])
82
+
83
+
84
+ def _committed_near_miss_repository(repository_path: Path) -> str:
85
+ _init_git_repository(repository_path)
86
+ _write_repository_text(repository_path, "quota.py", "baseline = 1\n")
87
+ _write_repository_text(repository_path, "README.md", "Baseline quota text.\n")
88
+ _commit_all(repository_path, "base")
89
+ comparison_revision = _head_revision(repository_path)
90
+ _write_repository_text(
91
+ repository_path,
92
+ "quota.py",
93
+ "baseline = 1\npremium_request_interactions = 5\n",
94
+ )
95
+ _commit_all(repository_path, "identifier")
96
+ _write_repository_text(
97
+ repository_path,
98
+ "README.md",
99
+ "The premium-request-budget field gates the run.\n",
100
+ )
101
+ _commit_all(repository_path, "documentation")
102
+ return comparison_revision
103
+
104
+
56
105
  CODE_AND_PROSE_DIFF = (
57
106
  "diff --git a/api/quota.py b/api/quota.py\n"
58
107
  "--- a/api/quota.py\n"
@@ -310,6 +359,16 @@ def test_staged_terminology_findings_empty_when_clean(tmp_path: Path) -> None:
310
359
  assert staged_terminology_findings(tmp_path) == []
311
360
 
312
361
 
362
+ def test_strict_base_terminology_findings_reports_committed_near_miss(
363
+ tmp_path: Path,
364
+ ) -> None:
365
+ comparison_revision = _committed_near_miss_repository(tmp_path)
366
+ all_findings = strict_base_terminology_findings(tmp_path, comparison_revision)
367
+ assert len(all_findings) == 1
368
+ assert "README.md:1" in all_findings[0]
369
+ assert "premium-request-budget" in all_findings[0]
370
+
371
+
313
372
  def test_parse_added_lines_counts_pre_increment_content_as_added_line() -> None:
314
373
  diff_with_pre_increment = (
315
374
  "diff --git a/app.mjs b/app.mjs\n"
package/bin/cde.mjs CHANGED
@@ -6,17 +6,19 @@ import path from "node:path";
6
6
 
7
7
  const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
8
8
  const lintScriptPath = path.join(packageRoot, "scripts", "cde_lint.py");
9
+ const verificationScriptPath = path.join(packageRoot, "scripts", "local_verification", "cli.py");
9
10
  const posixSignalStatusOffset = 128;
10
11
  const lintCommandName = "lint";
12
+ const verifyCommandName = "verify";
11
13
  const pythonOptionName = "--python";
12
14
  const pythonEnvironmentName = "CDE_PYTHON";
13
15
 
14
16
 
15
17
  export function createHelpText() {
16
18
  return [
17
- "Usage: cde lint [options]",
19
+ "Usage: cde <lint|verify> [options]",
18
20
  "",
19
- "Run the policy linter. Source modes are mutually exclusive:",
21
+ "Run the policy linter with cde lint. Source modes are mutually exclusive:",
20
22
  " --files PATH [PATH ...] Current worktree files",
21
23
  " --staged Staged index content",
22
24
  " --base REVISION Changes from a base revision",
@@ -29,6 +31,12 @@ export function createHelpText() {
29
31
  " --python <command> Python interpreter override",
30
32
  " Exit 0 clean, 1 diagnostics, 2 invalid input or start failure, 3 failed rule",
31
33
  "",
34
+ "Run the required-check manifest with cde verify:",
35
+ " --manifest PATH JSON required-check manifest",
36
+ " --repo PATH Candidate repository root",
37
+ " --base SHA Trusted base revision",
38
+ " --output PATH JSON verification report",
39
+ "",
32
40
  "Python may also be selected with CDE_PYTHON.",
33
41
  ].join("\n");
34
42
  }
@@ -59,6 +67,14 @@ export function buildLintCommand(interpreter, forwardedArguments) {
59
67
  }
60
68
 
61
69
 
70
+ export function buildVerifyCommand(interpreter, forwardedArguments) {
71
+ return {
72
+ executable: interpreter,
73
+ arguments: [verificationScriptPath, ...forwardedArguments],
74
+ };
75
+ }
76
+
77
+
62
78
  function takePythonOverride(allArguments) {
63
79
  const remainingArguments = [];
64
80
  let interpreterOverride;
@@ -110,7 +126,7 @@ function statusCodeForSignal(signalName) {
110
126
  }
111
127
 
112
128
 
113
- export function runLintCommand(command, dependencies = {}) {
129
+ function runChildCommand(command, failureMessage, dependencies = {}) {
114
130
  const runChild = dependencies.runChild ?? spawn;
115
131
  const processEmitter = dependencies.processEmitter ?? process;
116
132
  return new Promise((resolve) => {
@@ -122,14 +138,14 @@ export function runLintCommand(command, dependencies = {}) {
122
138
  windowsHide: true,
123
139
  });
124
140
  } catch {
125
- processEmitter.stderr.write("Unable to start the policy linter.\n");
141
+ processEmitter.stderr.write(`${failureMessage}\n`);
126
142
  resolve(2);
127
143
  return;
128
144
  }
129
145
  const detachSignals = attachSignalForwarding(childProcess, processEmitter);
130
146
  childProcess.on("error", () => {
131
147
  detachSignals();
132
- processEmitter.stderr.write("Unable to start the policy linter.\n");
148
+ processEmitter.stderr.write(`${failureMessage}\n`);
133
149
  resolve(2);
134
150
  });
135
151
  childProcess.on("close", (exitCode, signalName) => {
@@ -144,12 +160,22 @@ export function runLintCommand(command, dependencies = {}) {
144
160
  }
145
161
 
146
162
 
163
+ export function runLintCommand(command, dependencies = {}) {
164
+ return runChildCommand(command, "Unable to start the policy linter.", dependencies);
165
+ }
166
+
167
+
168
+ export function runVerifyCommand(command, dependencies = {}) {
169
+ return runChildCommand(command, "Unable to start verification.", dependencies);
170
+ }
171
+
172
+
147
173
  export async function main(argumentsList = process.argv.slice(2), dependencies = {}) {
148
174
  if (argumentsList.length === 0 || argumentsList.includes("--help") || argumentsList.includes("-h")) {
149
175
  process.stdout.write(`${createHelpText()}\n`);
150
176
  return 0;
151
177
  }
152
- if (argumentsList[0] !== lintCommandName) {
178
+ if (![lintCommandName, verifyCommandName].includes(argumentsList[0])) {
153
179
  process.stderr.write(`${createHelpText()}\n`);
154
180
  return 2;
155
181
  }
@@ -164,8 +190,10 @@ export async function main(argumentsList = process.argv.slice(2), dependencies =
164
190
  process.stderr.write("No usable Python interpreter found. Use --python or CDE_PYTHON.\n");
165
191
  return 2;
166
192
  }
167
- const command = buildLintCommand(interpreter, remainingArguments);
168
- const runCommand = dependencies.runCommand ?? runLintCommand;
193
+ const buildCommand = argumentsList[0] === lintCommandName ? buildLintCommand : buildVerifyCommand;
194
+ const command = buildCommand(interpreter, remainingArguments);
195
+ const runCommand = dependencies.runCommand
196
+ ?? (argumentsList[0] === lintCommandName ? runLintCommand : runVerifyCommand);
169
197
  return await runCommand(command, dependencies);
170
198
  }
171
199
 
package/bin/cde.test.mjs CHANGED
@@ -7,6 +7,7 @@ import test from "node:test";
7
7
 
8
8
  import {
9
9
  buildLintCommand,
10
+ buildVerifyCommand,
10
11
  createHelpText,
11
12
  findPython,
12
13
  main,
@@ -43,6 +44,8 @@ test("help describes lint source modes", () => {
43
44
  assert.match(helpText, /--base/);
44
45
  assert.match(helpText, /--repository/);
45
46
  assert.match(helpText, /--text-as/);
47
+ assert.match(helpText, /cde verify/);
48
+ assert.match(helpText, /--manifest/);
46
49
  });
47
50
 
48
51
 
@@ -67,6 +70,51 @@ test("forwards lint arguments to the python command without a shell", () => {
67
70
  });
68
71
 
69
72
 
73
+ test("forwards verification arguments to the authoritative python command", () => {
74
+ const command = buildVerifyCommand("python-test", [
75
+ "--manifest",
76
+ "manifest with spaces.json",
77
+ "--repo",
78
+ "repo with spaces",
79
+ "--base",
80
+ "base-sha",
81
+ "--output",
82
+ "report.json",
83
+ ]);
84
+ assert.equal(command.executable, "python-test");
85
+ assert.match(command.arguments[0], /scripts[\\/]local_verification[\\/]cli\.py$/);
86
+ assert.deepEqual(command.arguments.slice(1), [
87
+ "--manifest",
88
+ "manifest with spaces.json",
89
+ "--repo",
90
+ "repo with spaces",
91
+ "--base",
92
+ "base-sha",
93
+ "--output",
94
+ "report.json",
95
+ ]);
96
+ });
97
+
98
+
99
+ test("dispatches verify without changing forwarded arguments", async () => {
100
+ let receivedCommand;
101
+ const exitCode = await main(
102
+ ["verify", "--python", "python-test", "--manifest", "manifest.json"],
103
+ {
104
+ findPython: async () => "unused-python",
105
+ runCommand: async (command) => {
106
+ receivedCommand = command;
107
+ return 0;
108
+ },
109
+ },
110
+ );
111
+ assert.equal(exitCode, 0);
112
+ assert.equal(receivedCommand.executable, "python-test");
113
+ assert.match(receivedCommand.arguments[0], /local_verification[\\/]cli\.py$/);
114
+ assert.deepEqual(receivedCommand.arguments.slice(1), ["--manifest", "manifest.json"]);
115
+ });
116
+
117
+
70
118
  test("strips the launcher python override from forwarded arguments", async () => {
71
119
  let receivedCommand;
72
120
  const exitCode = await main(["lint", "--python", "python-test", "--staged"], {
@@ -1,23 +1,3 @@
1
- /**
2
- * The top-level skill directory names this package has ever shipped.
3
- *
4
- * The installer subtracts the skills the current package installs from this set
5
- * to learn which shipped skills have retired, so a full reinstall can remove a
6
- * retired skill left behind under ~/.agents/skills. Because the current set is
7
- * subtracted at runtime, restoring a retired skill to the package protects it
8
- * automatically — it re-enters the installed set and drops out of the retired
9
- * set on the next install.
10
- *
11
- * The list is a committed literal rather than a git query, because a user
12
- * installs from the npm tarball, which carries no source-repo history. Refresh
13
- * it by running, from the repository root:
14
- *
15
- * git log --all --pretty=format: --name-only -- \
16
- * 'packages/claude-dev-env/.agents/skills/*\/SKILL.md' \
17
- * 'packages/claude-dev-env/skills/*\/SKILL.md' | sort -u
18
- *
19
- * and pasting each distinct top-level skill directory name below.
20
- */
21
1
  export const EVER_SHIPPED_SKILL_NAMES = new Set([
22
2
  'agent-prompt',
23
3
  'anthropic-plan',
@@ -109,6 +89,7 @@ export const EVER_SHIPPED_SKILL_NAMES = new Set([
109
89
  'reviewer-gates',
110
90
  'reviews',
111
91
  'run-claude-dev-env',
92
+ 'session-continuity',
112
93
  'session-log',
113
94
  'session-tidy',
114
95
  'pr-shared-extraction',
@@ -127,4 +108,5 @@ export const EVER_SHIPPED_SKILL_NAMES = new Set([
127
108
  'update',
128
109
  'usage-pause',
129
110
  'verified-build',
111
+ 'windows-scheduled-task',
130
112
  ]);
@@ -36,3 +36,11 @@ test('EVER_SHIPPED_SKILL_NAMES retains the explicit test runner', () => {
36
36
  test('EVER_SHIPPED_SKILL_NAMES includes the pull request skill', () => {
37
37
  assert.equal(EVER_SHIPPED_SKILL_NAMES.has('pull-request'), true);
38
38
  });
39
+
40
+ test('EVER_SHIPPED_SKILL_NAMES includes the windows scheduled task skill', () => {
41
+ assert.equal(EVER_SHIPPED_SKILL_NAMES.has('windows-scheduled-task'), true);
42
+ });
43
+
44
+ test('EVER_SHIPPED_SKILL_NAMES includes the session continuity companion', () => {
45
+ assert.equal(EVER_SHIPPED_SKILL_NAMES.has('session-continuity'), true);
46
+ });
@@ -1,9 +1,8 @@
1
1
  /**
2
- * Install-time expansion of $HOME / ${HOME} / ~/ in settings.json commands.
2
+ * Expand $HOME, ${HOME}, and ~/ in settings.json commands at install time.
3
3
  *
4
- * Hosts that require referenced env vars at hook load time (for example a third-party host)
5
- * skip the hook when HOME is unset — common on Windows — so the installer
6
- * rewrites residual tokens to absolute home paths.
4
+ * Some hosts skip a hook when HOME is unset, which is common on Windows.
5
+ * The installer rewrites leftover tokens to absolute home paths.
7
6
  */
8
7
 
9
8
  /**
@@ -34,7 +33,7 @@ export function expandHomeDirectoryTokens(commandString, homeDirectory) {
34
33
  () => normalizedHome,
35
34
  );
36
35
  expandedCommand = expandedCommand.replace(
37
- /(^|[\s"'=])~\//g,
36
+ /(^|[\s"'=;(])~\//g,
38
37
  (_fullMatch, boundary) => `${boundary}${normalizedHome}/`,
39
38
  );
40
39
  return expandedCommand;