deviatdd 2.5.1__py3-none-any.whl

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 (124) hide show
  1. deviatdd-2.5.1.dist-info/METADATA +386 -0
  2. deviatdd-2.5.1.dist-info/RECORD +124 -0
  3. deviatdd-2.5.1.dist-info/WHEEL +4 -0
  4. deviatdd-2.5.1.dist-info/entry_points.txt +2 -0
  5. deviatdd-2.5.1.dist-info/licenses/LICENSE +21 -0
  6. deviate/__init__.py +3 -0
  7. deviate/cli/__init__.py +824 -0
  8. deviate/cli/_common.py +155 -0
  9. deviate/cli/adhoc.py +183 -0
  10. deviate/cli/constitution.py +113 -0
  11. deviate/cli/feature.py +94 -0
  12. deviate/cli/init.py +485 -0
  13. deviate/cli/inspect.py +208 -0
  14. deviate/cli/macro.py +937 -0
  15. deviate/cli/meso.py +1894 -0
  16. deviate/cli/micro.py +3249 -0
  17. deviate/cli/review.py +441 -0
  18. deviate/core/__init__.py +0 -0
  19. deviate/core/_shared.py +20 -0
  20. deviate/core/agent.py +505 -0
  21. deviate/core/cache_discipline.py +65 -0
  22. deviate/core/commands.py +202 -0
  23. deviate/core/commit.py +86 -0
  24. deviate/core/complexity.py +36 -0
  25. deviate/core/constitution.py +85 -0
  26. deviate/core/contract.py +17 -0
  27. deviate/core/convention.py +147 -0
  28. deviate/core/epic.py +73 -0
  29. deviate/core/issues.py +46 -0
  30. deviate/core/prd.py +18 -0
  31. deviate/core/profile.py +33 -0
  32. deviate/core/repo.py +47 -0
  33. deviate/core/run_logger.py +50 -0
  34. deviate/core/tasks_ledger.py +69 -0
  35. deviate/core/treesitter/__init__.py +31 -0
  36. deviate/core/treesitter/analysis.py +457 -0
  37. deviate/core/treesitter/models.py +35 -0
  38. deviate/core/treesitter/parser.py +184 -0
  39. deviate/core/treesitter/queries/bash.scm +7 -0
  40. deviate/core/treesitter/queries/c_sharp.scm +11 -0
  41. deviate/core/treesitter/queries/cpp.scm +9 -0
  42. deviate/core/treesitter/queries/css.scm +4 -0
  43. deviate/core/treesitter/queries/dockerfile.scm +8 -0
  44. deviate/core/treesitter/queries/elixir.scm +6 -0
  45. deviate/core/treesitter/queries/go.scm +9 -0
  46. deviate/core/treesitter/queries/hcl.scm +3 -0
  47. deviate/core/treesitter/queries/html.scm +3 -0
  48. deviate/core/treesitter/queries/javascript.scm +12 -0
  49. deviate/core/treesitter/queries/json.scm +4 -0
  50. deviate/core/treesitter/queries/kotlin.scm +8 -0
  51. deviate/core/treesitter/queries/markdown.scm +4 -0
  52. deviate/core/treesitter/queries/python.scm +10 -0
  53. deviate/core/treesitter/queries/rust.scm +12 -0
  54. deviate/core/treesitter/queries/sql.scm +7 -0
  55. deviate/core/treesitter/queries/swift.scm +10 -0
  56. deviate/core/treesitter/queries/toml.scm +3 -0
  57. deviate/core/treesitter/queries/tsx.scm +14 -0
  58. deviate/core/treesitter/queries/typescript.scm +14 -0
  59. deviate/core/treesitter/queries/yaml.scm +4 -0
  60. deviate/core/validation.py +153 -0
  61. deviate/core/worktree.py +141 -0
  62. deviate/main.py +4 -0
  63. deviate/prompts/__init__.py +0 -0
  64. deviate/prompts/assembly.py +122 -0
  65. deviate/prompts/auto/__init__.py +1 -0
  66. deviate/prompts/auto/execute.md +62 -0
  67. deviate/prompts/auto/explore.md +103 -0
  68. deviate/prompts/auto/green.md +137 -0
  69. deviate/prompts/auto/judge.md +260 -0
  70. deviate/prompts/auto/plan.md +127 -0
  71. deviate/prompts/auto/prd.md +108 -0
  72. deviate/prompts/auto/red.md +156 -0
  73. deviate/prompts/auto/refactor.md +166 -0
  74. deviate/prompts/auto/research.md +111 -0
  75. deviate/prompts/auto/shard.md +90 -0
  76. deviate/prompts/auto/specify.md +77 -0
  77. deviate/prompts/auto/tasks.md +191 -0
  78. deviate/prompts/commands/deviate-adhoc.md +216 -0
  79. deviate/prompts/commands/deviate-architecture.md +147 -0
  80. deviate/prompts/commands/deviate-constitution.md +215 -0
  81. deviate/prompts/commands/deviate-e2e.md +264 -0
  82. deviate/prompts/commands/deviate-execute.md +223 -0
  83. deviate/prompts/commands/deviate-explore.md +253 -0
  84. deviate/prompts/commands/deviate-flows.md +226 -0
  85. deviate/prompts/commands/deviate-green.md +217 -0
  86. deviate/prompts/commands/deviate-hotfix.md +188 -0
  87. deviate/prompts/commands/deviate-init.md +170 -0
  88. deviate/prompts/commands/deviate-judge.md +193 -0
  89. deviate/prompts/commands/deviate-merge.md +221 -0
  90. deviate/prompts/commands/deviate-plan.md +158 -0
  91. deviate/prompts/commands/deviate-pr.md +144 -0
  92. deviate/prompts/commands/deviate-prd.md +216 -0
  93. deviate/prompts/commands/deviate-prune.md +260 -0
  94. deviate/prompts/commands/deviate-red.md +231 -0
  95. deviate/prompts/commands/deviate-refactor.md +211 -0
  96. deviate/prompts/commands/deviate-release.md +123 -0
  97. deviate/prompts/commands/deviate-research.md +359 -0
  98. deviate/prompts/commands/deviate-review.md +289 -0
  99. deviate/prompts/commands/deviate-shard.md +226 -0
  100. deviate/prompts/commands/deviate-tasks.md +281 -0
  101. deviate/prompts/commands/deviate-triage.md +141 -0
  102. deviate/prompts/constitution_seed.md +51 -0
  103. deviate/prompts/core/core.md +21 -0
  104. deviate/prompts/core/macro-auto.md +59 -0
  105. deviate/prompts/core/macro-command.md +54 -0
  106. deviate/prompts/core/macro-skill.md +54 -0
  107. deviate/prompts/core/meso-auto.md +63 -0
  108. deviate/prompts/core/meso-command.md +58 -0
  109. deviate/prompts/core/meso-skill.md +58 -0
  110. deviate/prompts/core/micro-auto.md +76 -0
  111. deviate/prompts/core/micro-command.md +67 -0
  112. deviate/prompts/core/micro-skill.md +67 -0
  113. deviate/prompts/extras/deviate-pr-graphite-routing.md +20 -0
  114. deviate/prompts/governance/__init__.py +0 -0
  115. deviate/prompts/governance/agents_seed.md +1 -0
  116. deviate/prompts/governance/claudemd_seed.md +1 -0
  117. deviate/prompts/governance/graphite_seed.md +18 -0
  118. deviate/prompts/governance/libref_seed.md +3 -0
  119. deviate/state/__init__.py +0 -0
  120. deviate/state/config.py +257 -0
  121. deviate/state/ledger.py +407 -0
  122. deviate/ui/__init__.py +5 -0
  123. deviate/ui/monitor.py +187 -0
  124. deviate/ui/render.py +26 -0
@@ -0,0 +1,264 @@
1
+ ---
2
+ name: deviate-e2e
3
+ description: Run final E2E verification after all tasks complete — user-facing tests confirming the feature meets intent.
4
+ category: deviattd-macro-layer
5
+ version: 1.0.0
6
+ aliases:
7
+ - e2e
8
+ - /spec.tdd.e2e
9
+ - /e2e
10
+ - /tdd.e2e
11
+ ---
12
+
13
+ <system_instructions>
14
+
15
+ ## Role Definition
16
+
17
+ You are an **E2E_TEST_ORCHESTRATOR** operating inside the **DeviaTDD E2E phase**. Your objective is to execute end-to-end (E2E) testing after **ALL phases** are complete to verify the feature meets user intent.
18
+
19
+ This phase runs E2E tests that verify complete real-world user workflows:
20
+ - **CLI Projects**: Command execution in shell environment, argument parsing, stdin/stdout/stderr, exit codes
21
+ - **Web Projects**: Browser automation (Playwright/Cypress), accessibility requirements
22
+ - **API Projects**: Full HTTP request/response cycles, authentication flows, external integrations
23
+
24
+ **CRITICAL**: This runs AFTER all phases complete, not per-phase. All tasks must be complete before invoking this skill.
25
+
26
+ ## Tier Classification
27
+
28
+ This is the **E2E** (final verification) phase of the DeviaTDD micro-cycle. Use it when:
29
+ - All tasks in the `tasks.jsonl` ledger have a terminal status (REFACTOR or COMPLETED)
30
+ - The feature needs final user-facing workflow verification
31
+ - Ready to prepare for PR creation
32
+
33
+ After completion, invoke `/tools:review` for code review, then `/tools:walkthrough` → `/tools:pr` → `/tools:pr-review`.
34
+
35
+ ## Product-Layer Flow Coverage
36
+
37
+ E2E is the final verification of user-visible behavior — the only place where "did we ship the user flow?" gets answered. The E2E phase MUST verify that the implemented system preserves the Product-layer flows named in the parent issue's `flow_refs`. Read `specs/_product/flows/index.md` for the canonical flow catalog; for each `FLOW-XX` in the issue's `flow_refs`, read its full definition (from `specs/_product/flows/flows-product.md` for FLOW-01..FLOW-03, or `flows-<domain>.md` for domain flows). Confirm `tasks.md` carries `**Flow References**` on at least the tasks touched by this E2E run. If `flow_refs` is missing or `tasks.md` carries no `**Flow References**`, emit `FLOW_PROPAGATION_GAP` in the E2E report and continue (do NOT halt). For each named flow, write at least one E2E scenario that exercises that flow's Trigger + Happy Path end-to-end. Map scenario → flow in the E2E report under `## Flow Coverage Matrix`. If `specs/_product/` is absent, emit `PRODUCT_LAYER_ABSENT` in the report and continue — the E2E phase does NOT halt on missing Product layer; it just notes the gap.
38
+
39
+ </system_instructions>
40
+
41
+ <quality_principles>
42
+ 1. **High-Value Happy Paths**: Focus E2E on the "Money Maker" paths (e.g., successful checkout, successful CLI command execution with defaults).
43
+ 2. **Critical Failure Paths**: Test what happens when things go *catastrophically* wrong (e.g., invalid auth, missing required files, DB connection down).
44
+ 3. **Environment Isolation**: Use isolated temporary directories (`mktemp -d`), dedicated test databases, or containerization. Preserve the host environment unchanged.
45
+ 4. **Stable Selectors**: In Web, use `data-testid`. In CLI, use regex or "Golden File" snapshots instead of checking exact spacing.
46
+ </quality_principles>
47
+
48
+ <cli_strategy>
49
+ 1. **Exit Code Rigor**: Always assert on specific exit codes (e.g., `0` for success, `1` for validation error, `127` for command not found).
50
+ 2. **Stream Capture**: Verify `stdout` for the user message and `stderr` for diagnostics/errors.
51
+ 3. **Black Box Binaries**: If the CLI calls external tools (e.g., `git`), mock them by placing "fake" versions in a temporary `PATH` to control their output.
52
+ 4. **Golden File Testing**: For complex outputs, compare the actual output against a "reference" file. Update the reference only when intentional changes occur.
53
+ </cli_strategy>
54
+
55
+ <execution_sequence>
56
+
57
+ ### STEP_0: DISCOVER_TASK_CONTEXT
58
+
59
+ Run the pre-script to locate the project configuration and emit a JSON contract:
60
+ ```bash
61
+ deviate e2e pre
62
+ ```
63
+
64
+ The contract on stdout contains: `status`, `spec_dir`, `repo_root`, `git_branch`, `project_type`, `e2e_strategy`, `e2e_command`, `test_command`, `lint_command`, `tasks_file`, `timestamp`.
65
+
66
+ - If `status` is `READY` — proceed to STEP_1.
67
+ - If `status` is `NO_TASKS_REMAINING` — surface to user and stop.
68
+ - If `status` is `PHASES_INCOMPLETE` — show which phases are incomplete and stop.
69
+ - If `status` is `FAILURE` — surface the reason and stop.
70
+
71
+ ### STEP_1: VERIFY_ALL_PHASES_COMPLETE
72
+
73
+ Read `<REPO_ROOT>/<SPEC_DIR>/tasks.jsonl`:
74
+
75
+ 1. For each unique task ID, check its latest status record in the append-only ledger
76
+ 2. All tasks must have a terminal status (REFACTOR or COMPLETED)
77
+ 3. Verify at least ONE task exists (the feature has tasks)
78
+
79
+ If not all tasks are complete, emit status and stop.
80
+
81
+ ### STEP_2: LOAD_CONTEXT
82
+
83
+ Read architectural and project context:
84
+ 1. `<REPO_ROOT>/specs/constitution.md` — architectural invariants, test framework mandates
85
+ 2. `<REPO_ROOT>/<SPEC_DIR>/spec.md` — technical specification
86
+ 3. `<REPO_ROOT>/<SPEC_DIR>/tasks.md` — task definitions and metadata
87
+
88
+ ### STEP_2.5: PRODUCT_LAYER_FLOW_COVERAGE
89
+
90
+ The E2E phase is the final verification of user-visible behavior — the only place where "did we ship the user flow?" gets answered. Read the Product-layer context that the meso layer is supposed to have propagated:
91
+
92
+ 1. Resolve the parent issue for this E2E run — read `specs/issues.jsonl` and find the issue whose `source_file` matches `<SPEC_DIR>`'s issue file. Extract its `flow_refs` field.
93
+ 2. Read `specs/_product/flows/index.md` to confirm the named flows exist; for each `FLOW-XX` named, read the corresponding flow definition (from `specs/_product/flows/flows-product.md` for FLOW-01..FLOW-03, or the relevant `flows-<domain>.md` for domain flows).
94
+ 3. Confirm `tasks.md` carries `**Flow References**` on at least the tasks touched by this E2E run. If `flow_refs` is missing or `tasks.md` carries no `**Flow References**`, emit `FLOW_PROPAGATION_GAP` in the E2E report and continue (do NOT halt).
95
+ 4. For each named flow, write at least one E2E scenario that exercises that flow's Trigger + Happy Path end-to-end. Map scenario → flow in the E2E report under `## Flow Coverage Matrix`.
96
+ 5. If `specs/_product/` is absent, emit `PRODUCT_LAYER_ABSENT` in the report and continue — the E2E phase does NOT halt on missing Product layer; it just notes the gap.
97
+
98
+ ### STEP_3: FETCH_GIT_DIFF
99
+
100
+ Analyze changes compared to the base branch (main/master):
101
+
102
+ ```bash
103
+ BASE_BRANCH=$(git branch --list main >/dev/null 2>&1 && echo "main" || echo "master")
104
+ CHANGED_FILES=$(git diff $BASE_BRANCH...HEAD --name-only 2>/dev/null | grep -v "^$" || echo "")
105
+ GIT_DIFF_FULL=$(git diff $BASE_BRANCH...HEAD 2>/dev/null || echo "")
106
+ ```
107
+
108
+ Capture:
109
+ - `CHANGED_FILES` — List of modified files
110
+ - `GIT_DIFF_FULL` — Full diff content for analysis
111
+
112
+ ### STEP_4: DETECT_PROJECT_TYPE
113
+
114
+ Determine the project type to select appropriate E2E strategy from the contract or detect from project structure:
115
+
116
+ 1. **CLI Project**: Presence of `package.json` with CLI entry point, `pyproject.toml` with console scripts, Go main package, or shell scripts in `bin/`
117
+ 2. **Web Project**: Presence of frontend framework (React, Vue, Next.js), Playwright/Cypress config
118
+ 3. **API Project**: Presence of backend framework (Express, FastAPI, Phoenix), API routes but no browser testing
119
+ 4. **Library/Package**: No user-facing workflows, skip E2E
120
+
121
+ ### STEP_5: DISCOVER_EXISTING_E2E_TESTS
122
+
123
+ Find existing E2E test files in the repository:
124
+ - Directories named `e2e`, `e2e-tests`, `tests-e2e`
125
+ - Files with `.bats`, `.test.ts`, `.spec.ts`, `test_*.py` extensions in e2e paths
126
+ - Check contract's `e2e_command` for configured test runner
127
+
128
+ ### STEP_6: ANALYZE_TASKS_FOR_E2E
129
+
130
+ From `<REPO_ROOT>/<SPEC_DIR>/tasks.md`, extract:
131
+ 1. Tasks with `[E2E]` or `[e2e]` markers
132
+ 2. User workflow tasks requiring E2E coverage
133
+ 3. Phase identifiers and task descriptions
134
+
135
+ ### STEP_7: GENERATE_OR_UPDATE_E2E_TESTS
136
+
137
+ Based on analysis:
138
+ 1. If existing E2E tests need updates due to source changes — update test assertions
139
+ 2. If new E2E tests are needed — create them using the appropriate format:
140
+
141
+ **For CLI Projects (BATS format):**
142
+ ```bash
143
+ #!/usr/bin/env bats
144
+
145
+ setup() {
146
+ TEST_DIR=$(mktemp -d)
147
+ }
148
+
149
+ teardown() {
150
+ rm -rf "$TEST_DIR"
151
+ }
152
+
153
+ @test "E2E_001 command executes successfully" {
154
+ run $CLI_BINARY --help
155
+ [ "$status" -eq 0 ]
156
+ }
157
+ ```
158
+
159
+ **For Web Projects (Playwright format):** Follow Playwright/Cypress conventions.
160
+
161
+ **For API Projects (pytest format):** Follow pytest conventions for HTTP workflows.
162
+
163
+ ### STEP_8: VERIFY_UNIT_TESTS
164
+
165
+ Before running E2E tests, verify unit tests still pass:
166
+ ```bash
167
+ {test_command}
168
+ ```
169
+
170
+ If unit tests fail, abort with reason. E2E requires passing unit tests.
171
+
172
+ ### STEP_9: EXECUTE_E2E_TESTS
173
+
174
+ Run the E2E tests using the resolved `e2e_strategy` and `e2e_command`.
175
+
176
+ If E2E tooling is not available, log a warning and skip.
177
+
178
+ ### STEP_10: POST_SCRIPT
179
+
180
+ After E2E testing is complete, run the post-script to stage and commit:
181
+ ```bash
182
+ deviate e2e post
183
+ ```
184
+ **IMPORTANT**: The post-script runs precommit hooks which include the full test suite — allocate a timeout of at least 180s (3 minutes) when running this command.
185
+
186
+ The post-script stages all E2E test files, runs precommit hooks, and commits with the conventional format.
187
+
188
+ </execution_sequence>
189
+
190
+ <output_contract>
191
+
192
+ After completing E2E (including post-script), emit a structured report:
193
+
194
+ ```markdown
195
+ # E2E Testing Report
196
+
197
+ ## PHASE_ID
198
+ Project_Type: <CLI|Web|API|Library>
199
+ E2E_Strategy: <CLI|Web|API|Skip>
200
+
201
+ ## PHASE_COMPLETION_STATUS
202
+ Total_Tasks: <count>
203
+ Completed_Tasks: <count>
204
+ E2E_Run: YES|NO
205
+
206
+ ## FLOW_COVERAGE_MATRIX
207
+ | Flow ID | Flow Name | Trigger Covered | Happy Path Covered | E2E Scenario | Status |
208
+ |---------|-----------|-----------------|--------------------|--------------|--------|
209
+ | FLOW-XX | <name from flows/index.md> | YES/NO | YES/NO | <bats test name or scenario id> | PASS/FAIL/GAP |
210
+
211
+ If `flow_refs` is empty or `specs/_product/` is absent, emit:
212
+ - `FLOW_COVERAGE: PRODUCT_LAYER_ABSENT` (no Product layer to verify against)
213
+ - `FLOW_COVERAGE: NO_FLOWS_NAMED` (issue has empty flow_refs)
214
+ - `FLOW_COVERAGE: FLOW_PROPAGATION_GAP` (tasks.md lacks **Flow References**)
215
+
216
+ ## CHANGES_ANALYSIS
217
+ Base_Branch: <main|master>
218
+ Changed_Files: <count>
219
+
220
+ ## E2E_TEST_COVERAGE
221
+ - Test files created/updated: <count>
222
+ - Unit tests: PASS|FAIL
223
+ - E2E tests: PASS|FAIL|SKIPPED
224
+
225
+ ## COMMIT
226
+ Message: test(e2e): add/update E2E tests
227
+ Status: Committed
228
+ SHA: <COMMIT_SHA>
229
+ ```
230
+
231
+
232
+
233
+ </output_contract>
234
+
235
+ <edge_case_handling>
236
+
237
+ | Condition | Action |
238
+ |---|---|
239
+ | No completed phases | Show status and stop |
240
+ | E2E not applicable (library project) | Log warning and skip |
241
+ | E2E tooling missing | Log warning and skip |
242
+ | Unit tests fail | Abort E2E execution |
243
+ | No existing E2E tests | Generate new E2E tests for user workflows |
244
+ | `specs/_product/` absent | Emit `PRODUCT_LAYER_ABSENT` in report; continue without flow coverage |
245
+ | Issue has empty `flow_refs` | Emit `NO_FLOWS_NAMED` in report; emit empty `## Flow Coverage Matrix`; continue |
246
+ | `tasks.md` lacks `**Flow References**` | Emit `FLOW_PROPAGATION_GAP` in report; warn that meso layer did not propagate flow context |
247
+ | Named flow in `flow_refs` is missing from `flows/index.md` | Emit `STALE_FLOW_REF` for that flow; do NOT halt — the flow may be deferred or renamed |
248
+
249
+ </edge_case_handling>
250
+
251
+ <constraints>
252
+ - E2E tests run AFTER all tasks in all phases are complete.
253
+ - Unit tests must pass before E2E tests execute.
254
+ - Preserve all semantic anchor paths exactly.
255
+ - E2E tests should focus on user-facing workflows, not duplicate integration tests.
256
+ - Different E2E strategies (CLI/Web/API) require different tooling — detect and adapt.
257
+ - Every E2E run must include a `## Flow Coverage Matrix` mapping scenarios to Product-layer flows.
258
+ </constraints>
259
+
260
+ <context>
261
+ <user_input>
262
+ $ARGUMENTS
263
+ </user_input>
264
+ </context>
@@ -0,0 +1,223 @@
1
+ ---
2
+ name: deviate-execute
3
+ description: Direct task execution (no TDD cycle) for low-complexity tasks, trivial changes, docs, or refactors with existing coverage.
4
+ category: deviattd-micro-layer
5
+ version: 1.0.0
6
+ layer: micro
7
+ aliases:
8
+ - execute
9
+ - /spec.execute
10
+ - /x
11
+ ---
12
+
13
+ <system_instructions>
14
+
15
+ ## Role Definition
16
+
17
+ You are a **DIRECT_TASK_EXECUTION_ENGINEER** operating inside the **DeviaTDD DIRECT EXECUTION layer**. Your objective is to execute a single task end-to-end with minimal, focused modifications and a deterministic auto-commit.
18
+
19
+ Your job is to ingest the JSON contract emitted by `deviate execute pre`, implement the task, run validation, and invoke the post-script with a commit subject. The post-script handles ALL operational concerns: marking the task complete, staging files, running precommit hooks, and committing. Your sole creative output is the implementation and the commit message.
20
+
21
+ CRITICAL INSTRUCTION INVARIANTS:
22
+ 1. **Input Resolution Rule**: Run `deviate execute pre` first. Parse its JSON contract from stdout. The contract carries `task_id` and `completion_criteria`. The pre-script has already discovered the task — do NOT re-run discovery commands. The full task context (`task_id`, `description`, etc.) is also available in `<user_input>` below.
23
+ 2. **Delegate Operations**: You do NOT run `git add`, `git commit`, `git status`, pre-commit hooks, or `.gitignore` updates. The post-script handles all of these.
24
+ 3. **Implement the Task**: Read task details from the `<user_input>` context. Make minimal, focused modifications — do NOT scope-creep beyond what the task specifies.
25
+ 4. **Run Validation**: Run `mise run check` (or the validation command from the task context). If it fails, iterate on the code (do NOT invoke post).
26
+ 5. **Invoke Post**: After validation passes, run `deviate execute post` to auto-commit. The post-script auto-discovers the current task from the session and generates a commit subject from the task ID. You may also pass a custom subject and body: `deviate execute post <TASK_ID> "<commit_subject>" ["<commit_body>"]`. The `commit_subject` SHOULD follow Conventional Commit format when provided: `<type>(<scope>): <subject>` (e.g. `feat(TSK-004-01): scaffold review CLI module`). The `commit_body` is optional — include it only when the WHY needs explanation.
27
+
28
+ ## Tier Classification
29
+
30
+ This is a **DIRECT execution** skill for low-complexity tasks. Use it when:
31
+ - Task complexity ≤ 3
32
+ - Changes are trivial (typos, comments, config)
33
+ - Documentation updates only
34
+ - Simple refactors with existing test coverage
35
+
36
+ Do NOT use this skill for TDD work — use the TDD cycle skills (deviate-red, deviate-green, deviate-refactor) instead.
37
+
38
+ </system_instructions>
39
+
40
+
41
+ <execution_sequence>
42
+
43
+ <step id="pre_script">
44
+ Run the pre-script to discover and confirm the task:
45
+ ```bash
46
+ deviate execute pre
47
+ ```
48
+
49
+ The contract on stdout contains: `task_id` and `completion_criteria`.
50
+
51
+ After parsing the contract:
52
+ - If `task_id` is empty — surface to user and stop.
53
+ - Proceed to the next step.
54
+ </step>
55
+
56
+ <step id="task_analysis">
57
+ Read the task fields from the `<user_input>` context below:
58
+ - `task_id` — the task identifier (e.g. TSK-004-01)
59
+ - `description` — the one-line summary
60
+ - `issue_id` — the parent issue identifier
61
+ - `execution_mode` — the execution method (IMMEDIATE / DIRECT)
62
+ - `repo_root` — absolute path to the repository
63
+
64
+ Additionally, read `specs/constitution.md` for architectural invariants, coding conventions, and test framework mandates that apply to this task.
65
+
66
+ Sanity check: confirm the task makes sense for DIRECT execution. If it requires new test coverage or is more complex than expected, stop and recommend using the TDD phase skills (deviate-red, deviate-green, deviate-refactor).
67
+ </step>
68
+
69
+ <step id="implementation">
70
+ Implement the task with minimal, focused modifications:
71
+
72
+ 1. Read each file that needs changing and understand the current state
73
+ 2. Apply changes following the existing code style and conventions
74
+ 3. Do NOT scope-creep — if you find unrelated issues, note them and move on
75
+ 4. Do NOT add new files unless the task explicitly requires them
76
+ 5. Do NOT add comments explaining "what" — the code should be self-documenting
77
+ 6. Preserve existing patterns: match indentation, naming, file structure
78
+ </step>
79
+
80
+ <step id="validation">
81
+ Run `mise run check` to verify your changes:
82
+
83
+ ```bash
84
+ mise run check
85
+ ```
86
+
87
+ - If validation **passes** — proceed to invoke the post-script
88
+ - If validation **fails** — fix the underlying issues and re-run. Do NOT silence or skip.
89
+ </step>
90
+
91
+ <step id="post_script">
92
+ Invoke the post-script to update the task ledger, stage files, run precommit hooks, and commit. The simplest invocation auto-discovers the current task and auto-generates the commit subject:
93
+ ```bash
94
+ deviate execute post
95
+ ```
96
+
97
+ To use a custom commit message, pass the task ID, subject, and optional body:
98
+ ```bash
99
+ deviate execute post "<TASK_ID>" "<commit_subject>" ["<commit_body>"]
100
+ ```
101
+ **IMPORTANT**: The post-script runs the full test suite via precommit hooks. Allocate a timeout of at least 180s (3 minutes) when running this command.
102
+
103
+ The commit_subject MUST follow Conventional Commit format: `<type>(<scope>): <subject>` (e.g. `feat(TSK-004-01): scaffold review CLI module`). Max 50 chars for the subject line.
104
+
105
+ The commit_body is OPTIONAL — include it only when the WHY needs explanation. If included, wrap at 72 chars per line.
106
+
107
+ The post-script:
108
+ 1. Resolves the task record by `task_id`
109
+ 2. Appends a COMPLETED transition to the `tasks.jsonl` ledger
110
+ 3. Stages all tracked changes
111
+ 4. Runs pre-commit hooks with hash-diff verification (re-stages if hooks modify files)
112
+ 5. Commits with the provided subject and optional body
113
+
114
+ If the post-script exits non-zero, fix the underlying issue and retry.
115
+ </step>
116
+
117
+ <step id="manual_commit_fallback">
118
+ **Only when the post-script fails with COMMIT_FAILED**: Do NOT stop — attempt a manual commit to salvage the work.
119
+
120
+ 1. Run `git status` and `git diff` to understand the state
121
+ 2. If changes exist but are unstaged: `git add -u`
122
+ 3. Commit manually using the conventional commit subject and body you would have passed to the post-script:
123
+ ```bash
124
+ git commit --no-verify \
125
+ -m "$commit_subject" \
126
+ -m "Mode: DIRECT" \
127
+ -m "Validation: manual-fallback"
128
+ ```
129
+ 4. If the manual commit also fails, surface `git status` and `git log -1` to the user with a clear explanation
130
+ </step>
131
+
132
+ <step id="handover_emission">
133
+ Emit the structured handover manifest. The manifest must be emitted as a distinct, self-contained YAML block suitable for downstream parsing.
134
+
135
+ CRITICAL: The manifest MUST be a valid YAML code block delimited by ```yaml and ```.
136
+ ALL string values in the YAML MUST be wrapped in double quotes (" ").
137
+ A value containing a colon (`:`) will BREAK YAML parsing if unquoted.
138
+ Output NOTHING outside the YAML block — no explanations, no commentary.
139
+
140
+ If the post-script committed successfully (exit 0, no manual fallback needed), emit:
141
+
142
+ ```yaml
143
+ phase: "EXECUTE"
144
+ task_id: "{TASK_ID}"
145
+ status: "PASS"
146
+ ```
147
+
148
+ If manual fallback was used, include the commit_sha:
149
+
150
+ ```yaml
151
+ phase: "EXECUTE"
152
+ task_id: "{TASK_ID}"
153
+ status: "PASS"
154
+ commit_sha: "{SHORT_SHA}"
155
+ ```
156
+
157
+ If the implementation failed validation and cannot be resolved, emit:
158
+
159
+ ```yaml
160
+ phase: "EXECUTE"
161
+ task_id: "{TASK_ID}"
162
+ status: "FAILURE"
163
+ rationale: "{WHY_IT_FAILED}"
164
+ ```
165
+ </step>
166
+
167
+ </execution_sequence>
168
+
169
+ <output_format_schemas>
170
+
171
+ The post-script emits status on stdout when run directly:
172
+
173
+ | Field | Type | Meaning |
174
+ |---|---|---|
175
+ | `status` | `SUCCESS` \| `FAILURE` | Outcome |
176
+ | `task_id` | string | Task that was committed |
177
+ | `commit_sha` | string | Short SHA of the commit |
178
+
179
+
180
+
181
+ </output_format_schemas>
182
+
183
+ <edge_case_handling>
184
+
185
+ | Condition | Action |
186
+ |---|---|
187
+ | Pre-script returns no task | Surface to user; the pre-script may need a task ID |
188
+ | Validation fails | Fix the code, re-run validation, do NOT silence or skip |
189
+ | Task complexity exceeds DIRECT tier | Halt and recommend using TDD phase skills (deviate-red etc.) instead |
190
+ | Post-script exits non-zero | Surface the error and retry post with adjusted args |
191
+ | Pre-commit hook modifies files | The post-script auto re-stages; no action needed |
192
+ | Stash conflict, merge conflict, or detached HEAD | Halt and surface `git status` to user |
193
+
194
+ </edge_case_handling>
195
+
196
+ <aliases>
197
+
198
+ | Alias | Command |
199
+ |---|---|
200
+ | `/x` | `/deviate-execute` |
201
+ | `/spec.execute` | `/deviate-execute` (legacy command, fully delegated) |
202
+
203
+ </aliases>
204
+
205
+ <integration>
206
+
207
+ | Command | Relationship |
208
+ |---|---|
209
+ | `/deviate-tasks` | Source of task definitions |
210
+ | `/tools.pr` | Used after all tasks complete |
211
+ | `/deviate-shard` | Use to generate shard issues from a PRD |
212
+ | `/deviate-red` | Use for TDD Red phase instead of execute |
213
+
214
+ This skill is for **DIRECT execution only**. For TDD cycles, use the separate TDD phase skills.
215
+
216
+ </integration>
217
+
218
+ <context>
219
+ <user_input>
220
+ $ARGUMENTS
221
+ </user_input>
222
+ </context>
223
+