rhachet 1.9.0 → 1.10.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.
@@ -95,6 +95,7 @@ const echoRole = objects_1.Role.build({
95
95
  readme: 'knows how to echo input back to the user.',
96
96
  traits: [],
97
97
  skills: [echoSkill, writeSkill],
98
+ briefs: null,
98
99
  });
99
100
  exports.EXAMPLE_REGISTRY = new objects_1.RoleRegistry({
100
101
  slug: 'echo',
@@ -1 +1 @@
1
- {"version":3,"file":"example.echoRegistry.js","sourceRoot":"","sources":["../../../src/.test/example.use.repo/example.echoRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"example.echoRegistry.js","sourceRoot":"","sources":["../../../src/.test/example.use.repo/example.echoRegistry.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ const assureUniqueRoles_1 = require("../../logic/invoke/assureUniqueRoles");
9
9
  const getInvokeHooksByOpts_1 = require("../../logic/invoke/getInvokeHooksByOpts");
10
10
  const getRegistriesByOpts_1 = require("../../logic/invoke/getRegistriesByOpts");
11
11
  const invokeAsk_1 = require("./invokeAsk");
12
+ const invokeBriefs_1 = require("./invokeBriefs");
12
13
  const invokeChoose_1 = require("./invokeChoose");
13
14
  const invokeList_1 = require("./invokeList");
14
15
  const invokeReadme_1 = require("./invokeReadme");
@@ -52,6 +53,7 @@ const invoke = async (input) => {
52
53
  .option('-c, --config <path>', 'where to find the rhachet.use.ts config'); // tell commander that we expect the config input and not to complain about it
53
54
  (0, invokeReadme_1.invokeReadme)({ program, registries });
54
55
  (0, invokeList_1.invokeList)({ program, registries });
56
+ (0, invokeBriefs_1.invokeBriefs)({ program, registries });
55
57
  (0, invokeChoose_1.invokeChoose)({ program });
56
58
  (0, invokeAsk_1.invokeAsk)({ program, config: { path: configPath }, registries, hooks });
57
59
  // invoke it
@@ -1 +1 @@
1
- {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../../src/contract/cli/invoke.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../../src/contract/cli/invoke.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 "briefs" command to the CLI with subcommands
5
+ * .why = manages role briefs (link from node_modules, boot/print context)
6
+ * .how = registers "link" and "boot" subcommands under "briefs"
7
+ */
8
+ export declare const invokeBriefs: ({ 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.invokeBriefs = void 0;
4
+ const invokeBriefsBoot_1 = require("./invokeBriefsBoot");
5
+ const invokeBriefsLink_1 = require("./invokeBriefsLink");
6
+ /**
7
+ * .what = adds the "briefs" command to the CLI with subcommands
8
+ * .why = manages role briefs (link from node_modules, boot/print context)
9
+ * .how = registers "link" and "boot" subcommands under "briefs"
10
+ */
11
+ const invokeBriefs = ({ program, registries, }) => {
12
+ const briefsCommand = program
13
+ .command('briefs')
14
+ .description('manage role briefs (link, boot)');
15
+ (0, invokeBriefsLink_1.invokeBriefsLink)({ command: briefsCommand, registries });
16
+ (0, invokeBriefsBoot_1.invokeBriefsBoot)({ command: briefsCommand });
17
+ };
18
+ exports.invokeBriefs = invokeBriefs;
19
+ //# sourceMappingURL=invokeBriefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invokeBriefs.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeBriefs.ts"],"names":[],"mappings":";;;AAGA,yDAAsD;AACtD,yDAAsD;AAEtD;;;;GAIG;AACI,MAAM,YAAY,GAAG,CAAC,EAC3B,OAAO,EACP,UAAU,GAIX,EAAQ,EAAE;IACT,MAAM,aAAa,GAAG,OAAO;SAC1B,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iCAAiC,CAAC,CAAC;IAElD,IAAA,mCAAgB,EAAC,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;IACzD,IAAA,mCAAgB,EAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;AAC/C,CAAC,CAAC;AAbW,QAAA,YAAY,gBAavB"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * .what = adds the "briefs boot" subcommand to the CLI
4
+ * .why = outputs all brief files with stats for context loading
5
+ * .how = reads all files in .briefs/<role> and prints them with formatting and statistics
6
+ */
7
+ export declare const invokeBriefsBoot: ({ command }: {
8
+ command: Command;
9
+ }) => void;
@@ -0,0 +1,107 @@
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 invokeBriefsBoot_1 = require("./invokeBriefsBoot");
8
+ describe('invokeBriefsBoot (integration)', () => {
9
+ (0, test_fns_1.given)('a CLI program with invokeBriefsBoot registered', () => {
10
+ const testDir = (0, node_path_1.resolve)(__dirname, './.temp/invokeBriefsBoot');
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
+ });
17
+ afterAll(() => {
18
+ process.chdir(originalCwd);
19
+ });
20
+ const briefsCommand = new commander_1.Command('briefs');
21
+ const logSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
22
+ beforeEach(() => {
23
+ logSpy.mockClear();
24
+ });
25
+ (0, invokeBriefsBoot_1.invokeBriefsBoot)({ command: briefsCommand });
26
+ (0, test_fns_1.when)('invoked with "boot --role mechanic" after creating briefs', () => {
27
+ beforeAll(() => {
28
+ // Clean up first to ensure fresh state
29
+ const cleanBriefsDir = (0, node_path_1.resolve)(testDir, '.briefs');
30
+ if ((0, node_fs_1.existsSync)(cleanBriefsDir)) {
31
+ (0, node_fs_1.rmSync)(cleanBriefsDir, { recursive: true, force: true });
32
+ }
33
+ // Setup: Create mock brief files
34
+ const briefsDir = (0, node_path_1.resolve)(testDir, '.briefs/mechanic');
35
+ (0, node_fs_1.mkdirSync)(briefsDir, { recursive: true });
36
+ // Create mock node_modules structure for symlinks
37
+ const mockRoleDir = (0, node_path_1.resolve)(testDir, 'node_modules/rhachet-roles-ehmpathy/dist/logic/roles/mechanic/.briefs');
38
+ (0, node_fs_1.mkdirSync)(mockRoleDir, { recursive: true });
39
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(mockRoleDir, 'brief1.md'), '# Brief 1\nThis is test brief 1');
40
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(mockRoleDir, 'brief2.md'), '# Brief 2\nThis is test brief 2');
41
+ // Create symlinks
42
+ (0, node_fs_1.symlinkSync)('../../node_modules/rhachet-roles-ehmpathy/dist/logic/roles/mechanic/.briefs/brief1.md', (0, node_path_1.resolve)(briefsDir, 'brief1.md'));
43
+ (0, node_fs_1.symlinkSync)('../../node_modules/rhachet-roles-ehmpathy/dist/logic/roles/mechanic/.briefs/brief2.md', (0, node_path_1.resolve)(briefsDir, 'brief2.md'));
44
+ });
45
+ (0, test_fns_1.then)('it should print all brief files with stats', async () => {
46
+ // Execute boot command
47
+ await briefsCommand.parseAsync(['boot', '--role', 'mechanic'], {
48
+ from: 'user',
49
+ });
50
+ // Check that stats were printed
51
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:stats'));
52
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('files = 2'));
53
+ // Check that file contents were printed
54
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:.briefs/mechanic/brief1.md'));
55
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('This is test brief 1'));
56
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:.briefs/mechanic/brief2.md'));
57
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('This is test brief 2'));
58
+ // Snapshot the full console output
59
+ const allLogOutput = logSpy.mock.calls
60
+ .map((call) => call[0])
61
+ .join('\n');
62
+ expect(allLogOutput).toMatchSnapshot();
63
+ });
64
+ });
65
+ (0, test_fns_1.when)('invoked with "boot" without --role', () => {
66
+ (0, test_fns_1.then)('it should throw an error requiring --role', async () => {
67
+ const error = await (0, test_fns_1.getError)(() => briefsCommand.parseAsync(['boot'], { from: 'user' }));
68
+ expect(error?.message).toContain('--role is required');
69
+ });
70
+ });
71
+ (0, test_fns_1.when)('invoked with "boot --role mechanic" before creating briefs', () => {
72
+ beforeAll(() => {
73
+ // Clean up to ensure no briefs directory exists
74
+ const briefsDir = (0, node_path_1.resolve)(testDir, '.briefs');
75
+ if ((0, node_fs_1.existsSync)(briefsDir)) {
76
+ (0, node_fs_1.rmSync)(briefsDir, { recursive: true, force: true });
77
+ }
78
+ });
79
+ (0, test_fns_1.then)('it should throw an error about missing briefs directory', async () => {
80
+ const error = await (0, test_fns_1.getError)(() => briefsCommand.parseAsync(['boot', '--role', 'mechanic'], {
81
+ from: 'user',
82
+ }));
83
+ expect(error?.message).toContain('Briefs directory not found');
84
+ expect(error?.message).toContain('briefs link');
85
+ });
86
+ });
87
+ (0, test_fns_1.when)('invoked with "boot --role mechanic" with empty briefs directory', () => {
88
+ beforeAll(() => {
89
+ // Clean up first, then create empty briefs directory
90
+ const cleanBriefsDir = (0, node_path_1.resolve)(testDir, '.briefs');
91
+ if ((0, node_fs_1.existsSync)(cleanBriefsDir)) {
92
+ (0, node_fs_1.rmSync)(cleanBriefsDir, { recursive: true, force: true });
93
+ }
94
+ // Setup: Create empty briefs directory
95
+ const briefsDir = (0, node_path_1.resolve)(testDir, '.briefs/mechanic');
96
+ (0, node_fs_1.mkdirSync)(briefsDir, { recursive: true });
97
+ });
98
+ (0, test_fns_1.then)('it should warn about no briefs found', async () => {
99
+ await briefsCommand.parseAsync(['boot', '--role', 'mechanic'], {
100
+ from: 'user',
101
+ });
102
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('No briefs found'));
103
+ });
104
+ });
105
+ });
106
+ });
107
+ //# sourceMappingURL=invokeBriefsBoot.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invokeBriefsBoot.integration.test.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeBriefsBoot.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.invokeBriefsBoot = void 0;
4
+ const helpful_errors_1 = require("helpful-errors");
5
+ const node_child_process_1 = require("node:child_process");
6
+ const node_fs_1 = require("node:fs");
7
+ const node_path_1 = require("node:path");
8
+ const rhachet_artifact_git_1 = require("rhachet-artifact-git");
9
+ /**
10
+ * .what = adds the "briefs boot" subcommand to the CLI
11
+ * .why = outputs all brief files with stats for context loading
12
+ * .how = reads all files in .briefs/<role> and prints them with formatting and statistics
13
+ */
14
+ const invokeBriefsBoot = ({ command }) => {
15
+ command
16
+ .command('boot')
17
+ .description('boot context from role briefs (print all brief files)')
18
+ .option('--role <slug>', 'the role to boot briefs for')
19
+ .action(async (opts) => {
20
+ if (!opts.role)
21
+ helpful_errors_1.BadRequestError.throw('--role is required (e.g., --role mechanic)');
22
+ const role = opts.role;
23
+ const briefsDir = (0, node_path_1.resolve)(process.cwd(), '.briefs', role);
24
+ const gitRoot = await (0, rhachet_artifact_git_1.getGitRepoRoot)({ from: briefsDir });
25
+ // Check if briefs directory exists
26
+ if (!(0, node_fs_1.existsSync)(briefsDir)) {
27
+ helpful_errors_1.BadRequestError.throw(`Briefs directory not found: ${briefsDir}\nRun "rhachet briefs link --role ${role}" first`);
28
+ }
29
+ // Read all files in the directory
30
+ const files = (0, node_fs_1.readdirSync)(briefsDir)
31
+ .map((file) => (0, node_path_1.resolve)(briefsDir, file))
32
+ .filter((filepath) => (0, node_fs_1.statSync)(filepath).isFile())
33
+ .sort();
34
+ if (files.length === 0) {
35
+ console.log(``);
36
+ console.log(`⚠️ No briefs found in ${briefsDir}`);
37
+ console.log(``);
38
+ return;
39
+ }
40
+ // Count total characters
41
+ let totalChars = 0;
42
+ for (const filepath of files) {
43
+ const content = (0, node_fs_1.readFileSync)(filepath, 'utf-8');
44
+ totalChars += content.length;
45
+ }
46
+ // Print stats helper
47
+ const printStats = () => {
48
+ console.log('#####################################################');
49
+ console.log('#####################################################');
50
+ console.log('#####################################################');
51
+ console.log('## began:stats');
52
+ console.log('#####################################################');
53
+ console.log('');
54
+ console.log(' quant');
55
+ console.log(` ├── files = ${files.length}`);
56
+ console.log(` └── chars = ${totalChars}`);
57
+ console.log('');
58
+ console.log(' treestruct');
59
+ const treeOutput = (0, node_child_process_1.execSync)(`tree -l ${briefsDir}`, {
60
+ encoding: 'utf-8',
61
+ })
62
+ .split('\n')
63
+ .map((line) => line.replace(/ -> .*$/, ''))
64
+ .map((line) => line.replace(gitRoot, '@gitroot'))
65
+ .filter((line) => !line.match(/^\s*\d+\s+director(y|ies),/))
66
+ .filter((line) => line.trim() !== '')
67
+ .map((line) => ` ${line}`)
68
+ .join('\n');
69
+ console.log(treeOutput);
70
+ console.log('');
71
+ console.log(' quant');
72
+ console.log(` ├── files = ${files.length}`);
73
+ console.log(` └── chars = ${totalChars}`);
74
+ console.log('');
75
+ console.log('#####################################################');
76
+ console.log('## ended:stats');
77
+ console.log('#####################################################');
78
+ console.log('#####################################################');
79
+ console.log('#####################################################');
80
+ console.log('');
81
+ };
82
+ // Print stats header
83
+ printStats();
84
+ // Print each file
85
+ for (const filepath of files) {
86
+ const content = (0, node_fs_1.readFileSync)(filepath, 'utf-8');
87
+ const relativePath = `.briefs/${role}/${(0, node_path_1.basename)(filepath)}`;
88
+ console.log('#####################################################');
89
+ console.log('#####################################################');
90
+ console.log('#####################################################');
91
+ console.log(`## began:${relativePath}`);
92
+ console.log('#####################################################');
93
+ console.log('');
94
+ // Print content with indentation
95
+ const indentedContent = content
96
+ .split('\n')
97
+ .map((line) => ` ${line}`)
98
+ .join('\n');
99
+ console.log(indentedContent);
100
+ console.log('');
101
+ console.log('#####################################################');
102
+ console.log(`## ended:${relativePath}`);
103
+ console.log('#####################################################');
104
+ console.log('#####################################################');
105
+ console.log('#####################################################');
106
+ console.log('');
107
+ }
108
+ // Print stats footer
109
+ printStats();
110
+ });
111
+ };
112
+ exports.invokeBriefsBoot = invokeBriefsBoot;
113
+ //# sourceMappingURL=invokeBriefsBoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invokeBriefsBoot.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeBriefsBoot.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 "briefs link" subcommand to the CLI
5
+ * .why = creates symlinks to role briefs from node_modules for easy access
6
+ * .how = creates .briefs/<role> directory and symlinks brief files from the role's package
7
+ */
8
+ export declare const invokeBriefsLink: ({ command, registries, }: {
9
+ command: Command;
10
+ registries: RoleRegistry[];
11
+ }) => void;
@@ -0,0 +1,85 @@
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 Role_1 = require("../../domain/objects/Role");
8
+ const RoleRegistry_1 = require("../../domain/objects/RoleRegistry");
9
+ const invokeBriefsLink_1 = require("./invokeBriefsLink");
10
+ describe('invokeBriefsLink (integration)', () => {
11
+ (0, test_fns_1.given)('a CLI program with invokeBriefsLink registered', () => {
12
+ const testDir = (0, node_path_1.resolve)(__dirname, './.temp/invokeBriefsLink');
13
+ const originalCwd = process.cwd();
14
+ beforeAll(() => {
15
+ // Create test directory structure
16
+ (0, node_fs_1.mkdirSync)(testDir, { recursive: true });
17
+ process.chdir(testDir);
18
+ // Create mock briefs directory
19
+ const briefsDir = (0, node_path_1.resolve)(testDir, 'test-briefs');
20
+ (0, node_fs_1.mkdirSync)(briefsDir, { recursive: true });
21
+ // Create mock brief files
22
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(briefsDir, 'brief1.md'), '# Brief 1\nThis is test brief 1');
23
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(briefsDir, 'brief2.md'), '# Brief 2\nThis is test brief 2');
24
+ });
25
+ afterAll(() => {
26
+ process.chdir(originalCwd);
27
+ });
28
+ // Create mock registries with a role that has briefs configured
29
+ const mockRole = new Role_1.Role({
30
+ slug: 'mechanic',
31
+ name: 'Mechanic',
32
+ purpose: 'Test mechanic role',
33
+ readme: 'Test readme',
34
+ traits: [],
35
+ skills: [],
36
+ briefs: { dir: 'test-briefs' },
37
+ });
38
+ const mockRegistry = new RoleRegistry_1.RoleRegistry({
39
+ slug: 'test-registry',
40
+ readme: 'Test readme',
41
+ roles: [mockRole],
42
+ });
43
+ const briefsCommand = new commander_1.Command('briefs');
44
+ const logSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
45
+ beforeEach(() => {
46
+ logSpy.mockClear();
47
+ // Clean up any existing .briefs directory
48
+ const briefsDir = (0, node_path_1.resolve)(testDir, '.briefs');
49
+ if ((0, node_fs_1.existsSync)(briefsDir)) {
50
+ (0, node_fs_1.rmSync)(briefsDir, { recursive: true, force: true });
51
+ }
52
+ });
53
+ (0, invokeBriefsLink_1.invokeBriefsLink)({ command: briefsCommand, registries: [mockRegistry] });
54
+ (0, test_fns_1.when)('invoked with "link --role mechanic"', () => {
55
+ (0, test_fns_1.then)('it should create symlinks to briefs', async () => {
56
+ await briefsCommand.parseAsync(['link', '--role', 'mechanic'], {
57
+ from: 'user',
58
+ });
59
+ // Check that .briefs/mechanic directory was created
60
+ expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.briefs/mechanic'))).toBe(true);
61
+ // Check that symlinks were created
62
+ expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.briefs/mechanic/brief1.md'))).toBe(true);
63
+ expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.briefs/mechanic/brief2.md'))).toBe(true);
64
+ // Check log output
65
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Linking briefs for role "mechanic"'));
66
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Linked 2 brief(s)'));
67
+ });
68
+ });
69
+ (0, test_fns_1.when)('invoked with "link" without --role', () => {
70
+ (0, test_fns_1.then)('it should throw an error requiring --role', async () => {
71
+ const error = await (0, test_fns_1.getError)(() => briefsCommand.parseAsync(['link'], { from: 'user' }));
72
+ expect(error?.message).toContain('--role is required');
73
+ });
74
+ });
75
+ (0, test_fns_1.when)('invoked with "link --role nonexistent"', () => {
76
+ (0, test_fns_1.then)('it should throw an error about role not found', async () => {
77
+ const error = await (0, test_fns_1.getError)(() => briefsCommand.parseAsync(['link', '--role', 'nonexistent'], {
78
+ from: 'user',
79
+ }));
80
+ expect(error?.message).toContain('no role named "nonexistent"');
81
+ });
82
+ });
83
+ });
84
+ });
85
+ //# sourceMappingURL=invokeBriefsLink.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invokeBriefsLink.integration.test.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeBriefsLink.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.invokeBriefsLink = 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 assureFindRole_1 = require("../../logic/invoke/assureFindRole");
8
+ /**
9
+ * .what = adds the "briefs link" subcommand to the CLI
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
12
+ */
13
+ const invokeBriefsLink = ({ command, registries, }) => {
14
+ command
15
+ .command('link')
16
+ .description('create symlinks to role briefs in .briefs/<role>/')
17
+ .option('--role <slug>', 'the role to link briefs for')
18
+ .action((opts) => {
19
+ if (!opts.role)
20
+ helpful_errors_1.BadRequestError.throw('--role is required (e.g., --role mechanic)');
21
+ // Find the role from registries
22
+ const role = (0, assureFindRole_1.assureFindRole)({ registries, slug: opts.role });
23
+ // Check if role has briefs configured
24
+ if (!role.briefs || !role.briefs.dir) {
25
+ helpful_errors_1.BadRequestError.throw(`Role "${role.slug}" does not have briefs configured`);
26
+ }
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
+ 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
+ }
72
+ console.log(``);
73
+ console.log(`✓ Linked ${files.length} brief(s) to ${briefsDir}`);
74
+ console.log(``);
75
+ });
76
+ };
77
+ exports.invokeBriefsLink = invokeBriefsLink;
78
+ //# sourceMappingURL=invokeBriefsLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invokeBriefsLink.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeBriefsLink.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,14 @@ export interface Role {
41
41
  * .why = declares what the role can do
42
42
  */
43
43
  skills: RoleSkill<any>[];
44
+ /**
45
+ * .what = the briefs curated for this role
46
+ * .why = declares the library of knowledge this role can and should leverage
47
+ * - enables reuse of the briefs, independent from the skills
48
+ */
49
+ briefs: null | {
50
+ dir: string;
51
+ };
44
52
  }
45
53
  export declare class Role extends DomainEntity<Role> implements Role {
46
54
  static unique: readonly ["slug"];
@@ -1 +1 @@
1
- {"version":3,"file":"Role.js","sourceRoot":"","sources":["../../../src/domain/objects/Role.ts"],"names":[],"mappings":";;;AAAA,mDAA8C;AAmD9C,MAAa,IAAK,SAAQ,6BAAkB;;AAA5C,oBAEC;AADe,WAAM,GAAG,CAAC,MAAM,CAAU,CAAC"}
1
+ {"version":3,"file":"Role.js","sourceRoot":"","sources":["../../../src/domain/objects/Role.ts"],"names":[],"mappings":";;;AAAA,mDAA8C;AA0D9C,MAAa,IAAK,SAAQ,6BAAkB;;AAA5C,oBAEC;AADe,WAAM,GAAG,CAAC,MAAM,CAAU,CAAC"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "rhachet",
3
3
  "author": "ehmpathy",
4
4
  "description": "A framework for reliable, thorough thought. Weave threads of thought via stitches.",
5
- "version": "1.9.0",
5
+ "version": "1.10.0",
6
6
  "repository": "ehmpathy/rhachet",
7
7
  "homepage": "https://github.com/ehmpathy/rhachet",
8
8
  "keywords": [
@@ -64,7 +64,6 @@
64
64
  "rhachet-artifact": "1.0.0",
65
65
  "rhachet-artifact-git": "1.1.0",
66
66
  "serde-fns": "1.3.1",
67
- "test-fns": "1.5.0",
68
67
  "tsx": "4.20.5",
69
68
  "type-fns": "1.19.0",
70
69
  "uuid-fns": "1.0.1"
@@ -90,6 +89,7 @@
90
89
  "husky": "8.0.3",
91
90
  "jest": "29.3.1",
92
91
  "prettier": "2.8.1",
92
+ "test-fns": "1.7.0",
93
93
  "ts-jest": "29.1.3",
94
94
  "ts-node": "10.9.2",
95
95
  "typescript": "5.4.5"