rhachet 1.10.1 → 1.12.1

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.
Files changed (69) hide show
  1. package/dist/.test/example.use.repo/example.echoRegistry.js +5 -2
  2. package/dist/.test/example.use.repo/example.echoRegistry.js.map +1 -1
  3. package/dist/contract/cli/invoke.js +11 -0
  4. package/dist/contract/cli/invoke.js.map +1 -1
  5. package/dist/contract/cli/invokeAsk.js +4 -2
  6. package/dist/contract/cli/invokeAsk.js.map +1 -1
  7. package/dist/contract/cli/invokeBriefsBoot.d.ts +1 -1
  8. package/dist/contract/cli/invokeBriefsBoot.integration.test.js +46 -36
  9. package/dist/contract/cli/invokeBriefsBoot.integration.test.js.map +1 -1
  10. package/dist/contract/cli/invokeBriefsBoot.js +9 -5
  11. package/dist/contract/cli/invokeBriefsBoot.js.map +1 -1
  12. package/dist/contract/cli/invokeBriefsLink.d.ts +1 -1
  13. package/dist/contract/cli/invokeBriefsLink.integration.test.js +33 -18
  14. package/dist/contract/cli/invokeBriefsLink.integration.test.js.map +1 -1
  15. package/dist/contract/cli/invokeBriefsLink.js +17 -49
  16. package/dist/contract/cli/invokeBriefsLink.js.map +1 -1
  17. package/dist/contract/cli/invokeInit.d.ts +9 -0
  18. package/dist/contract/cli/invokeInit.integration.test.d.ts +1 -0
  19. package/dist/contract/cli/invokeInit.integration.test.js +123 -0
  20. package/dist/contract/cli/invokeInit.integration.test.js.map +1 -0
  21. package/dist/contract/cli/invokeInit.js +57 -0
  22. package/dist/contract/cli/invokeInit.js.map +1 -0
  23. package/dist/contract/cli/invokeList.js +1 -1
  24. package/dist/contract/cli/invokeList.js.map +1 -1
  25. package/dist/contract/cli/invokeReadme.integration.test.js +1 -1
  26. package/dist/contract/cli/invokeReadme.integration.test.js.map +1 -1
  27. package/dist/contract/cli/invokeReadme.js +2 -2
  28. package/dist/contract/cli/invokeReadme.js.map +1 -1
  29. package/dist/contract/cli/invokeRoles.d.ts +11 -0
  30. package/dist/contract/cli/invokeRoles.js +19 -0
  31. package/dist/contract/cli/invokeRoles.js.map +1 -0
  32. package/dist/contract/cli/invokeRolesBoot.d.ts +9 -0
  33. package/dist/contract/cli/invokeRolesBoot.integration.test.d.ts +1 -0
  34. package/dist/contract/cli/invokeRolesBoot.integration.test.js +152 -0
  35. package/dist/contract/cli/invokeRolesBoot.integration.test.js.map +1 -0
  36. package/dist/contract/cli/invokeRolesBoot.js +205 -0
  37. package/dist/contract/cli/invokeRolesBoot.js.map +1 -0
  38. package/dist/contract/cli/invokeRolesLink.d.ts +11 -0
  39. package/dist/contract/cli/invokeRolesLink.integration.test.d.ts +1 -0
  40. package/dist/contract/cli/invokeRolesLink.integration.test.js +117 -0
  41. package/dist/contract/cli/invokeRolesLink.integration.test.js.map +1 -0
  42. package/dist/contract/cli/invokeRolesLink.js +78 -0
  43. package/dist/contract/cli/invokeRolesLink.js.map +1 -0
  44. package/dist/domain/objects/Role.d.ts +13 -3
  45. package/dist/domain/objects/Role.js.map +1 -1
  46. package/dist/logic/init/discoverRolePackages.d.ts +8 -0
  47. package/dist/logic/init/discoverRolePackages.js +20 -0
  48. package/dist/logic/init/discoverRolePackages.js.map +1 -0
  49. package/dist/logic/init/generateRhachetConfig.d.ts +8 -0
  50. package/dist/logic/init/generateRhachetConfig.js +40 -0
  51. package/dist/logic/init/generateRhachetConfig.js.map +1 -0
  52. package/dist/logic/init/generateRhachetConfig.test.d.ts +1 -0
  53. package/dist/logic/init/generateRhachetConfig.test.js +35 -0
  54. package/dist/logic/init/generateRhachetConfig.test.js.map +1 -0
  55. package/dist/logic/invoke/getAgentReadmeTemplates.d.ts +6 -0
  56. package/dist/logic/invoke/getAgentReadmeTemplates.js +42 -0
  57. package/dist/logic/invoke/getAgentReadmeTemplates.js.map +1 -0
  58. package/dist/logic/invoke/getInvokeHooksByOpts.d.ts +2 -1
  59. package/dist/logic/invoke/getInvokeHooksByOpts.js +11 -3
  60. package/dist/logic/invoke/getInvokeHooksByOpts.js.map +1 -1
  61. package/dist/logic/invoke/link/findsertFile.d.ts +9 -0
  62. package/dist/logic/invoke/link/findsertFile.js +29 -0
  63. package/dist/logic/invoke/link/findsertFile.js.map +1 -0
  64. package/dist/logic/invoke/link/symlinkResourceDirectories.d.ts +12 -0
  65. package/dist/logic/invoke/link/symlinkResourceDirectories.js +81 -0
  66. package/dist/logic/invoke/link/symlinkResourceDirectories.js.map +1 -0
  67. package/dist/logic/invoke/performInCurrentThread.js +1 -1
  68. package/dist/logic/invoke/performInCurrentThread.js.map +1 -1
  69. package/package.json +1 -1
@@ -2,75 +2,43 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.invokeBriefsLink = void 0;
4
4
  const helpful_errors_1 = require("helpful-errors");
5
- const node_fs_1 = require("node:fs");
6
5
  const node_path_1 = require("node:path");
7
6
  const assureFindRole_1 = require("../../logic/invoke/assureFindRole");
7
+ const symlinkResourceDirectories_1 = require("../../logic/invoke/link/symlinkResourceDirectories");
8
8
  /**
9
9
  * .what = adds the "briefs link" subcommand to the CLI
10
10
  * .why = creates symlinks to role briefs from node_modules for easy access
11
- * .how = creates .briefs/<role> directory and symlinks brief files from the role's package
11
+ * .how = creates .agent/repo=$repo/role=$role/briefs directory and symlinks brief files
12
12
  */
13
13
  const invokeBriefsLink = ({ command, registries, }) => {
14
14
  command
15
15
  .command('link')
16
- .description('create symlinks to role briefs in .briefs/<role>/')
16
+ .description('create symlinks to role briefs in .agent/ structure')
17
+ .option('--repo <slug>', 'the repository slug for the role')
17
18
  .option('--role <slug>', 'the role to link briefs for')
18
19
  .action((opts) => {
20
+ if (!opts.repo)
21
+ helpful_errors_1.BadRequestError.throw('--repo is required (e.g., --repo ehmpathy)');
19
22
  if (!opts.role)
20
23
  helpful_errors_1.BadRequestError.throw('--role is required (e.g., --role mechanic)');
24
+ const repoSlug = opts.repo;
21
25
  // Find the role from registries
22
26
  const role = (0, assureFindRole_1.assureFindRole)({ registries, slug: opts.role });
23
27
  // Check if role has briefs configured
24
- if (!role.briefs || !role.briefs.dir) {
28
+ if (role.briefs.dirs.length === 0) {
25
29
  helpful_errors_1.BadRequestError.throw(`Role "${role.slug}" does not have briefs configured`);
26
30
  }
27
- // Create .briefs/<role> directory
28
- const briefsDir = (0, node_path_1.resolve)(process.cwd(), '.briefs', role.slug);
29
- (0, node_fs_1.mkdirSync)(briefsDir, { recursive: true });
30
- // Path to the role's briefs directory
31
- const sourceDir = (0, node_path_1.resolve)(process.cwd(), role.briefs.dir);
32
- // Check if source directory exists
33
- if (!(0, node_fs_1.existsSync)(sourceDir)) {
34
- helpful_errors_1.BadRequestError.throw(`Source directory not found: ${sourceDir}\nMake sure role "${role.slug}" briefs directory is accessible`);
35
- }
36
- // Read all files in the source directory
37
- const files = (0, node_fs_1.readdirSync)(sourceDir);
38
- if (files.length === 0) {
39
- console.log(``);
40
- console.log(`⚠️ No briefs found for role "${role.slug}"`);
41
- console.log(``);
42
- return;
43
- }
44
- // Create symlinks for each file
45
31
  console.log(``);
46
- console.log(`📎 Linking briefs for role "${role.slug}"...`);
47
- for (const file of files) {
48
- const sourcePath = (0, node_path_1.resolve)(sourceDir, file);
49
- const targetPath = (0, node_path_1.resolve)(briefsDir, (0, node_path_1.basename)(file));
50
- // Remove existing symlink if it exists
51
- if ((0, node_fs_1.existsSync)(targetPath)) {
52
- console.log(` ↻ ${file} (updating)`);
53
- }
54
- else {
55
- console.log(` + ${file}`);
56
- }
57
- // Create relative symlink from target directory to source file
58
- const relativeSource = (0, node_path_1.relative)(briefsDir, sourcePath);
59
- try {
60
- (0, node_fs_1.symlinkSync)(relativeSource, targetPath);
61
- }
62
- catch (error) {
63
- if (error.code === 'EEXIST') {
64
- // If file exists and is not a symlink, warn user
65
- console.log(` ⚠️ ${file} already exists (skipping)`);
66
- }
67
- else {
68
- throw error;
69
- }
70
- }
71
- }
32
+ console.log(`📎 Linking briefs for role "${role.slug}" from repo "${repoSlug}"...`);
33
+ // Create .agent/repo=$repo/role=$role/briefs directory and link briefs
34
+ const briefsDir = (0, node_path_1.resolve)(process.cwd(), '.agent', `repo=${repoSlug}`, `role=${role.slug}`, 'briefs');
35
+ const totalFiles = (0, symlinkResourceDirectories_1.symlinkResourceDirectories)({
36
+ sourceDirs: role.briefs.dirs,
37
+ targetDir: briefsDir,
38
+ resourceName: 'briefs',
39
+ });
72
40
  console.log(``);
73
- console.log(`✓ Linked ${files.length} brief(s) to ${briefsDir}`);
41
+ console.log(`🔗 Linked ${totalFiles} brief(s) to ${briefsDir}`);
74
42
  console.log(``);
75
43
  });
76
44
  };
@@ -1 +1 @@
1
- {"version":3,"file":"invokeBriefsLink.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeBriefsLink.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"invokeBriefsLink.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeBriefsLink.ts"],"names":[],"mappings":";;;AACA,mDAAiD;AACjD,yCAAoC;AAEpC,sEAAmE;AACnE,mGAAgG;AAGhG;;;;GAIG;AACI,MAAM,gBAAgB,GAAG,CAAC,EAC/B,OAAO,EACP,UAAU,GAIX,EAAQ,EAAE;IACT,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC;SAC3D,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,CAAC,IAAsC,EAAE,EAAE;QACjD,IAAI,CAAC,IAAI,CAAC,IAAI;YACZ,gCAAe,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,IAAI;YACZ,gCAAe,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAEtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAE3B,gCAAgC;QAChC,MAAM,IAAI,GAAG,IAAA,+BAAc,EAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAE7D,sCAAsC;QACtC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,gCAAe,CAAC,KAAK,CACnB,SAAS,IAAI,CAAC,IAAI,mCAAmC,CACtD,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,+BAA+B,IAAI,CAAC,IAAI,gBAAgB,QAAQ,MAAM,CACvE,CAAC;QAEF,uEAAuE;QACvE,MAAM,SAAS,GAAG,IAAA,mBAAO,EACvB,OAAO,CAAC,GAAG,EAAE,EACb,QAAQ,EACR,QAAQ,QAAQ,EAAE,EAClB,QAAQ,IAAI,CAAC,IAAI,EAAE,EACnB,QAAQ,CACT,CAAC;QAEF,MAAM,UAAU,GAAG,IAAA,uDAA0B,EAAC;YAC5C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YAC5B,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,QAAQ;SACvB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,gBAAgB,SAAS,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAtDW,QAAA,gBAAgB,oBAsD3B"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * .what = adds the "init" command to the CLI
4
+ * .why = enables auto-generation of rhachet.use.ts config from discovered role packages
5
+ * .how = discovers rhachet-roles-* packages and generates config file
6
+ */
7
+ export declare const invokeInit: ({ program }: {
8
+ program: Command;
9
+ }) => void;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const child_process_1 = require("child_process");
4
+ const commander_1 = require("commander");
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const test_fns_1 = require("test-fns");
8
+ const invokeInit_1 = require("./invokeInit");
9
+ describe('invokeInit (integration)', () => {
10
+ (0, test_fns_1.given)('a CLI program with invokeInit registered', () => {
11
+ const testDir = (0, node_path_1.resolve)(__dirname, './.temp/invokeInit');
12
+ const originalCwd = process.cwd();
13
+ beforeAll(() => {
14
+ // Create test directory structure
15
+ (0, node_fs_1.mkdirSync)(testDir, { recursive: true });
16
+ // Initialize as a git repo for getGitRepoRoot to work
17
+ try {
18
+ (0, child_process_1.execSync)('git init', { cwd: testDir, stdio: 'pipe' });
19
+ }
20
+ catch {
21
+ // already a git repo
22
+ }
23
+ });
24
+ afterAll(() => {
25
+ process.chdir(originalCwd);
26
+ });
27
+ const program = new commander_1.Command('rhachet');
28
+ const logSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
29
+ beforeEach(() => {
30
+ logSpy.mockClear();
31
+ process.chdir(testDir);
32
+ // Clean up any existing rhachet.use.ts
33
+ const configPath = (0, node_path_1.resolve)(testDir, 'rhachet.use.ts');
34
+ if ((0, node_fs_1.existsSync)(configPath)) {
35
+ (0, node_fs_1.rmSync)(configPath);
36
+ }
37
+ });
38
+ (0, invokeInit_1.invokeInit)({ program });
39
+ (0, test_fns_1.when)('invoked with package.json containing rhachet-roles-* packages', () => {
40
+ beforeEach(() => {
41
+ // Create package.json with rhachet-roles packages
42
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(testDir, 'package.json'), JSON.stringify({
43
+ name: 'test-project',
44
+ dependencies: {
45
+ 'rhachet-roles-ehmpathy': '1.0.0',
46
+ },
47
+ }));
48
+ });
49
+ (0, test_fns_1.then)('it should create rhachet.use.ts with discovered packages', async () => {
50
+ await program.parseAsync(['init'], { from: 'user' });
51
+ const configPath = (0, node_path_1.resolve)(testDir, 'rhachet.use.ts');
52
+ expect((0, node_fs_1.existsSync)(configPath)).toBe(true);
53
+ const content = (0, node_fs_1.readFileSync)(configPath, 'utf8');
54
+ expect(content).toContain('getRoleRegistryEhmpathy');
55
+ expect(content).toContain('getInvokeHooksEhmpathy');
56
+ expect(content).toContain("from 'rhachet-roles-ehmpathy'");
57
+ // Check log output
58
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('rhachet-roles-ehmpathy'));
59
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Done'));
60
+ });
61
+ });
62
+ (0, test_fns_1.when)('invoked with multiple rhachet-roles-* packages', () => {
63
+ beforeEach(() => {
64
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(testDir, 'package.json'), JSON.stringify({
65
+ name: 'test-project',
66
+ dependencies: {
67
+ 'rhachet-roles-ehmpathy': '1.0.0',
68
+ },
69
+ devDependencies: {
70
+ 'rhachet-roles-other': '1.0.0',
71
+ },
72
+ }));
73
+ });
74
+ (0, test_fns_1.then)('it should include all packages in config', async () => {
75
+ await program.parseAsync(['init'], { from: 'user' });
76
+ const configPath = (0, node_path_1.resolve)(testDir, 'rhachet.use.ts');
77
+ const content = (0, node_fs_1.readFileSync)(configPath, 'utf8');
78
+ expect(content).toContain('getRoleRegistryEhmpathy');
79
+ expect(content).toContain('getRoleRegistryOther');
80
+ expect(content).toContain('getInvokeHooksEhmpathy(), getInvokeHooksOther()');
81
+ });
82
+ });
83
+ (0, test_fns_1.when)('invoked with no rhachet-roles-* packages', () => {
84
+ beforeEach(() => {
85
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(testDir, 'package.json'), JSON.stringify({
86
+ name: 'test-project',
87
+ dependencies: {
88
+ lodash: '4.0.0',
89
+ },
90
+ }));
91
+ });
92
+ (0, test_fns_1.then)('it should warn and not create config', async () => {
93
+ await program.parseAsync(['init'], { from: 'user' });
94
+ const configPath = (0, node_path_1.resolve)(testDir, 'rhachet.use.ts');
95
+ expect((0, node_fs_1.existsSync)(configPath)).toBe(false);
96
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('No rhachet-roles-* packages found'));
97
+ });
98
+ });
99
+ (0, test_fns_1.when)('rhachet.use.ts already exists', () => {
100
+ beforeEach(() => {
101
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(testDir, 'package.json'), JSON.stringify({
102
+ name: 'test-project',
103
+ dependencies: {
104
+ 'rhachet-roles-ehmpathy': '1.0.0',
105
+ },
106
+ }));
107
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(testDir, 'rhachet.use.ts'), '// existing config');
108
+ });
109
+ (0, test_fns_1.then)('it should throw an error without --force', async () => {
110
+ const error = await (0, test_fns_1.getError)(() => program.parseAsync(['init'], { from: 'user' }));
111
+ expect(error?.message).toContain('already exists');
112
+ expect(error?.message).toContain('--force');
113
+ });
114
+ (0, test_fns_1.then)('it should overwrite with --force', async () => {
115
+ await program.parseAsync(['init', '--force'], { from: 'user' });
116
+ const configPath = (0, node_path_1.resolve)(testDir, 'rhachet.use.ts');
117
+ const content = (0, node_fs_1.readFileSync)(configPath, 'utf8');
118
+ expect(content).toContain('getRoleRegistryEhmpathy');
119
+ });
120
+ });
121
+ });
122
+ });
123
+ //# sourceMappingURL=invokeInit.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invokeInit.integration.test.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeInit.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.invokeInit = void 0;
4
+ const helpful_errors_1 = require("helpful-errors");
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const rhachet_artifact_git_1 = require("rhachet-artifact-git");
8
+ const discoverRolePackages_1 = require("../../logic/init/discoverRolePackages");
9
+ const generateRhachetConfig_1 = require("../../logic/init/generateRhachetConfig");
10
+ /**
11
+ * .what = adds the "init" command to the CLI
12
+ * .why = enables auto-generation of rhachet.use.ts config from discovered role packages
13
+ * .how = discovers rhachet-roles-* packages and generates config file
14
+ */
15
+ const invokeInit = ({ program }) => {
16
+ program
17
+ .command('init')
18
+ .description('initialize rhachet.use.ts config from discovered role packages')
19
+ .option('--force', 'overwrite existing rhachet.use.ts')
20
+ .action(async (opts) => {
21
+ const cwd = process.cwd();
22
+ const root = await (0, rhachet_artifact_git_1.getGitRepoRoot)({ from: cwd });
23
+ const configPath = (0, node_path_1.resolve)(root, 'rhachet.use.ts');
24
+ const relativeConfigPath = (0, node_path_1.relative)(cwd, configPath);
25
+ // Check if config already exists
26
+ if ((0, node_fs_1.existsSync)(configPath) && !opts.force) {
27
+ helpful_errors_1.BadRequestError.throw(`rhachet.use.ts already exists. Use --force to overwrite.`);
28
+ }
29
+ console.log(``);
30
+ console.log(`🔭 Search for rhachet role packages...`);
31
+ // Discover role packages
32
+ const packages = await (0, discoverRolePackages_1.discoverRolePackages)({ from: cwd });
33
+ if (packages.length === 0) {
34
+ console.log(` - [none found]`);
35
+ console.log(``);
36
+ console.log(`⚠️ No rhachet-roles-* packages found in package.json dependencies.`);
37
+ console.log(` Install a role package first, e.g.: npm install rhachet-roles-ehmpathy`);
38
+ console.log(``);
39
+ return;
40
+ }
41
+ for (const pkg of packages) {
42
+ console.log(` - [found] ${pkg}`);
43
+ }
44
+ console.log(``);
45
+ console.log(`✨ Create rhachet.use.ts...`);
46
+ // Generate and write config
47
+ const content = (0, generateRhachetConfig_1.generateRhachetConfig)({ packages });
48
+ (0, node_fs_1.writeFileSync)(configPath, content, 'utf8');
49
+ console.log(` + [created] ${relativeConfigPath}`);
50
+ console.log(``);
51
+ console.log(`🌊 Done, rhachet config with ${packages.length} role package(s), ready for use`);
52
+ console.log(``);
53
+ console.log(`Run 'npx rhachet list' to see available roles.`);
54
+ });
55
+ };
56
+ exports.invokeInit = invokeInit;
57
+ //# sourceMappingURL=invokeInit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invokeInit.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeInit.ts"],"names":[],"mappings":";;;AACA,mDAAiD;AACjD,qCAAoD;AACpD,yCAA8C;AAC9C,+DAAsD;AAEtD,gFAA6E;AAC7E,kFAA+E;AAE/E;;;;GAIG;AACI,MAAM,UAAU,GAAG,CAAC,EAAE,OAAO,EAAwB,EAAQ,EAAE;IACpE,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,gEAAgE,CACjE;SACA,MAAM,CAAC,SAAS,EAAE,mCAAmC,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,IAAA,qCAAc,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QACnD,MAAM,kBAAkB,GAAG,IAAA,oBAAQ,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAErD,iCAAiC;QACjC,IAAI,IAAA,oBAAU,EAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1C,gCAAe,CAAC,KAAK,CACnB,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAEtD,yBAAyB;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAA,2CAAoB,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAE3D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,qEAAqE,CACtE,CAAC;YACF,OAAO,CAAC,GAAG,CACT,2EAA2E,CAC5E,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAE1C,4BAA4B;QAC5B,MAAM,OAAO,GAAG,IAAA,6CAAqB,EAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpD,IAAA,uBAAa,EAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,kBAAkB,EAAE,CAAC,CAAC;QAEnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,gCAAgC,QAAQ,CAAC,MAAM,iCAAiC,CACjF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AA1DW,QAAA,UAAU,cA0DrB"}
@@ -20,7 +20,7 @@ const invokeList = ({ program, registries, }) => {
20
20
  helpful_errors_1.BadRequestError.throw(`no role named "${opts.role}"`);
21
21
  console.log(``);
22
22
  console.log(`📖 ${role.slug}.skills =`);
23
- for (const skill of role.skills)
23
+ for (const skill of role.skills.refs)
24
24
  console.log(` - ${role.slug}.${skill.slug}`);
25
25
  console.log(``);
26
26
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"invokeList.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeList.ts"],"names":[],"mappings":";;;AACA,mDAAiD;AAEjD,sEAAmE;AAGnE;;;GAGG;AACI,MAAM,UAAU,GAAG,CAAC,EACzB,OAAO,EACP,UAAU,GAIX,EAAQ,EAAE;IACT,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;SAC7D,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;SAC1E,MAAM,CAAC,CAAC,IAA0C,EAAE,EAAE;QACrD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,IAAA,+BAAc,EAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI;gBAAE,gCAAe,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YAEjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,WAAW,CAAC,CAAC;YACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM;gBAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClE,IAAI,CAAC,QAAQ;gBACX,gCAAe,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAEhE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,UAAU,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK;gBAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC/C,QAAQ,CAAC,KAAK,CAAC,GAAG,CAChB,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,OAAO,EAAE,CACrE,CACF,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAhDW,QAAA,UAAU,cAgDrB"}
1
+ {"version":3,"file":"invokeList.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeList.ts"],"names":[],"mappings":";;;AACA,mDAAiD;AAEjD,sEAAmE;AAGnE;;;GAGG;AACI,MAAM,UAAU,GAAG,CAAC,EACzB,OAAO,EACP,UAAU,GAIX,EAAQ,EAAE;IACT,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;SAC7D,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;SAC1E,MAAM,CAAC,CAAC,IAA0C,EAAE,EAAE;QACrD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,IAAA,+BAAc,EAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI;gBAAE,gCAAe,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YAEjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,WAAW,CAAC,CAAC;YACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;gBAClC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClE,IAAI,CAAC,QAAQ;gBACX,gCAAe,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAEhE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,UAAU,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK;gBAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC/C,QAAQ,CAAC,KAAK,CAAC,GAAG,CAChB,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,OAAO,EAAE,CACrE,CACF,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAhDW,QAAA,UAAU,cAgDrB"}
@@ -32,7 +32,7 @@ describe('invokeReadme (integration)', () => {
32
32
  (0, test_fns_1.then)('it should print the skill readme', async () => {
33
33
  await program.parseAsync(['readme', '--role', 'echoer', '--skill', 'echo'], { from: 'user' });
34
34
  expect(logSpy).toHaveBeenCalledWith('📜 echoer.echo.readme');
35
- expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(example_echoRegistry_1.EXAMPLE_REGISTRY.roles[0].skills[0].readme.split('\n')[0]));
35
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(example_echoRegistry_1.EXAMPLE_REGISTRY.roles[0].skills.refs[0].readme.split('\n')[0]));
36
36
  });
37
37
  });
38
38
  (0, test_fns_1.when)('invoked with an unknown role', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"invokeReadme.integration.test.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeReadme.integration.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"invokeReadme.integration.test.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeReadme.integration.test.ts"],"names":[],"mappings":"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"}
@@ -38,9 +38,9 @@ const invokeReadme = ({ program, registries, }) => {
38
38
  if (!opts.skill)
39
39
  return printReadme(`${role.slug}`, role.readme);
40
40
  // resolve skill
41
- const skill = role.skills.find((s) => s.slug === opts.skill);
41
+ const skill = role.skills.refs.find((s) => s.slug === opts.skill);
42
42
  if (!skill)
43
- helpful_errors_1.BadRequestError.throw(`no skill "${opts.skill}" in role "${opts.role}"`, { skills: role.skills.map((thisSkill) => thisSkill.slug) });
43
+ helpful_errors_1.BadRequestError.throw(`no skill "${opts.skill}" in role "${opts.role}"`, { skills: role.skills.refs.map((thisSkill) => thisSkill.slug) });
44
44
  // skill-level readme
45
45
  return printReadme(`${role.slug}.${skill.slug}`, skill.readme);
46
46
  });
@@ -1 +1 @@
1
- {"version":3,"file":"invokeReadme.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeReadme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"invokeReadme.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeReadme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Command } from 'commander';
2
+ import { RoleRegistry } from '../sdk';
3
+ /**
4
+ * .what = adds the "roles" command to the CLI with subcommands
5
+ * .why = manages role resources (briefs and skills) in .agent/ directory structure
6
+ * .how = registers "link" and "boot" subcommands under "roles"
7
+ */
8
+ export declare const invokeRoles: ({ program, registries, }: {
9
+ program: Command;
10
+ registries: RoleRegistry[];
11
+ }) => void;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.invokeRoles = void 0;
4
+ const invokeRolesBoot_1 = require("./invokeRolesBoot");
5
+ const invokeRolesLink_1 = require("./invokeRolesLink");
6
+ /**
7
+ * .what = adds the "roles" command to the CLI with subcommands
8
+ * .why = manages role resources (briefs and skills) in .agent/ directory structure
9
+ * .how = registers "link" and "boot" subcommands under "roles"
10
+ */
11
+ const invokeRoles = ({ program, registries, }) => {
12
+ const rolesCommand = program
13
+ .command('roles')
14
+ .description('manage role resources (link, boot)');
15
+ (0, invokeRolesLink_1.invokeRolesLink)({ command: rolesCommand, registries });
16
+ (0, invokeRolesBoot_1.invokeRolesBoot)({ command: rolesCommand });
17
+ };
18
+ exports.invokeRoles = invokeRoles;
19
+ //# sourceMappingURL=invokeRoles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invokeRoles.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeRoles.ts"],"names":[],"mappings":";;;AAGA,uDAAoD;AACpD,uDAAoD;AAEpD;;;;GAIG;AACI,MAAM,WAAW,GAAG,CAAC,EAC1B,OAAO,EACP,UAAU,GAIX,EAAQ,EAAE;IACT,MAAM,YAAY,GAAG,OAAO;SACzB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,oCAAoC,CAAC,CAAC;IAErD,IAAA,iCAAe,EAAC,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;IACvD,IAAA,iCAAe,EAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC;AAbW,QAAA,WAAW,eAatB"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * .what = adds the "roles boot" subcommand to the CLI
4
+ * .why = outputs role resources (briefs and skills) with stats for context loading
5
+ * .how = reads all files in .agent/repo=$repo/role=$role and prints them with formatting
6
+ */
7
+ export declare const invokeRolesBoot: ({ command }: {
8
+ command: Command;
9
+ }) => void;
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const commander_1 = require("commander");
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const test_fns_1 = require("test-fns");
7
+ const invokeRolesBoot_1 = require("./invokeRolesBoot");
8
+ describe('invokeRolesBoot (integration)', () => {
9
+ (0, test_fns_1.given)('a CLI program with invokeRolesBoot registered', () => {
10
+ const testDir = (0, node_path_1.resolve)(__dirname, './.temp/invokeRolesBoot');
11
+ const originalCwd = process.cwd();
12
+ beforeAll(() => {
13
+ // Create test directory structure
14
+ (0, node_fs_1.mkdirSync)(testDir, { recursive: true });
15
+ process.chdir(testDir);
16
+ // Initialize a git repo (required by invokeRolesBoot for getGitRepoRoot)
17
+ const { execSync } = require('node:child_process');
18
+ try {
19
+ execSync('git init', { cwd: testDir, stdio: 'ignore' });
20
+ execSync('git config user.email "test@example.com"', {
21
+ cwd: testDir,
22
+ stdio: 'ignore',
23
+ });
24
+ execSync('git config user.name "Test User"', {
25
+ cwd: testDir,
26
+ stdio: 'ignore',
27
+ });
28
+ }
29
+ catch {
30
+ // Ignore errors if git is not available
31
+ }
32
+ });
33
+ afterAll(() => {
34
+ process.chdir(originalCwd);
35
+ });
36
+ const rolesCommand = new commander_1.Command('roles');
37
+ const logSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
38
+ beforeEach(() => {
39
+ logSpy.mockClear();
40
+ });
41
+ (0, invokeRolesBoot_1.invokeRolesBoot)({ command: rolesCommand });
42
+ (0, test_fns_1.when)('invoked with "boot --repo test --role mechanic" after creating briefs and skills', () => {
43
+ beforeAll(() => {
44
+ // Clean up first to ensure fresh state
45
+ const cleanAgentDir = (0, node_path_1.resolve)(testDir, '.agent');
46
+ if ((0, node_fs_1.existsSync)(cleanAgentDir)) {
47
+ (0, node_fs_1.rmSync)(cleanAgentDir, { recursive: true, force: true });
48
+ }
49
+ // Setup: Create mock role directory structure
50
+ const roleDir = (0, node_path_1.resolve)(testDir, '.agent/repo=test/role=mechanic');
51
+ const briefsDir = (0, node_path_1.resolve)(roleDir, 'briefs');
52
+ const skillsDir = (0, node_path_1.resolve)(roleDir, 'skills');
53
+ (0, node_fs_1.mkdirSync)(briefsDir, { recursive: true });
54
+ (0, node_fs_1.mkdirSync)(skillsDir, { recursive: true });
55
+ // Create mock briefs source directory and files
56
+ const mockBriefsSourceDir = (0, node_path_1.resolve)(testDir, 'node_modules/rhachet-roles-test/dist/logic/roles/mechanic/.briefs');
57
+ (0, node_fs_1.mkdirSync)(mockBriefsSourceDir, { recursive: true });
58
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(mockBriefsSourceDir, 'brief1.md'), '# Brief 1\nThis is test brief 1');
59
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(mockBriefsSourceDir, 'brief2.md'), '# Brief 2\nThis is test brief 2');
60
+ // Create mock skills source directory and files
61
+ const mockSkillsSourceDir = (0, node_path_1.resolve)(testDir, 'node_modules/rhachet-roles-test/dist/logic/roles/mechanic/.skills');
62
+ (0, node_fs_1.mkdirSync)(mockSkillsSourceDir, { recursive: true });
63
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(mockSkillsSourceDir, 'skill1.sh'), '#!/bin/bash\n# Skill 1 - Test skill\n# This skill does something useful\necho "test skill 1"');
64
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(mockSkillsSourceDir, 'skill2.sh'), '#!/bin/bash\n# Skill 2 - Another test skill\necho "test skill 2"');
65
+ // Create symlinks to the directories (following new directory-linking behavior)
66
+ // Path is relative from briefsDir back to testDir, then to node_modules
67
+ (0, node_fs_1.symlinkSync)('../../../../node_modules/rhachet-roles-test/dist/logic/roles/mechanic/.briefs', (0, node_path_1.resolve)(briefsDir, '.briefs'));
68
+ // Path is relative from skillsDir back to testDir, then to node_modules
69
+ (0, node_fs_1.symlinkSync)('../../../../node_modules/rhachet-roles-test/dist/logic/roles/mechanic/.skills', (0, node_path_1.resolve)(skillsDir, '.skills'));
70
+ // Create a readme file in the role directory
71
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(roleDir, 'readme.md'), '# Mechanic Role\n\nThis is the mechanic role readme.');
72
+ });
73
+ (0, test_fns_1.then)('it should print all briefs and skills with stats', async () => {
74
+ // Execute boot command
75
+ await rolesCommand.parseAsync(['boot', '--repo', 'test', '--role', 'mechanic'], {
76
+ from: 'user',
77
+ });
78
+ // Check that stats were printed
79
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:stats'));
80
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('files = 5'));
81
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('briefs = 2'));
82
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('skills = 2'));
83
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('other = 1'));
84
+ // Check that brief file contents were printed
85
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:.agent/repo=test/role=mechanic/briefs/.briefs/brief1.md'));
86
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('This is test brief 1'));
87
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:.agent/repo=test/role=mechanic/briefs/.briefs/brief2.md'));
88
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('This is test brief 2'));
89
+ // Check that skill documentation was extracted (not full implementation)
90
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:.agent/repo=test/role=mechanic/skills/.skills/skill1.sh'));
91
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Skill 1 - Test skill'));
92
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('[implementation hidden - use skill to execute]'));
93
+ // Check that implementation is NOT printed for skills
94
+ expect(logSpy).not.toHaveBeenCalledWith(expect.stringContaining('echo "test skill 1"'));
95
+ // Check that readme was printed
96
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:.agent/repo=test/role=mechanic/readme.md'));
97
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Mechanic Role'));
98
+ });
99
+ });
100
+ (0, test_fns_1.when)('invoked with "boot" without --repo', () => {
101
+ (0, test_fns_1.then)('it should throw an error requiring --repo', async () => {
102
+ const error = await (0, test_fns_1.getError)(() => rolesCommand.parseAsync(['boot', '--role', 'mechanic'], {
103
+ from: 'user',
104
+ }));
105
+ expect(error?.message).toContain('--repo is required');
106
+ });
107
+ });
108
+ (0, test_fns_1.when)('invoked with "boot" without --role', () => {
109
+ (0, test_fns_1.then)('it should throw an error requiring --role', async () => {
110
+ const error = await (0, test_fns_1.getError)(() => rolesCommand.parseAsync(['boot', '--repo', 'test'], {
111
+ from: 'user',
112
+ }));
113
+ expect(error?.message).toContain('--role is required');
114
+ });
115
+ });
116
+ (0, test_fns_1.when)('invoked with "boot --repo test --role mechanic" before creating role directory', () => {
117
+ beforeAll(() => {
118
+ // Clean up to ensure no role directory exists
119
+ const agentDir = (0, node_path_1.resolve)(testDir, '.agent');
120
+ if ((0, node_fs_1.existsSync)(agentDir)) {
121
+ (0, node_fs_1.rmSync)(agentDir, { recursive: true, force: true });
122
+ }
123
+ });
124
+ (0, test_fns_1.then)('it should throw an error about missing role directory', async () => {
125
+ const error = await (0, test_fns_1.getError)(() => rolesCommand.parseAsync(['boot', '--repo', 'test', '--role', 'mechanic'], {
126
+ from: 'user',
127
+ }));
128
+ expect(error?.message).toContain('Role directory not found');
129
+ expect(error?.message).toContain('roles link');
130
+ });
131
+ });
132
+ (0, test_fns_1.when)('invoked with "boot --repo test --role mechanic" with empty role directory', () => {
133
+ beforeAll(() => {
134
+ // Clean up first, then create empty role directory
135
+ const cleanAgentDir = (0, node_path_1.resolve)(testDir, '.agent');
136
+ if ((0, node_fs_1.existsSync)(cleanAgentDir)) {
137
+ (0, node_fs_1.rmSync)(cleanAgentDir, { recursive: true, force: true });
138
+ }
139
+ // Setup: Create empty role directory
140
+ const roleDir = (0, node_path_1.resolve)(testDir, '.agent/repo=test/role=mechanic');
141
+ (0, node_fs_1.mkdirSync)(roleDir, { recursive: true });
142
+ });
143
+ (0, test_fns_1.then)('it should warn about no resources found', async () => {
144
+ await rolesCommand.parseAsync(['boot', '--repo', 'test', '--role', 'mechanic'], {
145
+ from: 'user',
146
+ });
147
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('No resources found'));
148
+ });
149
+ });
150
+ });
151
+ });
152
+ //# sourceMappingURL=invokeRolesBoot.integration.test.js.map