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.
- package/dist/.test/example.use.repo/example.echoRegistry.js +5 -2
- package/dist/.test/example.use.repo/example.echoRegistry.js.map +1 -1
- package/dist/contract/cli/invoke.js +11 -0
- package/dist/contract/cli/invoke.js.map +1 -1
- package/dist/contract/cli/invokeAsk.js +4 -2
- package/dist/contract/cli/invokeAsk.js.map +1 -1
- package/dist/contract/cli/invokeBriefsBoot.d.ts +1 -1
- package/dist/contract/cli/invokeBriefsBoot.integration.test.js +46 -36
- package/dist/contract/cli/invokeBriefsBoot.integration.test.js.map +1 -1
- package/dist/contract/cli/invokeBriefsBoot.js +9 -5
- package/dist/contract/cli/invokeBriefsBoot.js.map +1 -1
- package/dist/contract/cli/invokeBriefsLink.d.ts +1 -1
- package/dist/contract/cli/invokeBriefsLink.integration.test.js +33 -18
- package/dist/contract/cli/invokeBriefsLink.integration.test.js.map +1 -1
- package/dist/contract/cli/invokeBriefsLink.js +17 -49
- package/dist/contract/cli/invokeBriefsLink.js.map +1 -1
- package/dist/contract/cli/invokeInit.d.ts +9 -0
- package/dist/contract/cli/invokeInit.integration.test.d.ts +1 -0
- package/dist/contract/cli/invokeInit.integration.test.js +123 -0
- package/dist/contract/cli/invokeInit.integration.test.js.map +1 -0
- package/dist/contract/cli/invokeInit.js +57 -0
- package/dist/contract/cli/invokeInit.js.map +1 -0
- package/dist/contract/cli/invokeList.js +1 -1
- package/dist/contract/cli/invokeList.js.map +1 -1
- package/dist/contract/cli/invokeReadme.integration.test.js +1 -1
- package/dist/contract/cli/invokeReadme.integration.test.js.map +1 -1
- package/dist/contract/cli/invokeReadme.js +2 -2
- package/dist/contract/cli/invokeReadme.js.map +1 -1
- package/dist/contract/cli/invokeRoles.d.ts +11 -0
- package/dist/contract/cli/invokeRoles.js +19 -0
- package/dist/contract/cli/invokeRoles.js.map +1 -0
- package/dist/contract/cli/invokeRolesBoot.d.ts +9 -0
- package/dist/contract/cli/invokeRolesBoot.integration.test.d.ts +1 -0
- package/dist/contract/cli/invokeRolesBoot.integration.test.js +152 -0
- package/dist/contract/cli/invokeRolesBoot.integration.test.js.map +1 -0
- package/dist/contract/cli/invokeRolesBoot.js +205 -0
- package/dist/contract/cli/invokeRolesBoot.js.map +1 -0
- package/dist/contract/cli/invokeRolesLink.d.ts +11 -0
- package/dist/contract/cli/invokeRolesLink.integration.test.d.ts +1 -0
- package/dist/contract/cli/invokeRolesLink.integration.test.js +117 -0
- package/dist/contract/cli/invokeRolesLink.integration.test.js.map +1 -0
- package/dist/contract/cli/invokeRolesLink.js +78 -0
- package/dist/contract/cli/invokeRolesLink.js.map +1 -0
- package/dist/domain/objects/Role.d.ts +13 -3
- package/dist/domain/objects/Role.js.map +1 -1
- package/dist/logic/init/discoverRolePackages.d.ts +8 -0
- package/dist/logic/init/discoverRolePackages.js +20 -0
- package/dist/logic/init/discoverRolePackages.js.map +1 -0
- package/dist/logic/init/generateRhachetConfig.d.ts +8 -0
- package/dist/logic/init/generateRhachetConfig.js +40 -0
- package/dist/logic/init/generateRhachetConfig.js.map +1 -0
- package/dist/logic/init/generateRhachetConfig.test.d.ts +1 -0
- package/dist/logic/init/generateRhachetConfig.test.js +35 -0
- package/dist/logic/init/generateRhachetConfig.test.js.map +1 -0
- package/dist/logic/invoke/getAgentReadmeTemplates.d.ts +6 -0
- package/dist/logic/invoke/getAgentReadmeTemplates.js +42 -0
- package/dist/logic/invoke/getAgentReadmeTemplates.js.map +1 -0
- package/dist/logic/invoke/getInvokeHooksByOpts.d.ts +2 -1
- package/dist/logic/invoke/getInvokeHooksByOpts.js +11 -3
- package/dist/logic/invoke/getInvokeHooksByOpts.js.map +1 -1
- package/dist/logic/invoke/link/findsertFile.d.ts +9 -0
- package/dist/logic/invoke/link/findsertFile.js +29 -0
- package/dist/logic/invoke/link/findsertFile.js.map +1 -0
- package/dist/logic/invoke/link/symlinkResourceDirectories.d.ts +12 -0
- package/dist/logic/invoke/link/symlinkResourceDirectories.js +81 -0
- package/dist/logic/invoke/link/symlinkResourceDirectories.js.map +1 -0
- package/dist/logic/invoke/performInCurrentThread.js +1 -1
- package/dist/logic/invoke/performInCurrentThread.js.map +1 -1
- 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
|
|
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 .
|
|
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 (
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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(
|
|
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":";;;AACA,mDAAiD;AACjD,
|
|
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;
|
|
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":";;AAAA,yCAAoC;AACpC,uCAAuD;AAEvD,4FAAqF;AACrF,iDAA8C;AAE9C,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAA,gBAAK,EACH,mEAAmE,EACnE,GAAG,EAAE;QACH,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACrC,IAAA,2BAAY,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,uCAAgB,CAAC,EAAE,CAAC,CAAC;QAE1D,IAAA,eAAI,EAAC,8BAA8B,EAAE,GAAG,EAAE;YACxC,IAAA,eAAI,EAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;gBACrD,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE;oBACzD,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;gBACtD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,uCAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,CACjE,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,eAAI,EAAC,0BAA0B,EAAE,GAAG,EAAE;YACpC,IAAA,eAAI,EAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;gBACjD,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;oBACvD,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;gBACxD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CACrB,uCAAgB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAClD,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,eAAI,EAAC,iCAAiC,EAAE,GAAG,EAAE;YAC3C,IAAA,eAAI,EAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;gBAClD,MAAM,OAAO,CAAC,UAAU,CACtB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,EACjD,EAAE,IAAI,EAAE,MAAM,EAAE,CACjB,CAAC;gBAEF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,CAAC;gBAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CACrB,uCAAgB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,
|
|
1
|
+
{"version":3,"file":"invokeReadme.integration.test.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeReadme.integration.test.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,uCAAuD;AAEvD,4FAAqF;AACrF,iDAA8C;AAE9C,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAA,gBAAK,EACH,mEAAmE,EACnE,GAAG,EAAE;QACH,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACrC,IAAA,2BAAY,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,uCAAgB,CAAC,EAAE,CAAC,CAAC;QAE1D,IAAA,eAAI,EAAC,8BAA8B,EAAE,GAAG,EAAE;YACxC,IAAA,eAAI,EAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;gBACrD,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE;oBACzD,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;gBACtD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,uCAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,CACjE,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,eAAI,EAAC,0BAA0B,EAAE,GAAG,EAAE;YACpC,IAAA,eAAI,EAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;gBACjD,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;oBACvD,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;gBACxD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CACrB,uCAAgB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAClD,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,eAAI,EAAC,iCAAiC,EAAE,GAAG,EAAE;YAC3C,IAAA,eAAI,EAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;gBAClD,MAAM,OAAO,CAAC,UAAU,CACtB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,EACjD,EAAE,IAAI,EAAE,MAAM,EAAE,CACjB,CAAC;gBAEF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,CAAC;gBAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CACrB,uCAAgB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAClE,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,eAAI,EAAC,8BAA8B,EAAE,GAAG,EAAE;YACxC,IAAA,eAAI,EAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;gBACtD,MAAM,KAAK,GAAG,MAAM,IAAA,mBAAQ,EAAC,GAAG,EAAE,CAChC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE;oBAClD,IAAI,EAAE,MAAM;iBACb,CAAC,CACH,CAAC;gBAEF,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAC9B,+CAA+C,CAChD,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,eAAI,EAAC,+BAA+B,EAAE,GAAG,EAAE;YACzC,IAAA,eAAI,EAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;gBACvD,MAAM,KAAK,GAAG,MAAM,IAAA,mBAAQ,EAAC,GAAG,EAAE,CAChC,OAAO,CAAC,UAAU,CAChB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EACpD,EAAE,IAAI,EAAE,MAAM,EAAE,CACjB,CACF,CAAC;gBAEF,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAC9B,qCAAqC,CACtC,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,eAAI,EAAC,kCAAkC,EAAE,GAAG,EAAE;YAC5C,IAAA,eAAI,EAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;gBAC1D,MAAM,KAAK,GAAG,MAAM,IAAA,mBAAQ,EAAC,GAAG,EAAE,CAChC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE;oBACtD,IAAI,EAAE,MAAM;iBACb,CAAC,CACH,CAAC;gBAEF,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -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":";;;AACA,mDAAiD;AAEjD,sEAAmE;AAGnE;;;GAGG;AACI,MAAM,YAAY,GAAG,CAAC,EAC3B,OAAO,EACP,UAAU,GAIX,EAAQ,EAAE;IACT,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SACxD,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC;SAChD,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;SAClD,MAAM,CAAC,CAAC,IAA0D,EAAE,EAAE;QACrE,qBAAqB;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI;YAC9B,gCAAe,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAE7D,mBAAmB;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;YAC5B,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC;YAClD,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ;gBACX,gCAAe,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAE7D,wBAAwB;YACxB,OAAO,WAAW,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1D,CAAC;QAED,eAAe;QACf,MAAM,IAAI,GAAG,IAAA,+BAAc,EAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI;YACP,gCAAe,CAAC,KAAK,CACnB,kBAAkB,IAAI,CAAC,IAAI,4BAA4B,EACvD;gBACE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;aAChE,CACF,CAAC;QAEJ,oBAAoB;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,WAAW,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEjE,gBAAgB;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;
|
|
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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|