rhachet 1.9.0 → 1.10.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 +1 -0
- package/dist/.test/example.use.repo/example.echoRegistry.js.map +1 -1
- package/dist/contract/cli/invoke.js +2 -0
- package/dist/contract/cli/invoke.js.map +1 -1
- package/dist/contract/cli/invokeBriefs.d.ts +11 -0
- package/dist/contract/cli/invokeBriefs.js +19 -0
- package/dist/contract/cli/invokeBriefs.js.map +1 -0
- package/dist/contract/cli/invokeBriefsBoot.d.ts +9 -0
- package/dist/contract/cli/invokeBriefsBoot.integration.test.d.ts +1 -0
- package/dist/contract/cli/invokeBriefsBoot.integration.test.js +149 -0
- package/dist/contract/cli/invokeBriefsBoot.integration.test.js.map +1 -0
- package/dist/contract/cli/invokeBriefsBoot.js +134 -0
- package/dist/contract/cli/invokeBriefsBoot.js.map +1 -0
- package/dist/contract/cli/invokeBriefsLink.d.ts +11 -0
- package/dist/contract/cli/invokeBriefsLink.integration.test.d.ts +1 -0
- package/dist/contract/cli/invokeBriefsLink.integration.test.js +85 -0
- package/dist/contract/cli/invokeBriefsLink.integration.test.js.map +1 -0
- package/dist/contract/cli/invokeBriefsLink.js +78 -0
- package/dist/contract/cli/invokeBriefsLink.js.map +1 -0
- package/dist/domain/objects/Role.d.ts +8 -0
- package/dist/domain/objects/Role.js.map +1 -1
- package/package.json +2 -2
|
@@ -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 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,149 @@
|
|
|
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
|
+
(0, test_fns_1.when)('invoked with "boot --role mechanic" with symlinked directory containing files', () => {
|
|
106
|
+
beforeAll(() => {
|
|
107
|
+
// Clean up first to ensure fresh state
|
|
108
|
+
const cleanBriefsDir = (0, node_path_1.resolve)(testDir, '.briefs');
|
|
109
|
+
if ((0, node_fs_1.existsSync)(cleanBriefsDir)) {
|
|
110
|
+
(0, node_fs_1.rmSync)(cleanBriefsDir, { recursive: true, force: true });
|
|
111
|
+
}
|
|
112
|
+
// Setup: Create briefs directory
|
|
113
|
+
const briefsDir = (0, node_path_1.resolve)(testDir, '.briefs/mechanic');
|
|
114
|
+
(0, node_fs_1.mkdirSync)(briefsDir, { recursive: true });
|
|
115
|
+
// Create a source directory with files and subdirectories
|
|
116
|
+
const sourceDir = (0, node_path_1.resolve)(testDir, 'test-briefs/subdir');
|
|
117
|
+
(0, node_fs_1.mkdirSync)(sourceDir, { recursive: true });
|
|
118
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(sourceDir, 'nested1.md'), '# Nested Brief 1\nThis is nested brief 1');
|
|
119
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(sourceDir, 'nested2.md'), '# Nested Brief 2\nThis is nested brief 2');
|
|
120
|
+
// Create a subdirectory within the source directory
|
|
121
|
+
const nestedSubdir = (0, node_path_1.resolve)(sourceDir, 'deeper');
|
|
122
|
+
(0, node_fs_1.mkdirSync)(nestedSubdir, { recursive: true });
|
|
123
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(nestedSubdir, 'deep1.md'), '# Deep Brief 1\nThis is deep brief 1');
|
|
124
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(nestedSubdir, 'deep2.md'), '# Deep Brief 2\nThis is deep brief 2');
|
|
125
|
+
// Create a symlink to the directory
|
|
126
|
+
(0, node_fs_1.symlinkSync)('../../test-briefs/subdir', (0, node_path_1.resolve)(briefsDir, 'linked-dir'));
|
|
127
|
+
});
|
|
128
|
+
(0, test_fns_1.then)('it should print all files including those in symlinked directories', async () => {
|
|
129
|
+
// Execute boot command
|
|
130
|
+
await briefsCommand.parseAsync(['boot', '--role', 'mechanic'], {
|
|
131
|
+
from: 'user',
|
|
132
|
+
});
|
|
133
|
+
// Check that stats show 4 files (2 in linked-dir, 2 in linked-dir/deeper)
|
|
134
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('files = 4'));
|
|
135
|
+
// Check that nested file contents were printed
|
|
136
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:.briefs/mechanic/linked-dir/nested1.md'));
|
|
137
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('This is nested brief 1'));
|
|
138
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:.briefs/mechanic/linked-dir/nested2.md'));
|
|
139
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('This is nested brief 2'));
|
|
140
|
+
// Check that deeply nested file contents were printed
|
|
141
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:.briefs/mechanic/linked-dir/deeper/deep1.md'));
|
|
142
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('This is deep brief 1'));
|
|
143
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('began:.briefs/mechanic/linked-dir/deeper/deep2.md'));
|
|
144
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('This is deep brief 2'));
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
//# 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":";;AAAA,yCAAoC;AACpC,qCAMiB;AACjB,yCAAoC;AACpC,uCAAuD;AAEvD,yDAAsD;AAEtD,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAA,gBAAK,EAAC,gDAAgD,EAAE,GAAG,EAAE;QAC3D,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAElC,SAAS,CAAC,GAAG,EAAE;YACb,kCAAkC;YAClC,IAAA,mBAAS,EAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,GAAG,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEvE,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,IAAA,mCAAgB,EAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;QAE7C,IAAA,eAAI,EAAC,2DAA2D,EAAE,GAAG,EAAE;YACrE,SAAS,CAAC,GAAG,EAAE;gBACb,uCAAuC;gBACvC,MAAM,cAAc,GAAG,IAAA,mBAAO,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACnD,IAAI,IAAA,oBAAU,EAAC,cAAc,CAAC,EAAE,CAAC;oBAC/B,IAAA,gBAAM,EAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBAED,iCAAiC;gBACjC,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;gBACvD,IAAA,mBAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE1C,kDAAkD;gBAClD,MAAM,WAAW,GAAG,IAAA,mBAAO,EACzB,OAAO,EACP,uEAAuE,CACxE,CAAC;gBACF,IAAA,mBAAS,EAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,IAAA,uBAAa,EACX,IAAA,mBAAO,EAAC,WAAW,EAAE,WAAW,CAAC,EACjC,iCAAiC,CAClC,CAAC;gBACF,IAAA,uBAAa,EACX,IAAA,mBAAO,EAAC,WAAW,EAAE,WAAW,CAAC,EACjC,iCAAiC,CAClC,CAAC;gBAEF,kBAAkB;gBAClB,IAAA,qBAAW,EACT,uFAAuF,EACvF,IAAA,mBAAO,EAAC,SAAS,EAAE,WAAW,CAAC,CAChC,CAAC;gBACF,IAAA,qBAAW,EACT,uFAAuF,EACvF,IAAA,mBAAO,EAAC,SAAS,EAAE,WAAW,CAAC,CAChC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAA,eAAI,EAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;gBAC5D,uBAAuB;gBACvB,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE;oBAC7D,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;gBAEH,gCAAgC;gBAChC,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CACvC,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CACrC,CAAC;gBAEF,wCAAwC;gBACxC,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAC5D,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAChD,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAC5D,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAChD,CAAC;gBAEF,mCAAmC;gBACnC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK;qBACnC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBACtB,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,eAAI,EAAC,oCAAoC,EAAE,GAAG,EAAE;YAC9C,IAAA,eAAI,EAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;gBAC3D,MAAM,KAAK,GAAG,MAAM,IAAA,mBAAQ,EAAC,GAAG,EAAE,CAChC,aAAa,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CACrD,CAAC;gBAEF,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,eAAI,EAAC,4DAA4D,EAAE,GAAG,EAAE;YACtE,SAAS,CAAC,GAAG,EAAE;gBACb,gDAAgD;gBAChD,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAC9C,IAAI,IAAA,oBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;oBAC1B,IAAA,gBAAM,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAA,eAAI,EACF,yDAAyD,EACzD,KAAK,IAAI,EAAE;gBACT,MAAM,KAAK,GAAG,MAAM,IAAA,mBAAQ,EAAC,GAAG,EAAE,CAChC,aAAa,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE;oBACvD,IAAI,EAAE,MAAM;iBACb,CAAC,CACH,CAAC;gBAEF,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;gBAC/D,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAClD,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAA,eAAI,EACF,iEAAiE,EACjE,GAAG,EAAE;YACH,SAAS,CAAC,GAAG,EAAE;gBACb,qDAAqD;gBACrD,MAAM,cAAc,GAAG,IAAA,mBAAO,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACnD,IAAI,IAAA,oBAAU,EAAC,cAAc,CAAC,EAAE,CAAC;oBAC/B,IAAA,gBAAM,EAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBAED,uCAAuC;gBACvC,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;gBACvD,IAAA,mBAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,IAAA,eAAI,EAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;gBACtD,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE;oBAC7D,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAC3C,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QAEF,IAAA,eAAI,EACF,+EAA+E,EAC/E,GAAG,EAAE;YACH,SAAS,CAAC,GAAG,EAAE;gBACb,uCAAuC;gBACvC,MAAM,cAAc,GAAG,IAAA,mBAAO,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACnD,IAAI,IAAA,oBAAU,EAAC,cAAc,CAAC,EAAE,CAAC;oBAC/B,IAAA,gBAAM,EAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBAED,iCAAiC;gBACjC,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;gBACvD,IAAA,mBAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE1C,0DAA0D;gBAC1D,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;gBACzD,IAAA,mBAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1C,IAAA,uBAAa,EACX,IAAA,mBAAO,EAAC,SAAS,EAAE,YAAY,CAAC,EAChC,0CAA0C,CAC3C,CAAC;gBACF,IAAA,uBAAa,EACX,IAAA,mBAAO,EAAC,SAAS,EAAE,YAAY,CAAC,EAChC,0CAA0C,CAC3C,CAAC;gBAEF,oDAAoD;gBACpD,MAAM,YAAY,GAAG,IAAA,mBAAO,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAClD,IAAA,mBAAS,EAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7C,IAAA,uBAAa,EACX,IAAA,mBAAO,EAAC,YAAY,EAAE,UAAU,CAAC,EACjC,sCAAsC,CACvC,CAAC;gBACF,IAAA,uBAAa,EACX,IAAA,mBAAO,EAAC,YAAY,EAAE,UAAU,CAAC,EACjC,sCAAsC,CACvC,CAAC;gBAEF,oCAAoC;gBACpC,IAAA,qBAAW,EACT,0BAA0B,EAC1B,IAAA,mBAAO,EAAC,SAAS,EAAE,YAAY,CAAC,CACjC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAA,eAAI,EACF,oEAAoE,EACpE,KAAK,IAAI,EAAE;gBACT,uBAAuB;gBACvB,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE;oBAC7D,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;gBAEH,0EAA0E;gBAC1E,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CACrC,CAAC;gBAEF,+CAA+C;gBAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CACrB,8CAA8C,CAC/C,CACF,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAClD,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CACrB,8CAA8C,CAC/C,CACF,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAClD,CAAC;gBAEF,sDAAsD;gBACtD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CACrB,mDAAmD,CACpD,CACF,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAChD,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CACrB,mDAAmD,CACpD,CACF,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAChD,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
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
|
+
// Recursively read all files, including those in symlinked directories
|
|
30
|
+
const getAllFiles = (dir) => {
|
|
31
|
+
const entries = (0, node_fs_1.readdirSync)(dir);
|
|
32
|
+
const files = [];
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
const fullPath = (0, node_path_1.resolve)(dir, entry);
|
|
35
|
+
const stats = (0, node_fs_1.statSync)(fullPath); // statSync follows symlinks
|
|
36
|
+
if (stats.isDirectory()) {
|
|
37
|
+
// Recursively traverse directories (including symlinked ones)
|
|
38
|
+
files.push(...getAllFiles(fullPath));
|
|
39
|
+
}
|
|
40
|
+
else if (stats.isFile()) {
|
|
41
|
+
files.push(fullPath);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return files;
|
|
45
|
+
};
|
|
46
|
+
const files = getAllFiles(briefsDir).sort();
|
|
47
|
+
if (files.length === 0) {
|
|
48
|
+
console.log(``);
|
|
49
|
+
console.log(`⚠️ No briefs found in ${briefsDir}`);
|
|
50
|
+
console.log(``);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Count total characters and approximate tokens
|
|
54
|
+
let totalChars = 0;
|
|
55
|
+
for (const filepath of files) {
|
|
56
|
+
const content = (0, node_fs_1.readFileSync)(filepath, 'utf-8');
|
|
57
|
+
totalChars += content.length;
|
|
58
|
+
}
|
|
59
|
+
const approxTokens = Math.ceil(totalChars / 4);
|
|
60
|
+
const costPerMillionTokens = 3; // $3 per million tokens
|
|
61
|
+
const approxCost = (approxTokens / 1_000_000) * costPerMillionTokens;
|
|
62
|
+
const costFormatted = approxCost < 0.01
|
|
63
|
+
? `< $0.01`
|
|
64
|
+
: `$${approxCost.toFixed(2).replace(/\.?0+$/, '')}`;
|
|
65
|
+
// Print stats helper
|
|
66
|
+
const printStats = () => {
|
|
67
|
+
console.log('#####################################################');
|
|
68
|
+
console.log('#####################################################');
|
|
69
|
+
console.log('#####################################################');
|
|
70
|
+
console.log('## began:stats');
|
|
71
|
+
console.log('#####################################################');
|
|
72
|
+
console.log('');
|
|
73
|
+
console.log(' quant');
|
|
74
|
+
console.log(` ├── files = ${files.length}`);
|
|
75
|
+
console.log(` ├── chars = ${totalChars}`);
|
|
76
|
+
console.log(` └── tokens ≈ ${approxTokens} (${costFormatted} at $3/mil)`);
|
|
77
|
+
console.log('');
|
|
78
|
+
console.log(' treestruct');
|
|
79
|
+
const treeOutput = (0, node_child_process_1.execSync)(`tree -l ${briefsDir}`, {
|
|
80
|
+
encoding: 'utf-8',
|
|
81
|
+
})
|
|
82
|
+
.split('\n')
|
|
83
|
+
.map((line) => line.replace(/ -> .*$/, ''))
|
|
84
|
+
.map((line) => line.replace(gitRoot, '@gitroot'))
|
|
85
|
+
.filter((line) => !line.match(/^\s*\d+\s+director(y|ies),/))
|
|
86
|
+
.filter((line) => line.trim() !== '')
|
|
87
|
+
.map((line) => ` ${line}`)
|
|
88
|
+
.join('\n');
|
|
89
|
+
console.log(treeOutput);
|
|
90
|
+
console.log('');
|
|
91
|
+
console.log(' quant');
|
|
92
|
+
console.log(` ├── files = ${files.length}`);
|
|
93
|
+
console.log(` ├── chars = ${totalChars}`);
|
|
94
|
+
console.log(` └── tokens ≈ ${approxTokens} (${costFormatted} at $3/mil)`);
|
|
95
|
+
console.log('');
|
|
96
|
+
console.log('#####################################################');
|
|
97
|
+
console.log('## ended:stats');
|
|
98
|
+
console.log('#####################################################');
|
|
99
|
+
console.log('#####################################################');
|
|
100
|
+
console.log('#####################################################');
|
|
101
|
+
console.log('');
|
|
102
|
+
};
|
|
103
|
+
// Print stats header
|
|
104
|
+
printStats();
|
|
105
|
+
// Print each file
|
|
106
|
+
for (const filepath of files) {
|
|
107
|
+
const content = (0, node_fs_1.readFileSync)(filepath, 'utf-8');
|
|
108
|
+
const relativePath = `.briefs/${role}/${(0, node_path_1.relative)(briefsDir, filepath)}`;
|
|
109
|
+
console.log('#####################################################');
|
|
110
|
+
console.log('#####################################################');
|
|
111
|
+
console.log('#####################################################');
|
|
112
|
+
console.log(`## began:${relativePath}`);
|
|
113
|
+
console.log('#####################################################');
|
|
114
|
+
console.log('');
|
|
115
|
+
// Print content with indentation
|
|
116
|
+
const indentedContent = content
|
|
117
|
+
.split('\n')
|
|
118
|
+
.map((line) => ` ${line}`)
|
|
119
|
+
.join('\n');
|
|
120
|
+
console.log(indentedContent);
|
|
121
|
+
console.log('');
|
|
122
|
+
console.log('#####################################################');
|
|
123
|
+
console.log(`## ended:${relativePath}`);
|
|
124
|
+
console.log('#####################################################');
|
|
125
|
+
console.log('#####################################################');
|
|
126
|
+
console.log('#####################################################');
|
|
127
|
+
console.log('');
|
|
128
|
+
}
|
|
129
|
+
// Print stats footer
|
|
130
|
+
printStats();
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
exports.invokeBriefsBoot = invokeBriefsBoot;
|
|
134
|
+
//# 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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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;
|
|
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.
|
|
5
|
+
"version": "1.10.1",
|
|
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"
|