@winton979/task-cli 1.1.1 → 1.2.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 winton979
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -10,7 +10,7 @@ Designed for:
10
10
 
11
11
  Task CLI provides a lightweight alternative to heavyweight spec-driven workflows by combining:
12
12
 
13
- * Requirement clarification (via Grill Me)
13
+ * Requirement clarification (prefer Grill Me, fallback built in)
14
14
  * Brief generation
15
15
  * Implementation
16
16
  * Review
@@ -34,7 +34,7 @@ task init
34
34
 
35
35
  ## Prerequisites
36
36
 
37
- Task CLI relies on a Grill Me compatible skill for requirement exploration.
37
+ Task CLI can use a Grill Me compatible skill for requirement and bug exploration.
38
38
 
39
39
  Recommended:
40
40
 
@@ -44,6 +44,8 @@ npx add-skill PJ-SBN-593844/skill-grill-me
44
44
 
45
45
  Compatible Grill Me implementations may also work.
46
46
 
47
+ If no Grill Me compatible skill is installed, `task-fast`, `task-explore`, and `bug-explore` fall back to built-in clarification prompts.
48
+
47
49
  ---
48
50
 
49
51
  ## Usage
@@ -59,7 +61,7 @@ After initialization, Task CLI creates the `.ai/` workspace and installs workflo
59
61
 
60
62
  Use `task refresh` in existing projects to remove and reinstall only the workflow skills managed by task-cli. It does not delete your `.ai` briefs, internal archives, or decision log.
61
63
 
62
- Use `task doctor` to check whether the required directories exist, whether managed skills are missing or outdated, and whether the `.gitignore` rules are present.
64
+ Use `task doctor` to check whether the required directories exist, whether managed skills are missing or outdated, whether a local Grill Me companion was detected, and whether the `.gitignore` rules are present.
63
65
 
64
66
  ---
65
67
 
@@ -73,6 +75,8 @@ Use `task doctor` to check whether the required directories exist, whether manag
73
75
  clarify + brief + implement + validate
74
76
 
75
77
  /task-review
78
+ or
79
+ /task-cancel
76
80
  ```
77
81
 
78
82
  ### Larger Requirement
@@ -85,6 +89,8 @@ TASK_READY
85
89
  /task-implement
86
90
 
87
91
  /task-review
92
+ or
93
+ /task-cancel
88
94
  ```
89
95
 
90
96
  ### Bug Fix
@@ -97,6 +103,8 @@ BUG_READY
97
103
  /bug-fix
98
104
 
99
105
  /bug-review
106
+ or
107
+ /bug-cancel
100
108
  ```
101
109
 
102
110
  ---
@@ -109,12 +117,14 @@ BUG_READY
109
117
  * task-explore
110
118
  * task-implement
111
119
  * task-review
120
+ * task-cancel
112
121
 
113
122
  ### Bug Workflow
114
123
 
115
124
  * bug-explore
116
125
  * bug-fix
117
126
  * bug-review
127
+ * bug-cancel
118
128
 
119
129
  ### Other
120
130
 
@@ -157,21 +167,50 @@ Instead of maintaining large specifications, it focuses on:
157
167
 
158
168
  The goal is to improve quality without slowing down iteration speed.
159
169
 
170
+ ## Compared with OpenSpec-Style Workflows
171
+
172
+ Task CLI is designed as a lightweight alternative to heavier spec-driven systems such as OpenSpec.
173
+
174
+ Detailed specification workflows can improve alignment, traceability, and consistency. They are often the right choice for large initiatives, cross-team programs, and environments with strong process requirements.
175
+
176
+ The difficulty is that the same level of ceremony does not always fit day-to-day engineering work. For frequent bug fixes, small features, and fast iteration, the process can become heavier than the change itself. When that happens, maintenance overhead increases, documentation quality starts to drift, and teams gradually stop using the workflow as originally intended.
177
+
178
+ Task CLI takes a narrower and more pragmatic approach:
179
+
180
+ * clarify the requirement
181
+ * capture only the minimum useful brief
182
+ * execute against acceptance criteria
183
+ * review the result
184
+ * keep a lightweight decision trail
185
+
186
+ The goal is not to replace specification systems in every context. It is to provide a workflow that people will actually keep using during day-to-day engineering work.
187
+
188
+ ## Strengths and Tradeoffs
189
+
190
+ Task CLI is optimized for execution speed and sustained adoption rather than full process coverage.
160
191
 
161
- ## Can This Be Simpler?
192
+ Strengths:
162
193
 
163
- Yes. The main simplification is to collapse the old 4-step paths:
194
+ * much lower process overhead for bugs, small features, and short iterations
195
+ * easier to adopt in mature codebases where engineers already know the product context
196
+ * encourages real usage because the workflow is short enough to sustain
197
+ * keeps enough structure to improve clarity without forcing large documents
164
198
 
165
- * `task-explore` now includes brief generation.
166
- * `bug-explore` now includes bug brief generation.
167
- * `task-implement` and `bug-fix` now validate the work and archive the brief automatically when complete.
199
+ Tradeoffs:
168
200
 
169
- That leaves these practical flows:
201
+ * less suitable for large cross-team initiatives that need formal design traceability
202
+ * relies more on engineer judgment and review quality than a full specification process
203
+ * stores less long-form historical context than a dedicated spec repository
170
204
 
171
- * Explore only: `/task-explore` or `/bug-explore`
172
- * Execute: `/task-implement` or `/bug-fix`
173
- * Review: `/task-review` or `/bug-review`
174
- * One-shot small work: `/task-fast`
205
+ ## Recommended Workflow Model
206
+
207
+ Task CLI keeps the user-facing flow short:
208
+
209
+ * `task-fast`
210
+ * `task-explore -> task-implement -> task-review` or `task-cancel`
211
+ * `bug-explore -> bug-fix -> bug-review` or `bug-cancel`
212
+
213
+ The `archive/` directories remain as internal storage. They are not separate user steps in the recommended workflow.
175
214
 
176
215
  ## Upgrading Existing Projects
177
216
 
@@ -184,18 +223,20 @@ task refresh
184
223
  This will:
185
224
 
186
225
  * keep `.ai/tasks`, `.ai/bugs`, and `.ai/decisions`
187
- * remove only these managed skills from `.claude/skills/` and `.codex/skills/`: `task-fast`, `task-explore`, `task-implement`, `task-review`, `bug-explore`, `bug-fix`, `bug-review`, `decision-log`
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`
188
227
  * reinstall the latest versions of those skills
189
228
 
190
229
  This avoids touching unrelated custom skills in the same project.
191
230
 
192
- The `archive/` directories remain as internal storage. They are not separate user steps in the recommended workflow.
193
-
194
231
  Before refreshing, you can inspect the current setup with:
195
232
 
196
233
  ```bash
197
234
  task doctor
198
235
  ```
199
236
 
237
+ ## License
238
+
239
+ MIT
240
+
200
241
  > Task CLI does not install Grill Me automatically.
201
- > Users remain free to choose any Grill Me compatible implementation.
242
+ > Users remain free to choose any Grill Me compatible implementation, and the explore skills fall back to built-in clarification if none is installed.
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@winton979/task-cli",
3
- "version": "1.1.1",
3
+ "version": "1.2.1",
4
4
  "description": "Lightweight task workflow CLI for AI-assisted development",
5
+ "license": "MIT",
5
6
  "type": "module",
6
7
  "bin": {
7
8
  "task": "./bin/task.js"
package/src/cli.js CHANGED
@@ -26,8 +26,8 @@ Usage:
26
26
 
27
27
  Recommended flows after init:
28
28
  fast: task-fast
29
- task: task-explore -> task-implement -> task-review
30
- bug: bug-explore -> bug-fix -> bug-review`);
29
+ task: task-explore -> task-implement -> task-review | task-cancel
30
+ bug: bug-explore -> bug-fix -> bug-review | bug-cancel`);
31
31
  }
32
32
 
33
33
  switch (cmd) {
package/src/init.js CHANGED
@@ -1,3 +1,5 @@
1
+ import chalk from 'chalk';
2
+
1
3
  const TASK_ACTIVE_DIR = '.ai/tasks/active';
2
4
  const TASK_ARCHIVE_DIR = '.ai/tasks/archive';
3
5
  const BUG_ACTIVE_DIR = '.ai/bugs/active';
@@ -11,6 +13,12 @@ const GITIGNORE_BLOCK = [
11
13
  '.ai/bugs/active/*.md',
12
14
  ].join('\n');
13
15
 
16
+ const GRILL_ME_HINTS = [
17
+ 'grill-me',
18
+ 'skill-grill-me',
19
+ 'grill me',
20
+ ];
21
+
14
22
  const SKILLS = {
15
23
  'task-fast': {
16
24
  name: 'task-fast',
@@ -27,19 +35,20 @@ Handle a small requirement in one continuous workflow with minimal ceremony.
27
35
 
28
36
  Workflow
29
37
 
30
- 1. Clarify the requirement just enough to remove ambiguity.
31
- 2. Create a concise task brief and save it to:
38
+ 1. If a Grill Me compatible skill is available in the current environment, use it for requirement clarification.
39
+ 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:
32
41
 
33
42
  .ai/tasks/active/YYYY-MM-DD-task-name.md
34
43
 
35
- 3. Show the brief before coding.
36
- 4. If the user does not object, implement immediately.
37
- 5. Verify the result against the acceptance criteria.
38
- 6. Archive the brief automatically by moving it to:
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:
39
48
 
40
49
  .ai/tasks/archive/YYYY-MM-DD-task-name.md
41
50
 
42
- 7. Summarize the outcome and any follow-up risks.
51
+ 8. Summarize the outcome and any follow-up risks.
43
52
 
44
53
  Task Brief Format
45
54
 
@@ -91,15 +100,16 @@ Clarify requirements and leave behind a ready-to-execute brief.
91
100
 
92
101
  Workflow
93
102
 
94
- 1. Explore the requirement through focused questions.
95
- 2. Continue until the task is sufficiently understood.
96
- 3. Do not write code.
97
- 4. Do not create implementation details.
98
- 5. Once the requirement is clear, generate a concise task brief and save it to:
103
+ 1. If a Grill Me compatible skill is available in the current environment, use it for requirement exploration.
104
+ 2. If no Grill Me compatible skill is available, explore the requirement yourself through focused questions.
105
+ 3. Continue until the task is sufficiently understood.
106
+ 4. Do not write code.
107
+ 5. Do not create implementation details.
108
+ 6. Once the requirement is clear, generate a concise task brief and save it to:
99
109
 
100
110
  .ai/tasks/active/YYYY-MM-DD-task-name.md
101
111
 
102
- 6. Show the saved brief and stop.
112
+ 7. Show the saved brief and stop.
103
113
 
104
114
  Task Brief Format
105
115
 
@@ -225,6 +235,36 @@ Anything not fully implemented.
225
235
  `,
226
236
  },
227
237
 
238
+ 'task-cancel': {
239
+ name: 'task-cancel',
240
+ description: 'Discard the current task analysis output and implementation changes for this attempt.',
241
+ content: `---
242
+ name: task-cancel
243
+ description: Discard the current task analysis output and implementation changes for this attempt.
244
+ user-invocable: true
245
+ ---
246
+
247
+ Purpose
248
+
249
+ Abandon the current task attempt completely.
250
+
251
+ Rules
252
+
253
+ 1. Target only the current task attempt.
254
+ 2. Discard the current task brief and any analysis artifacts created for this attempt.
255
+ 3. Discard code changes made for this attempt.
256
+ 4. Do not archive the task brief.
257
+ 5. Do not keep partial implementation.
258
+ 6. Do not preserve temporary conclusions from this attempt as accepted decisions.
259
+ 7. Do not touch unrelated historical archives, other active briefs, or user-authored changes outside this attempt.
260
+ 8. If the exact changed files are uncertain, stop and ask for confirmation before deleting or reverting anything.
261
+
262
+ Output
263
+
264
+ TASK_CANCELLED
265
+ `,
266
+ },
267
+
228
268
  'bug-explore': {
229
269
  name: 'bug-explore',
230
270
  description: 'Investigate a bug and generate a fix brief in one step, without writing code.',
@@ -240,22 +280,23 @@ Investigate a bug and leave behind a ready-to-fix brief.
240
280
 
241
281
  Rules
242
282
 
243
- 1. Do not write code.
244
- 2. Do not suggest fixes before enough evidence exists.
245
- 3. Identify root cause candidates.
246
- 4. Ask focused questions.
247
- 5. Request evidence whenever possible.
248
- 6. Separate:
283
+ 1. If a Grill Me compatible skill is available in the current environment, use it for bug exploration.
284
+ 2. If no Grill Me compatible skill is available, ask focused questions and drive the investigation yourself.
285
+ 3. Do not write code.
286
+ 4. Do not suggest fixes before enough evidence exists.
287
+ 5. Identify root cause candidates.
288
+ 6. Request evidence whenever possible.
289
+ 7. Separate:
249
290
 
250
291
  * observed behavior
251
292
  * expected behavior
252
293
  * assumptions
253
294
 
254
- 7. Once the bug is sufficiently understood, generate a brief and save it to:
295
+ 8. Once the bug is sufficiently understood, generate a brief and save it to:
255
296
 
256
297
  .ai/bugs/active/YYYY-MM-DD-bug-name.md
257
298
 
258
- 8. Show the saved brief and stop.
299
+ 9. Show the saved brief and stop.
259
300
 
260
301
  Bug Brief Format
261
302
 
@@ -372,6 +413,36 @@ Further improvements.
372
413
  `,
373
414
  },
374
415
 
416
+ 'bug-cancel': {
417
+ name: 'bug-cancel',
418
+ description: 'Discard the current bug analysis output and code changes for this attempt.',
419
+ content: `---
420
+ name: bug-cancel
421
+ description: Discard the current bug analysis output and code changes for this attempt.
422
+ user-invocable: true
423
+ ---
424
+
425
+ Purpose
426
+
427
+ Abandon the current bug-fix attempt completely.
428
+
429
+ Rules
430
+
431
+ 1. Target only the current bug-fix attempt.
432
+ 2. Discard the current bug brief and any analysis artifacts created for this attempt.
433
+ 3. Discard code changes made for this attempt.
434
+ 4. Do not archive the bug brief.
435
+ 5. Do not keep partial fixes.
436
+ 6. Do not preserve temporary conclusions from this attempt as accepted decisions.
437
+ 7. Do not touch unrelated historical archives, other active briefs, or user-authored changes outside this attempt.
438
+ 8. If the exact changed files are uncertain, stop and ask for confirmation before deleting or reverting anything.
439
+
440
+ Output
441
+
442
+ BUG_CANCELLED
443
+ `,
444
+ },
445
+
375
446
  'decision-log': {
376
447
  name: 'decision-log',
377
448
  description: 'Record implementation decisions to .ai/decisions/decisions.md. Append-only, max 10 lines per entry.',
@@ -424,6 +495,49 @@ function skillFilePath(path, cwd, skillRoot, skillName) {
424
495
  return path.join(cwd, skillRoot, skillName, 'SKILL.md');
425
496
  }
426
497
 
498
+ function hasGrillMeHint(value) {
499
+ const normalized = value.toLowerCase();
500
+ return GRILL_ME_HINTS.some((hint) => normalized.includes(hint));
501
+ }
502
+
503
+ function detectLocalGrillMeSkill(fs, path, cwd, skillRoot) {
504
+ const root = path.join(cwd, skillRoot);
505
+ if (!fs.existsSync(root)) {
506
+ return null;
507
+ }
508
+
509
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
510
+ if (!entry.isDirectory()) {
511
+ continue;
512
+ }
513
+
514
+ if (MANAGED_SKILL_NAMES.includes(entry.name)) {
515
+ continue;
516
+ }
517
+
518
+ if (hasGrillMeHint(entry.name)) {
519
+ return entry.name;
520
+ }
521
+
522
+ const skillPath = path.join(root, entry.name, 'SKILL.md');
523
+ if (!fs.existsSync(skillPath)) {
524
+ continue;
525
+ }
526
+
527
+ const content = fs.readFileSync(skillPath, 'utf-8');
528
+ const metadata = content
529
+ .split('---')
530
+ .slice(1, 2)
531
+ .join('\n');
532
+
533
+ if (hasGrillMeHint(metadata)) {
534
+ return entry.name;
535
+ }
536
+ }
537
+
538
+ return null;
539
+ }
540
+
427
541
  function logCheck(log, ok, label, detail) {
428
542
  if (ok) {
429
543
  log.chalk.green(` OK ${label}${detail ? ` - ${detail}` : ''}`);
@@ -533,8 +647,8 @@ export function init(cwd, { fs, path, log }) {
533
647
 
534
648
  log.info(`\nTask workflow initialized. Recommended flows:
535
649
  fast: task-fast
536
- task: task-explore -> task-implement -> task-review
537
- bug: bug-explore -> bug-fix -> bug-review
650
+ task: task-explore -> task-implement -> task-review | task-cancel
651
+ bug: bug-explore -> bug-fix -> bug-review | bug-cancel
538
652
  other: decision-log`);
539
653
  }
540
654
 
@@ -567,8 +681,8 @@ export function refresh(cwd, { fs, path, log }) {
567
681
 
568
682
  log.info(`\nTask workflow refreshed. Managed skills reinstalled:
569
683
  fast: task-fast
570
- task: task-explore -> task-implement -> task-review
571
- bug: bug-explore -> bug-fix -> bug-review
684
+ task: task-explore -> task-implement -> task-review | task-cancel
685
+ bug: bug-explore -> bug-fix -> bug-review | bug-cancel
572
686
  other: decision-log`);
573
687
  }
574
688
 
@@ -620,6 +734,22 @@ export function doctor(cwd, { fs, path, log }) {
620
734
  }
621
735
  }
622
736
 
737
+ const grillMeFindings = [
738
+ [CLAUDE_SKILLS_DIR, detectLocalGrillMeSkill(fs, path, cwd, CLAUDE_SKILLS_DIR)],
739
+ [CODEX_SKILLS_DIR, detectLocalGrillMeSkill(fs, path, cwd, CODEX_SKILLS_DIR)],
740
+ ];
741
+
742
+ for (const [skillRoot, skillName] of grillMeFindings) {
743
+ if (skillName) {
744
+ logCheck(log, true, `${skillRoot} Grill Me companion`, `detected ${skillName}`);
745
+ continue;
746
+ }
747
+
748
+ console.log(chalk.yellow(
749
+ ` WARN ${skillRoot} Grill Me companion - not detected locally; task-fast, task-explore, and bug-explore will use built-in clarification fallback`
750
+ ));
751
+ }
752
+
623
753
  const gitignorePath = path.join(cwd, '.gitignore');
624
754
  const gitignore = fs.existsSync(gitignorePath)
625
755
  ? fs.readFileSync(gitignorePath, 'utf-8')