@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.
- package/README.md +65 -46
- package/bin/contextkit.js +4 -2
- package/lib/commands/analyze.js +131 -91
- package/lib/commands/check.js +24 -18
- package/lib/commands/install.js +274 -71
- package/lib/commands/note.js +12 -20
- package/lib/commands/run.js +20 -22
- package/lib/commands/status.js +61 -32
- package/lib/commands/update.js +25 -26
- package/lib/index.js +1 -1
- package/lib/integrations/aider-integration.js +1 -1
- package/lib/integrations/base-integration.js +13 -6
- package/lib/integrations/claude-integration.js +103 -41
- package/lib/integrations/continue-integration.js +5 -5
- package/lib/integrations/copilot-integration.js +1 -1
- package/lib/integrations/cursor-integration.js +70 -28
- package/lib/integrations/gemini-integration.js +13 -11
- package/lib/integrations/index.js +11 -1
- package/lib/utils/banner.js +14 -11
- package/lib/utils/download.js +3 -4
- package/lib/utils/git-hooks.js +3 -4
- package/lib/utils/migrations.js +6 -4
- package/lib/utils/migrations.md +4 -3
- package/lib/utils/notifier.js +1 -1
- package/lib/utils/project-detector.js +11 -5
- package/lib/utils/status-manager.js +6 -7
- package/lib/utils/tool-detector.js +19 -21
- package/package.json +8 -2
|
@@ -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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 (
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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(
|
|
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 [
|
|
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 };
|
package/lib/utils/banner.js
CHANGED
|
@@ -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
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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('');
|
package/lib/utils/download.js
CHANGED
|
@@ -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}`);
|
package/lib/utils/git-hooks.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
169
|
+
} catch {
|
|
171
170
|
// Best effort
|
|
172
171
|
}
|
|
173
172
|
}
|
package/lib/utils/migrations.js
CHANGED
|
@@ -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 =
|
|
14
|
+
const from = currentVersion === undefined || currentVersion === null ? 0 : currentVersion;
|
|
15
15
|
|
|
16
16
|
if (from > CURRENT_FORMAT_VERSION) {
|
|
17
|
-
console.log(
|
|
18
|
-
|
|
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
|
|