agents-templated 2.0.0 → 2.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/bin/cli.js +141 -65
- package/index.js +2 -3
- package/lib/instructions.js +163 -129
- package/lib/layout.js +9 -1
- package/package.json +1 -1
- package/templates/AGENTS.md +3 -7
- package/templates/CLAUDE.md +150 -7
- package/templates/agents/rules/ai-integration.mdc +54 -0
- package/templates/agents/rules/guardrails.mdc +97 -0
- package/templates/agents/rules/intent-routing.mdc +9 -0
- package/templates/agents/rules/planning.mdc +69 -0
- package/templates/agents/skills/api-design/SKILL.md +59 -0
- package/templates/agents/skills/llm-integration/SKILL.md +64 -0
- package/templates/agents/subagents/README.md +76 -0
- package/templates/agents/subagents/architect.md +106 -0
- package/templates/agents/subagents/build-error-resolver.md +119 -0
- package/templates/agents/subagents/code-reviewer.md +116 -0
- package/templates/agents/subagents/doc-updater.md +130 -0
- package/templates/agents/subagents/e2e-runner.md +122 -0
- package/templates/agents/subagents/planner.md +87 -0
- package/templates/agents/subagents/refactor-cleaner.md +137 -0
- package/templates/agents/subagents/security-reviewer.md +138 -0
- package/templates/agents/subagents/tdd-guide.md +98 -0
package/bin/cli.js
CHANGED
|
@@ -10,15 +10,18 @@ const {
|
|
|
10
10
|
LAYOUT,
|
|
11
11
|
resolveRulesDir,
|
|
12
12
|
resolveSkillsDir,
|
|
13
|
+
resolveSubagentsDir,
|
|
13
14
|
hasAnyLayout,
|
|
14
15
|
getLegacyMigrationPlan
|
|
15
16
|
} = require('../lib/layout');
|
|
16
17
|
const {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
KNOWN_ORPHAN_PATHS,
|
|
18
|
+
CANONICAL_INSTRUCTION_FILE,
|
|
19
|
+
POINTER_FILES,
|
|
20
20
|
writeGeneratedInstructions,
|
|
21
|
-
validateInstructionDrift
|
|
21
|
+
validateInstructionDrift,
|
|
22
|
+
scaffoldSkill,
|
|
23
|
+
scaffoldRule,
|
|
24
|
+
scaffoldSubagent
|
|
22
25
|
} = require('../lib/instructions');
|
|
23
26
|
|
|
24
27
|
// Resolve the templates directory - works in both dev and installed contexts
|
|
@@ -51,6 +54,7 @@ program
|
|
|
51
54
|
.option('-r, --rules', 'Install agent rules only')
|
|
52
55
|
.option('-s, --skills', 'Install skills only')
|
|
53
56
|
.option('-g, --github', 'Install GitHub Copilot instructions')
|
|
57
|
+
.option('-S, --subagents', 'Install agent subagents only')
|
|
54
58
|
.option('-p, --preset <name>', 'Use a preset configuration (nextjs, django-react, express-api, fastapi, go-api)')
|
|
55
59
|
.option('-f, --force', 'Overwrite existing files')
|
|
56
60
|
.action(async (options) => {
|
|
@@ -120,7 +124,8 @@ program
|
|
|
120
124
|
{ name: 'Documentation files (agent-docs/)', value: 'docs' },
|
|
121
125
|
{ name: 'Agent rules (.github/instructions/rules/*.mdc)', value: 'rules' },
|
|
122
126
|
{ name: 'Skills (.github/skills/*)', value: 'skills' },
|
|
123
|
-
{ name: 'AI Agent instructions (Cursor, Copilot, Claude, Generic AGENTS)', value: 'github' }
|
|
127
|
+
{ name: 'AI Agent instructions (Cursor, Copilot, Claude, Generic AGENTS)', value: 'github' },
|
|
128
|
+
{ name: 'Agent subagents (agents/subagents/*.md)', value: 'subagents' }
|
|
124
129
|
],
|
|
125
130
|
default: ['all']
|
|
126
131
|
},
|
|
@@ -142,6 +147,7 @@ program
|
|
|
142
147
|
if (options.rules) choices.push('rules');
|
|
143
148
|
if (options.skills) choices.push('skills');
|
|
144
149
|
if (options.github) choices.push('github');
|
|
150
|
+
if (options.subagents) choices.push('subagents');
|
|
145
151
|
}
|
|
146
152
|
|
|
147
153
|
const installAll = choices.includes('all');
|
|
@@ -153,7 +159,6 @@ program
|
|
|
153
159
|
const targetDocsDir = path.join(targetDir, 'agent-docs');
|
|
154
160
|
await fs.ensureDir(targetDocsDir);
|
|
155
161
|
await copyDirectory(sourceDir, targetDocsDir, options.force);
|
|
156
|
-
await copyFiles(templateDir, targetDir, [CORE_SOURCE_REL_PATH], options.force);
|
|
157
162
|
}
|
|
158
163
|
|
|
159
164
|
// Install agent rules
|
|
@@ -183,18 +188,28 @@ program
|
|
|
183
188
|
console.log(chalk.yellow('Installing AI agent instructions...'));
|
|
184
189
|
await fs.ensureDir(path.join(targetDir, '.github', 'instructions'));
|
|
185
190
|
await writeGeneratedInstructions(targetDir, templateDir, options.force);
|
|
186
|
-
console.log(chalk.gray(' ✓
|
|
187
|
-
console.log(chalk.gray(' ✓ GitHub Copilot (.github/copilot-instructions.md
|
|
188
|
-
console.log(chalk.gray(' ✓
|
|
189
|
-
|
|
191
|
+
console.log(chalk.gray(' ✓ Claude (CLAUDE.md — canonical source)'));
|
|
192
|
+
console.log(chalk.gray(' ✓ GitHub Copilot (.github/copilot-instructions.md pointer)'));
|
|
193
|
+
console.log(chalk.gray(' ✓ Generic AGENTS (AGENTS.MD pointer)'));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Install agent subagents
|
|
197
|
+
if (installAll || choices.includes('subagents')) {
|
|
198
|
+
console.log(chalk.yellow('Installing agent subagents...'));
|
|
199
|
+
await fs.ensureDir(path.join(targetDir, LAYOUT.canonical.subagentsDir));
|
|
200
|
+
await copyDirectory(
|
|
201
|
+
path.join(templateDir, 'agents', 'subagents'),
|
|
202
|
+
path.join(targetDir, LAYOUT.canonical.subagentsDir),
|
|
203
|
+
options.force
|
|
204
|
+
);
|
|
190
205
|
}
|
|
191
206
|
|
|
192
207
|
console.log(chalk.green.bold('\nInstallation complete!\n'));
|
|
193
208
|
console.log(chalk.cyan('Next steps:'));
|
|
194
|
-
console.log(chalk.white(' 1. Review
|
|
209
|
+
console.log(chalk.white(' 1. Review CLAUDE.md (canonical AI policy — edit this directly)'));
|
|
195
210
|
console.log(chalk.white(' 2. Review agent-docs/ARCHITECTURE.md for project guidelines'));
|
|
196
|
-
console.log(chalk.white(' 3.
|
|
197
|
-
console.log(chalk.white(' 4. Configure your AI assistant (
|
|
211
|
+
console.log(chalk.white(' 3. AGENTS.MD and .github/copilot-instructions.md are thin compatibility pointers'));
|
|
212
|
+
console.log(chalk.white(' 4. Configure your AI assistant (Copilot, Claude, etc.)'));
|
|
198
213
|
console.log(chalk.white(' 5. Adapt the rules to your technology stack\n'));
|
|
199
214
|
|
|
200
215
|
} catch (error) {
|
|
@@ -241,7 +256,8 @@ program
|
|
|
241
256
|
{ name: 'Documentation (agent-docs/)', value: 'docs' },
|
|
242
257
|
{ name: 'Agent Rules (security, testing, database, etc.)', value: 'rules' },
|
|
243
258
|
{ name: 'Skills (reusable agent capabilities)', value: 'skills' },
|
|
244
|
-
{ name: 'AI Agent instructions (Cursor, Copilot, Claude, Generic AGENTS)', value: 'github' }
|
|
259
|
+
{ name: 'AI Agent instructions (Cursor, Copilot, Claude, Generic AGENTS)', value: 'github' },
|
|
260
|
+
{ name: 'Agent subagents (agents/subagents/*.md)', value: 'subagents' }
|
|
245
261
|
],
|
|
246
262
|
validate: (answer) => {
|
|
247
263
|
if (answer.length === 0) {
|
|
@@ -277,7 +293,8 @@ program
|
|
|
277
293
|
{ name: 'Documentation (agent-docs/)', value: 'docs', checked: true },
|
|
278
294
|
{ name: 'Agent Rules (security, testing, database, etc.)', value: 'rules', checked: true },
|
|
279
295
|
{ name: 'Skills (reusable agent capabilities)', value: 'skills', checked: true },
|
|
280
|
-
{ name: 'AI Agent instructions (Cursor, Copilot, Claude, Generic AGENTS)', value: 'github', checked: true }
|
|
296
|
+
{ name: 'AI Agent instructions (Cursor, Copilot, Claude, Generic AGENTS)', value: 'github', checked: true },
|
|
297
|
+
{ name: 'Agent subagents (agents/subagents/*.md)', value: 'subagents', checked: true }
|
|
281
298
|
],
|
|
282
299
|
validate: (answer) => {
|
|
283
300
|
if (answer.length === 0) {
|
|
@@ -302,7 +319,8 @@ program
|
|
|
302
319
|
docs: componentAnswers.components.includes('docs'),
|
|
303
320
|
rules: componentAnswers.components.includes('rules'),
|
|
304
321
|
skills: componentAnswers.components.includes('skills'),
|
|
305
|
-
github: componentAnswers.components.includes('github')
|
|
322
|
+
github: componentAnswers.components.includes('github'),
|
|
323
|
+
subagents: componentAnswers.components.includes('subagents')
|
|
306
324
|
};
|
|
307
325
|
|
|
308
326
|
// Install documentation files
|
|
@@ -312,7 +330,6 @@ program
|
|
|
312
330
|
const targetDocsDir = path.join(targetDir, 'agent-docs');
|
|
313
331
|
await fs.ensureDir(targetDocsDir);
|
|
314
332
|
await copyDirectory(sourceDocsDir, targetDocsDir, options.force);
|
|
315
|
-
await copyFiles(templateDir, targetDir, [CORE_SOURCE_REL_PATH], options.force);
|
|
316
333
|
}
|
|
317
334
|
|
|
318
335
|
// Install agent rules
|
|
@@ -342,20 +359,30 @@ program
|
|
|
342
359
|
console.log(chalk.yellow('Installing AI agent instructions...'));
|
|
343
360
|
await fs.ensureDir(path.join(targetDir, '.github', 'instructions'));
|
|
344
361
|
await writeGeneratedInstructions(targetDir, templateDir, options.force);
|
|
345
|
-
console.log(chalk.gray(' ✓
|
|
346
|
-
console.log(chalk.gray(' ✓ GitHub Copilot (.github/copilot-instructions.md
|
|
347
|
-
console.log(chalk.gray(' ✓
|
|
348
|
-
|
|
362
|
+
console.log(chalk.gray(' ✓ Claude (CLAUDE.md — canonical source)'));
|
|
363
|
+
console.log(chalk.gray(' ✓ GitHub Copilot (.github/copilot-instructions.md pointer)'));
|
|
364
|
+
console.log(chalk.gray(' ✓ Generic AGENTS (AGENTS.MD pointer)'));
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// Install agent subagents
|
|
368
|
+
if (options.subagents) {
|
|
369
|
+
console.log(chalk.yellow('Installing agent subagents...'));
|
|
370
|
+
await fs.ensureDir(path.join(targetDir, LAYOUT.canonical.subagentsDir));
|
|
371
|
+
await copyDirectory(
|
|
372
|
+
path.join(templateDir, 'agents', 'subagents'),
|
|
373
|
+
path.join(targetDir, LAYOUT.canonical.subagentsDir),
|
|
374
|
+
options.force
|
|
375
|
+
);
|
|
349
376
|
}
|
|
350
377
|
|
|
351
378
|
// Show summary and next steps
|
|
352
379
|
console.log(chalk.green.bold('\n✅ Installation complete!\n'));
|
|
353
380
|
|
|
354
381
|
console.log(chalk.cyan('\n📚 Next Steps:\n'));
|
|
355
|
-
console.log(chalk.white(' 1. Review
|
|
382
|
+
console.log(chalk.white(' 1. Review CLAUDE.md (canonical AI policy — edit this directly)'));
|
|
356
383
|
console.log(chalk.white(' 2. Review agent-docs/ARCHITECTURE.md for project guidelines'));
|
|
357
|
-
console.log(chalk.white(' 3.
|
|
358
|
-
console.log(chalk.white(' 4. Customize
|
|
384
|
+
console.log(chalk.white(' 3. AGENTS.MD and .github/copilot-instructions.md are thin pointers to CLAUDE.md'));
|
|
385
|
+
console.log(chalk.white(' 4. Customize agents/rules/*.mdc for your tech stack'));
|
|
359
386
|
|
|
360
387
|
console.log(chalk.cyan('\n🔒 Security Reminder:\n'));
|
|
361
388
|
console.log(chalk.white(' • Review agents/rules/security.mdc'));
|
|
@@ -378,6 +405,7 @@ program
|
|
|
378
405
|
console.log(chalk.yellow('rules') + ' - Agent rules (.github/instructions/rules/*.mdc)');
|
|
379
406
|
console.log(chalk.yellow('skills') + ' - Agent skills (.github/skills/*)');
|
|
380
407
|
console.log(chalk.yellow('github') + ' - AI Agent instructions (Cursor, Copilot, Claude, Generic AGENTS)');
|
|
408
|
+
console.log(chalk.yellow('subagents') + ' - Agent subagents (agents/subagents/*.md)');
|
|
381
409
|
console.log(chalk.yellow('all') + ' - All components');
|
|
382
410
|
|
|
383
411
|
console.log(chalk.blue.bold('\n\nAvailable Presets:\n'));
|
|
@@ -402,12 +430,12 @@ program
|
|
|
402
430
|
let warnings = [];
|
|
403
431
|
let passed = [];
|
|
404
432
|
|
|
405
|
-
// Check canonical
|
|
406
|
-
const
|
|
407
|
-
if (await fs.pathExists(
|
|
408
|
-
passed.push(`✓ ${
|
|
433
|
+
// Check canonical instruction file
|
|
434
|
+
const claudePath = path.join(targetDir, CANONICAL_INSTRUCTION_FILE);
|
|
435
|
+
if (await fs.pathExists(claudePath)) {
|
|
436
|
+
passed.push(`✓ ${CANONICAL_INSTRUCTION_FILE} found (canonical policy source)`);
|
|
409
437
|
} else {
|
|
410
|
-
warnings.push(`⚠ ${
|
|
438
|
+
warnings.push(`⚠ ${CANONICAL_INSTRUCTION_FILE} missing - run 'agents-templated init --github'`);
|
|
411
439
|
}
|
|
412
440
|
|
|
413
441
|
const docFiles = ['ARCHITECTURE.md'];
|
|
@@ -465,43 +493,32 @@ program
|
|
|
465
493
|
warnings.push(`⚠ ${LAYOUT.canonical.skillsDir} directory missing - run 'agents-templated init --skills'`);
|
|
466
494
|
}
|
|
467
495
|
|
|
468
|
-
// Check
|
|
469
|
-
const
|
|
470
|
-
|
|
471
|
-
await fs.
|
|
472
|
-
|
|
473
|
-
|
|
496
|
+
// Check subagents
|
|
497
|
+
const subagentsDir = path.join(targetDir, LAYOUT.canonical.subagentsDir);
|
|
498
|
+
if (await fs.pathExists(subagentsDir)) {
|
|
499
|
+
const subagents = (await fs.readdir(subagentsDir)).filter(f => f.endsWith('.md') && f !== 'README.md');
|
|
500
|
+
passed.push(`✓ ${subagents.length} subagents installed in ${LAYOUT.canonical.subagentsDir}`);
|
|
501
|
+
} else {
|
|
502
|
+
warnings.push(`⚠ ${LAYOUT.canonical.subagentsDir} directory missing - run 'agents-templated init --subagents'`);
|
|
503
|
+
}
|
|
474
504
|
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
}
|
|
484
|
-
if (instructionDrift.orphanedPolicyFiles && instructionDrift.orphanedPolicyFiles.length > 0) {
|
|
485
|
-
issues.push(
|
|
486
|
-
`✗ Orphaned policy files detected (contain duplicated content, should be deleted): ` +
|
|
487
|
-
`${instructionDrift.orphanedPolicyFiles.join(', ')} — run 'agents-templated update --github' to remove`
|
|
488
|
-
);
|
|
489
|
-
}
|
|
505
|
+
// Check instruction pointer files and drift
|
|
506
|
+
const instructionDrift = await validateInstructionDrift(targetDir);
|
|
507
|
+
if (instructionDrift.missingCanonical) {
|
|
508
|
+
issues.push(`✗ CLAUDE.md missing - run 'agents-templated init --github'`);
|
|
509
|
+
} else if (instructionDrift.driftFiles.length > 0) {
|
|
510
|
+
warnings.push(`⚠ Pointer files out of sync: ${instructionDrift.driftFiles.join(', ')} — run 'agents-templated update --github'`);
|
|
511
|
+
} else {
|
|
512
|
+
passed.push('✓ AGENTS.MD and .github/copilot-instructions.md are in sync');
|
|
490
513
|
}
|
|
491
514
|
|
|
492
|
-
const compatCopilotFile = path.join(targetDir,
|
|
515
|
+
const compatCopilotFile = path.join(targetDir, POINTER_FILES.copilot);
|
|
493
516
|
if (await fs.pathExists(compatCopilotFile)) {
|
|
494
517
|
passed.push(`✓ GitHub Copilot configuration found`);
|
|
495
518
|
} else {
|
|
496
519
|
warnings.push(`⚠ GitHub Copilot configuration missing - run 'agents-templated init --github'`);
|
|
497
520
|
}
|
|
498
521
|
|
|
499
|
-
// Check for .cursorrules (if using Cursor)
|
|
500
|
-
const cursorrules = path.join(targetDir, '.cursorrules');
|
|
501
|
-
if (await fs.pathExists(cursorrules)) {
|
|
502
|
-
passed.push(`✓ .cursorrules file found (Cursor IDE)`);
|
|
503
|
-
}
|
|
504
|
-
|
|
505
522
|
// Check for .gitignore
|
|
506
523
|
const gitignore = path.join(targetDir, '.gitignore');
|
|
507
524
|
if (await fs.pathExists(gitignore)) {
|
|
@@ -628,15 +645,16 @@ async function copyDirectory(sourceDir, targetDir, force = false) {
|
|
|
628
645
|
|
|
629
646
|
async function hasInstalledTemplates(targetDir) {
|
|
630
647
|
return await hasAnyLayout(targetDir) ||
|
|
631
|
-
await fs.pathExists(path.join(targetDir,
|
|
632
|
-
await fs.pathExists(path.join(targetDir,
|
|
648
|
+
await fs.pathExists(path.join(targetDir, CANONICAL_INSTRUCTION_FILE)) ||
|
|
649
|
+
await fs.pathExists(path.join(targetDir, POINTER_FILES.agents));
|
|
633
650
|
}
|
|
634
651
|
|
|
635
652
|
async function cleanupLegacyInstructionFiles(targetDir) {
|
|
636
653
|
// Files removed in v2.0.0: orphaned wrappers that contained duplicated policy
|
|
637
654
|
// content and were not managed/validated by the generator.
|
|
638
655
|
const legacyFiles = [
|
|
639
|
-
|
|
656
|
+
'.cursorrules',
|
|
657
|
+
'.github/instructions/AGENTS.md',
|
|
640
658
|
// Pre-v1.2.13 paths
|
|
641
659
|
'.claude/CLAUDE.md'
|
|
642
660
|
];
|
|
@@ -652,7 +670,7 @@ async function cleanupLegacyInstructionFiles(targetDir) {
|
|
|
652
670
|
|
|
653
671
|
async function updateSelectedComponents(targetDir, templateDir, selectedComponents, overwrite = true) {
|
|
654
672
|
const components = selectedComponents.includes('all')
|
|
655
|
-
? ['docs', 'rules', 'skills', 'github']
|
|
673
|
+
? ['docs', 'rules', 'skills', 'github', 'subagents']
|
|
656
674
|
: selectedComponents;
|
|
657
675
|
|
|
658
676
|
if (components.includes('docs')) {
|
|
@@ -663,7 +681,6 @@ async function updateSelectedComponents(targetDir, templateDir, selectedComponen
|
|
|
663
681
|
path.join(targetDir, 'agent-docs'),
|
|
664
682
|
overwrite
|
|
665
683
|
);
|
|
666
|
-
await copyFiles(templateDir, targetDir, [CORE_SOURCE_REL_PATH], overwrite);
|
|
667
684
|
}
|
|
668
685
|
|
|
669
686
|
if (components.includes('rules')) {
|
|
@@ -693,6 +710,16 @@ async function updateSelectedComponents(targetDir, templateDir, selectedComponen
|
|
|
693
710
|
await cleanupLegacyInstructionFiles(targetDir);
|
|
694
711
|
}
|
|
695
712
|
|
|
713
|
+
if (components.includes('subagents')) {
|
|
714
|
+
console.log(chalk.yellow('Updating agent subagents...'));
|
|
715
|
+
await fs.ensureDir(path.join(targetDir, LAYOUT.canonical.subagentsDir));
|
|
716
|
+
await copyDirectory(
|
|
717
|
+
path.join(templateDir, 'agents', 'subagents'),
|
|
718
|
+
path.join(targetDir, LAYOUT.canonical.subagentsDir),
|
|
719
|
+
overwrite
|
|
720
|
+
);
|
|
721
|
+
}
|
|
722
|
+
|
|
696
723
|
if ((components.includes('docs') || components.includes('github')) && !components.includes('github')) {
|
|
697
724
|
await writeGeneratedInstructions(targetDir, templateDir, overwrite);
|
|
698
725
|
}
|
|
@@ -727,6 +754,7 @@ program
|
|
|
727
754
|
.option('-r, --rules', 'Update agent rules only')
|
|
728
755
|
.option('-s, --skills', 'Update skills only')
|
|
729
756
|
.option('-g, --github', 'Update AI agent instruction files only')
|
|
757
|
+
.option('-S, --subagents', 'Update agent subagents only')
|
|
730
758
|
.option('-c, --check-only', 'Only check for updates, don\'t install')
|
|
731
759
|
.option('-f, --force', 'Force overwrite files during update')
|
|
732
760
|
.action(async (options) => {
|
|
@@ -786,6 +814,7 @@ program
|
|
|
786
814
|
if (options.all || options.rules) selectedComponents.push('rules');
|
|
787
815
|
if (options.all || options.skills) selectedComponents.push('skills');
|
|
788
816
|
if (options.all || options.github) selectedComponents.push('github');
|
|
817
|
+
if (options.all || options.subagents) selectedComponents.push('subagents');
|
|
789
818
|
|
|
790
819
|
console.log(chalk.blue('📦 Updating selected components...\n'));
|
|
791
820
|
|
|
@@ -798,7 +827,7 @@ program
|
|
|
798
827
|
// List potential updates
|
|
799
828
|
const updates = [];
|
|
800
829
|
const checkFiles = [
|
|
801
|
-
{ targetFile:
|
|
830
|
+
{ targetFile: CANONICAL_INSTRUCTION_FILE, templateFile: CANONICAL_INSTRUCTION_FILE, component: 'root' },
|
|
802
831
|
{ targetFile: 'agent-docs/ARCHITECTURE.md', templateFile: 'agent-docs/ARCHITECTURE.md', component: 'docs' },
|
|
803
832
|
{ targetFile: `${LAYOUT.canonical.rulesDir}/security.mdc`, templateFile: 'agents/rules/security.mdc', component: 'rules' },
|
|
804
833
|
{ targetFile: `${LAYOUT.canonical.rulesDir}/testing.mdc`, templateFile: 'agents/rules/testing.mdc', component: 'rules' },
|
|
@@ -935,7 +964,6 @@ program
|
|
|
935
964
|
|
|
936
965
|
// Check AI assistant configs
|
|
937
966
|
const configs = [
|
|
938
|
-
{ file: '.cursorrules', name: 'Cursor IDE' },
|
|
939
967
|
{ file: '.github/copilot-instructions.md', name: 'GitHub Copilot' }
|
|
940
968
|
];
|
|
941
969
|
|
|
@@ -961,8 +989,56 @@ program
|
|
|
961
989
|
console.log(chalk.blue('\n📚 Quick Tips:\n'));
|
|
962
990
|
console.log(chalk.white(' • Run "agents-templated validate" to check setup'));
|
|
963
991
|
console.log(chalk.white(' • Run "agents-templated wizard" for guided setup'));
|
|
964
|
-
console.log(chalk.white(' • Review
|
|
992
|
+
console.log(chalk.white(' • Review agents/rules/security.mdc for security patterns\n'));
|
|
993
|
+
|
|
994
|
+
} catch (error) {
|
|
995
|
+
console.error(chalk.red('Error:'), error.message);
|
|
996
|
+
process.exit(1);
|
|
997
|
+
}
|
|
998
|
+
});
|
|
999
|
+
|
|
1000
|
+
program
|
|
1001
|
+
.command('new-skill <name>')
|
|
1002
|
+
.description('Scaffold a new skill in agents/skills/<name>/SKILL.md')
|
|
1003
|
+
.action(async (name) => {
|
|
1004
|
+
try {
|
|
1005
|
+
const targetDir = process.cwd();
|
|
1006
|
+
const relPath = await scaffoldSkill(targetDir, name);
|
|
1007
|
+
console.log(chalk.green(`\n+ ${relPath}\n`));
|
|
1008
|
+
console.log(chalk.gray('Fill in Trigger Conditions, Workflow, and Output Contract.'));
|
|
1009
|
+
console.log(chalk.gray('Then add it to the Reference Index in CLAUDE.md.\n'));
|
|
1010
|
+
} catch (error) {
|
|
1011
|
+
console.error(chalk.red('Error:'), error.message);
|
|
1012
|
+
process.exit(1);
|
|
1013
|
+
}
|
|
1014
|
+
});
|
|
965
1015
|
|
|
1016
|
+
program
|
|
1017
|
+
.command('new-rule <name>')
|
|
1018
|
+
.description('Scaffold a new rule in agents/rules/<name>.mdc')
|
|
1019
|
+
.action(async (name) => {
|
|
1020
|
+
try {
|
|
1021
|
+
const targetDir = process.cwd();
|
|
1022
|
+
const relPath = await scaffoldRule(targetDir, name);
|
|
1023
|
+
console.log(chalk.green(`\n+ ${relPath}\n`));
|
|
1024
|
+
console.log(chalk.gray('Fill in Purpose and Requirements sections.'));
|
|
1025
|
+
console.log(chalk.gray('Then add it to the Reference Index in CLAUDE.md.\n'));
|
|
1026
|
+
} catch (error) {
|
|
1027
|
+
console.error(chalk.red('Error:'), error.message);
|
|
1028
|
+
process.exit(1);
|
|
1029
|
+
}
|
|
1030
|
+
});
|
|
1031
|
+
|
|
1032
|
+
program
|
|
1033
|
+
.command('new-subagent <name>')
|
|
1034
|
+
.description('Scaffold a new subagent in agents/subagents/<name>.md')
|
|
1035
|
+
.action(async (name) => {
|
|
1036
|
+
try {
|
|
1037
|
+
const targetDir = process.cwd();
|
|
1038
|
+
const relPath = await scaffoldSubagent(targetDir, name);
|
|
1039
|
+
console.log(chalk.green(`\n+ ${relPath}\n`));
|
|
1040
|
+
console.log(chalk.gray('Fill in Activation Conditions, Workflow, and Output Format.'));
|
|
1041
|
+
console.log(chalk.gray('Then add it to the Subagent modules table in CLAUDE.md.\n'));
|
|
966
1042
|
} catch (error) {
|
|
967
1043
|
console.error(chalk.red('Error:'), error.message);
|
|
968
1044
|
process.exit(1);
|
package/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const fs = require('fs-extra');
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const { LAYOUT } = require('./lib/layout');
|
|
4
|
-
const {
|
|
4
|
+
const { CANONICAL_INSTRUCTION_FILE, writeGeneratedInstructions } = require('./lib/instructions');
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Programmatic API for agents-templated
|
|
@@ -29,8 +29,7 @@ async function install(targetDir, options = {}) {
|
|
|
29
29
|
if (installAll || options.docs) {
|
|
30
30
|
files.push(
|
|
31
31
|
'agent-docs/ARCHITECTURE.md',
|
|
32
|
-
'agent-docs/README.md'
|
|
33
|
-
CORE_SOURCE_REL_PATH
|
|
32
|
+
'agent-docs/README.md'
|
|
34
33
|
);
|
|
35
34
|
}
|
|
36
35
|
|