@chief-clancy/brief 0.3.0 → 0.3.2

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 CHANGED
@@ -90,9 +90,20 @@ Existing behaviour, unchanged. The pipeline label respects `CLANCY_ROLES`: if `p
90
90
  npx chief-clancy
91
91
  ```
92
92
 
93
+ ## Also included
94
+
95
+ Installing `@chief-clancy/brief` also installs codebase scanning commands from [`@chief-clancy/scan`](https://www.npmjs.com/package/@chief-clancy/scan):
96
+
97
+ - `/clancy:map-codebase` — scan your codebase with 5 parallel agents and generate `.clancy/docs/`
98
+ - `/clancy:update-docs` — incrementally refresh docs affected by recent changes
99
+
100
+ Running `/clancy:map-codebase` before briefing enriches the devil's advocate analysis with real codebase context.
101
+
93
102
  ## Part of the Clancy monorepo
94
103
 
95
104
  - [`chief-clancy`](https://www.npmjs.com/package/chief-clancy) — full pipeline (install, configure, implement, autopilot)
105
+ - [`@chief-clancy/scan`](https://www.npmjs.com/package/@chief-clancy/scan) — codebase scanning agents and workflows
106
+ - [`@chief-clancy/plan`](https://www.npmjs.com/package/@chief-clancy/plan) — implementation planner
96
107
  - [`@chief-clancy/terminal`](https://www.npmjs.com/package/@chief-clancy/terminal) — installer, slash commands, hooks, runners
97
108
  - [`@chief-clancy/core`](https://www.npmjs.com/package/@chief-clancy/core) — board integrations, pipeline phases, schemas
98
109
 
package/bin/brief.js CHANGED
@@ -39,6 +39,9 @@ const require = createRequire(import.meta.url);
39
39
  const pkg = require('../package.json');
40
40
 
41
41
  const briefRoot = join(dirname(fileURLToPath(import.meta.url)), '..');
42
+ const scanRoot = join(
43
+ dirname(require.resolve('@chief-clancy/scan/package.json')),
44
+ );
42
45
 
43
46
  const sources = {
44
47
  commandsDir: join(briefRoot, 'src', 'commands'),
@@ -87,6 +90,15 @@ const ask = (label) => new Promise((resolve) => rl.question(label, resolve));
87
90
  const COMMAND_FILES = ['approve-brief.md', 'board-setup.md', 'brief.md'];
88
91
  const WORKFLOW_FILES = ['approve-brief.md', 'board-setup.md', 'brief.md'];
89
92
  const AGENT_FILES = ['devils-advocate.md'];
93
+ const SCAN_AGENT_FILES = [
94
+ 'arch-agent.md',
95
+ 'concerns-agent.md',
96
+ 'design-agent.md',
97
+ 'quality-agent.md',
98
+ 'tech-agent.md',
99
+ ];
100
+ const SCAN_COMMAND_FILES = ['map-codebase.md', 'update-docs.md'];
101
+ const SCAN_WORKFLOW_FILES = ['map-codebase.md', 'update-docs.md'];
90
102
 
91
103
  // ---------------------------------------------------------------------------
92
104
  // Installer
@@ -113,12 +125,13 @@ function copyChecked(src, dest) {
113
125
  function inlineWorkflows(commandsDest, workflowsDest) {
114
126
  const WORKFLOW_REF = /^@\.claude\/clancy\/workflows\/([^/\\]+\.md)\r?$/gm;
115
127
 
116
- COMMAND_FILES.forEach((file) => {
128
+ [...COMMAND_FILES, ...SCAN_COMMAND_FILES].forEach((file) => {
117
129
  const cmdPath = join(commandsDest, file);
118
130
  const content = readFileSync(cmdPath, 'utf8');
119
131
  const resolved = content.replace(WORKFLOW_REF, (match, fileName) => {
120
132
  const wfPath = join(workflowsDest, fileName);
121
133
  if (!existsSync(wfPath)) return match;
134
+ rejectSymlink(wfPath);
122
135
  return readFileSync(wfPath, 'utf8');
123
136
  });
124
137
 
@@ -156,39 +169,14 @@ async function chooseMode() {
156
169
  }
157
170
 
158
171
  // ---------------------------------------------------------------------------
159
- // Main
172
+ // Install helpers
160
173
  // ---------------------------------------------------------------------------
161
174
 
162
- async function main() {
163
- console.log('');
164
- console.log(blue(' Clancy Brief'));
165
- console.log(
166
- ` ${bold(`v${pkg.version}`)}${dim(' Strategic brief generator for Claude Code.')}`,
167
- );
168
- console.log('');
169
-
170
- const mode = flag ?? (await chooseMode());
175
+ /** Copy all brief + scan files and write version marker. */
176
+ function installFiles(dest, mode) {
177
+ const { commandsDest, workflowsDest, agentsDest } = dest;
171
178
 
172
- if (flag) {
173
- console.log(dim(` Mode: ${flag} (--${flag} flag)`));
174
- }
175
-
176
- const cwd = process.cwd();
177
- const baseDir =
178
- mode === 'global' ? join(homeDir, '.claude') : join(cwd, '.claude');
179
-
180
- const commandsDest = join(baseDir, 'commands', 'clancy');
181
- const workflowsDest = join(baseDir, 'clancy', 'workflows');
182
- const agentsDest = join(baseDir, 'clancy', 'agents');
183
-
184
- console.log(dim(` Installing to: ${commandsDest}`));
185
-
186
- // Create directories
187
- mkdirSync(commandsDest, { recursive: true });
188
- mkdirSync(workflowsDest, { recursive: true });
189
- mkdirSync(agentsDest, { recursive: true });
190
-
191
- // Copy files
179
+ // Brief files
192
180
  COMMAND_FILES.forEach((f) =>
193
181
  copyChecked(join(sources.commandsDir, f), join(commandsDest, f)),
194
182
  );
@@ -199,17 +187,26 @@ async function main() {
199
187
  copyChecked(join(sources.agentsDir, f), join(agentsDest, f)),
200
188
  );
201
189
 
202
- // Inline workflows for global mode
203
- if (mode === 'global') {
204
- inlineWorkflows(commandsDest, workflowsDest);
205
- }
190
+ // Scan files (agents, commands, workflows from @chief-clancy/scan)
191
+ SCAN_AGENT_FILES.forEach((f) =>
192
+ copyChecked(join(scanRoot, 'src', 'agents', f), join(agentsDest, f)),
193
+ );
194
+ SCAN_COMMAND_FILES.forEach((f) =>
195
+ copyChecked(join(scanRoot, 'src', 'commands', f), join(commandsDest, f)),
196
+ );
197
+ SCAN_WORKFLOW_FILES.forEach((f) =>
198
+ copyChecked(join(scanRoot, 'src', 'workflows', f), join(workflowsDest, f)),
199
+ );
200
+
201
+ if (mode === 'global') inlineWorkflows(commandsDest, workflowsDest);
206
202
 
207
- // Write version marker
208
203
  const versionPath = join(commandsDest, 'VERSION.brief');
209
204
  rejectSymlink(versionPath);
210
205
  writeFileSync(versionPath, pkg.version);
206
+ }
211
207
 
212
- // Success
208
+ /** Print the install success output. */
209
+ function printSuccess() {
213
210
  console.log('');
214
211
  console.log(green(' ✓ Clancy Brief installed successfully.'));
215
212
  console.log('');
@@ -223,10 +220,19 @@ async function main() {
223
220
  console.log(
224
221
  ` ${cyan('/clancy:board-setup')} ${dim('Configure board credentials (optional)')}`,
225
222
  );
223
+ console.log(
224
+ ` ${cyan('/clancy:map-codebase')} ${dim('Scan codebase and generate .clancy/docs/')}`,
225
+ );
226
+ console.log(
227
+ ` ${cyan('/clancy:update-docs')} ${dim('Refresh .clancy/docs/ incrementally')}`,
228
+ );
226
229
  console.log('');
227
230
  console.log(' Next steps:');
228
231
  console.log(` 1. Open a project in Claude Code`);
229
- console.log(` 2. Run: ${cyan('/clancy:brief "Your feature idea"')}`);
232
+ console.log(
233
+ ` 2. Optional: ${cyan('/clancy:map-codebase')} ${dim('for richer briefs')}`,
234
+ );
235
+ console.log(` 3. Run: ${cyan('/clancy:brief "Your feature idea"')}`);
230
236
  console.log('');
231
237
  console.log(dim(' Want to brief from board tickets?'));
232
238
  console.log(dim(` Run: ${cyan('/clancy:board-setup')}`));
@@ -236,6 +242,42 @@ async function main() {
236
242
  );
237
243
  console.log(dim(` npx chief-clancy`));
238
244
  console.log('');
245
+ }
246
+
247
+ // ---------------------------------------------------------------------------
248
+ // Main
249
+ // ---------------------------------------------------------------------------
250
+
251
+ async function main() {
252
+ console.log('');
253
+ console.log(blue(' Clancy Brief'));
254
+ console.log(
255
+ ` ${bold(`v${pkg.version}`)}${dim(' Strategic brief generator for Claude Code.')}`,
256
+ );
257
+ console.log('');
258
+
259
+ const mode = flag ?? (await chooseMode());
260
+
261
+ if (flag) {
262
+ console.log(dim(` Mode: ${flag} (--${flag} flag)`));
263
+ }
264
+
265
+ const cwd = process.cwd();
266
+ const baseDir =
267
+ mode === 'global' ? join(homeDir, '.claude') : join(cwd, '.claude');
268
+
269
+ const commandsDest = join(baseDir, 'commands', 'clancy');
270
+ const workflowsDest = join(baseDir, 'clancy', 'workflows');
271
+ const agentsDest = join(baseDir, 'clancy', 'agents');
272
+
273
+ console.log(dim(` Installing to: ${commandsDest}`));
274
+
275
+ mkdirSync(commandsDest, { recursive: true });
276
+ mkdirSync(workflowsDest, { recursive: true });
277
+ mkdirSync(agentsDest, { recursive: true });
278
+
279
+ installFiles({ commandsDest, workflowsDest, agentsDest }, mode);
280
+ printSuccess();
239
281
 
240
282
  rl.close();
241
283
  }
@@ -11,6 +11,9 @@ type BriefInstallSources = {
11
11
  readonly commandsDir: string;
12
12
  readonly workflowsDir: string;
13
13
  readonly agentsDir: string;
14
+ readonly scanAgentsDir: string;
15
+ readonly scanCommandsDir: string;
16
+ readonly scanWorkflowsDir: string;
14
17
  };
15
18
  /**
16
19
  * File system operations the installer performs.
@@ -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;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"}
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;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC,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;AA6CF;;;;;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;AA+EF;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,sBAAsB,KAAG,IA+CjE,CAAC"}
@@ -23,6 +23,18 @@ const WORKFLOW_FILES = [
23
23
  ];
24
24
  /** Agent files shipped with the brief package. */
25
25
  const AGENT_FILES = ['devils-advocate.md'];
26
+ /** Scan agent files from @chief-clancy/scan. */
27
+ const SCAN_AGENT_FILES = [
28
+ 'arch-agent.md',
29
+ 'concerns-agent.md',
30
+ 'design-agent.md',
31
+ 'quality-agent.md',
32
+ 'tech-agent.md',
33
+ ];
34
+ /** Scan command files from @chief-clancy/scan. */
35
+ const SCAN_COMMAND_FILES = ['map-codebase.md', 'update-docs.md'];
36
+ /** Scan workflow files from @chief-clancy/scan. */
37
+ const SCAN_WORKFLOW_FILES = ['map-codebase.md', 'update-docs.md'];
26
38
  /** Matches `@.claude/clancy/workflows/<filename>.md` on its own line. */
27
39
  const WORKFLOW_REF = /^@\.claude\/clancy\/workflows\/([^/\\]+\.md)\r?$/gm;
28
40
  // ---------------------------------------------------------------------------
@@ -69,6 +81,7 @@ const rejectSymlink = (path, isSymlink) => {
69
81
  /** Copy a list of files from src dir to dest dir with symlink protection. */
70
82
  const copyFiles = (options) => {
71
83
  const { files, srcDir, destDir, fs } = options;
84
+ rejectSymlink(destDir, fs.isSymlink);
72
85
  fs.mkdir(destDir);
73
86
  files.forEach((file) => {
74
87
  const src = join(srcDir, file);
@@ -88,12 +101,15 @@ const copyFiles = (options) => {
88
101
  * @-file resolution.
89
102
  */
90
103
  const inlineWorkflow = (commandsDest, workflowsDest, fs) => {
91
- COMMAND_FILES.forEach((file) => {
104
+ [...COMMAND_FILES, ...SCAN_COMMAND_FILES].forEach((file) => {
92
105
  const cmdPath = join(commandsDest, file);
93
106
  const content = fs.readFile(cmdPath);
94
107
  const resolved = content.replace(WORKFLOW_REF, (match, fileName) => {
95
108
  const wfPath = join(workflowsDest, fileName);
96
- return fs.exists(wfPath) ? fs.readFile(wfPath) : match;
109
+ rejectSymlink(wfPath, fs.isSymlink);
110
+ if (!fs.exists(wfPath))
111
+ return match;
112
+ return fs.readFile(wfPath);
97
113
  });
98
114
  if (resolved !== content) {
99
115
  rejectSymlink(cmdPath, fs.isSymlink);
@@ -133,6 +149,24 @@ export const runBriefInstall = (options) => {
133
149
  destDir: paths.agentsDest,
134
150
  fs,
135
151
  });
152
+ copyFiles({
153
+ files: SCAN_AGENT_FILES,
154
+ srcDir: sources.scanAgentsDir,
155
+ destDir: paths.agentsDest,
156
+ fs,
157
+ });
158
+ copyFiles({
159
+ files: SCAN_COMMAND_FILES,
160
+ srcDir: sources.scanCommandsDir,
161
+ destDir: paths.commandsDest,
162
+ fs,
163
+ });
164
+ copyFiles({
165
+ files: SCAN_WORKFLOW_FILES,
166
+ srcDir: sources.scanWorkflowsDir,
167
+ destDir: paths.workflowsDest,
168
+ fs,
169
+ });
136
170
  if (mode === 'global') {
137
171
  inlineWorkflow(paths.commandsDest, paths.workflowsDest, fs);
138
172
  }
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chief-clancy/brief",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Strategic brief generator for Claude Code — grill, decompose, and document feature ideas",
5
5
  "author": "Alex Clapperton",
6
6
  "license": "MIT",
@@ -39,6 +39,9 @@
39
39
  "src/workflows",
40
40
  "src/agents"
41
41
  ],
42
+ "dependencies": {
43
+ "@chief-clancy/scan": "0.2.1"
44
+ },
42
45
  "scripts": {
43
46
  "build": "rm -rf dist tsconfig.build.tsbuildinfo && tsc --project tsconfig.build.json && tsc-alias --project tsconfig.build.json",
44
47
  "test": "vitest run",
@@ -8,7 +8,7 @@ You receive 10-15 clarifying questions generated during the AI-grill phase of `/
8
8
 
9
9
  1. Work through each question one at a time. For every question, investigate before answering — never guess.
10
10
  2. Interrogate three sources in order of preference:
11
- - **Codebase**: use Glob, Grep, and Read to explore affected areas, check `.clancy/docs/`, read existing patterns. Use real file paths and code snippets as evidence.
11
+ - **Codebase**: use Glob, Grep, and Read to explore affected areas, check `.clancy/docs/` if available, read existing patterns. Use real file paths and code snippets as evidence.
12
12
  - **Board**: check the parent ticket, related tickets, and existing children for context. Look for conflicting requirements.
13
13
  - **Web**: when the question involves external technology, third-party integrations, or industry patterns, use WebSearch and WebFetch.
14
14
  3. Challenge your own answers. If the codebase says one thing but the ticket description says another, flag the conflict — do not silently pick one.
@@ -582,7 +582,7 @@ Same relentless energy as the human grill, but directed at the strategist itself
582
582
  - The path to the agent prompt: `.claude/clancy/agents/devils-advocate.md`
583
583
 
584
584
  3. The devil's advocate agent answers each question by INTERROGATING ITS SOURCES:
585
- - **Codebase:** explore affected areas, read `.clancy/docs/`, check existing patterns. Don't assume — look.
585
+ - **Codebase:** explore affected areas, read `.clancy/docs/` if available, check existing patterns. Don't assume — look.
586
586
  - **Board:** parent ticket, related tickets, existing children. Check for conflicting requirements.
587
587
  - **Web:** when the question involves external technology, patterns, or third-party integrations. Same trigger as Step 6: `--research` flag forces it, otherwise judgement-based.
588
588
 
@@ -695,7 +695,7 @@ Web research agent (adds 1 to the count above, max 4 total):
695
695
 
696
696
  ### What agents explore
697
697
 
698
- - `.clancy/docs/` — STACK.md, ARCHITECTURE.md, CONVENTIONS.md, TESTING.md, DESIGN-SYSTEM.md
698
+ - `.clancy/docs/` (if available) — STACK.md, ARCHITECTURE.md, CONVENTIONS.md, TESTING.md, DESIGN-SYSTEM.md
699
699
  - Affected code areas via Glob + Read
700
700
  - Board for duplicates/related tickets (text-match against title):
701
701
  - **GitHub:** `GET /repos/$GITHUB_REPO/issues?state=open&per_page=30` and text-match