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
|
@@ -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,
|
|
626
|
+
repository_root: Path,
|
|
627
|
+
all_names: frozenset[str],
|
|
628
|
+
tree_revision: str,
|
|
626
629
|
) -> frozenset[str]:
|
|
627
|
-
"""Return the names the
|
|
630
|
+
"""Return the names the comparison tree already contains.
|
|
628
631
|
|
|
629
|
-
Each name is looked up as a whole word in
|
|
630
|
-
|
|
631
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
732
|
-
repository_root,
|
|
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(
|
|
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
|
|
747
|
-
|
|
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
|
|
755
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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]
|
|
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
|
|
168
|
-
const
|
|
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
|
-
*
|
|
2
|
+
* Expand $HOME, ${HOME}, and ~/ in settings.json commands at install time.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
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"'
|
|
36
|
+
/(^|[\s"'=;(])~\//g,
|
|
38
37
|
(_fullMatch, boundary) => `${boundary}${normalizedHome}/`,
|
|
39
38
|
);
|
|
40
39
|
return expandedCommand;
|