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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invokeRolesBoot.integration.test.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeRolesBoot.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.invokeRolesBoot = 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 = extracts documentation from a skill file without showing implementation
|
|
11
|
+
* .why = agents should understand what skills do, not how they do it
|
|
12
|
+
* .how = reads file and extracts only comments/documentation at the top
|
|
13
|
+
*/
|
|
14
|
+
const extractSkillDocumentation = (filepath) => {
|
|
15
|
+
const content = (0, node_fs_1.readFileSync)(filepath, 'utf-8');
|
|
16
|
+
const lines = content.split('\n');
|
|
17
|
+
const docLines = [];
|
|
18
|
+
// Extract shebang and leading comments/documentation
|
|
19
|
+
for (const line of lines) {
|
|
20
|
+
const trimmed = line.trim();
|
|
21
|
+
// Include shebang
|
|
22
|
+
if (trimmed.startsWith('#!')) {
|
|
23
|
+
docLines.push(line);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
// Include comment lines (shell, python, etc)
|
|
27
|
+
if (trimmed.startsWith('#') ||
|
|
28
|
+
trimmed.startsWith('//') ||
|
|
29
|
+
trimmed.startsWith('*')) {
|
|
30
|
+
docLines.push(line);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Stop at first non-comment, non-blank line
|
|
34
|
+
if (trimmed !== '') {
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
// Include blank lines between comments
|
|
38
|
+
docLines.push(line);
|
|
39
|
+
}
|
|
40
|
+
// If we got some documentation, add a note about implementation being hidden
|
|
41
|
+
if (docLines.length > 0) {
|
|
42
|
+
docLines.push('');
|
|
43
|
+
docLines.push('# [implementation hidden - use skill to execute]');
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
docLines.push('# [no documentation found]');
|
|
47
|
+
docLines.push('# [implementation hidden - use skill to execute]');
|
|
48
|
+
}
|
|
49
|
+
return docLines.join('\n');
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* .what = adds the "roles boot" subcommand to the CLI
|
|
53
|
+
* .why = outputs role resources (briefs and skills) with stats for context loading
|
|
54
|
+
* .how = reads all files in .agent/repo=$repo/role=$role and prints them with formatting
|
|
55
|
+
*/
|
|
56
|
+
const invokeRolesBoot = ({ command }) => {
|
|
57
|
+
command
|
|
58
|
+
.command('boot')
|
|
59
|
+
.description('boot context from role resources (briefs and skills)')
|
|
60
|
+
.option('--repo <slug>', 'the repository slug for the role')
|
|
61
|
+
.option('--role <slug>', 'the role to boot resources for')
|
|
62
|
+
.action(async (opts) => {
|
|
63
|
+
if (!opts.repo)
|
|
64
|
+
helpful_errors_1.BadRequestError.throw('--repo is required (e.g., --repo ehmpathy)');
|
|
65
|
+
if (!opts.role)
|
|
66
|
+
helpful_errors_1.BadRequestError.throw('--role is required (e.g., --role mechanic)');
|
|
67
|
+
const repoSlug = opts.repo;
|
|
68
|
+
const roleSlug = opts.role;
|
|
69
|
+
const roleDir = (0, node_path_1.resolve)(process.cwd(), '.agent', `repo=${repoSlug}`, `role=${roleSlug}`);
|
|
70
|
+
const gitRoot = await (0, rhachet_artifact_git_1.getGitRepoRoot)({ from: roleDir });
|
|
71
|
+
// Check if role directory exists
|
|
72
|
+
if (!(0, node_fs_1.existsSync)(roleDir)) {
|
|
73
|
+
helpful_errors_1.BadRequestError.throw(`Role directory not found: ${roleDir}\nRun "rhachet roles link --repo ${repoSlug} --role ${roleSlug}" first`);
|
|
74
|
+
}
|
|
75
|
+
// Recursively read all files, including those in symlinked directories
|
|
76
|
+
const getAllFiles = (dir) => {
|
|
77
|
+
const entries = (0, node_fs_1.readdirSync)(dir);
|
|
78
|
+
const files = [];
|
|
79
|
+
for (const entry of entries) {
|
|
80
|
+
const fullPath = (0, node_path_1.resolve)(dir, entry);
|
|
81
|
+
const stats = (0, node_fs_1.statSync)(fullPath); // statSync follows symlinks
|
|
82
|
+
if (stats.isDirectory()) {
|
|
83
|
+
// Recursively traverse directories (including symlinked ones)
|
|
84
|
+
files.push(...getAllFiles(fullPath));
|
|
85
|
+
}
|
|
86
|
+
else if (stats.isFile()) {
|
|
87
|
+
files.push(fullPath);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return files;
|
|
91
|
+
};
|
|
92
|
+
const allFiles = getAllFiles(roleDir).sort();
|
|
93
|
+
if (allFiles.length === 0) {
|
|
94
|
+
console.log(``);
|
|
95
|
+
console.log(`⚠️ No resources found in ${roleDir}`);
|
|
96
|
+
console.log(``);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Separate files by type
|
|
100
|
+
const briefsDir = (0, node_path_1.resolve)(roleDir, 'briefs');
|
|
101
|
+
const skillsDir = (0, node_path_1.resolve)(roleDir, 'skills');
|
|
102
|
+
const briefFiles = allFiles.filter((f) => f.startsWith(briefsDir));
|
|
103
|
+
const skillFiles = allFiles.filter((f) => f.startsWith(skillsDir));
|
|
104
|
+
const otherFiles = allFiles.filter((f) => !f.startsWith(briefsDir) && !f.startsWith(skillsDir));
|
|
105
|
+
// Count total characters and approximate tokens
|
|
106
|
+
let totalChars = 0;
|
|
107
|
+
for (const filepath of allFiles) {
|
|
108
|
+
const isSkill = filepath.startsWith(skillsDir);
|
|
109
|
+
if (isSkill) {
|
|
110
|
+
// For skills, only count documentation
|
|
111
|
+
const doc = extractSkillDocumentation(filepath);
|
|
112
|
+
totalChars += doc.length;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// For other files, count full content
|
|
116
|
+
const content = (0, node_fs_1.readFileSync)(filepath, 'utf-8');
|
|
117
|
+
totalChars += content.length;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const approxTokens = Math.ceil(totalChars / 4);
|
|
121
|
+
const costPerMillionTokens = 3; // $3 per million tokens
|
|
122
|
+
const approxCost = (approxTokens / 1_000_000) * costPerMillionTokens;
|
|
123
|
+
const costFormatted = approxCost < 0.01
|
|
124
|
+
? `< $0.01`
|
|
125
|
+
: `$${approxCost.toFixed(2).replace(/\.?0+$/, '')}`;
|
|
126
|
+
// Print stats helper
|
|
127
|
+
const printStats = () => {
|
|
128
|
+
console.log('#####################################################');
|
|
129
|
+
console.log('#####################################################');
|
|
130
|
+
console.log('#####################################################');
|
|
131
|
+
console.log('## began:stats');
|
|
132
|
+
console.log('#####################################################');
|
|
133
|
+
console.log('');
|
|
134
|
+
console.log(' quant');
|
|
135
|
+
console.log(` ├── files = ${allFiles.length}`);
|
|
136
|
+
console.log(` │ ├── briefs = ${briefFiles.length}`);
|
|
137
|
+
console.log(` │ ├── skills = ${skillFiles.length}`);
|
|
138
|
+
console.log(` │ └── other = ${otherFiles.length}`);
|
|
139
|
+
console.log(` ├── chars = ${totalChars}`);
|
|
140
|
+
console.log(` └── tokens ≈ ${approxTokens} (${costFormatted} at $3/mil)`);
|
|
141
|
+
console.log('');
|
|
142
|
+
console.log(' treestruct');
|
|
143
|
+
const treeOutput = (0, node_child_process_1.execSync)(`tree -l ${roleDir}`, {
|
|
144
|
+
encoding: 'utf-8',
|
|
145
|
+
})
|
|
146
|
+
.split('\n')
|
|
147
|
+
.map((line) => line.replace(/ -> .*$/, ''))
|
|
148
|
+
.map((line) => line.replace(gitRoot, '@gitroot'))
|
|
149
|
+
.filter((line) => !line.match(/^\s*\d+\s+director(y|ies),/))
|
|
150
|
+
.filter((line) => line.trim() !== '')
|
|
151
|
+
.map((line) => ` ${line}`)
|
|
152
|
+
.join('\n');
|
|
153
|
+
console.log(treeOutput);
|
|
154
|
+
console.log('');
|
|
155
|
+
console.log(' quant');
|
|
156
|
+
console.log(` ├── files = ${allFiles.length}`);
|
|
157
|
+
console.log(` │ ├── briefs = ${briefFiles.length}`);
|
|
158
|
+
console.log(` │ ├── skills = ${skillFiles.length}`);
|
|
159
|
+
console.log(` │ └── other = ${otherFiles.length}`);
|
|
160
|
+
console.log(` ├── chars = ${totalChars}`);
|
|
161
|
+
console.log(` └── tokens ≈ ${approxTokens} (${costFormatted} at $3/mil)`);
|
|
162
|
+
console.log('');
|
|
163
|
+
console.log('#####################################################');
|
|
164
|
+
console.log('## ended:stats');
|
|
165
|
+
console.log('#####################################################');
|
|
166
|
+
console.log('#####################################################');
|
|
167
|
+
console.log('#####################################################');
|
|
168
|
+
console.log('');
|
|
169
|
+
};
|
|
170
|
+
// Print stats header
|
|
171
|
+
printStats();
|
|
172
|
+
// Print each file
|
|
173
|
+
for (const filepath of allFiles) {
|
|
174
|
+
const relativePath = `.agent/repo=${repoSlug}/role=${roleSlug}/${(0, node_path_1.relative)(roleDir, filepath)}`;
|
|
175
|
+
const isSkill = filepath.startsWith(skillsDir);
|
|
176
|
+
console.log('#####################################################');
|
|
177
|
+
console.log('#####################################################');
|
|
178
|
+
console.log('#####################################################');
|
|
179
|
+
console.log(`## began:${relativePath}`);
|
|
180
|
+
console.log('#####################################################');
|
|
181
|
+
console.log('');
|
|
182
|
+
// Get content based on file type
|
|
183
|
+
const content = isSkill
|
|
184
|
+
? extractSkillDocumentation(filepath)
|
|
185
|
+
: (0, node_fs_1.readFileSync)(filepath, 'utf-8');
|
|
186
|
+
// Print content with indentation
|
|
187
|
+
const indentedContent = content
|
|
188
|
+
.split('\n')
|
|
189
|
+
.map((line) => ` ${line}`)
|
|
190
|
+
.join('\n');
|
|
191
|
+
console.log(indentedContent);
|
|
192
|
+
console.log('');
|
|
193
|
+
console.log('#####################################################');
|
|
194
|
+
console.log(`## ended:${relativePath}`);
|
|
195
|
+
console.log('#####################################################');
|
|
196
|
+
console.log('#####################################################');
|
|
197
|
+
console.log('#####################################################');
|
|
198
|
+
console.log('');
|
|
199
|
+
}
|
|
200
|
+
// Print stats footer
|
|
201
|
+
printStats();
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
exports.invokeRolesBoot = invokeRolesBoot;
|
|
205
|
+
//# sourceMappingURL=invokeRolesBoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invokeRolesBoot.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeRolesBoot.ts"],"names":[],"mappings":";;;AACA,mDAAiD;AACjD,2DAA8C;AAC9C,qCAA0E;AAC1E,yCAA8C;AAC9C,+DAAsD;AAEtD;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,CAAC,QAAgB,EAAU,EAAE;IAC7D,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,qDAAqD;IACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,kBAAkB;QAClB,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QAED,6CAA6C;QAC7C,IACE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YACvB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YACxB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EACvB,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,MAAM;QACR,CAAC;QAED,uCAAuC;QACvC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,6EAA6E;IAC7E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF;;;;GAIG;AACI,MAAM,eAAe,GAAG,CAAC,EAAE,OAAO,EAAwB,EAAQ,EAAE;IACzE,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC;SAC3D,MAAM,CAAC,eAAe,EAAE,gCAAgC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAsC,EAAE,EAAE;QACvD,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;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAA,mBAAO,EACrB,OAAO,CAAC,GAAG,EAAE,EACb,QAAQ,EACR,QAAQ,QAAQ,EAAE,EAClB,QAAQ,QAAQ,EAAE,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,IAAA,qCAAc,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAExD,iCAAiC;QACjC,IAAI,CAAC,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;YACzB,gCAAe,CAAC,KAAK,CACnB,6BAA6B,OAAO,oCAAoC,QAAQ,WAAW,QAAQ,SAAS,CAC7G,CAAC;QACJ,CAAC;QAED,uEAAuE;QACvE,MAAM,WAAW,GAAG,CAAC,GAAW,EAAY,EAAE;YAC5C,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAa,EAAE,CAAC;YAE3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAA,mBAAO,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACrC,MAAM,KAAK,GAAG,IAAA,kBAAQ,EAAC,QAAQ,CAAC,CAAC,CAAC,4BAA4B;gBAE9D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,8DAA8D;oBAC9D,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACvC,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAE7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE7C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAC5D,CAAC;QAEF,gDAAgD;QAChD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAE/C,IAAI,OAAO,EAAE,CAAC;gBACZ,uCAAuC;gBACvC,MAAM,GAAG,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;gBAChD,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,sCAAsC;gBACtC,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,oBAAoB,GAAG,CAAC,CAAC,CAAC,wBAAwB;QACxD,MAAM,UAAU,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,oBAAoB,CAAC;QACrE,MAAM,aAAa,GACjB,UAAU,GAAG,IAAI;YACf,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;QAExD,qBAAqB;QACrB,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CACT,oBAAoB,YAAY,KAAK,aAAa,aAAa,CAChE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAA,6BAAQ,EAAC,WAAW,OAAO,EAAE,EAAE;gBAChD,QAAQ,EAAE,OAAO;aAClB,CAAC;iBACC,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;iBAC1C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;iBAChD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;iBAC3D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;iBACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC;iBAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CACT,oBAAoB,YAAY,KAAK,aAAa,aAAa,CAChE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,qBAAqB;QACrB,UAAU,EAAE,CAAC;QAEb,kBAAkB;QAClB,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,YAAY,GAAG,eAAe,QAAQ,SAAS,QAAQ,IAAI,IAAA,oBAAQ,EACvE,OAAO,EACP,QAAQ,CACT,EAAE,CAAC;YACJ,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAE/C,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,iCAAiC;YACjC,MAAM,OAAO,GAAG,OAAO;gBACrB,CAAC,CAAC,yBAAyB,CAAC,QAAQ,CAAC;gBACrC,CAAC,CAAC,IAAA,sBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEpC,iCAAiC;YACjC,MAAM,eAAe,GAAG,OAAO;iBAC5B,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;iBAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAE7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,qBAAqB;QACrB,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAvLW,QAAA,eAAe,mBAuL1B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { RoleRegistry } from '../sdk';
|
|
3
|
+
/**
|
|
4
|
+
* .what = adds the "roles link" subcommand to the CLI
|
|
5
|
+
* .why = creates .agent/ directory structure and links role resources
|
|
6
|
+
* .how = findserts standard readmes and symlinks briefs and skills
|
|
7
|
+
*/
|
|
8
|
+
export declare const invokeRolesLink: ({ command, registries, }: {
|
|
9
|
+
command: Command;
|
|
10
|
+
registries: RoleRegistry[];
|
|
11
|
+
}) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
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 invokeRolesLink_1 = require("./invokeRolesLink");
|
|
10
|
+
describe('invokeRolesLink (integration)', () => {
|
|
11
|
+
(0, test_fns_1.given)('a CLI program with invokeRolesLink registered', () => {
|
|
12
|
+
const testDir = (0, node_path_1.resolve)(__dirname, './.temp/invokeRolesLink');
|
|
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
|
+
// Create mock skills directory
|
|
25
|
+
const skillsDir = (0, node_path_1.resolve)(testDir, 'test-skills');
|
|
26
|
+
(0, node_fs_1.mkdirSync)(skillsDir, { recursive: true });
|
|
27
|
+
// Create mock skill files
|
|
28
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(skillsDir, 'skill1.sh'), '#!/bin/bash\n# Skill 1\necho "test skill 1"');
|
|
29
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(skillsDir, 'skill2.sh'), '#!/bin/bash\n# Skill 2\necho "test skill 2"');
|
|
30
|
+
});
|
|
31
|
+
afterAll(() => {
|
|
32
|
+
process.chdir(originalCwd);
|
|
33
|
+
});
|
|
34
|
+
// Create mock registries with a role that has briefs and skills configured
|
|
35
|
+
const mockRole = new Role_1.Role({
|
|
36
|
+
slug: 'mechanic',
|
|
37
|
+
name: 'Mechanic',
|
|
38
|
+
purpose: 'Test mechanic role',
|
|
39
|
+
readme: '# Mechanic Role\n\nThis is the mechanic role readme.',
|
|
40
|
+
traits: [],
|
|
41
|
+
skills: {
|
|
42
|
+
dirs: [{ uri: 'test-skills' }],
|
|
43
|
+
refs: [],
|
|
44
|
+
},
|
|
45
|
+
briefs: { dirs: [{ uri: 'test-briefs' }] },
|
|
46
|
+
});
|
|
47
|
+
const mockRegistry = new RoleRegistry_1.RoleRegistry({
|
|
48
|
+
slug: 'test-registry',
|
|
49
|
+
readme: 'Test readme',
|
|
50
|
+
roles: [mockRole],
|
|
51
|
+
});
|
|
52
|
+
const rolesCommand = new commander_1.Command('roles');
|
|
53
|
+
const logSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
logSpy.mockClear();
|
|
56
|
+
// Clean up any existing .agent directory
|
|
57
|
+
const agentDir = (0, node_path_1.resolve)(testDir, '.agent');
|
|
58
|
+
if ((0, node_fs_1.existsSync)(agentDir)) {
|
|
59
|
+
(0, node_fs_1.rmSync)(agentDir, { recursive: true, force: true });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
(0, invokeRolesLink_1.invokeRolesLink)({ command: rolesCommand, registries: [mockRegistry] });
|
|
63
|
+
(0, test_fns_1.when)('invoked with "link --repo test --role mechanic"', () => {
|
|
64
|
+
(0, test_fns_1.then)('it should create .agent directory structure and link briefs and skills', async () => {
|
|
65
|
+
await rolesCommand.parseAsync(['link', '--repo', 'test', '--role', 'mechanic'], {
|
|
66
|
+
from: 'user',
|
|
67
|
+
});
|
|
68
|
+
// Check that .agent directory structure was created
|
|
69
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.agent/readme.md'))).toBe(true);
|
|
70
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.agent/repo=.this/readme.md'))).toBe(true);
|
|
71
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.agent/repo=test/role=mechanic/readme.md'))).toBe(true);
|
|
72
|
+
// Check that role readme was created
|
|
73
|
+
const roleReadmeContent = require('fs').readFileSync((0, node_path_1.resolve)(testDir, '.agent/repo=test/role=mechanic/readme.md'), 'utf-8');
|
|
74
|
+
expect(roleReadmeContent).toContain('Mechanic Role');
|
|
75
|
+
// Check that briefs directory symlink was created
|
|
76
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.agent/repo=test/role=mechanic/briefs/test-briefs'))).toBe(true);
|
|
77
|
+
// Check that files are accessible through the symlinked briefs directory
|
|
78
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.agent/repo=test/role=mechanic/briefs/test-briefs/brief1.md'))).toBe(true);
|
|
79
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.agent/repo=test/role=mechanic/briefs/test-briefs/brief2.md'))).toBe(true);
|
|
80
|
+
// Check that skills directory symlink was created
|
|
81
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.agent/repo=test/role=mechanic/skills/test-skills'))).toBe(true);
|
|
82
|
+
// Check that files are accessible through the symlinked skills directory
|
|
83
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.agent/repo=test/role=mechanic/skills/test-skills/skill1.sh'))).toBe(true);
|
|
84
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.resolve)(testDir, '.agent/repo=test/role=mechanic/skills/test-skills/skill2.sh'))).toBe(true);
|
|
85
|
+
// Check log output
|
|
86
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Linked role "mechanic"'));
|
|
87
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('2 brief(s) linked'));
|
|
88
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('2 skill(s) linked'));
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
(0, test_fns_1.when)('invoked with "link" without --repo', () => {
|
|
92
|
+
(0, test_fns_1.then)('it should throw an error requiring --repo', async () => {
|
|
93
|
+
const error = await (0, test_fns_1.getError)(() => rolesCommand.parseAsync(['link', '--role', 'mechanic'], {
|
|
94
|
+
from: 'user',
|
|
95
|
+
}));
|
|
96
|
+
expect(error?.message).toContain('--repo is required');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
(0, test_fns_1.when)('invoked with "link" without --role', () => {
|
|
100
|
+
(0, test_fns_1.then)('it should throw an error requiring --role', async () => {
|
|
101
|
+
const error = await (0, test_fns_1.getError)(() => rolesCommand.parseAsync(['link', '--repo', 'test'], {
|
|
102
|
+
from: 'user',
|
|
103
|
+
}));
|
|
104
|
+
expect(error?.message).toContain('--role is required');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
(0, test_fns_1.when)('invoked with "link --repo test --role nonexistent"', () => {
|
|
108
|
+
(0, test_fns_1.then)('it should throw an error about role not found', async () => {
|
|
109
|
+
const error = await (0, test_fns_1.getError)(() => rolesCommand.parseAsync(['link', '--repo', 'test', '--role', 'nonexistent'], {
|
|
110
|
+
from: 'user',
|
|
111
|
+
}));
|
|
112
|
+
expect(error?.message).toContain('no role named "nonexistent"');
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=invokeRolesLink.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invokeRolesLink.integration.test.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeRolesLink.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.invokeRolesLink = 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
|
+
const getAgentReadmeTemplates_1 = require("../../logic/invoke/getAgentReadmeTemplates");
|
|
9
|
+
const findsertFile_1 = require("../../logic/invoke/link/findsertFile");
|
|
10
|
+
const symlinkResourceDirectories_1 = require("../../logic/invoke/link/symlinkResourceDirectories");
|
|
11
|
+
/**
|
|
12
|
+
* .what = adds the "roles link" subcommand to the CLI
|
|
13
|
+
* .why = creates .agent/ directory structure and links role resources
|
|
14
|
+
* .how = findserts standard readmes and symlinks briefs and skills
|
|
15
|
+
*/
|
|
16
|
+
const invokeRolesLink = ({ command, registries, }) => {
|
|
17
|
+
command
|
|
18
|
+
.command('link')
|
|
19
|
+
.description('link role resources into .agent/ directory structure')
|
|
20
|
+
.option('--repo <slug>', 'the repository slug for the role')
|
|
21
|
+
.option('--role <slug>', 'the role to link resources for')
|
|
22
|
+
.action((opts) => {
|
|
23
|
+
if (!opts.repo)
|
|
24
|
+
helpful_errors_1.BadRequestError.throw('--repo is required (e.g., --repo ehmpathy)');
|
|
25
|
+
if (!opts.role)
|
|
26
|
+
helpful_errors_1.BadRequestError.throw('--role is required (e.g., --role mechanic)');
|
|
27
|
+
const repoSlug = opts.repo;
|
|
28
|
+
const role = (0, assureFindRole_1.assureFindRole)({ registries, slug: opts.role });
|
|
29
|
+
console.log(``);
|
|
30
|
+
console.log(`🔗 Linking role "${role.slug}" from repo "${repoSlug}"...`);
|
|
31
|
+
console.log(``);
|
|
32
|
+
// Create .agent directory structure
|
|
33
|
+
const agentDir = (0, node_path_1.resolve)(process.cwd(), '.agent');
|
|
34
|
+
const repoThisDir = (0, node_path_1.resolve)(agentDir, 'repo=.this');
|
|
35
|
+
const repoRoleDir = (0, node_path_1.resolve)(agentDir, `repo=${repoSlug}`, `role=${role.slug}`);
|
|
36
|
+
(0, node_fs_1.mkdirSync)(agentDir, { recursive: true });
|
|
37
|
+
(0, node_fs_1.mkdirSync)(repoThisDir, { recursive: true });
|
|
38
|
+
(0, node_fs_1.mkdirSync)(repoRoleDir, { recursive: true });
|
|
39
|
+
// Findsert .agent/readme.md
|
|
40
|
+
(0, findsertFile_1.findsertFile)({
|
|
41
|
+
path: (0, node_path_1.resolve)(agentDir, 'readme.md'),
|
|
42
|
+
template: (0, getAgentReadmeTemplates_1.getAgentRootReadmeTemplate)(),
|
|
43
|
+
});
|
|
44
|
+
// Findsert .agent/repo=.this/readme.md
|
|
45
|
+
(0, findsertFile_1.findsertFile)({
|
|
46
|
+
path: (0, node_path_1.resolve)(repoThisDir, 'readme.md'),
|
|
47
|
+
template: (0, getAgentReadmeTemplates_1.getAgentRepoThisReadmeTemplate)(),
|
|
48
|
+
});
|
|
49
|
+
// Upsert .agent/repo=$repo/role=$role/readme.md
|
|
50
|
+
if (role.readme) {
|
|
51
|
+
const roleReadmePath = (0, node_path_1.resolve)(repoRoleDir, 'readme.md');
|
|
52
|
+
const relativeRoleReadmePath = (0, node_path_1.relative)(process.cwd(), roleReadmePath);
|
|
53
|
+
(0, node_fs_1.writeFileSync)(roleReadmePath, role.readme, 'utf8');
|
|
54
|
+
console.log(` + ${relativeRoleReadmePath} (upserted)`);
|
|
55
|
+
}
|
|
56
|
+
// Link briefs if configured
|
|
57
|
+
const briefsCount = (0, symlinkResourceDirectories_1.symlinkResourceDirectories)({
|
|
58
|
+
sourceDirs: role.briefs.dirs,
|
|
59
|
+
targetDir: (0, node_path_1.resolve)(repoRoleDir, 'briefs'),
|
|
60
|
+
resourceName: 'briefs',
|
|
61
|
+
});
|
|
62
|
+
// Link skills if configured
|
|
63
|
+
const skillsCount = (0, symlinkResourceDirectories_1.symlinkResourceDirectories)({
|
|
64
|
+
sourceDirs: role.skills.dirs,
|
|
65
|
+
targetDir: (0, node_path_1.resolve)(repoRoleDir, 'skills'),
|
|
66
|
+
resourceName: 'skills',
|
|
67
|
+
});
|
|
68
|
+
console.log(``);
|
|
69
|
+
console.log(`🔗 Linked role "${role.slug}" from repo "${repoSlug}"`);
|
|
70
|
+
if (briefsCount > 0)
|
|
71
|
+
console.log(` - ${briefsCount} brief(s) linked`);
|
|
72
|
+
if (skillsCount > 0)
|
|
73
|
+
console.log(` - ${skillsCount} skill(s) linked`);
|
|
74
|
+
console.log(``);
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
exports.invokeRolesLink = invokeRolesLink;
|
|
78
|
+
//# sourceMappingURL=invokeRolesLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invokeRolesLink.js","sourceRoot":"","sources":["../../../src/contract/cli/invokeRolesLink.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,15 +39,25 @@ export interface Role {
|
|
|
39
39
|
/**
|
|
40
40
|
* .what = the skills known by the role
|
|
41
41
|
* .why = declares what the role can do
|
|
42
|
+
* .how =
|
|
43
|
+
* - dirs: directory-based skills (e.g., .sh scripts) for linking/booting
|
|
44
|
+
* - refs: programmatic RoleSkill references for execution
|
|
42
45
|
*/
|
|
43
|
-
skills:
|
|
46
|
+
skills: {
|
|
47
|
+
dirs: {
|
|
48
|
+
uri: string;
|
|
49
|
+
}[];
|
|
50
|
+
refs: RoleSkill<any>[];
|
|
51
|
+
};
|
|
44
52
|
/**
|
|
45
53
|
* .what = the briefs curated for this role
|
|
46
54
|
* .why = declares the library of knowledge this role can and should leverage
|
|
47
55
|
* - enables reuse of the briefs, independent from the skills
|
|
48
56
|
*/
|
|
49
|
-
briefs:
|
|
50
|
-
|
|
57
|
+
briefs: {
|
|
58
|
+
dirs: {
|
|
59
|
+
uri: string;
|
|
60
|
+
}[];
|
|
51
61
|
};
|
|
52
62
|
}
|
|
53
63
|
export declare class Role extends DomainEntity<Role> implements Role {
|
|
@@ -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;AAgE9C,MAAa,IAAK,SAAQ,6BAAkB;;AAA5C,oBAEC;AADe,WAAM,GAAG,CAAC,MAAM,CAAU,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .what = discovers rhachet role packages from package.json
|
|
3
|
+
* .why = enables auto-initialization of rhachet.use.ts config
|
|
4
|
+
* .how = scans dependencies + devDependencies for packages matching `rhachet-roles-*`
|
|
5
|
+
*/
|
|
6
|
+
export declare const discoverRolePackages: (input: {
|
|
7
|
+
from: string;
|
|
8
|
+
}) => Promise<string[]>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.discoverRolePackages = void 0;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const rhachet_artifact_git_1 = require("rhachet-artifact-git");
|
|
7
|
+
/**
|
|
8
|
+
* .what = discovers rhachet role packages from package.json
|
|
9
|
+
* .why = enables auto-initialization of rhachet.use.ts config
|
|
10
|
+
* .how = scans dependencies + devDependencies for packages matching `rhachet-roles-*`
|
|
11
|
+
*/
|
|
12
|
+
const discoverRolePackages = async (input) => {
|
|
13
|
+
const root = await (0, rhachet_artifact_git_1.getGitRepoRoot)({ from: input.from });
|
|
14
|
+
const pkgPath = (0, node_path_1.resolve)(root, 'package.json');
|
|
15
|
+
const pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, 'utf8'));
|
|
16
|
+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
17
|
+
return Object.keys(allDeps).filter((name) => name.startsWith('rhachet-roles-'));
|
|
18
|
+
};
|
|
19
|
+
exports.discoverRolePackages = discoverRolePackages;
|
|
20
|
+
//# sourceMappingURL=discoverRolePackages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discoverRolePackages.js","sourceRoot":"","sources":["../../../src/logic/init/discoverRolePackages.ts"],"names":[],"mappings":";;;AAAA,qCAAuC;AACvC,yCAAoC;AACpC,+DAAsD;AAEtD;;;;GAIG;AACI,MAAM,oBAAoB,GAAG,KAAK,EAAE,KAE1C,EAAqB,EAAE;IACtB,MAAM,IAAI,GAAG,MAAM,IAAA,qCAAc,EAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1C,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAClC,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,oBAAoB,wBAU/B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .what = generates rhachet.use.ts config file content
|
|
3
|
+
* .why = enables auto-initialization from discovered role packages
|
|
4
|
+
* .how = creates aliased imports and exports for registries and hooks
|
|
5
|
+
*/
|
|
6
|
+
export declare const generateRhachetConfig: (input: {
|
|
7
|
+
packages: string[];
|
|
8
|
+
}) => string;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRhachetConfig = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* .what = converts a package name suffix to PascalCase
|
|
6
|
+
* .why = generates valid TypeScript identifier suffixes for aliased imports
|
|
7
|
+
*/
|
|
8
|
+
const toPascalCase = (str) => str
|
|
9
|
+
.split('-')
|
|
10
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
11
|
+
.join('');
|
|
12
|
+
/**
|
|
13
|
+
* .what = generates rhachet.use.ts config file content
|
|
14
|
+
* .why = enables auto-initialization from discovered role packages
|
|
15
|
+
* .how = creates aliased imports and exports for registries and hooks
|
|
16
|
+
*/
|
|
17
|
+
const generateRhachetConfig = (input) => {
|
|
18
|
+
// Always use aliased imports for consistency
|
|
19
|
+
const imports = input.packages
|
|
20
|
+
.map((pkg) => {
|
|
21
|
+
const suffix = toPascalCase(pkg.replace('rhachet-roles-', ''));
|
|
22
|
+
return `import { getRoleRegistry as getRoleRegistry${suffix}, getInvokeHooks as getInvokeHooks${suffix} } from '${pkg}';`;
|
|
23
|
+
})
|
|
24
|
+
.join('\n');
|
|
25
|
+
const registries = input.packages
|
|
26
|
+
.map((pkg) => `getRoleRegistry${toPascalCase(pkg.replace('rhachet-roles-', ''))}()`)
|
|
27
|
+
.join(', ');
|
|
28
|
+
const hooks = input.packages
|
|
29
|
+
.map((pkg) => `getInvokeHooks${toPascalCase(pkg.replace('rhachet-roles-', ''))}()`)
|
|
30
|
+
.join(', ');
|
|
31
|
+
return `import { InvokeHooks, RoleRegistry } from 'rhachet';
|
|
32
|
+
|
|
33
|
+
${imports}
|
|
34
|
+
|
|
35
|
+
export const getRoleRegistries = (): RoleRegistry[] => [${registries}];
|
|
36
|
+
export const getInvokeHooks = (): InvokeHooks[] => [${hooks}];
|
|
37
|
+
`;
|
|
38
|
+
};
|
|
39
|
+
exports.generateRhachetConfig = generateRhachetConfig;
|
|
40
|
+
//# sourceMappingURL=generateRhachetConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateRhachetConfig.js","sourceRoot":"","sources":["../../../src/logic/init/generateRhachetConfig.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,GAAW,EAAU,EAAE,CAC3C,GAAG;KACA,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AAEd;;;;GAIG;AACI,MAAM,qBAAqB,GAAG,CAAC,KAErC,EAAU,EAAE;IACX,6CAA6C;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ;SAC3B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,8CAA8C,MAAM,qCAAqC,MAAM,YAAY,GAAG,IAAI,CAAC;IAC5H,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ;SAC9B,GAAG,CACF,CAAC,GAAG,EAAE,EAAE,CACN,kBAAkB,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CACxE;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ;SACzB,GAAG,CACF,CAAC,GAAG,EAAE,EAAE,CACN,iBAAiB,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CACvE;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;EAEP,OAAO;;0DAEiD,UAAU;sDACd,KAAK;CAC1D,CAAC;AACF,CAAC,CAAC;AAhCW,QAAA,qBAAqB,yBAgChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|