@nolrm/contextkit 0.13.4 → 0.13.7

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.
@@ -164,155 +164,215 @@ Follow the code style standards auto-loaded via CLAUDE.md (from code-style.md).
164
164
  await this.writeGeneratedFile('.claude/rules/contextkit-code-style.md', codeStyleRule);
165
165
 
166
166
  // Slash commands — thin wrappers that delegate to .contextkit/commands/
167
- await this.writeGeneratedFile('.claude/commands/analyze.md', `# Analyze Project
167
+ await this.writeGeneratedFile(
168
+ '.claude/commands/analyze.md',
169
+ `# Analyze Project
168
170
 
169
171
  Read \`.contextkit/commands/analyze.md\` and execute the analysis workflow for this project.
170
172
 
171
173
  Scan the codebase structure, detect frameworks and patterns, then generate customized standards files in \`.contextkit/standards/\`.
172
- `);
174
+ `
175
+ );
173
176
 
174
- await this.writeGeneratedFile('.claude/commands/review.md', `# Code Review
177
+ await this.writeGeneratedFile(
178
+ '.claude/commands/review.md',
179
+ `# Code Review
175
180
 
176
181
  Read \`.contextkit/commands/review.md\` and execute the review workflow.
177
182
 
178
183
  Review current changes for correctness, standards compliance, and potential issues.
179
- `);
184
+ `
185
+ );
180
186
 
181
- await this.writeGeneratedFile('.claude/commands/fix.md', `# Fix Bug
187
+ await this.writeGeneratedFile(
188
+ '.claude/commands/fix.md',
189
+ `# Fix Bug
182
190
 
183
191
  Read \`.contextkit/commands/fix.md\` and execute the bug fix workflow.
184
192
 
185
193
  Diagnose the root cause, implement the minimal fix, and add a regression test.
186
- `);
194
+ `
195
+ );
187
196
 
188
- await this.writeGeneratedFile('.claude/commands/refactor.md', `# Refactor
197
+ await this.writeGeneratedFile(
198
+ '.claude/commands/refactor.md',
199
+ `# Refactor
189
200
 
190
201
  Read \`.contextkit/commands/refactor.md\` and execute the refactoring workflow.
191
202
 
192
203
  Improve code structure without changing behavior, keeping tests green at every step.
193
- `);
204
+ `
205
+ );
194
206
 
195
- await this.writeGeneratedFile('.claude/commands/test.md', `# Run Tests
207
+ await this.writeGeneratedFile(
208
+ '.claude/commands/test.md',
209
+ `# Run Tests
196
210
 
197
211
  Read \`.contextkit/commands/run-tests.md\` and execute the testing workflow.
198
212
 
199
213
  Generate or run tests for the specified code, covering happy paths, edge cases, and errors.
200
- `);
214
+ `
215
+ );
201
216
 
202
- await this.writeGeneratedFile('.claude/commands/doc.md', `# Add Documentation
217
+ await this.writeGeneratedFile(
218
+ '.claude/commands/doc.md',
219
+ `# Add Documentation
203
220
 
204
221
  Read \`.contextkit/commands/add-documentation.md\` and execute the documentation workflow.
205
222
 
206
223
  Add inline docs, README sections, and usage examples for the specified code.
207
- `);
224
+ `
225
+ );
208
226
 
209
- await this.writeGeneratedFile('.claude/commands/spec.md', `# Spec
227
+ await this.writeGeneratedFile(
228
+ '.claude/commands/spec.md',
229
+ `# Spec
210
230
 
211
231
  Read \`.contextkit/commands/spec.md\` and execute the spec workflow.
212
232
 
213
233
  Write a component spec (MD-first) before any code is created. Scaffold the spec file colocated with the component and wait for review before coding begins.
214
- `);
234
+ `
235
+ );
215
236
 
216
237
  // Squad slash commands
217
- await this.writeGeneratedFile('.claude/commands/squad.md', `# Squad — Kickoff (start here)
238
+ await this.writeGeneratedFile(
239
+ '.claude/commands/squad.md',
240
+ `# Squad — Kickoff (start here)
218
241
 
219
242
  Read \`.contextkit/commands/squad.md\` and execute the squad kickoff workflow.
220
243
 
221
244
  Create the handoff file and write the PO spec for the given task. Pass the user's task description as the input.
222
245
 
223
246
  After kickoff, run \`/squad-auto\` to auto-run the full pipeline hands-free, or step through manually with \`/squad-architect\` → \`/squad-dev\` → \`/squad-test\` → \`/squad-review\` → \`/squad-doc\`.
224
- `);
247
+ `
248
+ );
225
249
 
226
- await this.writeGeneratedFile('.claude/commands/squad-architect.md', `# Squad — Architect (manual step 1/4)
250
+ await this.writeGeneratedFile(
251
+ '.claude/commands/squad-architect.md',
252
+ `# Squad — Architect (manual step 1/4)
227
253
 
228
254
  Read \`.contextkit/commands/squad-architect.md\` and execute the architect workflow.
229
255
 
230
256
  Read the PO spec from the handoff file, design the technical approach, and write the implementation plan. Use \`/squad-auto\` instead to run all steps automatically.
231
- `);
257
+ `
258
+ );
232
259
 
233
- await this.writeGeneratedFile('.claude/commands/squad-dev.md', `# Squad — Dev (manual step 2/4)
260
+ await this.writeGeneratedFile(
261
+ '.claude/commands/squad-dev.md',
262
+ `# Squad — Dev (manual step 2/4)
234
263
 
235
264
  Read \`.contextkit/commands/squad-dev.md\` and execute the dev workflow.
236
265
 
237
266
  Follow the architect's plan to implement the code changes. Use \`/squad-auto\` instead to run all steps automatically.
238
- `);
267
+ `
268
+ );
239
269
 
240
- await this.writeGeneratedFile('.claude/commands/squad-test.md', `# Squad — Test (manual step 3/4)
270
+ await this.writeGeneratedFile(
271
+ '.claude/commands/squad-test.md',
272
+ `# Squad — Test (manual step 3/4)
241
273
 
242
274
  Read \`.contextkit/commands/squad-test.md\` and execute the test workflow.
243
275
 
244
276
  Write and run tests against the PO's acceptance criteria. Use \`/squad-auto\` instead to run all steps automatically.
245
- `);
277
+ `
278
+ );
246
279
 
247
- await this.writeGeneratedFile('.claude/commands/squad-review.md', `# Squad — Review (manual step 4/4)
280
+ await this.writeGeneratedFile(
281
+ '.claude/commands/squad-review.md',
282
+ `# Squad — Review (manual step 4/4)
248
283
 
249
284
  Read \`.contextkit/commands/squad-review.md\` and execute the review workflow.
250
285
 
251
286
  Review the full handoff (spec, plan, implementation, tests) and write the final verdict. Use \`/squad-auto\` instead to run all steps automatically.
252
- `);
287
+ `
288
+ );
253
289
 
254
- await this.writeGeneratedFile('.claude/commands/squad-auto.md', `# Squad Auto — Full Pipeline (recommended)
290
+ await this.writeGeneratedFile(
291
+ '.claude/commands/squad-auto.md',
292
+ `# Squad Auto — Full Pipeline (recommended)
255
293
 
256
294
  Read \`.contextkit/commands/squad-auto.md\` and execute the pipeline runner workflow.
257
295
 
258
296
  Run after \`/squad\` kickoff. Automatically runs architect → dev → test → review for all tasks sequentially, hands-free.
259
- `);
297
+ `
298
+ );
260
299
 
261
- await this.writeGeneratedFile('.claude/commands/squad-auto-parallel.md', `# Squad Auto — Parallel Agents (batch, fastest)
300
+ await this.writeGeneratedFile(
301
+ '.claude/commands/squad-auto-parallel.md',
302
+ `# Squad Auto — Parallel Agents (batch, fastest)
262
303
 
263
304
  Read \`.contextkit/commands/squad-auto-parallel.md\` and execute the parallel pipeline workflow.
264
305
 
265
306
  Spawn one subagent per task per phase using the Task tool, so all tasks progress simultaneously instead of sequentially. Use this after \`/squad\` batch kickoff for faster execution on multi-task batches.
266
- `);
307
+ `
308
+ );
267
309
 
268
- await this.writeGeneratedFile('.claude/commands/squad-reset.md', `# Squad — Reset
310
+ await this.writeGeneratedFile(
311
+ '.claude/commands/squad-reset.md',
312
+ `# Squad — Reset
269
313
 
270
314
  Read \`.contextkit/commands/squad-reset.md\` and execute the reset workflow.
271
315
 
272
316
  Delete the current squad state (.contextkit/squad/) so you can start fresh. Use when the squad folder is in a mixed or stuck state.
273
- `);
317
+ `
318
+ );
274
319
 
275
- await this.writeGeneratedFile('.claude/commands/squad-doc.md', `# Squad — Doc (manual step 5/5)
320
+ await this.writeGeneratedFile(
321
+ '.claude/commands/squad-doc.md',
322
+ `# Squad — Doc (manual step 5/5)
276
323
 
277
324
  Read \`.contextkit/commands/squad-doc.md\` and execute the doc workflow.
278
325
 
279
326
  After review passes, create or update companion .md files for every new/modified code file in this task. Use \`/squad-auto\` instead to run all steps automatically.
280
- `);
327
+ `
328
+ );
281
329
 
282
- await this.writeGeneratedFile('.claude/commands/ck.md', `# ContextKit Health Check
330
+ await this.writeGeneratedFile(
331
+ '.claude/commands/ck.md',
332
+ `# ContextKit Health Check
283
333
 
284
334
  Read \`.contextkit/commands/health-check.md\` and execute the health check workflow.
285
335
 
286
336
  Check project setup, standards status, and integrations. Report what needs attention.
287
- `);
337
+ `
338
+ );
288
339
 
289
340
  // Doc family slash commands
290
- await this.writeGeneratedFile('.claude/commands/doc-arch.md', `# Doc — Architecture (Level 1)
341
+ await this.writeGeneratedFile(
342
+ '.claude/commands/doc-arch.md',
343
+ `# Doc — Architecture (Level 1)
291
344
 
292
345
  Read \`.contextkit/commands/doc-arch.md\` and execute the architecture documentation workflow.
293
346
 
294
347
  Detect the project stack, then generate or update \`docs/architecture.md\` with system boundaries, key flows, and stack-appropriate artifacts (Mermaid diagrams, component trees, service maps).
295
348
 
296
349
  Pass an optional PR number to scope to that PR's changes.
297
- `);
350
+ `
351
+ );
298
352
 
299
- await this.writeGeneratedFile('.claude/commands/doc-feature.md', `# Doc — Feature (Level 2)
353
+ await this.writeGeneratedFile(
354
+ '.claude/commands/doc-feature.md',
355
+ `# Doc — Feature (Level 2)
300
356
 
301
357
  Read \`.contextkit/commands/doc-feature.md\` and execute the feature documentation workflow.
302
358
 
303
359
  Detect the project stack, identify the target feature from the argument or current branch, then generate or update \`docs/features/<name>.md\` with purpose, components/modules, data flow, and user flows.
304
360
 
305
361
  Pass a feature name, directory path, or PR number to scope the documentation.
306
- `);
362
+ `
363
+ );
307
364
 
308
- await this.writeGeneratedFile('.claude/commands/doc-component.md', `# Doc — Component (Level 3)
365
+ await this.writeGeneratedFile(
366
+ '.claude/commands/doc-component.md',
367
+ `# Doc — Component (Level 3)
309
368
 
310
369
  Read \`.contextkit/commands/doc-component.md\` and execute the component documentation workflow.
311
370
 
312
371
  Detect the project stack, read the target file or directory, then create or update a colocated \`<name>.md\` with API/props, usage examples, behavior, and edge cases.
313
372
 
314
373
  Pass a file path or directory to target. Omit to infer from current context.
315
- `);
374
+ `
375
+ );
316
376
  }
317
377
 
318
378
  showUsage() {
@@ -339,7 +399,9 @@ Pass a file path or directory to target. Omit to infer from current context.
339
399
  console.log(chalk.dim(' /squad-test — Write and run tests'));
340
400
  console.log(chalk.dim(' /squad-review — Review and write verdict'));
341
401
  console.log(chalk.dim(' /squad-auto — Auto-run full pipeline (recommended)'));
342
- console.log(chalk.dim(' /squad-auto-parallel — Auto-run pipeline in parallel (batch, fastest)'));
402
+ console.log(
403
+ chalk.dim(' /squad-auto-parallel — Auto-run pipeline in parallel (batch, fastest)')
404
+ );
343
405
  console.log(chalk.dim(' /squad-doc — Document changes after review passes'));
344
406
  console.log(chalk.dim(''));
345
407
  console.log(chalk.dim(' Health check:'));
@@ -7,10 +7,7 @@ class ContinueIntegration extends BaseIntegration {
7
7
  super();
8
8
  this.name = 'continue';
9
9
  this.displayName = 'Continue';
10
- this.generatedFiles = [
11
- '.continue/rules/contextkit-standards.md',
12
- '.continue/config.yaml',
13
- ];
10
+ this.generatedFiles = ['.continue/rules/contextkit-standards.md', '.continue/config.yaml'];
14
11
  this.bridgeFiles = [];
15
12
  this.platformDir = '.continue/rules';
16
13
  }
@@ -75,7 +72,10 @@ context:
75
72
  `;
76
73
 
77
74
  // Only write config.yaml if neither config.yaml nor config.json exists
78
- if (!await fs.pathExists('.continue/config.yaml') && !await fs.pathExists('.continue/config.json')) {
75
+ if (
76
+ !(await fs.pathExists('.continue/config.yaml')) &&
77
+ !(await fs.pathExists('.continue/config.json'))
78
+ ) {
79
79
  await this.writeGeneratedFile('.continue/config.yaml', configYaml);
80
80
  } else if (await fs.pathExists('.continue/config.yaml')) {
81
81
  // Update existing yaml
@@ -49,7 +49,7 @@ ${this.getStandardsBlock()}
49
49
 
50
50
  // Add copilot instruction reference
51
51
  settings['github.copilot.chat.codeGeneration.instructions'] = [
52
- { file: '.github/copilot-instructions.md' }
52
+ { file: '.github/copilot-instructions.md' },
53
53
  ];
54
54
  settings['contextKit.standardsPath'] = '.contextkit/standards';
55
55
  settings['contextKit.templatesPath'] = '.contextkit/templates';
@@ -159,104 +159,146 @@ Reference: @.contextkit/standards/architecture.md
159
159
  await this.writeGeneratedFile('.cursor/rules/contextkit-api.mdc', apiRule);
160
160
 
161
161
  // Cursor prompts — reusable slash commands in Cursor Chat
162
- await this.writeGeneratedFile('.cursor/prompts/analyze.md', `# Analyze Project
162
+ await this.writeGeneratedFile(
163
+ '.cursor/prompts/analyze.md',
164
+ `# Analyze Project
163
165
 
164
166
  Read \`.contextkit/commands/analyze.md\` and execute the analysis workflow for this project.
165
167
 
166
168
  Scan the codebase structure, detect frameworks and patterns, then generate customized standards files in \`.contextkit/standards/\`.
167
- `);
169
+ `
170
+ );
168
171
 
169
- await this.writeGeneratedFile('.cursor/prompts/review.md', `# Code Review
172
+ await this.writeGeneratedFile(
173
+ '.cursor/prompts/review.md',
174
+ `# Code Review
170
175
 
171
176
  Read \`.contextkit/commands/review.md\` and execute the review workflow.
172
177
 
173
178
  Review current changes for correctness, standards compliance, and potential issues. Flag bugs, security concerns, and standards violations.
174
- `);
179
+ `
180
+ );
175
181
 
176
- await this.writeGeneratedFile('.cursor/prompts/fix.md', `# Fix Bug
182
+ await this.writeGeneratedFile(
183
+ '.cursor/prompts/fix.md',
184
+ `# Fix Bug
177
185
 
178
186
  Read \`.contextkit/commands/fix.md\` and execute the bug fix workflow.
179
187
 
180
188
  Diagnose the root cause, implement the minimal fix, and add a regression test.
181
- `);
189
+ `
190
+ );
182
191
 
183
- await this.writeGeneratedFile('.cursor/prompts/refactor.md', `# Refactor
192
+ await this.writeGeneratedFile(
193
+ '.cursor/prompts/refactor.md',
194
+ `# Refactor
184
195
 
185
196
  Read \`.contextkit/commands/refactor.md\` and execute the refactoring workflow.
186
197
 
187
198
  Improve code structure without changing behavior, keeping tests green at every step.
188
- `);
199
+ `
200
+ );
189
201
 
190
- await this.writeGeneratedFile('.cursor/prompts/test.md', `# Run Tests
202
+ await this.writeGeneratedFile(
203
+ '.cursor/prompts/test.md',
204
+ `# Run Tests
191
205
 
192
206
  Read \`.contextkit/commands/run-tests.md\` and execute the testing workflow.
193
207
 
194
208
  Generate or run tests for the specified code, covering happy paths, edge cases, and errors.
195
- `);
209
+ `
210
+ );
196
211
 
197
- await this.writeGeneratedFile('.cursor/prompts/doc.md', `# Add Documentation
212
+ await this.writeGeneratedFile(
213
+ '.cursor/prompts/doc.md',
214
+ `# Add Documentation
198
215
 
199
216
  Read \`.contextkit/commands/add-documentation.md\` and execute the documentation workflow.
200
217
 
201
218
  Add inline docs, README sections, and usage examples for the specified code.
202
- `);
219
+ `
220
+ );
203
221
 
204
222
  // Squad prompts
205
- await this.writeGeneratedFile('.cursor/prompts/squad.md', `# Squad — Kickoff
223
+ await this.writeGeneratedFile(
224
+ '.cursor/prompts/squad.md',
225
+ `# Squad — Kickoff
206
226
 
207
227
  Read \`.contextkit/commands/squad.md\` and execute the squad kickoff workflow.
208
228
 
209
229
  Create the handoff file and write the PO spec for the given task. Pass the user's task description as the input.
210
- `);
230
+ `
231
+ );
211
232
 
212
- await this.writeGeneratedFile('.cursor/prompts/squad-architect.md', `# Squad — Architect
233
+ await this.writeGeneratedFile(
234
+ '.cursor/prompts/squad-architect.md',
235
+ `# Squad — Architect
213
236
 
214
237
  Read \`.contextkit/commands/squad-architect.md\` and execute the architect workflow.
215
238
 
216
239
  Read the PO spec from the handoff file, design the technical approach, and write the implementation plan.
217
- `);
240
+ `
241
+ );
218
242
 
219
- await this.writeGeneratedFile('.cursor/prompts/squad-dev.md', `# Squad — Dev
243
+ await this.writeGeneratedFile(
244
+ '.cursor/prompts/squad-dev.md',
245
+ `# Squad — Dev
220
246
 
221
247
  Read \`.contextkit/commands/squad-dev.md\` and execute the dev workflow.
222
248
 
223
249
  Follow the architect's plan to implement the code changes.
224
- `);
250
+ `
251
+ );
225
252
 
226
- await this.writeGeneratedFile('.cursor/prompts/squad-test.md', `# Squad — Test
253
+ await this.writeGeneratedFile(
254
+ '.cursor/prompts/squad-test.md',
255
+ `# Squad — Test
227
256
 
228
257
  Read \`.contextkit/commands/squad-test.md\` and execute the test workflow.
229
258
 
230
259
  Write and run tests against the PO's acceptance criteria.
231
- `);
260
+ `
261
+ );
232
262
 
233
- await this.writeGeneratedFile('.cursor/prompts/squad-review.md', `# Squad — Review
263
+ await this.writeGeneratedFile(
264
+ '.cursor/prompts/squad-review.md',
265
+ `# Squad — Review
234
266
 
235
267
  Read \`.contextkit/commands/squad-review.md\` and execute the review workflow.
236
268
 
237
269
  Review the full handoff (spec, plan, implementation, tests) and write the final verdict.
238
- `);
270
+ `
271
+ );
239
272
 
240
- await this.writeGeneratedFile('.cursor/prompts/squad-auto.md', `# Squad Auto — Full Pipeline (recommended)
273
+ await this.writeGeneratedFile(
274
+ '.cursor/prompts/squad-auto.md',
275
+ `# Squad Auto — Full Pipeline (recommended)
241
276
 
242
277
  Read \`.contextkit/commands/squad-auto.md\` and execute the pipeline runner workflow.
243
278
 
244
279
  Run after kickoff. Automatically runs architect → dev → test → review for all tasks sequentially, hands-free.
245
- `);
280
+ `
281
+ );
246
282
 
247
- await this.writeGeneratedFile('.cursor/prompts/spec.md', `# Spec
283
+ await this.writeGeneratedFile(
284
+ '.cursor/prompts/spec.md',
285
+ `# Spec
248
286
 
249
287
  Read \`.contextkit/commands/spec.md\` and execute the spec workflow.
250
288
 
251
289
  Write a component spec (MD-first) before any code is created. Scaffold the spec file colocated with the component and wait for review before coding begins.
252
- `);
290
+ `
291
+ );
253
292
 
254
- await this.writeGeneratedFile('.cursor/prompts/ck.md', `# ContextKit Health Check
293
+ await this.writeGeneratedFile(
294
+ '.cursor/prompts/ck.md',
295
+ `# ContextKit Health Check
255
296
 
256
297
  Read \`.contextkit/commands/health-check.md\` and execute the health check workflow.
257
298
 
258
299
  Check project setup, standards status, and integrations. Report what needs attention.
259
- `);
300
+ `
301
+ );
260
302
  }
261
303
 
262
304
  showUsage() {
@@ -1,5 +1,4 @@
1
1
  const chalk = require('chalk');
2
- const fs = require('fs-extra');
3
2
  const BaseIntegration = require('./base-integration');
4
3
 
5
4
  class GeminiIntegration extends BaseIntegration {
@@ -32,18 +31,21 @@ Before writing code, check the relevant standards files above. Always follow the
32
31
 
33
32
  // Gemini settings
34
33
  const settings = {
35
- "description": "ContextKit - Context Engineering",
36
- "contextFiles": [
37
- ".contextkit/standards/code-style.md",
38
- ".contextkit/standards/testing.md",
39
- ".contextkit/standards/architecture.md",
40
- ".contextkit/standards/ai-guidelines.md",
41
- ".contextkit/standards/glossary.md",
42
- ".contextkit/product/mission-lite.md"
43
- ]
34
+ description: 'ContextKit - Context Engineering',
35
+ contextFiles: [
36
+ '.contextkit/standards/code-style.md',
37
+ '.contextkit/standards/testing.md',
38
+ '.contextkit/standards/architecture.md',
39
+ '.contextkit/standards/ai-guidelines.md',
40
+ '.contextkit/standards/glossary.md',
41
+ '.contextkit/product/mission-lite.md',
42
+ ],
44
43
  };
45
44
 
46
- await this.writeGeneratedFile('.gemini/settings.json', JSON.stringify(settings, null, 2) + '\n');
45
+ await this.writeGeneratedFile(
46
+ '.gemini/settings.json',
47
+ JSON.stringify(settings, null, 2) + '\n'
48
+ );
47
49
  }
48
50
 
49
51
  showUsage() {
@@ -29,7 +29,17 @@ function getIntegration(name) {
29
29
 
30
30
  function getAllIntegrationNames() {
31
31
  // Return unique names (exclude aliases like vscode)
32
- return ['claude', 'cursor', 'copilot', 'codex', 'opencode', 'gemini', 'aider', 'continue', 'windsurf'];
32
+ return [
33
+ 'claude',
34
+ 'cursor',
35
+ 'copilot',
36
+ 'codex',
37
+ 'opencode',
38
+ 'gemini',
39
+ 'aider',
40
+ 'continue',
41
+ 'windsurf',
42
+ ];
33
43
  }
34
44
 
35
45
  module.exports = { getIntegration, getAllIntegrationNames, INTEGRATIONS };
@@ -19,26 +19,29 @@ const LINES = [
19
19
  function hslToRgb(h, s, l) {
20
20
  s /= 100;
21
21
  l /= 100;
22
- const k = n => (n + h / 30) % 12;
22
+ const k = (n) => (n + h / 30) % 12;
23
23
  const a = s * Math.min(l, 1 - l);
24
- const f = n => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));
24
+ const f = (n) => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));
25
25
  return [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];
26
26
  }
27
27
 
28
28
  // ── Banner ─────────────────────────────────────────────────────────────────
29
29
 
30
30
  function printBanner() {
31
- const maxLen = Math.max(...LINES.map(l => l.length));
31
+ const maxLen = Math.max(...LINES.map((l) => l.length));
32
32
 
33
33
  console.log('');
34
- LINES.forEach(line => {
35
- const colored = line.split('').map((char, i) => {
36
- if (char === ' ') return ' ';
37
- // Cycle hues 20–290°: warm red → yellow → green → cyan → blue
38
- const hue = (i / maxLen) * 270 + 20;
39
- const [r, g, b] = hslToRgb(hue, 100, 65);
40
- return chalk.rgb(r, g, b)(char);
41
- }).join('');
34
+ LINES.forEach((line) => {
35
+ const colored = line
36
+ .split('')
37
+ .map((char, i) => {
38
+ if (char === ' ') return ' ';
39
+ // Cycle hues 20–290°: warm red yellow → green → cyan → blue
40
+ const hue = (i / maxLen) * 270 + 20;
41
+ const [r, g, b] = hslToRgb(hue, 100, 65);
42
+ return chalk.rgb(r, g, b)(char);
43
+ })
44
+ .join('');
42
45
  console.log(colored);
43
46
  });
44
47
  console.log('');
@@ -19,8 +19,8 @@ class DownloadManager {
19
19
  responseType: 'stream',
20
20
  timeout: this.timeout,
21
21
  headers: {
22
- 'User-Agent': 'contextkit-cli/1.0.0'
23
- }
22
+ 'User-Agent': 'contextkit-cli/1.0.0',
23
+ },
24
24
  });
25
25
 
26
26
  const writer = fs.createWriteStream(outputPath);
@@ -30,11 +30,10 @@ class DownloadManager {
30
30
  writer.on('finish', resolve);
31
31
  writer.on('error', reject);
32
32
  });
33
-
34
33
  } catch (error) {
35
34
  if (retryCount < this.retries) {
36
35
  console.log(`Retrying download (${retryCount + 1}/${this.retries})...`);
37
- await new Promise(resolve => setTimeout(resolve, 1000 * (retryCount + 1)));
36
+ await new Promise((resolve) => setTimeout(resolve, 1000 * (retryCount + 1)));
38
37
  return this.downloadFile(url, outputPath, retryCount + 1);
39
38
  }
40
39
  throw new Error(`Failed to download ${url}: ${error.message}`);
@@ -40,7 +40,6 @@ class GitHooksManager {
40
40
  }
41
41
 
42
42
  console.log(chalk.green('✅ Git hooks setup complete'));
43
-
44
43
  } catch (error) {
45
44
  console.log(chalk.red('❌ Git hooks setup failed:'), error.message);
46
45
  throw error;
@@ -87,7 +86,7 @@ class GitHooksManager {
87
86
 
88
87
  await fs.writeJson('package.json', pkg, { spaces: 2 });
89
88
  console.log(chalk.green('✅ Added prepare script to package.json'));
90
- } catch (error) {
89
+ } catch {
91
90
  console.log(chalk.yellow('⚠️ Could not update package.json prepare script'));
92
91
  }
93
92
  }
@@ -138,7 +137,7 @@ class GitHooksManager {
138
137
  try {
139
138
  execSync('git config --unset core.hooksPath', { stdio: 'pipe' });
140
139
  console.log(chalk.green('✅ Removed core.hooksPath config'));
141
- } catch (error) {
140
+ } catch {
142
141
  // Already unset, that's fine
143
142
  }
144
143
 
@@ -167,7 +166,7 @@ class GitHooksManager {
167
166
  }
168
167
 
169
168
  await fs.writeJson('package.json', pkg, { spaces: 2 });
170
- } catch (error) {
169
+ } catch {
171
170
  // Best effort
172
171
  }
173
172
  }
@@ -11,12 +11,14 @@ class MigrationRunner {
11
11
  * @param {string} configPath - path to config.yml
12
12
  */
13
13
  async run(currentVersion, configPath) {
14
- const from = (currentVersion === undefined || currentVersion === null) ? 0 : currentVersion;
14
+ const from = currentVersion === undefined || currentVersion === null ? 0 : currentVersion;
15
15
 
16
16
  if (from > CURRENT_FORMAT_VERSION) {
17
- console.log(chalk.yellow(
18
- `⚠️ .contextkit/ format version (${from}) is newer than this version of ContextKit (${CURRENT_FORMAT_VERSION}). Skipping migration.`
19
- ));
17
+ console.log(
18
+ chalk.yellow(
19
+ `⚠️ .contextkit/ format version (${from}) is newer than this version of ContextKit (${CURRENT_FORMAT_VERSION}). Skipping migration.`
20
+ )
21
+ );
20
22
  return;
21
23
  }
22
24