builder-doctor 1.0.14 → 1.0.16
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/README.md +47 -2
- package/dist/index.js +60 -11
- package/dist/index.js.map +1 -1
- package/dist/install-skill.d.ts +7 -0
- package/dist/install-skill.d.ts.map +1 -1
- package/dist/install-skill.js +91 -3
- package/dist/install-skill.js.map +1 -1
- package/dist/install.d.ts +18 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +255 -0
- package/dist/install.js.map +1 -0
- package/dist/non-interactive-message.d.ts +4 -0
- package/dist/non-interactive-message.d.ts.map +1 -0
- package/dist/non-interactive-message.js +21 -0
- package/dist/non-interactive-message.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,6 +23,8 @@ builder-doctor [options] [commands]
|
|
|
23
23
|
### Options
|
|
24
24
|
|
|
25
25
|
- `--verbose` - Show detailed output for each check
|
|
26
|
+
- `--source <owner/repo>` - Override the install source repository for `install-skill`, `skills`, and `install-plugin`
|
|
27
|
+
- `BUILDER_SKILLS_SOURCE=<owner/repo>` - Environment variable to set the default source repository (overridden by `--source`)
|
|
26
28
|
- `--help, -h` - Show help message
|
|
27
29
|
|
|
28
30
|
### Running Default Checks
|
|
@@ -120,10 +122,47 @@ Install a skill from `https://github.com/BuilderIO/builder-agent-skills` into `.
|
|
|
120
122
|
|
|
121
123
|
```bash
|
|
122
124
|
npx builder-doctor install-skill skill-creator
|
|
125
|
+
npx builder-doctor install-skill skill-creator --source myorg/myrepo
|
|
123
126
|
```
|
|
124
127
|
|
|
125
128
|
If files already exist for that skill, they are overwritten.
|
|
126
129
|
|
|
130
|
+
The optional `--source` flag accepts a GitHub `owner/repository` value and pulls from that repository.
|
|
131
|
+
|
|
132
|
+
Default source resolution order is:
|
|
133
|
+
1. `--source`
|
|
134
|
+
2. `BUILDER_SKILLS_SOURCE`
|
|
135
|
+
3. `BuilderIO/builder-agent-skills`
|
|
136
|
+
|
|
137
|
+
### skills
|
|
138
|
+
|
|
139
|
+
List available skills from `https://github.com/BuilderIO/builder-agent-skills`.
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
npx builder-doctor skills
|
|
143
|
+
npx builder-doctor skills --source myorg/myrepo
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Only folders that contain a `SKILL.md` file are included in the output.
|
|
147
|
+
|
|
148
|
+
### install-plugin
|
|
149
|
+
|
|
150
|
+
Install a plugin from `https://github.com/BuilderIO/builder-agent-plugins`.
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
npx builder-doctor install-plugin my-plugin
|
|
154
|
+
npx builder-doctor install-plugin my-plugin --source myorg/myrepo
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Plugin contents are extracted into the `.builder` root (for example: `skills`, `agents`, `rules`, etc).
|
|
158
|
+
|
|
159
|
+
The optional `--source` flag accepts a GitHub `owner/repository` value and pulls from that repository.
|
|
160
|
+
|
|
161
|
+
Default source resolution order is:
|
|
162
|
+
1. `--source`
|
|
163
|
+
2. `BUILDER_SKILLS_SOURCE`
|
|
164
|
+
3. `BuilderIO/builder-agent-plugins`
|
|
165
|
+
|
|
127
166
|
## Examples
|
|
128
167
|
|
|
129
168
|
```bash
|
|
@@ -132,7 +171,13 @@ builder-doctor network # Run only network checks
|
|
|
132
171
|
builder-doctor rules # Run only rules checks
|
|
133
172
|
builder-doctor setup # Get project setup instructions
|
|
134
173
|
builder-doctor env # Display environment variables
|
|
135
|
-
builder-doctor install-skill skill-creator
|
|
136
|
-
builder-doctor --
|
|
174
|
+
builder-doctor install-skill skill-creator # Install a skill into .builder/skills
|
|
175
|
+
builder-doctor install-skill skill-creator --source myorg/myrepo # Install a skill from a custom source
|
|
176
|
+
builder-doctor skills # List available skills (requires SKILL.md)
|
|
177
|
+
builder-doctor skills --source myorg/myrepo # List available skills from a custom source
|
|
178
|
+
BUILDER_SKILLS_SOURCE=myorg/myrepo builder-doctor skills # Use env var as the default source
|
|
179
|
+
builder-doctor install-plugin my-plugin # Install a plugin into .builder
|
|
180
|
+
builder-doctor install-plugin my-plugin --source myorg/myrepo # Install a plugin from a custom source
|
|
181
|
+
builder-doctor --verbose # Run all checks with detailed output
|
|
137
182
|
```
|
|
138
183
|
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ const rules_1 = require("./rules");
|
|
|
5
5
|
const setup_1 = require("./setup");
|
|
6
6
|
const env_1 = require("./env");
|
|
7
7
|
const network_1 = require("./network");
|
|
8
|
-
const
|
|
8
|
+
const install_1 = require("./install");
|
|
9
9
|
const args = process.argv.slice(2);
|
|
10
10
|
const verbose = args.includes("--verbose");
|
|
11
11
|
const rules = args.includes("rules");
|
|
@@ -15,12 +15,24 @@ const env = args.includes("env");
|
|
|
15
15
|
const showHelp = args.includes("--help") || args.includes("-h") || args.includes("help");
|
|
16
16
|
const installSkill = args[0] === "install-skill";
|
|
17
17
|
const installSkillName = installSkill ? args[1] : undefined;
|
|
18
|
-
const
|
|
18
|
+
const installPlugin = args[0] === "install-plugin";
|
|
19
|
+
const installPluginName = installPlugin ? args[1] : undefined;
|
|
20
|
+
const skills = args[0] === "skills";
|
|
21
|
+
const source = getOptionValue("--source");
|
|
22
|
+
const all = !rules &&
|
|
23
|
+
!network &&
|
|
24
|
+
!setup &&
|
|
25
|
+
!env &&
|
|
26
|
+
!showHelp &&
|
|
27
|
+
!installSkill &&
|
|
28
|
+
!installPlugin &&
|
|
29
|
+
!skills;
|
|
19
30
|
const nonInteractive = !process.stdin.isTTY || !process.stdout.isTTY;
|
|
20
|
-
const nonInteractiveMessage = `Ask the user (using AskUserQuestion) whether they would like to 1. Install the skill creator 2. Install a skill, 3. Review rules for issues. ` +
|
|
31
|
+
const nonInteractiveMessage = `Ask the user (using AskUserQuestion) whether they would like to 1. Install the skill creator 2. Install a skill, 3. Install a plugin, 4. Review rules for issues. ` +
|
|
21
32
|
`If 1 is chosen then run npx builder-doctor install-skill skill-creator, ` +
|
|
22
33
|
`if 2 is chosen then ask the user to enter the skill they would like to install and then run npx builder-doctor install-skill <skill-name>, ` +
|
|
23
|
-
`
|
|
34
|
+
`if 3 is chosen then ask the user to enter the plugin they would like to install and then run npx builder-doctor install-plugin <plugin-name>, ` +
|
|
35
|
+
`If 4 is chosen then run npx builder-doctor rules`;
|
|
24
36
|
if (showHelp) {
|
|
25
37
|
console.log(`
|
|
26
38
|
builder-doctor - A CLI tool for Builder.io diagnostics
|
|
@@ -32,12 +44,15 @@ Commands:
|
|
|
32
44
|
rules Check Builder.io rules configuration
|
|
33
45
|
setup Run Builder.io agent to analyze project and provide setup instructions
|
|
34
46
|
env Display all environment variables sorted alphabetically
|
|
35
|
-
install-skill <skill-name>
|
|
36
|
-
|
|
47
|
+
install-skill <skill-name> Install a skill from BuilderIO/builder-agent-skills
|
|
48
|
+
skills List available skills
|
|
49
|
+
install-plugin <plugin-name> Install a plugin from BuilderIO/builder-agent-plugins
|
|
50
|
+
help Show this help message
|
|
37
51
|
|
|
38
52
|
Options:
|
|
39
|
-
--verbose
|
|
40
|
-
--
|
|
53
|
+
--verbose Show detailed output for each check
|
|
54
|
+
--source <owner/repo> Override source repository (GitHub owner/repository). Overrides BUILDER_SKILLS_SOURCE
|
|
55
|
+
--help, -h Show this help message
|
|
41
56
|
|
|
42
57
|
Examples:
|
|
43
58
|
builder-doctor Run rules and network checks
|
|
@@ -46,8 +61,13 @@ Examples:
|
|
|
46
61
|
builder-doctor rules Run only rules checks
|
|
47
62
|
builder-doctor setup Get project setup instructions from Builder.io agent
|
|
48
63
|
builder-doctor env Display environment variables
|
|
49
|
-
builder-doctor install-skill skill-creator
|
|
50
|
-
builder-doctor
|
|
64
|
+
builder-doctor install-skill skill-creator Install a skill into .builder/skills
|
|
65
|
+
builder-doctor skills List available skills
|
|
66
|
+
builder-doctor skills --source myorg/myrepo List available skills from a custom source
|
|
67
|
+
builder-doctor install-skill skill-creator --source myorg/myrepo Install a skill from a custom source
|
|
68
|
+
builder-doctor install-plugin my-plugin Install a plugin into .builder
|
|
69
|
+
builder-doctor install-plugin my-plugin --source myorg/myrepo Install a plugin from a custom source
|
|
70
|
+
builder-doctor --verbose Run rules and network checks with detailed output
|
|
51
71
|
`);
|
|
52
72
|
process.exit(0);
|
|
53
73
|
}
|
|
@@ -79,8 +99,26 @@ async function main() {
|
|
|
79
99
|
console.error("Missing skill name. Usage: builder-doctor install-skill <skill-name>");
|
|
80
100
|
process.exit(1);
|
|
81
101
|
}
|
|
82
|
-
await (0,
|
|
102
|
+
await (0, install_1.runInstallSkill)({
|
|
83
103
|
skillName: installSkillName,
|
|
104
|
+
source,
|
|
105
|
+
verbose,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (skills) {
|
|
109
|
+
await (0, install_1.runListSkills)({
|
|
110
|
+
source,
|
|
111
|
+
verbose,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
if (installPlugin) {
|
|
115
|
+
if (!installPluginName) {
|
|
116
|
+
console.error("Missing plugin name. Usage: builder-doctor install-plugin <plugin-name>");
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
await (0, install_1.runInstallPlugin)({
|
|
120
|
+
pluginName: installPluginName,
|
|
121
|
+
source,
|
|
84
122
|
verbose,
|
|
85
123
|
});
|
|
86
124
|
}
|
|
@@ -91,4 +129,15 @@ async function main() {
|
|
|
91
129
|
}
|
|
92
130
|
}
|
|
93
131
|
main();
|
|
132
|
+
function getOptionValue(optionName) {
|
|
133
|
+
const optionIndex = args.indexOf(optionName);
|
|
134
|
+
if (optionIndex === -1) {
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
const optionValue = args[optionIndex + 1];
|
|
138
|
+
if (!optionValue || optionValue.startsWith("--")) {
|
|
139
|
+
throw new Error(`Missing value for ${optionName}. Usage: ${optionName} <owner/repo>`);
|
|
140
|
+
}
|
|
141
|
+
return optionValue;
|
|
142
|
+
}
|
|
94
143
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,mCAAqC;AACrC,mCAAmC;AACnC,+BAA+B;AAC/B,uCAAuC;AACvC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/install-skill.d.ts
CHANGED
|
@@ -2,5 +2,12 @@ export interface InstallSkillOptions {
|
|
|
2
2
|
skillName: string;
|
|
3
3
|
verbose?: boolean;
|
|
4
4
|
}
|
|
5
|
+
export interface SkillSummary {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
}
|
|
5
9
|
export declare function runInstallSkill(options: InstallSkillOptions): Promise<void>;
|
|
10
|
+
export declare function listAvailableSkills(options?: {
|
|
11
|
+
verbose?: boolean;
|
|
12
|
+
}): Promise<SkillSummary[]>;
|
|
6
13
|
//# sourceMappingURL=install-skill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../src/install-skill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../src/install-skill.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoEf;AAED,wBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAoD1B"}
|
package/dist/install-skill.js
CHANGED
|
@@ -37,6 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.runInstallSkill = runInstallSkill;
|
|
40
|
+
exports.listAvailableSkills = listAvailableSkills;
|
|
40
41
|
const node_fs_1 = require("node:fs");
|
|
41
42
|
const node_path_1 = __importDefault(require("node:path"));
|
|
42
43
|
const promises_1 = require("node:stream/promises");
|
|
@@ -44,14 +45,14 @@ const node_stream_1 = require("node:stream");
|
|
|
44
45
|
const node_zlib_1 = require("node:zlib");
|
|
45
46
|
const tar = __importStar(require("tar"));
|
|
46
47
|
const fetch_1 = require("./fetch");
|
|
48
|
+
const skillsRepoTarballUrl = "https://codeload.github.com/BuilderIO/builder-agent-skills/tar.gz/refs/heads/main";
|
|
47
49
|
async function runInstallSkill(options) {
|
|
48
50
|
const { skillName, verbose = false } = options;
|
|
49
51
|
validateSkillName(skillName);
|
|
50
|
-
const tarballUrl = "https://codeload.github.com/BuilderIO/builder-agent-skills/tar.gz/refs/heads/main";
|
|
51
52
|
if (verbose) {
|
|
52
|
-
console.log(`Downloading skill "${skillName}" from ${
|
|
53
|
+
console.log(`Downloading skill "${skillName}" from ${skillsRepoTarballUrl}`);
|
|
53
54
|
}
|
|
54
|
-
const response = await (0, fetch_1.safeFetch)(
|
|
55
|
+
const response = await (0, fetch_1.safeFetch)(skillsRepoTarballUrl);
|
|
55
56
|
if (!response.ok) {
|
|
56
57
|
throw new Error(`Failed to download skills repository (HTTP ${response.status} ${response.statusText})`);
|
|
57
58
|
}
|
|
@@ -83,6 +84,41 @@ async function runInstallSkill(options) {
|
|
|
83
84
|
}
|
|
84
85
|
console.log(`Installed skill "${skillName}" into ${node_path_1.default.join(".builder", "skills", skillName)}`);
|
|
85
86
|
}
|
|
87
|
+
async function listAvailableSkills(options) {
|
|
88
|
+
const verbose = options?.verbose ?? false;
|
|
89
|
+
if (verbose) {
|
|
90
|
+
console.log(`Downloading available skills from ${skillsRepoTarballUrl}`);
|
|
91
|
+
}
|
|
92
|
+
const response = await (0, fetch_1.safeFetch)(skillsRepoTarballUrl);
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new Error(`Failed to download skills repository (HTTP ${response.status} ${response.statusText})`);
|
|
95
|
+
}
|
|
96
|
+
const skillDescriptions = new Map();
|
|
97
|
+
await (0, promises_1.pipeline)(node_stream_1.Readable.from(Buffer.from(await response.arrayBuffer())), (0, node_zlib_1.createGunzip)(), tar.t({
|
|
98
|
+
strict: true,
|
|
99
|
+
onentry: (entry) => {
|
|
100
|
+
const entryPath = entry.path;
|
|
101
|
+
assertSafeArchivePath(entryPath);
|
|
102
|
+
const match = entryPath.match(/^[^/]+\/([^/]+)\/SKILL\.md$/);
|
|
103
|
+
if (!match) {
|
|
104
|
+
entry.resume();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const skillName = match[1];
|
|
108
|
+
const chunks = [];
|
|
109
|
+
entry.on("data", (chunk) => {
|
|
110
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
111
|
+
});
|
|
112
|
+
entry.on("end", () => {
|
|
113
|
+
const markdown = Buffer.concat(chunks).toString("utf8");
|
|
114
|
+
skillDescriptions.set(skillName, extractDescriptionFromSkillMarkdown(markdown));
|
|
115
|
+
});
|
|
116
|
+
},
|
|
117
|
+
}));
|
|
118
|
+
return Array.from(skillDescriptions.entries())
|
|
119
|
+
.map(([name, description]) => ({ name, description }))
|
|
120
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
121
|
+
}
|
|
86
122
|
function validateSkillName(skillName) {
|
|
87
123
|
if (!skillName || !/^[a-zA-Z0-9._-]+$/.test(skillName)) {
|
|
88
124
|
throw new Error("Invalid skill name. Use only letters, numbers, dots, underscores, and hyphens.");
|
|
@@ -102,4 +138,56 @@ function assertSafeArchivePath(entryPath) {
|
|
|
102
138
|
function escapeRegExp(value) {
|
|
103
139
|
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
104
140
|
}
|
|
141
|
+
function extractDescriptionFromSkillMarkdown(markdown) {
|
|
142
|
+
const lines = removeFrontmatter(markdown.replace(/\r\n/g, "\n")).split("\n");
|
|
143
|
+
const paragraphs = [];
|
|
144
|
+
let currentParagraph = [];
|
|
145
|
+
let inCodeFence = false;
|
|
146
|
+
for (const line of lines) {
|
|
147
|
+
const trimmed = line.trim();
|
|
148
|
+
if (trimmed.startsWith("```")) {
|
|
149
|
+
inCodeFence = !inCodeFence;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (inCodeFence) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (!trimmed) {
|
|
156
|
+
if (currentParagraph.length > 0) {
|
|
157
|
+
paragraphs.push(currentParagraph.join(" "));
|
|
158
|
+
currentParagraph = [];
|
|
159
|
+
}
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (trimmed.startsWith("#")) {
|
|
163
|
+
if (currentParagraph.length > 0) {
|
|
164
|
+
paragraphs.push(currentParagraph.join(" "));
|
|
165
|
+
currentParagraph = [];
|
|
166
|
+
}
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
currentParagraph.push(trimmed);
|
|
170
|
+
}
|
|
171
|
+
if (currentParagraph.length > 0) {
|
|
172
|
+
paragraphs.push(currentParagraph.join(" "));
|
|
173
|
+
}
|
|
174
|
+
if (paragraphs.length === 0) {
|
|
175
|
+
return "No description available.";
|
|
176
|
+
}
|
|
177
|
+
return paragraphs[0]
|
|
178
|
+
.replace(/\[([^\]]+)\]\([^\)]+\)/g, "$1")
|
|
179
|
+
.replace(/`([^`]+)`/g, "$1")
|
|
180
|
+
.replace(/\s+/g, " ")
|
|
181
|
+
.trim();
|
|
182
|
+
}
|
|
183
|
+
function removeFrontmatter(content) {
|
|
184
|
+
if (!content.startsWith("---\n")) {
|
|
185
|
+
return content;
|
|
186
|
+
}
|
|
187
|
+
const endMarkerIndex = content.indexOf("\n---\n", 4);
|
|
188
|
+
if (endMarkerIndex === -1) {
|
|
189
|
+
return content;
|
|
190
|
+
}
|
|
191
|
+
return content.slice(endMarkerIndex + 5);
|
|
192
|
+
}
|
|
105
193
|
//# sourceMappingURL=install-skill.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../src/install-skill.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../src/install-skill.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,0CAsEC;AAED,kDAsDC;AAnJD,qCAAoC;AACpC,0DAA6B;AAC7B,mDAAgD;AAChD,6CAAuC;AACvC,yCAAyC;AACzC,yCAA2B;AAC3B,mCAAoC;AAEpC,MAAM,oBAAoB,GACxB,mFAAmF,CAAC;AAY/E,KAAK,UAAU,eAAe,CACnC,OAA4B;IAE5B,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAE/C,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAE7B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,UAAU,oBAAoB,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAA,iBAAS,EAAC,oBAAoB,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,8CAA8C,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,mBAAI,CAAC,IAAI,CAC9B,OAAO,CAAC,GAAG,EAAE,EACb,UAAU,EACV,QAAQ,EACR,SAAS,CACV,CAAC;IACF,IAAA,mBAAS,EAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,gBAAgB,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,UAAU,gBAAgB,GAAG,CAAC,CAAC;IAEnE,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAE3B,MAAM,IAAA,mBAAQ,EACZ,sBAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,EACxD,IAAA,wBAAY,GAAE,EACd,GAAG,CAAC,CAAC,CAAC;QACJ,GAAG,EAAE,cAAc;QACnB,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,KAAK;QACpB,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;YAC3B,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAEjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,SAAS,GAAI,KAA2B,CAAC,IAAI,CAAC;YACpD,IAAI,SAAS,KAAK,cAAc,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,kBAAkB,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC,CACH,CAAC;IAEF,IAAI,kBAAkB,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,UAAU,SAAS,mDAAmD,CACvE,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CACT,oBAAoB,SAAS,UAAU,mBAAI,CAAC,IAAI,CAC9C,UAAU,EACV,QAAQ,EACR,SAAS,CACV,EAAE,CACJ,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,OAEzC;IACC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC;IAE1C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,qCAAqC,oBAAoB,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAA,iBAAS,EAAC,oBAAoB,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,8CAA8C,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEpD,MAAM,IAAA,mBAAQ,EACZ,sBAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,EACxD,IAAA,wBAAY,GAAE,EACd,GAAG,CAAC,CAAC,CAAC;QACJ,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;YAC7B,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAEjC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,CAAC,MAAM,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACzB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACnB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACxD,iBAAiB,CAAC,GAAG,CACnB,SAAS,EACT,mCAAmC,CAAC,QAAQ,CAAC,CAC9C,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CACH,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;SACrD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,CAAC,SAAS,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,UAAU,GAAG,mBAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnD,IACE,UAAU,KAAK,IAAI;QACnB,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC;QAC5B,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC3B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,mCAAmC,CAAC,QAAgB;IAC3D,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE7E,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,gBAAgB,GAAa,EAAE,CAAC;IACpC,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,WAAW,GAAG,CAAC,WAAW,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5C,gBAAgB,GAAG,EAAE,CAAC;YACxB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5C,gBAAgB,GAAG,EAAE,CAAC;YACxB,CAAC;YACD,SAAS;QACX,CAAC;QAED,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,2BAA2B,CAAC;IACrC,CAAC;IAED,OAAO,UAAU,CAAC,CAAC,CAAC;SACjB,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC;SACxC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;SAC3B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACrD,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface InstallSkillOptions {
|
|
2
|
+
skillName: string;
|
|
3
|
+
source?: string;
|
|
4
|
+
verbose?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface InstallPluginOptions {
|
|
7
|
+
pluginName: string;
|
|
8
|
+
source?: string;
|
|
9
|
+
verbose?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ListSkillsOptions {
|
|
12
|
+
source?: string;
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function runInstallSkill(options: InstallSkillOptions): Promise<void>;
|
|
16
|
+
export declare function runInstallPlugin(options: InstallPluginOptions): Promise<void>;
|
|
17
|
+
export declare function runListSkills(options: ListSkillsOptions): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAmBf;AAcD,wBAAsB,aAAa,CACjC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CA+Df"}
|
package/dist/install.js
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.runInstallSkill = runInstallSkill;
|
|
40
|
+
exports.runInstallPlugin = runInstallPlugin;
|
|
41
|
+
exports.runListSkills = runListSkills;
|
|
42
|
+
const node_fs_1 = require("node:fs");
|
|
43
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
44
|
+
const promises_1 = require("node:stream/promises");
|
|
45
|
+
const node_stream_1 = require("node:stream");
|
|
46
|
+
const node_zlib_1 = require("node:zlib");
|
|
47
|
+
const tar = __importStar(require("tar"));
|
|
48
|
+
const fetch_1 = require("./fetch");
|
|
49
|
+
const DEFAULT_SKILLS_SOURCE = "BuilderIO/builder-agent-skills";
|
|
50
|
+
const DEFAULT_PLUGINS_SOURCE = "BuilderIO/builder-agent-plugins";
|
|
51
|
+
const SOURCE_ENV_VAR = "BUILDER_SKILLS_SOURCE";
|
|
52
|
+
const GITHUB_TARBALL_BASE_URL = "https://codeload.github.com";
|
|
53
|
+
async function runInstallSkill(options) {
|
|
54
|
+
const { skillName, source, verbose = false } = options;
|
|
55
|
+
const sourceRepo = resolveSourceRepository(source);
|
|
56
|
+
validateInstallItemName(skillName, "skill");
|
|
57
|
+
const escapedSkillName = escapeRegExp(skillName);
|
|
58
|
+
const destinationPath = node_path_1.default.join(".builder", "skills", skillName);
|
|
59
|
+
await runInstallFromTarball({
|
|
60
|
+
itemType: "Skill",
|
|
61
|
+
itemName: skillName,
|
|
62
|
+
tarballUrl: createTarballUrl(sourceRepo),
|
|
63
|
+
destinationDir: node_path_1.default.join(process.cwd(), destinationPath),
|
|
64
|
+
archivePathPattern: new RegExp(`^[^/]+/${escapedSkillName}/`),
|
|
65
|
+
strip: 2,
|
|
66
|
+
missingItemSource: sourceRepo,
|
|
67
|
+
installedPathDisplay: destinationPath,
|
|
68
|
+
verbose,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async function runInstallPlugin(options) {
|
|
72
|
+
const { pluginName, source, verbose = false } = options;
|
|
73
|
+
const sourceRepo = resolveSourceRepository(source, DEFAULT_PLUGINS_SOURCE);
|
|
74
|
+
validateInstallItemName(pluginName, "plugin");
|
|
75
|
+
const escapedPluginName = escapeRegExp(pluginName);
|
|
76
|
+
await runInstallFromTarball({
|
|
77
|
+
itemType: "Plugin",
|
|
78
|
+
itemName: pluginName,
|
|
79
|
+
tarballUrl: createTarballUrl(sourceRepo),
|
|
80
|
+
destinationDir: node_path_1.default.join(process.cwd(), ".builder"),
|
|
81
|
+
archivePathPattern: new RegExp(`^[^/]+/${escapedPluginName}/`),
|
|
82
|
+
strip: 2,
|
|
83
|
+
missingItemSource: sourceRepo,
|
|
84
|
+
installedPathDisplay: ".builder",
|
|
85
|
+
verbose,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async function runListSkills(options) {
|
|
89
|
+
const { source, verbose = false } = options;
|
|
90
|
+
const sourceRepo = resolveSourceRepository(source);
|
|
91
|
+
const tarballUrl = createTarballUrl(sourceRepo);
|
|
92
|
+
if (verbose) {
|
|
93
|
+
console.log(`Downloading skills catalog from ${tarballUrl}`);
|
|
94
|
+
}
|
|
95
|
+
const response = await (0, fetch_1.safeFetch)(tarballUrl);
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
throw new Error(`Failed to download skills repository from ${sourceRepo} (HTTP ${response.status} ${response.statusText})`);
|
|
98
|
+
}
|
|
99
|
+
const skills = new Map();
|
|
100
|
+
const skillReadTasks = [];
|
|
101
|
+
await (0, promises_1.pipeline)(node_stream_1.Readable.from(Buffer.from(await response.arrayBuffer())), (0, node_zlib_1.createGunzip)(), tar.t({
|
|
102
|
+
strict: true,
|
|
103
|
+
onentry: (entry) => {
|
|
104
|
+
const entryPath = entry.path;
|
|
105
|
+
assertSafeArchivePath(entryPath);
|
|
106
|
+
const match = entryPath.match(/^[^/]+\/([^/]+)\/SKILL\.md$/);
|
|
107
|
+
if (!match) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const skillName = match[1];
|
|
111
|
+
const readTask = readEntryToString(entry).then((content) => {
|
|
112
|
+
skills.set(skillName, extractSkillDescription(content));
|
|
113
|
+
});
|
|
114
|
+
skillReadTasks.push(readTask);
|
|
115
|
+
},
|
|
116
|
+
}));
|
|
117
|
+
await Promise.all(skillReadTasks);
|
|
118
|
+
const sortedSkills = Array.from(skills.entries()).sort(([skillA], [skillB]) => skillA.localeCompare(skillB));
|
|
119
|
+
if (sortedSkills.length === 0) {
|
|
120
|
+
console.log("No skills were found.");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const defaultSource = sourceRepo === resolveSourceRepository(undefined);
|
|
124
|
+
const formattedSkills = sortedSkills.map(([skillName, description]) => {
|
|
125
|
+
const installCommand = defaultSource
|
|
126
|
+
? `npx builder-doctor install-skill ${skillName}`
|
|
127
|
+
: `npx builder-doctor install-skill ${skillName} --source ${sourceRepo}`;
|
|
128
|
+
return [skillName, "=========", description, `\nInstall Command: ` + installCommand].join("\n");
|
|
129
|
+
});
|
|
130
|
+
console.log(formattedSkills.join("\n\n"));
|
|
131
|
+
}
|
|
132
|
+
async function runInstallFromTarball(options) {
|
|
133
|
+
const { itemType, itemName, tarballUrl, destinationDir, archivePathPattern, strip, missingItemSource, installedPathDisplay, verbose, } = options;
|
|
134
|
+
if (verbose) {
|
|
135
|
+
console.log(`Downloading ${itemType.toLowerCase()} "${itemName}" from ${tarballUrl}`);
|
|
136
|
+
}
|
|
137
|
+
const response = await (0, fetch_1.safeFetch)(tarballUrl);
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
throw new Error(`Failed to download ${itemType.toLowerCase()}s repository (HTTP ${response.status} ${response.statusText})`);
|
|
140
|
+
}
|
|
141
|
+
(0, node_fs_1.mkdirSync)(destinationDir, { recursive: true });
|
|
142
|
+
let extractedFileCount = 0;
|
|
143
|
+
await (0, promises_1.pipeline)(node_stream_1.Readable.from(Buffer.from(await response.arrayBuffer())), (0, node_zlib_1.createGunzip)(), tar.x({
|
|
144
|
+
cwd: destinationDir,
|
|
145
|
+
strict: true,
|
|
146
|
+
preservePaths: false,
|
|
147
|
+
strip,
|
|
148
|
+
filter: (entryPath, entry) => {
|
|
149
|
+
assertSafeArchivePath(entryPath);
|
|
150
|
+
if (!archivePathPattern.test(entryPath)) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
const entryType = entry.type;
|
|
154
|
+
if (entryType === "SymbolicLink" || entryType === "Link") {
|
|
155
|
+
throw new Error(`Refusing to extract link entry: ${entryPath}`);
|
|
156
|
+
}
|
|
157
|
+
extractedFileCount += 1;
|
|
158
|
+
return true;
|
|
159
|
+
},
|
|
160
|
+
}));
|
|
161
|
+
if (extractedFileCount === 0) {
|
|
162
|
+
throw new Error(`${itemType} "${itemName}" was not found in ${missingItemSource}`);
|
|
163
|
+
}
|
|
164
|
+
console.log(`Installed ${itemType.toLowerCase()} "${itemName}" into ${installedPathDisplay}`);
|
|
165
|
+
}
|
|
166
|
+
function validateInstallItemName(name, label) {
|
|
167
|
+
if (!name || !/^[a-zA-Z0-9._-]+$/.test(name)) {
|
|
168
|
+
throw new Error(`Invalid ${label} name. Use only letters, numbers, dots, underscores, and hyphens.`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function assertSafeArchivePath(entryPath) {
|
|
172
|
+
if (entryPath.startsWith("/") || /^[a-zA-Z]:/.test(entryPath)) {
|
|
173
|
+
throw new Error(`Unsafe archive path: ${entryPath}`);
|
|
174
|
+
}
|
|
175
|
+
const normalized = node_path_1.default.posix.normalize(entryPath);
|
|
176
|
+
if (normalized === ".." ||
|
|
177
|
+
normalized.startsWith("../") ||
|
|
178
|
+
normalized.includes("/../")) {
|
|
179
|
+
throw new Error(`Unsafe archive path: ${entryPath}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async function readEntryToString(entry) {
|
|
183
|
+
const chunks = [];
|
|
184
|
+
for await (const chunk of entry) {
|
|
185
|
+
chunks.push(typeof chunk === "string" ? chunk : chunk.toString("utf8"));
|
|
186
|
+
}
|
|
187
|
+
return chunks.join("");
|
|
188
|
+
}
|
|
189
|
+
function extractSkillDescription(content) {
|
|
190
|
+
const frontMatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);
|
|
191
|
+
if (frontMatterMatch) {
|
|
192
|
+
const frontMatterLines = frontMatterMatch[1].split(/\r?\n/);
|
|
193
|
+
for (let i = 0; i < frontMatterLines.length; i += 1) {
|
|
194
|
+
const line = frontMatterLines[i];
|
|
195
|
+
const match = line.match(/^description:\s*(.*)$/);
|
|
196
|
+
if (!match) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const descriptionValue = match[1].trim();
|
|
200
|
+
if (descriptionValue === ">" || descriptionValue === "|") {
|
|
201
|
+
const blockLines = [];
|
|
202
|
+
for (let j = i + 1; j < frontMatterLines.length; j += 1) {
|
|
203
|
+
const blockLine = frontMatterLines[j];
|
|
204
|
+
if (blockLine.trim() === "") {
|
|
205
|
+
blockLines.push("");
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
if (!/^\s+/.test(blockLine)) {
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
blockLines.push(blockLine.trim());
|
|
212
|
+
}
|
|
213
|
+
const blockDescription = blockLines.join(" ").replace(/\s+/g, " ").trim();
|
|
214
|
+
if (blockDescription) {
|
|
215
|
+
return blockDescription;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (descriptionValue) {
|
|
219
|
+
return descriptionValue.replace(/^['"]|['"]$/g, "");
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const contentWithoutFrontMatter = content.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, "");
|
|
224
|
+
const descriptionLine = contentWithoutFrontMatter
|
|
225
|
+
.split(/\r?\n/)
|
|
226
|
+
.map((line) => line.trim())
|
|
227
|
+
.find((line) => line &&
|
|
228
|
+
!line.startsWith("#") &&
|
|
229
|
+
!line.startsWith("```") &&
|
|
230
|
+
!/^>\s*$/.test(line));
|
|
231
|
+
if (!descriptionLine) {
|
|
232
|
+
return "No description provided.";
|
|
233
|
+
}
|
|
234
|
+
return descriptionLine.startsWith(">")
|
|
235
|
+
? descriptionLine.replace(/^>\s*/, "")
|
|
236
|
+
: descriptionLine;
|
|
237
|
+
}
|
|
238
|
+
function resolveSourceRepository(source, fallback = DEFAULT_SKILLS_SOURCE) {
|
|
239
|
+
const envSource = process.env[SOURCE_ENV_VAR];
|
|
240
|
+
const resolvedSource = source ?? envSource ?? fallback;
|
|
241
|
+
validateSourceRepository(resolvedSource, source ? "--source" : envSource ? SOURCE_ENV_VAR : "default source");
|
|
242
|
+
return resolvedSource;
|
|
243
|
+
}
|
|
244
|
+
function validateSourceRepository(source, sourceLabel) {
|
|
245
|
+
if (!/^[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$/.test(source)) {
|
|
246
|
+
throw new Error(`Invalid source format from ${sourceLabel}. Use GitHub owner/repository, for example: BuilderIO/builder-agent-skills`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function createTarballUrl(sourceRepo) {
|
|
250
|
+
return `${GITHUB_TARBALL_BASE_URL}/${sourceRepo}/tar.gz/refs/heads/main`;
|
|
251
|
+
}
|
|
252
|
+
function escapeRegExp(value) {
|
|
253
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SkillSummary } from "./install-skill";
|
|
2
|
+
export declare function formatSkillInstallLines(skillsList: SkillSummary[]): string;
|
|
3
|
+
export declare function buildNonInteractiveMessage(skillsList: SkillSummary[]): string;
|
|
4
|
+
//# sourceMappingURL=non-interactive-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"non-interactive-message.d.ts","sourceRoot":"","sources":["../src/non-interactive-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,CAW1E;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,CAS7E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatSkillInstallLines = formatSkillInstallLines;
|
|
4
|
+
exports.buildNonInteractiveMessage = buildNonInteractiveMessage;
|
|
5
|
+
function formatSkillInstallLines(skillsList) {
|
|
6
|
+
return skillsList
|
|
7
|
+
.map(({ name, description }) => `${name}\n` +
|
|
8
|
+
"=".repeat(name.length) +
|
|
9
|
+
`\n` +
|
|
10
|
+
`${description}\n` +
|
|
11
|
+
`Install with \`npx builder-doctor install-skill ${name}\`\n`)
|
|
12
|
+
.join("\n");
|
|
13
|
+
}
|
|
14
|
+
function buildNonInteractiveMessage(skillsList) {
|
|
15
|
+
const skillInstallLines = formatSkillInstallLines(skillsList);
|
|
16
|
+
return ("Ask the user (using AskUserQuestion) whether they would like to install one of these skills or review rules for issues. " +
|
|
17
|
+
"If a skill is chosen, run the corresponding install command below. If review rules is chosen, run npx builder-doctor rules.\n\n" +
|
|
18
|
+
"Available skills:\n" +
|
|
19
|
+
skillInstallLines);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=non-interactive-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"non-interactive-message.js","sourceRoot":"","sources":["../src/non-interactive-message.ts"],"names":[],"mappings":";;AAEA,0DAWC;AAED,gEASC;AAtBD,SAAgB,uBAAuB,CAAC,UAA0B;IAChE,OAAO,UAAU;SACd,GAAG,CACF,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CACxB,GAAG,IAAI,IAAI;QACX,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACvB,IAAI;QACJ,GAAG,WAAW,IAAI;QAClB,mDAAmD,IAAI,MAAM,CAChE;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAgB,0BAA0B,CAAC,UAA0B;IACnE,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAE9D,OAAO,CACL,0HAA0H;QAC1H,iIAAiI;QACjI,qBAAqB;QACrB,iBAAiB,CAClB,CAAC;AACJ,CAAC"}
|