@chief-clancy/brief 0.1.1 → 0.2.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 +20 -10
- package/bin/brief.js +41 -24
- package/dist/installer/install.d.ts.map +1 -1
- package/dist/installer/install.js +10 -2
- package/dist/installer/install.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/approve-brief.md +23 -0
- package/src/commands/board-setup.md +11 -0
- package/src/commands/brief.md +1 -1
- package/src/commands/commands.test.ts +10 -1
- package/src/workflows/approve-brief.md +1540 -0
- package/src/workflows/board-setup.md +370 -0
- package/src/workflows/brief.md +21 -13
- package/src/workflows/workflows.test.ts +106 -10
package/README.md
CHANGED
|
@@ -26,19 +26,18 @@ The `/clancy:brief` slash command researches your codebase, grills you (or itsel
|
|
|
26
26
|
1. **Install:** `npx @chief-clancy/brief` — choose global or local
|
|
27
27
|
2. **Run:** `/clancy:brief "Add dark mode support"` — inline text
|
|
28
28
|
3. **Or from a file:** `/clancy:brief --from docs/rfc.md`
|
|
29
|
-
4. **Or from a board ticket:** `/clancy:brief #42` (requires board credentials)
|
|
30
29
|
|
|
31
30
|
Briefs are saved to `.clancy/briefs/` in your project.
|
|
32
31
|
|
|
33
32
|
## Input modes
|
|
34
33
|
|
|
35
|
-
| Mode | Example | Board needed?
|
|
36
|
-
| ------------ | --------------------------------------------- |
|
|
37
|
-
| Inline text | `/clancy:brief "Add dark mode"` | No
|
|
38
|
-
| From file | `/clancy:brief --from docs/rfc.md` | No
|
|
39
|
-
| Board ticket | `/clancy:brief #42`, `/clancy:brief PROJ-123` | Yes
|
|
40
|
-
| Batch | `/clancy:brief 3` | Yes
|
|
41
|
-
| Interactive | `/clancy:brief` | No
|
|
34
|
+
| Mode | Example | Board needed? |
|
|
35
|
+
| ------------ | --------------------------------------------- | --------------------------- |
|
|
36
|
+
| Inline text | `/clancy:brief "Add dark mode"` | No |
|
|
37
|
+
| From file | `/clancy:brief --from docs/rfc.md` | No |
|
|
38
|
+
| Board ticket | `/clancy:brief #42`, `/clancy:brief PROJ-123` | Yes (`/clancy:board-setup`) |
|
|
39
|
+
| Batch | `/clancy:brief 3` | Yes (`/clancy:board-setup`) |
|
|
40
|
+
| Interactive | `/clancy:brief` | No |
|
|
42
41
|
|
|
43
42
|
## Flags
|
|
44
43
|
|
|
@@ -51,9 +50,20 @@ Briefs are saved to `.clancy/briefs/` in your project.
|
|
|
51
50
|
| `--epic <KEY>` | Set parent for ticket creation |
|
|
52
51
|
| `--list` | Show inventory of existing briefs |
|
|
53
52
|
|
|
54
|
-
##
|
|
53
|
+
## Board ticket mode (optional)
|
|
55
54
|
|
|
56
|
-
|
|
55
|
+
To brief from board tickets and push approved briefs back to the board without installing the full pipeline:
|
|
56
|
+
|
|
57
|
+
1. Run `/clancy:board-setup` in Claude Code
|
|
58
|
+
2. Follow the prompts to configure your board credentials
|
|
59
|
+
3. Run `/clancy:brief #42` (or your board's ticket format) to brief from an existing ticket
|
|
60
|
+
4. Run `/clancy:approve-brief <slug>` to convert an approved brief into child tickets on your board (creates one ticket per row in the brief's decomposition table, links dependencies, and posts a tracking summary)
|
|
61
|
+
|
|
62
|
+
Credentials are stored in `.clancy/.env` and are per-project (not global).
|
|
63
|
+
|
|
64
|
+
## Full pipeline
|
|
65
|
+
|
|
66
|
+
`@chief-clancy/brief` covers brief generation and ticket creation from briefs. For planning and the full development pipeline (autopilot, implementation, review), install the complete Clancy package:
|
|
57
67
|
|
|
58
68
|
```bash
|
|
59
69
|
npx chief-clancy
|
package/bin/brief.js
CHANGED
|
@@ -80,6 +80,14 @@ const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
|
80
80
|
/** @param {string} label */
|
|
81
81
|
const ask = (label) => new Promise((resolve) => rl.question(label, resolve));
|
|
82
82
|
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
// File lists (keep in sync with install.ts)
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
|
|
87
|
+
const COMMAND_FILES = ['approve-brief.md', 'board-setup.md', 'brief.md'];
|
|
88
|
+
const WORKFLOW_FILES = ['approve-brief.md', 'board-setup.md', 'brief.md'];
|
|
89
|
+
const AGENT_FILES = ['devils-advocate.md'];
|
|
90
|
+
|
|
83
91
|
// ---------------------------------------------------------------------------
|
|
84
92
|
// Installer
|
|
85
93
|
// ---------------------------------------------------------------------------
|
|
@@ -102,20 +110,23 @@ function copyChecked(src, dest) {
|
|
|
102
110
|
}
|
|
103
111
|
|
|
104
112
|
/** Inline workflow @-references into command files (global mode only). */
|
|
105
|
-
function
|
|
113
|
+
function inlineWorkflows(commandsDest, workflowsDest) {
|
|
106
114
|
const WORKFLOW_REF = /^@\.claude\/clancy\/workflows\/([^/\\]+\.md)\r?$/gm;
|
|
107
|
-
const cmdPath = join(commandsDest, 'brief.md');
|
|
108
|
-
const content = readFileSync(cmdPath, 'utf8');
|
|
109
|
-
const resolved = content.replace(WORKFLOW_REF, (match, fileName) => {
|
|
110
|
-
const wfPath = join(workflowsDest, fileName);
|
|
111
|
-
if (!existsSync(wfPath)) return match;
|
|
112
|
-
return readFileSync(wfPath, 'utf8');
|
|
113
|
-
});
|
|
114
115
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
COMMAND_FILES.forEach((file) => {
|
|
117
|
+
const cmdPath = join(commandsDest, file);
|
|
118
|
+
const content = readFileSync(cmdPath, 'utf8');
|
|
119
|
+
const resolved = content.replace(WORKFLOW_REF, (match, fileName) => {
|
|
120
|
+
const wfPath = join(workflowsDest, fileName);
|
|
121
|
+
if (!existsSync(wfPath)) return match;
|
|
122
|
+
return readFileSync(wfPath, 'utf8');
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
if (resolved !== content) {
|
|
126
|
+
rejectSymlink(cmdPath);
|
|
127
|
+
writeFileSync(cmdPath, resolved);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
119
130
|
}
|
|
120
131
|
|
|
121
132
|
// ---------------------------------------------------------------------------
|
|
@@ -178,22 +189,19 @@ async function main() {
|
|
|
178
189
|
mkdirSync(agentsDest, { recursive: true });
|
|
179
190
|
|
|
180
191
|
// Copy files
|
|
181
|
-
|
|
182
|
-
join(sources.commandsDir,
|
|
183
|
-
join(commandsDest, 'brief.md'),
|
|
192
|
+
COMMAND_FILES.forEach((f) =>
|
|
193
|
+
copyChecked(join(sources.commandsDir, f), join(commandsDest, f)),
|
|
184
194
|
);
|
|
185
|
-
|
|
186
|
-
join(sources.workflowsDir,
|
|
187
|
-
join(workflowsDest, 'brief.md'),
|
|
195
|
+
WORKFLOW_FILES.forEach((f) =>
|
|
196
|
+
copyChecked(join(sources.workflowsDir, f), join(workflowsDest, f)),
|
|
188
197
|
);
|
|
189
|
-
|
|
190
|
-
join(sources.agentsDir,
|
|
191
|
-
join(agentsDest, 'devils-advocate.md'),
|
|
198
|
+
AGENT_FILES.forEach((f) =>
|
|
199
|
+
copyChecked(join(sources.agentsDir, f), join(agentsDest, f)),
|
|
192
200
|
);
|
|
193
201
|
|
|
194
202
|
// Inline workflows for global mode
|
|
195
203
|
if (mode === 'global') {
|
|
196
|
-
|
|
204
|
+
inlineWorkflows(commandsDest, workflowsDest);
|
|
197
205
|
}
|
|
198
206
|
|
|
199
207
|
// Write version marker
|
|
@@ -205,15 +213,24 @@ async function main() {
|
|
|
205
213
|
console.log('');
|
|
206
214
|
console.log(green(' ✓ Clancy Brief installed successfully.'));
|
|
207
215
|
console.log('');
|
|
208
|
-
console.log('
|
|
216
|
+
console.log(' Commands available:');
|
|
217
|
+
console.log(
|
|
218
|
+
` ${cyan('/clancy:brief')} ${dim('Generate a strategic brief')}`,
|
|
219
|
+
);
|
|
209
220
|
console.log(
|
|
210
|
-
` ${cyan('/clancy:brief')} ${dim('
|
|
221
|
+
` ${cyan('/clancy:approve-brief')} ${dim('Approve a brief and create board tickets')}`,
|
|
222
|
+
);
|
|
223
|
+
console.log(
|
|
224
|
+
` ${cyan('/clancy:board-setup')} ${dim('Configure board credentials (optional)')}`,
|
|
211
225
|
);
|
|
212
226
|
console.log('');
|
|
213
227
|
console.log(' Next steps:');
|
|
214
228
|
console.log(` 1. Open a project in Claude Code`);
|
|
215
229
|
console.log(` 2. Run: ${cyan('/clancy:brief "Your feature idea"')}`);
|
|
216
230
|
console.log('');
|
|
231
|
+
console.log(dim(' Want to brief from board tickets?'));
|
|
232
|
+
console.log(dim(` Run: ${cyan('/clancy:board-setup')}`));
|
|
233
|
+
console.log('');
|
|
217
234
|
console.log(
|
|
218
235
|
dim(' For the full pipeline (tickets, planning, implementation):'),
|
|
219
236
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"AAaA,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElD,+DAA+D;AAC/D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,iDAAiD;AACjD,KAAK,mBAAmB,GAAG;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C,CAAC;AAEF,2CAA2C;AAC3C,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,gBAAgB,CAAC;CAC/B,CAAC;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"AAaA,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElD,+DAA+D;AAC/D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,iDAAiD;AACjD,KAAK,mBAAmB,GAAG;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C,CAAC;AAEF,2CAA2C;AAC3C,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,gBAAgB,CAAC;CAC/B,CAAC;AA8BF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,SAAS,MAAM,EAAE,KACtB,gBAAgB,GAAG,IAKrB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GACnC,MAAM,gBAAgB,EACtB,SAAS,MAAM,EACf,KAAK,MAAM,KACV,iBASF,CAAC;AA4EF;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,sBAAsB,KAAG,IA6BjE,CAAC"}
|
|
@@ -10,9 +10,17 @@ import { join } from 'node:path';
|
|
|
10
10
|
// Constants
|
|
11
11
|
// ---------------------------------------------------------------------------
|
|
12
12
|
/** Command files shipped with the brief package. */
|
|
13
|
-
const COMMAND_FILES = [
|
|
13
|
+
const COMMAND_FILES = [
|
|
14
|
+
'approve-brief.md',
|
|
15
|
+
'board-setup.md',
|
|
16
|
+
'brief.md',
|
|
17
|
+
];
|
|
14
18
|
/** Workflow files shipped with the brief package. */
|
|
15
|
-
const WORKFLOW_FILES = [
|
|
19
|
+
const WORKFLOW_FILES = [
|
|
20
|
+
'approve-brief.md',
|
|
21
|
+
'board-setup.md',
|
|
22
|
+
'brief.md',
|
|
23
|
+
];
|
|
16
24
|
/** Agent files shipped with the brief package. */
|
|
17
25
|
const AGENT_FILES = ['devils-advocate.md'];
|
|
18
26
|
/** Matches `@.claude/clancy/workflows/<filename>.md` on its own line. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA+CjC,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,oDAAoD;AACpD,MAAM,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# /clancy:approve-brief
|
|
2
|
+
|
|
3
|
+
Convert an approved brief into real tickets on the board. Creates child tickets under the parent, links dependencies, and posts a tracking summary.
|
|
4
|
+
|
|
5
|
+
Accepts optional arguments:
|
|
6
|
+
|
|
7
|
+
- **By slug:** `/clancy:approve-brief auth-rework` — approve a specific brief
|
|
8
|
+
- **By index:** `/clancy:approve-brief 2` — approve the 2nd unapproved brief
|
|
9
|
+
- **By ticket:** `/clancy:approve-brief PROJ-123` — approve brief sourced from this ticket
|
|
10
|
+
- **Set parent:** `--epic PROJ-50` — override or set the parent epic
|
|
11
|
+
- **Preview:** `--dry-run` — show what would be created without making API calls
|
|
12
|
+
- **Skip confirmation:** `--afk` — auto-confirm without prompting (for automation)
|
|
13
|
+
|
|
14
|
+
Examples:
|
|
15
|
+
|
|
16
|
+
- `/clancy:approve-brief` — auto-select (if only 1 unapproved brief)
|
|
17
|
+
- `/clancy:approve-brief auth-rework` — approve by slug
|
|
18
|
+
- `/clancy:approve-brief --dry-run` — preview ticket creation
|
|
19
|
+
- `/clancy:approve-brief --epic PROJ-50` — set parent and approve
|
|
20
|
+
|
|
21
|
+
@.claude/clancy/workflows/approve-brief.md
|
|
22
|
+
|
|
23
|
+
Follow the approve-brief workflow above. Parse the decomposition, create tickets on the board, link dependencies, and post a tracking comment.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# /clancy:board-setup
|
|
2
|
+
|
|
3
|
+
Configure board credentials for standalone brief usage. Connects your project to a Kanban board so you can brief from board tickets.
|
|
4
|
+
|
|
5
|
+
Not needed if you have the full Clancy pipeline installed (`npx chief-clancy`) — use `/clancy:settings` instead.
|
|
6
|
+
|
|
7
|
+
Supported boards: Jira, GitHub Issues, Linear, Shortcut, Notion, Azure DevOps.
|
|
8
|
+
|
|
9
|
+
@.claude/clancy/workflows/board-setup.md
|
|
10
|
+
|
|
11
|
+
Follow the board setup workflow above. Collect credentials, verify the connection, and write them to `.clancy/.env`.
|
package/src/commands/brief.md
CHANGED
|
@@ -4,7 +4,7 @@ Generate a strategic brief for a feature idea. Researches the codebase, grills y
|
|
|
4
4
|
|
|
5
5
|
Accepts optional arguments:
|
|
6
6
|
|
|
7
|
-
- **Board ticket:** `/clancy:brief PROJ-123`, `/clancy:brief #42`, `/clancy:brief ENG-42` — brief from a board ticket
|
|
7
|
+
- **Board ticket:** `/clancy:brief PROJ-123`, `/clancy:brief #42`, `/clancy:brief ENG-42` — brief from a board ticket (requires credentials — run `/clancy:board-setup` or install the full pipeline with `npx chief-clancy`)
|
|
8
8
|
- **Inline text:** `/clancy:brief "Add dark mode"` — brief from a description
|
|
9
9
|
- **From file:** `/clancy:brief --from docs/rfc.md` — brief from a local file
|
|
10
10
|
- **Batch mode:** `/clancy:brief 3` — brief up to 3 tickets from the queue
|
|
@@ -11,7 +11,7 @@ import { describe, expect, it } from 'vitest';
|
|
|
11
11
|
|
|
12
12
|
const COMMANDS_DIR = fileURLToPath(new URL('.', import.meta.url));
|
|
13
13
|
|
|
14
|
-
const EXPECTED_COMMANDS = ['brief.md'];
|
|
14
|
+
const EXPECTED_COMMANDS = ['approve-brief.md', 'board-setup.md', 'brief.md'];
|
|
15
15
|
|
|
16
16
|
describe('commands directory structure', () => {
|
|
17
17
|
it('contains exactly the expected command files', () => {
|
|
@@ -36,4 +36,13 @@ describe('commands directory structure', () => {
|
|
|
36
36
|
|
|
37
37
|
expect(issues).toEqual([]);
|
|
38
38
|
});
|
|
39
|
+
|
|
40
|
+
it('approve-brief command starts with the approve-brief heading', () => {
|
|
41
|
+
const content = readFileSync(
|
|
42
|
+
new URL('approve-brief.md', import.meta.url),
|
|
43
|
+
'utf8',
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
expect(content.split('\n')[0]?.trim()).toBe('# /clancy:approve-brief');
|
|
47
|
+
});
|
|
39
48
|
});
|