@winton979/task-cli 1.2.1 → 1.3.1

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 (3) hide show
  1. package/README.md +20 -1
  2. package/package.json +1 -1
  3. package/src/init.js +110 -12
package/README.md CHANGED
@@ -46,6 +46,8 @@ Compatible Grill Me implementations may also work.
46
46
 
47
47
  If no Grill Me compatible skill is installed, `task-fast`, `task-explore`, and `bug-explore` fall back to built-in clarification prompts.
48
48
 
49
+ When `.ai/decisions/decisions.md` contains real entries, those skills should inspect it before finalizing a brief and pull in only the decisions that materially constrain the current task or bug.
50
+
49
51
  ---
50
52
 
51
53
  ## Usage
@@ -129,6 +131,7 @@ BUG_READY
129
131
  ### Other
130
132
 
131
133
  * decision-log
134
+ * decision-sweep-weekly
132
135
 
133
136
  ---
134
137
 
@@ -153,6 +156,20 @@ BUG_READY
153
156
 
154
157
  ---
155
158
 
159
+ ## Weekly Decision Sweep
160
+
161
+ Calling `/decision-log` after every task is easy to forget. As a lower-friction alternative, run `decision-sweep-weekly` once per week (Friday is a natural fit):
162
+
163
+ ```
164
+ /decision-sweep-weekly
165
+ ```
166
+
167
+ The skill scans archived task and bug briefs from the past 7 days, judges which ones contain a decision worth keeping (cross-task impact, rejected alternatives, counter-intuitive choices, externally driven calls, or instructive cancellations), drafts the entries, and waits for confirmation before appending to `.ai/decisions/decisions.md`.
168
+
169
+ Use `decision-log` for in-the-moment recording and `decision-sweep-weekly` for periodic cleanup. Either alone is enough; using both is fine.
170
+
171
+ The decisions file is intentionally narrow. It is meant to hold durable project invariants and reusable constraints, not a running transcript of every local implementation choice.
172
+
156
173
  ## Philosophy
157
174
 
158
175
  Task CLI is intentionally lightweight.
@@ -167,6 +184,8 @@ Instead of maintaining large specifications, it focuses on:
167
184
 
168
185
  The goal is to improve quality without slowing down iteration speed.
169
186
 
187
+ That decision history is meant to be selectively reusable. Explore and fast-path skills should consult it to avoid violating existing project decisions, but only the parts that materially constrain the current work belong in the new brief.
188
+
170
189
  ## Compared with OpenSpec-Style Workflows
171
190
 
172
191
  Task CLI is designed as a lightweight alternative to heavier spec-driven systems such as OpenSpec.
@@ -223,7 +242,7 @@ task refresh
223
242
  This will:
224
243
 
225
244
  * keep `.ai/tasks`, `.ai/bugs`, and `.ai/decisions`
226
- * remove only these managed skills from `.claude/skills/` and `.codex/skills/`: `task-fast`, `task-explore`, `task-implement`, `task-review`, `task-cancel`, `bug-explore`, `bug-fix`, `bug-review`, `bug-cancel`, `decision-log`
245
+ * remove only these managed skills from `.claude/skills/` and `.codex/skills/`: `task-fast`, `task-explore`, `task-implement`, `task-review`, `task-cancel`, `bug-explore`, `bug-fix`, `bug-review`, `bug-cancel`, `decision-log`, `decision-sweep-weekly`
227
246
  * reinstall the latest versions of those skills
228
247
 
229
248
  This avoids touching unrelated custom skills in the same project.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@winton979/task-cli",
3
- "version": "1.2.1",
3
+ "version": "1.3.1",
4
4
  "description": "Lightweight task workflow CLI for AI-assisted development",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/src/init.js CHANGED
@@ -19,6 +19,17 @@ const GRILL_ME_HINTS = [
19
19
  'grill me',
20
20
  ];
21
21
 
22
+ const DECISIONS_READ_GUIDANCE = `Decision Intake
23
+
24
+ Before finalizing the brief, inspect .ai/decisions/decisions.md if it exists and contains real entries beyond the title.
25
+
26
+ Use it narrowly:
27
+
28
+ * extract only decisions that materially constrain this task
29
+ * ignore unrelated historical notes
30
+ * treat the file as a source of durable project invariants, not as a second specification
31
+ * if relevant decisions exist, summarize them briefly in Context or Constraints instead of copying them verbatim`;
32
+
22
33
  const SKILLS = {
23
34
  'task-fast': {
24
35
  name: 'task-fast',
@@ -37,18 +48,22 @@ Workflow
37
48
 
38
49
  1. If a Grill Me compatible skill is available in the current environment, use it for requirement clarification.
39
50
  2. If no Grill Me compatible skill is available, clarify the requirement yourself with focused questions just far enough to remove ambiguity.
40
- 3. Create a concise task brief and save it to:
51
+ 3. Read the project code and conventions needed to avoid obvious conflicts.
52
+ 4. Read .ai/decisions/decisions.md if it exists and has entries. Pull in only decisions that materially constrain this task.
53
+ 5. Create a concise task brief and save it to:
41
54
 
42
55
  .ai/tasks/active/YYYY-MM-DD-task-name.md
43
56
 
44
- 4. Show the brief before coding.
45
- 5. If the user does not object, implement immediately.
46
- 6. Verify the result against the acceptance criteria.
47
- 7. Archive the brief automatically by moving it to:
57
+ 6. Show the brief before coding.
58
+ 7. If the user does not object, implement immediately.
59
+ 8. Verify the result against the acceptance criteria.
60
+ 9. Archive the brief automatically by moving it to:
48
61
 
49
62
  .ai/tasks/archive/YYYY-MM-DD-task-name.md
50
63
 
51
- 8. Summarize the outcome and any follow-up risks.
64
+ 10. Summarize the outcome and any follow-up risks.
65
+
66
+ ${DECISIONS_READ_GUIDANCE}
52
67
 
53
68
  Task Brief Format
54
69
 
@@ -105,11 +120,14 @@ Workflow
105
120
  3. Continue until the task is sufficiently understood.
106
121
  4. Do not write code.
107
122
  5. Do not create implementation details.
108
- 6. Once the requirement is clear, generate a concise task brief and save it to:
123
+ 6. Before writing the brief, inspect .ai/decisions/decisions.md if it exists and has entries. Pull in only decisions that materially constrain this task.
124
+ 7. Once the requirement is clear, generate a concise task brief and save it to:
109
125
 
110
126
  .ai/tasks/active/YYYY-MM-DD-task-name.md
111
127
 
112
- 7. Show the saved brief and stop.
128
+ 8. Show the saved brief and stop.
129
+
130
+ ${DECISIONS_READ_GUIDANCE}
113
131
 
114
132
  Task Brief Format
115
133
 
@@ -292,11 +310,14 @@ Rules
292
310
  * expected behavior
293
311
  * assumptions
294
312
 
295
- 8. Once the bug is sufficiently understood, generate a brief and save it to:
313
+ 8. Before writing the brief, inspect .ai/decisions/decisions.md if it exists and has entries. Pull in only decisions that materially constrain the observed behavior, expected behavior, or likely root cause.
314
+ 9. Once the bug is sufficiently understood, generate a brief and save it to:
296
315
 
297
316
  .ai/bugs/active/YYYY-MM-DD-bug-name.md
298
317
 
299
- 9. Show the saved brief and stop.
318
+ 10. Show the saved brief and stop.
319
+
320
+ ${DECISIONS_READ_GUIDANCE}
300
321
 
301
322
  Bug Brief Format
302
323
 
@@ -456,6 +477,8 @@ Purpose
456
477
 
457
478
  Record important implementation decisions.
458
479
 
480
+ Only record decisions that are likely to matter beyond a single task. Good candidates are durable constraints, architecture boundaries, rejected alternatives someone may retry later, externally forced choices, and intentional behavior that otherwise looks incorrect.
481
+
459
482
  Save Location
460
483
 
461
484
  .ai/decisions/decisions.md
@@ -485,6 +508,79 @@ Requirements
485
508
  * Maximum 10 lines per decision
486
509
  * Append only
487
510
  * Keep concise
511
+ `,
512
+ },
513
+
514
+ 'decision-sweep-weekly': {
515
+ name: 'decision-sweep-weekly',
516
+ description: 'Weekly sweep of recent task and bug briefs to decide which deserve a decision-log entry. Proposes entries for confirmation before appending.',
517
+ content: `---
518
+ name: decision-sweep-weekly
519
+ description: Weekly sweep of recent task and bug briefs to decide which deserve a decision-log entry. Proposes entries for confirmation before appending.
520
+ user-invocable: true
521
+ ---
522
+
523
+ Purpose
524
+
525
+ Batch-review the past week of work and sediment only the decisions that outlive a single task. Replaces per-task reminders with one weekly pass.
526
+
527
+ When to Run
528
+
529
+ Run once per week, ideally on Friday. May also run ad-hoc after a busy stretch.
530
+
531
+ Workflow
532
+
533
+ 1. Scan briefs created in the last 7 days under .ai/tasks/archive/ and .ai/bugs/archive/. Filter by filename date prefix YYYY-MM-DD. If a brief lacks a date prefix, fall back to filesystem mtime.
534
+ 2. For cancelled briefs in either archive, treat the abandonment itself as potential decision material.
535
+ 3. Evaluate each brief against the Sediment Conditions below.
536
+ 4. For each candidate, draft a decision entry using the four-section format.
537
+ 5. Present a single review list: every scanned brief with a verdict (write / skip / insufficient info), then the proposed drafts grouped at the end.
538
+ 6. Do NOT append anything yet. Wait for the user to confirm which drafts to keep, edit, or drop.
539
+ 7. Only after confirmation, append the approved entries to .ai/decisions/decisions.md, oldest first, under the matching YYYY-MM-DD section heading.
540
+ 8. Report what was appended and what was skipped.
541
+
542
+ Sediment Conditions
543
+
544
+ A brief becomes a decision entry if it satisfies any of:
545
+
546
+ * Cross-task impact: the choice constrains how future tasks must be written.
547
+ * A concrete alternative was rejected and someone could plausibly pick it later.
548
+ * Counter-intuitive choice: code reads like an anti-pattern but is intentional.
549
+ * Externally driven: compliance, performance, compatibility, or a third-party API limit forced the call.
550
+ * A cancelled attempt whose failure is itself a useful conclusion.
551
+
552
+ Skip Conditions
553
+
554
+ * Affects only the implementation detail of one task.
555
+ * A temporary or unsettled conclusion.
556
+ * A bare fact with no decision behind it.
557
+
558
+ Entry Format
559
+
560
+ ## YYYY-MM-DD
561
+
562
+ ### Problem
563
+
564
+ What issue was encountered.
565
+
566
+ ### Decision
567
+
568
+ What was chosen.
569
+
570
+ ### Reason
571
+
572
+ Why this choice was made.
573
+
574
+ ### Alternatives Considered
575
+
576
+ What alternatives were rejected.
577
+
578
+ Requirements
579
+
580
+ * Maximum 10 lines per decision
581
+ * Append only
582
+ * One date section per day; multiple decisions on the same day stack under the same heading
583
+ * Never edit or delete prior entries
488
584
  `,
489
585
  },
490
586
  };
@@ -649,7 +745,8 @@ export function init(cwd, { fs, path, log }) {
649
745
  fast: task-fast
650
746
  task: task-explore -> task-implement -> task-review | task-cancel
651
747
  bug: bug-explore -> bug-fix -> bug-review | bug-cancel
652
- other: decision-log`);
748
+ other: decision-log
749
+ sweep: decision-sweep-weekly`);
653
750
  }
654
751
 
655
752
  export function refresh(cwd, { fs, path, log }) {
@@ -683,7 +780,8 @@ export function refresh(cwd, { fs, path, log }) {
683
780
  fast: task-fast
684
781
  task: task-explore -> task-implement -> task-review | task-cancel
685
782
  bug: bug-explore -> bug-fix -> bug-review | bug-cancel
686
- other: decision-log`);
783
+ other: decision-log
784
+ sweep: decision-sweep-weekly`);
687
785
  }
688
786
 
689
787
  export function doctor(cwd, { fs, path, log }) {