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 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 # Install a skill into .builder/skills
136
- builder-doctor --verbose # Run all checks with detailed output
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 install_skill_1 = require("./install-skill");
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 all = !rules && !network && !setup && !env && !showHelp && !installSkill;
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
- `If 3 is chosen then run npx builder-doctor rules`;
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> Install a skill from BuilderIO/builder-agent-skills
36
- help Show this help message
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 Show detailed output for each check
40
- --help, -h Show this help message
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 Install a skill into .builder/skills
50
- builder-doctor --verbose Run rules and network checks with detailed output
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, install_skill_1.runInstallSkill)({
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -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":"AAQA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAuEf"}
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"}
@@ -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 ${tarballUrl}`);
53
+ console.log(`Downloading skill "${skillName}" from ${skillsRepoTarballUrl}`);
53
54
  }
54
- const response = await (0, fetch_1.safeFetch)(tarballUrl);
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":"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"}
1
+ {"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../src/install-skill.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "builder-doctor",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "A CLI tool for Builder.io diagnostics",
5
5
  "main": "dist/index.js",
6
6
  "bin": {