@winton979/task-cli 1.4.3 → 1.5.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/README.md +8 -18
- package/package.json +1 -1
- package/src/init.js +43 -97
package/README.md
CHANGED
|
@@ -82,17 +82,13 @@ task init
|
|
|
82
82
|
|
|
83
83
|
After initialization, Task CLI creates the `.ai/` workspace and installs workflow skills into both `.claude/skills/` and `.codex/skills/`.
|
|
84
84
|
|
|
85
|
-
###
|
|
86
|
-
|
|
87
|
-
Task CLI
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
npx add-skill PJ-SBN-593844/skill-grill-me
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
If no Grill Me compatible skill is installed, `task-fast`, `task-explore`, and `bug-explore` fall back to built-in clarification prompts.
|
|
85
|
+
### Exploration Protocol
|
|
86
|
+
|
|
87
|
+
Task CLI embeds the `grilling` primitive from [Matt Pocock's skills collection](https://github.com/mattpocock/skills.git). Its wording is the methodological foundation for exploration, not a runtime dependency.
|
|
88
|
+
|
|
89
|
+
`task-explore` and `bug-explore` preserve the primitive's body verbatim. Their only workflow-specific interpretation of it is that "act on it" means creating the brief. `task-fast` uses a narrower clarification loop so the fast path remains fast.
|
|
90
|
+
|
|
91
|
+
Task CLI neither requires nor installs a companion interviewing skill.
|
|
96
92
|
|
|
97
93
|
---
|
|
98
94
|
|
|
@@ -314,13 +310,7 @@ This will:
|
|
|
314
310
|
|
|
315
311
|
Unrelated custom skills in the same project are left untouched. Inspect the current setup first with `task doctor`.
|
|
316
312
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
something else:
|
|
320
|
-
> Task CLI does not install Grill Me automatically.
|
|
321
|
-
> Users remain free to choose any Grill Me compatible implementation, and the explore skills fall back to built-in clarification if none is installed.
|
|
322
|
-
|
|
323
|
-
## License
|
|
313
|
+
## License
|
|
324
314
|
|
|
325
315
|
MIT
|
|
326
316
|
|
package/package.json
CHANGED
package/src/init.js
CHANGED
|
@@ -13,11 +13,15 @@ const GITIGNORE_BLOCK = [
|
|
|
13
13
|
'.ai/bugs/active/*.md',
|
|
14
14
|
].join('\n');
|
|
15
15
|
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
const GRILLING_GUIDANCE = `Grilling
|
|
17
|
+
|
|
18
|
+
Interview me relentlessly about every aspect of this until we reach a shared understanding. Walk down each branch of the decision tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.
|
|
19
|
+
|
|
20
|
+
Ask the questions one at a time, waiting for feedback on each question before continuing. Asking multiple questions at once is bewildering.
|
|
21
|
+
|
|
22
|
+
If a *fact* can be found by exploring the environment (filesystem, tools, etc.), look it up rather than asking me. The *decisions*, though, are mine — put each one to me and wait for my answer.
|
|
23
|
+
|
|
24
|
+
Do not act on it until I confirm we have reached a shared understanding.`;
|
|
21
25
|
|
|
22
26
|
const DECISIONS_READ_GUIDANCE = `Decision Intake
|
|
23
27
|
|
|
@@ -60,23 +64,24 @@ Handle a small requirement in one continuous workflow with minimal ceremony.
|
|
|
60
64
|
|
|
61
65
|
Workflow
|
|
62
66
|
|
|
63
|
-
1.
|
|
64
|
-
2. If
|
|
65
|
-
3.
|
|
66
|
-
4.
|
|
67
|
-
5.
|
|
68
|
-
6.
|
|
67
|
+
1. Read the project code and conventions needed to avoid obvious conflicts.
|
|
68
|
+
2. If a fact can be found by exploring the environment, look it up rather than asking the user.
|
|
69
|
+
3. Ask only questions whose answers can change the implementation or acceptance criteria. Ask them one at a time, waiting for feedback on each before continuing. For each question, provide your recommended answer.
|
|
70
|
+
4. Put unresolved decisions to the user; do not make them on the user's behalf.
|
|
71
|
+
5. Read .ai/decisions/decisions.md if it exists and has entries. Pull in only decisions that materially constrain this task.
|
|
72
|
+
6. Before finalizing the brief, perform a Complexity Assessment.
|
|
73
|
+
7. Create a concise task brief and save it to:
|
|
69
74
|
|
|
70
75
|
.ai/tasks/active/YYYY-MM-DD-task-name.md
|
|
71
76
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
77
|
+
8. Show the brief as the fast-path summary of shared understanding, ask the user to confirm it, and stop. Do not code until the user confirms.
|
|
78
|
+
9. Once the user confirms the brief, implement immediately.
|
|
79
|
+
10. Verify the result against the acceptance criteria.
|
|
80
|
+
11. Archive the brief automatically by moving it to:
|
|
76
81
|
|
|
77
82
|
.ai/tasks/archive/YYYY-MM-DD-task-name.md
|
|
78
83
|
|
|
79
|
-
|
|
84
|
+
12. Summarize the outcome and any follow-up risks.
|
|
80
85
|
|
|
81
86
|
${DECISIONS_READ_GUIDANCE}
|
|
82
87
|
|
|
@@ -123,10 +128,10 @@ TASK_DONE
|
|
|
123
128
|
|
|
124
129
|
'task-explore': {
|
|
125
130
|
name: 'task-explore',
|
|
126
|
-
description: '
|
|
131
|
+
description: 'Grill the user relentlessly about a requirement; generate an execution brief only after shared understanding, without implementing.',
|
|
127
132
|
content: `---
|
|
128
133
|
name: task-explore
|
|
129
|
-
description:
|
|
134
|
+
description: Grill the user relentlessly about a requirement; generate an execution brief only after shared understanding, without implementing.
|
|
130
135
|
user-invocable: true
|
|
131
136
|
---
|
|
132
137
|
|
|
@@ -136,17 +141,17 @@ Clarify requirements and leave behind a ready-to-execute brief.
|
|
|
136
141
|
|
|
137
142
|
Workflow
|
|
138
143
|
|
|
139
|
-
1.
|
|
140
|
-
2.
|
|
141
|
-
3.
|
|
142
|
-
4.
|
|
143
|
-
5.
|
|
144
|
-
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.
|
|
145
|
-
7. Once the requirement is clear, generate a concise task brief and save it to:
|
|
144
|
+
1. Grill the requirement using the Grilling section below.
|
|
145
|
+
2. Do not write code or create implementation details.
|
|
146
|
+
3. Before writing the brief, inspect .ai/decisions/decisions.md if it exists and has entries. Pull in only decisions that materially constrain this task.
|
|
147
|
+
4. For this workflow, "act on it" means creating the brief.
|
|
148
|
+
5. Generate a concise task brief and save it to:
|
|
146
149
|
|
|
147
150
|
.ai/tasks/active/YYYY-MM-DD-task-name.md
|
|
148
151
|
|
|
149
|
-
|
|
152
|
+
6. Show the saved brief and stop.
|
|
153
|
+
|
|
154
|
+
${GRILLING_GUIDANCE}
|
|
150
155
|
|
|
151
156
|
${DECISIONS_READ_GUIDANCE}
|
|
152
157
|
|
|
@@ -358,10 +363,10 @@ TASK_CANCELLED
|
|
|
358
363
|
|
|
359
364
|
'bug-explore': {
|
|
360
365
|
name: 'bug-explore',
|
|
361
|
-
description: '
|
|
366
|
+
description: 'Grill the user relentlessly about a bug while investigating its evidence; generate a fix brief only after shared understanding, without writing code.',
|
|
362
367
|
content: `---
|
|
363
368
|
name: bug-explore
|
|
364
|
-
description:
|
|
369
|
+
description: Grill the user relentlessly about a bug while investigating its evidence; generate a fix brief only after shared understanding, without writing code.
|
|
365
370
|
user-invocable: true
|
|
366
371
|
---
|
|
367
372
|
|
|
@@ -371,24 +376,24 @@ Investigate a bug and leave behind a ready-to-fix brief.
|
|
|
371
376
|
|
|
372
377
|
Rules
|
|
373
378
|
|
|
374
|
-
1.
|
|
375
|
-
2.
|
|
376
|
-
3.
|
|
377
|
-
4.
|
|
378
|
-
5. Identify root cause candidates.
|
|
379
|
-
6. Request evidence whenever possible.
|
|
380
|
-
7. Separate:
|
|
379
|
+
1. Grill the bug using the Grilling section below.
|
|
380
|
+
2. Investigate the bug and gather reproducible evidence. Do not write code or suggest fixes before enough evidence exists.
|
|
381
|
+
3. Identify root cause candidates.
|
|
382
|
+
4. Separate:
|
|
381
383
|
|
|
382
384
|
* observed behavior
|
|
383
385
|
* expected behavior
|
|
384
386
|
* assumptions
|
|
385
387
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
+
5. 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.
|
|
389
|
+
6. For this workflow, "act on it" means creating the brief.
|
|
390
|
+
7. Generate a brief and save it to:
|
|
388
391
|
|
|
389
392
|
.ai/bugs/active/YYYY-MM-DD-bug-name.md
|
|
390
393
|
|
|
391
|
-
|
|
394
|
+
8. Show the saved brief and stop.
|
|
395
|
+
|
|
396
|
+
${GRILLING_GUIDANCE}
|
|
392
397
|
|
|
393
398
|
${DECISIONS_READ_GUIDANCE}
|
|
394
399
|
|
|
@@ -803,49 +808,6 @@ function skillFilePath(path, cwd, skillRoot, skillName) {
|
|
|
803
808
|
return path.join(cwd, skillRoot, skillName, 'SKILL.md');
|
|
804
809
|
}
|
|
805
810
|
|
|
806
|
-
function hasGrillMeHint(value) {
|
|
807
|
-
const normalized = value.toLowerCase();
|
|
808
|
-
return GRILL_ME_HINTS.some((hint) => normalized.includes(hint));
|
|
809
|
-
}
|
|
810
|
-
|
|
811
|
-
function detectLocalGrillMeSkill(fs, path, cwd, skillRoot) {
|
|
812
|
-
const root = path.join(cwd, skillRoot);
|
|
813
|
-
if (!fs.existsSync(root)) {
|
|
814
|
-
return null;
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
|
|
818
|
-
if (!entry.isDirectory()) {
|
|
819
|
-
continue;
|
|
820
|
-
}
|
|
821
|
-
|
|
822
|
-
if (MANAGED_SKILL_NAMES.includes(entry.name)) {
|
|
823
|
-
continue;
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
if (hasGrillMeHint(entry.name)) {
|
|
827
|
-
return entry.name;
|
|
828
|
-
}
|
|
829
|
-
|
|
830
|
-
const skillPath = path.join(root, entry.name, 'SKILL.md');
|
|
831
|
-
if (!fs.existsSync(skillPath)) {
|
|
832
|
-
continue;
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
const content = fs.readFileSync(skillPath, 'utf-8');
|
|
836
|
-
const metadata = content
|
|
837
|
-
.split('---')
|
|
838
|
-
.slice(1, 2)
|
|
839
|
-
.join('\n');
|
|
840
|
-
|
|
841
|
-
if (hasGrillMeHint(metadata)) {
|
|
842
|
-
return entry.name;
|
|
843
|
-
}
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
return null;
|
|
847
|
-
}
|
|
848
|
-
|
|
849
811
|
function logCheck(log, ok, label, detail) {
|
|
850
812
|
if (ok) {
|
|
851
813
|
log.chalk.green(` OK ${label}${detail ? ` - ${detail}` : ''}`);
|
|
@@ -1056,22 +1018,6 @@ export function doctor(cwd, { fs, path, log }) {
|
|
|
1056
1018
|
}
|
|
1057
1019
|
}
|
|
1058
1020
|
|
|
1059
|
-
const grillMeFindings = [
|
|
1060
|
-
[CLAUDE_SKILLS_DIR, detectLocalGrillMeSkill(fs, path, cwd, CLAUDE_SKILLS_DIR)],
|
|
1061
|
-
[CODEX_SKILLS_DIR, detectLocalGrillMeSkill(fs, path, cwd, CODEX_SKILLS_DIR)],
|
|
1062
|
-
];
|
|
1063
|
-
|
|
1064
|
-
for (const [skillRoot, skillName] of grillMeFindings) {
|
|
1065
|
-
if (skillName) {
|
|
1066
|
-
logCheck(log, true, `${skillRoot} Grill Me companion`, `detected ${skillName}`);
|
|
1067
|
-
continue;
|
|
1068
|
-
}
|
|
1069
|
-
|
|
1070
|
-
console.log(chalk.yellow(
|
|
1071
|
-
` WARN ${skillRoot} Grill Me companion - not detected locally; task-fast, task-explore, and bug-explore will use built-in clarification fallback`
|
|
1072
|
-
));
|
|
1073
|
-
}
|
|
1074
|
-
|
|
1075
1021
|
const gitignorePath = path.join(cwd, '.gitignore');
|
|
1076
1022
|
const gitignore = fs.existsSync(gitignorePath)
|
|
1077
1023
|
? fs.readFileSync(gitignorePath, 'utf-8')
|