k-harness 0.1.0 → 0.3.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 +5 -1
- package/package.json +1 -1
- package/src/init.js +125 -7
package/README.md
CHANGED
|
@@ -28,13 +28,15 @@ npx k-harness init --ide claude
|
|
|
28
28
|
npx k-harness init --ide cursor
|
|
29
29
|
npx k-harness init --ide codex
|
|
30
30
|
npx k-harness init --ide windsurf
|
|
31
|
+
npx k-harness init --ide augment
|
|
32
|
+
npx k-harness init --ide antigravity
|
|
31
33
|
```
|
|
32
34
|
|
|
33
35
|
### Options
|
|
34
36
|
|
|
35
37
|
| Flag | Description |
|
|
36
38
|
|------|-------------|
|
|
37
|
-
| `--ide <name>` | Target IDE: `vscode`, `claude`, `cursor`, `codex`, `windsurf` |
|
|
39
|
+
| `--ide <name>` | Target IDE: `vscode`, `claude`, `cursor`, `codex`, `windsurf`, `augment`, `antigravity` |
|
|
38
40
|
| `--dir <path>` | Target directory (default: current directory) |
|
|
39
41
|
| `--overwrite` | Overwrite existing files |
|
|
40
42
|
|
|
@@ -47,6 +49,8 @@ npx k-harness init --ide windsurf
|
|
|
47
49
|
| **Cursor** | `.cursor/rules/core.mdc` | `.cursor/rules/*.mdc` | `.cursor/rules/*.mdc` | `.cursor/rules/*.mdc` |
|
|
48
50
|
| **Codex** | `AGENTS.md` | (merged into AGENTS.md) | `.agents/skills/*/SKILL.md` | (merged into AGENTS.md) |
|
|
49
51
|
| **Windsurf** | `.windsurfrules` | (merged) | (merged) | (merged) |
|
|
52
|
+
| **Augment Code** | `.augment/rules/core.md` | `.augment/rules/*.md` | `.augment/skills/*/SKILL.md` | `.augment/skills/*/SKILL.md` |
|
|
53
|
+
| **Google Antigravity** | `.agent/rules/core.md` | `.agent/rules/*.md` | `.agent/skills/*/SKILL.md` | `.agent/skills/*/SKILL.md` |
|
|
50
54
|
|
|
51
55
|
All IDEs also get `project-state.md`, `failure-patterns.md`, `features.md`, and `project-brief.md` at the project root.
|
|
52
56
|
|
package/package.json
CHANGED
package/src/init.js
CHANGED
|
@@ -210,13 +210,131 @@ function generateWindsurf(targetDir, overwrite) {
|
|
|
210
210
|
writeFile(targetDir, 'project-brief.md', readTemplate('project-brief.md'), overwrite);
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
+
function generateAugment(targetDir, overwrite) {
|
|
214
|
+
// .augment/rules/ — Always-type rules for core, testing, backend
|
|
215
|
+
const coreRules = readTemplate('core-rules.md');
|
|
216
|
+
const coreRule =
|
|
217
|
+
'---\ndescription: Core project rules — Iron Laws, completion protocol, concreteness\ntype: always\n---\n\n' +
|
|
218
|
+
coreRules;
|
|
219
|
+
writeFile(targetDir, '.augment/rules/core.md', coreRule, overwrite);
|
|
220
|
+
|
|
221
|
+
const testingRules = readTemplate('testing-rules.md');
|
|
222
|
+
const testingRule =
|
|
223
|
+
'---\ndescription: Testing rules — mock sync, forbidden patterns\ntype: auto\nglobs: "**/*.test.*,**/*.spec.*,**/__mocks__/**,**/__tests__/**"\n---\n\n' +
|
|
224
|
+
testingRules;
|
|
225
|
+
writeFile(targetDir, '.augment/rules/testing.md', testingRule, overwrite);
|
|
226
|
+
|
|
227
|
+
const backendRules = readTemplate('backend-rules.md');
|
|
228
|
+
const backendRule =
|
|
229
|
+
'---\ndescription: Backend code rules — architecture enforcement, type safety\ntype: auto\nglobs: "src/**/*.ts,src/**/*.js"\n---\n\n' +
|
|
230
|
+
backendRules;
|
|
231
|
+
writeFile(targetDir, '.augment/rules/backend.md', backendRule, overwrite);
|
|
232
|
+
|
|
233
|
+
// .augment/skills/ — SKILL.md format (enables / slash commands)
|
|
234
|
+
const skills = [
|
|
235
|
+
{ id: 'test-integrity', desc: 'Ensure test mocks stay synchronized when interfaces change. Use when modifying repository or service interfaces.' },
|
|
236
|
+
{ id: 'security-checklist', desc: 'Security risk inspection before commits. Use when reviewing code for security issues.' },
|
|
237
|
+
{ id: 'investigate', desc: 'Investigate and diagnose issues. Use when debugging or analyzing unexpected behavior.' },
|
|
238
|
+
{ id: 'impact-analysis', desc: 'Assess change blast radius. Use when modifying shared modules or interfaces.' },
|
|
239
|
+
{ id: 'feature-breakdown', desc: 'Break down features into implementable stories. Use when planning new features.' },
|
|
240
|
+
];
|
|
241
|
+
for (const skill of skills) {
|
|
242
|
+
const content = readTemplate(`skills/${skill.id}.md`);
|
|
243
|
+
const skillMd =
|
|
244
|
+
`---\nname: ${skill.id}\ndescription: '${skill.desc}'\n---\n\n` +
|
|
245
|
+
content;
|
|
246
|
+
writeFile(targetDir, `.augment/skills/${skill.id}/SKILL.md`, skillMd, overwrite);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Agents as skills (invokable via / commands)
|
|
250
|
+
const agents = [
|
|
251
|
+
{ id: 'reviewer', file: 'agents/reviewer.md', desc: 'Code review + auto-fix. Validates quality, security, and test integrity before commits.' },
|
|
252
|
+
{ id: 'sprint-manager', file: 'agents/sprint-manager.md', desc: 'Sprint/Story state tracking, next task guidance, scope drift prevention.' },
|
|
253
|
+
{ id: 'planner', file: 'agents/planner.md', desc: 'Feature planning and dependency management. Analyze architecture, break down features.' },
|
|
254
|
+
];
|
|
255
|
+
for (const agent of agents) {
|
|
256
|
+
const content = readTemplate(agent.file);
|
|
257
|
+
const skillMd =
|
|
258
|
+
`---\nname: ${agent.id}\ndescription: '${agent.desc}'\n---\n\n` +
|
|
259
|
+
content;
|
|
260
|
+
writeFile(targetDir, `.augment/skills/${agent.id}/SKILL.md`, skillMd, overwrite);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// State files
|
|
264
|
+
writeFile(targetDir, 'project-state.md', readTemplate('project-state.md'), overwrite);
|
|
265
|
+
writeFile(targetDir, 'failure-patterns.md', readTemplate('failure-patterns.md'), overwrite);
|
|
266
|
+
writeFile(targetDir, 'dependency-map.md', readTemplate('dependency-map.md'), overwrite);
|
|
267
|
+
writeFile(targetDir, 'features.md', readTemplate('features.md'), overwrite);
|
|
268
|
+
writeFile(targetDir, 'project-brief.md', readTemplate('project-brief.md'), overwrite);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function generateAntigravity(targetDir, overwrite) {
|
|
272
|
+
// .agent/rules/ — Always-type rules (same as Augment format, read by Antigravity)
|
|
273
|
+
const coreRules = readTemplate('core-rules.md');
|
|
274
|
+
const coreRule =
|
|
275
|
+
'---\ndescription: Core project rules — Iron Laws, completion protocol, concreteness\ntype: always\n---\n\n' +
|
|
276
|
+
coreRules;
|
|
277
|
+
writeFile(targetDir, '.agent/rules/core.md', coreRule, overwrite);
|
|
278
|
+
|
|
279
|
+
const testingRules = readTemplate('testing-rules.md');
|
|
280
|
+
const testingRule =
|
|
281
|
+
'---\ndescription: Testing rules — mock sync, forbidden patterns\ntype: auto\nglobs: "**/*.test.*,**/*.spec.*,**/__mocks__/**,**/__tests__/**"\n---\n\n' +
|
|
282
|
+
testingRules;
|
|
283
|
+
writeFile(targetDir, '.agent/rules/testing.md', testingRule, overwrite);
|
|
284
|
+
|
|
285
|
+
const backendRules = readTemplate('backend-rules.md');
|
|
286
|
+
const backendRule =
|
|
287
|
+
'---\ndescription: Backend code rules — architecture enforcement, type safety\ntype: auto\nglobs: "src/**/*.ts,src/**/*.js"\n---\n\n' +
|
|
288
|
+
backendRules;
|
|
289
|
+
writeFile(targetDir, '.agent/rules/backend.md', backendRule, overwrite);
|
|
290
|
+
|
|
291
|
+
// .agent/skills/ — SKILL.md format (enables / slash commands)
|
|
292
|
+
const skills = [
|
|
293
|
+
{ id: 'test-integrity', desc: 'Ensure test mocks stay synchronized when interfaces change. Use when modifying repository or service interfaces.' },
|
|
294
|
+
{ id: 'security-checklist', desc: 'Security risk inspection before commits. Use when reviewing code for security issues.' },
|
|
295
|
+
{ id: 'investigate', desc: 'Investigate and diagnose issues. Use when debugging or analyzing unexpected behavior.' },
|
|
296
|
+
{ id: 'impact-analysis', desc: 'Assess change blast radius. Use when modifying shared modules or interfaces.' },
|
|
297
|
+
{ id: 'feature-breakdown', desc: 'Break down features into implementable stories. Use when planning new features.' },
|
|
298
|
+
];
|
|
299
|
+
for (const skill of skills) {
|
|
300
|
+
const content = readTemplate(`skills/${skill.id}.md`);
|
|
301
|
+
const skillMd =
|
|
302
|
+
`---\nname: ${skill.id}\ndescription: '${skill.desc}'\n---\n\n` +
|
|
303
|
+
content;
|
|
304
|
+
writeFile(targetDir, `.agent/skills/${skill.id}/SKILL.md`, skillMd, overwrite);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Agents as skills (invokable via / commands)
|
|
308
|
+
const agents = [
|
|
309
|
+
{ id: 'reviewer', file: 'agents/reviewer.md', desc: 'Code review + auto-fix. Validates quality, security, and test integrity before commits.' },
|
|
310
|
+
{ id: 'sprint-manager', file: 'agents/sprint-manager.md', desc: 'Sprint/Story state tracking, next task guidance, scope drift prevention.' },
|
|
311
|
+
{ id: 'planner', file: 'agents/planner.md', desc: 'Feature planning and dependency management. Analyze architecture, break down features.' },
|
|
312
|
+
];
|
|
313
|
+
for (const agent of agents) {
|
|
314
|
+
const content = readTemplate(agent.file);
|
|
315
|
+
const skillMd =
|
|
316
|
+
`---\nname: ${agent.id}\ndescription: '${agent.desc}'\n---\n\n` +
|
|
317
|
+
content;
|
|
318
|
+
writeFile(targetDir, `.agent/skills/${agent.id}/SKILL.md`, skillMd, overwrite);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// State files
|
|
322
|
+
writeFile(targetDir, 'project-state.md', readTemplate('project-state.md'), overwrite);
|
|
323
|
+
writeFile(targetDir, 'failure-patterns.md', readTemplate('failure-patterns.md'), overwrite);
|
|
324
|
+
writeFile(targetDir, 'dependency-map.md', readTemplate('dependency-map.md'), overwrite);
|
|
325
|
+
writeFile(targetDir, 'features.md', readTemplate('features.md'), overwrite);
|
|
326
|
+
writeFile(targetDir, 'project-brief.md', readTemplate('project-brief.md'), overwrite);
|
|
327
|
+
}
|
|
328
|
+
|
|
213
329
|
// ─── IDE registry ────────────────────────────────────────────
|
|
214
330
|
const GENERATORS = {
|
|
215
|
-
vscode:
|
|
216
|
-
claude:
|
|
217
|
-
cursor:
|
|
218
|
-
codex:
|
|
219
|
-
windsurf:
|
|
331
|
+
vscode: { name: 'VS Code Copilot', fn: generateVscode },
|
|
332
|
+
claude: { name: 'Claude Code', fn: generateClaude },
|
|
333
|
+
cursor: { name: 'Cursor', fn: generateCursor },
|
|
334
|
+
codex: { name: 'Codex (OpenAI)', fn: generateCodex },
|
|
335
|
+
windsurf: { name: 'Windsurf', fn: generateWindsurf },
|
|
336
|
+
augment: { name: 'Augment Code', fn: generateAugment },
|
|
337
|
+
antigravity: { name: 'Google Antigravity', fn: generateAntigravity },
|
|
220
338
|
};
|
|
221
339
|
|
|
222
340
|
// ─── Interactive prompt ──────────────────────────────────────
|
|
@@ -238,7 +356,7 @@ async function promptIde() {
|
|
|
238
356
|
});
|
|
239
357
|
console.log();
|
|
240
358
|
|
|
241
|
-
const answer = await askQuestion(
|
|
359
|
+
const answer = await askQuestion(` Choice (1-${keys.length}): `);
|
|
242
360
|
const idx = parseInt(answer, 10) - 1;
|
|
243
361
|
if (idx < 0 || idx >= keys.length || isNaN(idx)) {
|
|
244
362
|
console.error(' Invalid choice.');
|
|
@@ -256,7 +374,7 @@ function showHelp() {
|
|
|
256
374
|
npx k-harness init [options]
|
|
257
375
|
|
|
258
376
|
Options:
|
|
259
|
-
--ide <name> IDE target: vscode, claude, cursor, codex, windsurf
|
|
377
|
+
--ide <name> IDE target: vscode, claude, cursor, codex, windsurf, augment, antigravity
|
|
260
378
|
--dir <path> Target directory (default: current directory)
|
|
261
379
|
--overwrite Overwrite existing files
|
|
262
380
|
--help Show this help
|