agentpacks 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -8
- package/dist/api.d.ts +2 -0
- package/dist/api.js +929 -409
- package/dist/cli/export-cmd.js +281 -149
- package/dist/cli/generate.js +740 -247
- package/dist/cli/import-cmd.js +57 -85
- package/dist/cli/info.d.ts +4 -0
- package/dist/cli/info.js +232 -0
- package/dist/cli/init.js +8 -36
- package/dist/cli/install.js +414 -129
- package/dist/cli/login.d.ts +9 -0
- package/dist/cli/login.js +202 -0
- package/dist/cli/models-explain.d.ts +16 -0
- package/dist/cli/models-explain.js +1205 -0
- package/dist/cli/pack/create.js +4 -32
- package/dist/cli/pack/enable.js +1 -29
- package/dist/cli/pack/list.js +266 -134
- package/dist/cli/pack/validate.js +274 -127
- package/dist/cli/publish.d.ts +8 -0
- package/dist/cli/publish.js +672 -0
- package/dist/cli/search.d.ts +12 -0
- package/dist/cli/search.js +210 -0
- package/dist/core/config.d.ts +2 -1
- package/dist/core/config.js +74 -117
- package/dist/core/dependency-resolver.js +4 -28
- package/dist/core/feature-merger.d.ts +7 -0
- package/dist/core/feature-merger.js +289 -29
- package/dist/core/index.js +283 -140
- package/dist/core/lockfile.js +0 -28
- package/dist/core/metarepo.js +74 -116
- package/dist/core/pack-loader.d.ts +2 -0
- package/dist/core/pack-loader.js +266 -133
- package/dist/core/profile-resolver.d.ts +75 -0
- package/dist/core/profile-resolver.js +111 -0
- package/dist/exporters/cursor-plugin.js +4 -32
- package/dist/exporters/index.js +4 -32
- package/dist/features/agents.d.ts +5 -0
- package/dist/features/agents.js +2 -30
- package/dist/features/commands.js +2 -30
- package/dist/features/hooks.js +2 -30
- package/dist/features/ignore.js +0 -28
- package/dist/features/index.d.ts +1 -0
- package/dist/features/index.js +176 -31
- package/dist/features/mcp.js +2 -30
- package/dist/features/models.d.ts +167 -0
- package/dist/features/models.js +293 -0
- package/dist/features/plugins.js +2 -30
- package/dist/features/rules.js +2 -30
- package/dist/features/skills.js +2 -30
- package/dist/importers/claude-code.js +10 -38
- package/dist/importers/cursor.js +15 -43
- package/dist/importers/opencode.js +16 -44
- package/dist/importers/rulesync.js +22 -50
- package/dist/index.js +1710 -538
- package/dist/node/api.js +929 -409
- package/dist/node/cli/export-cmd.js +281 -149
- package/dist/node/cli/generate.js +740 -247
- package/dist/node/cli/import-cmd.js +57 -85
- package/dist/node/cli/info.js +232 -0
- package/dist/node/cli/init.js +8 -36
- package/dist/node/cli/install.js +414 -129
- package/dist/node/cli/login.js +202 -0
- package/dist/node/cli/models-explain.js +1205 -0
- package/dist/node/cli/pack/create.js +4 -32
- package/dist/node/cli/pack/enable.js +1 -29
- package/dist/node/cli/pack/list.js +266 -134
- package/dist/node/cli/pack/validate.js +274 -127
- package/dist/node/cli/publish.js +672 -0
- package/dist/node/cli/search.js +210 -0
- package/dist/node/core/config.js +74 -117
- package/dist/node/core/dependency-resolver.js +4 -28
- package/dist/node/core/feature-merger.js +289 -29
- package/dist/node/core/index.js +283 -140
- package/dist/node/core/lockfile.js +0 -28
- package/dist/node/core/metarepo.js +74 -116
- package/dist/node/core/pack-loader.js +266 -133
- package/dist/node/core/profile-resolver.js +111 -0
- package/dist/node/exporters/cursor-plugin.js +4 -32
- package/dist/node/exporters/index.js +4 -32
- package/dist/node/features/agents.js +2 -30
- package/dist/node/features/commands.js +2 -30
- package/dist/node/features/hooks.js +2 -30
- package/dist/node/features/ignore.js +0 -28
- package/dist/node/features/index.js +176 -31
- package/dist/node/features/mcp.js +2 -30
- package/dist/node/features/models.js +293 -0
- package/dist/node/features/plugins.js +2 -30
- package/dist/node/features/rules.js +2 -30
- package/dist/node/features/skills.js +2 -30
- package/dist/node/importers/claude-code.js +10 -38
- package/dist/node/importers/cursor.js +15 -43
- package/dist/node/importers/opencode.js +16 -44
- package/dist/node/importers/rulesync.js +22 -50
- package/dist/node/index.js +1710 -538
- package/dist/node/sources/git-ref.js +7 -30
- package/dist/node/sources/git.js +7 -30
- package/dist/node/sources/index.js +337 -39
- package/dist/node/sources/local.js +0 -28
- package/dist/node/sources/npm-ref.js +0 -28
- package/dist/node/sources/npm.js +10 -37
- package/dist/node/sources/registry-ref.js +37 -0
- package/dist/node/sources/registry.js +355 -0
- package/dist/node/targets/additional-targets.js +196 -37
- package/dist/node/targets/agents-md.js +5 -33
- package/dist/node/targets/base-target.js +0 -28
- package/dist/node/targets/claude-code.js +211 -41
- package/dist/node/targets/codex-cli.js +7 -35
- package/dist/node/targets/copilot.js +202 -41
- package/dist/node/targets/cursor.js +188 -40
- package/dist/node/targets/gemini-cli.js +10 -38
- package/dist/node/targets/generic-md-target.js +196 -37
- package/dist/node/targets/index.js +414 -106
- package/dist/node/targets/opencode.js +171 -51
- package/dist/node/targets/registry.js +414 -106
- package/dist/node/utils/credentials.js +38 -0
- package/dist/node/utils/diff.js +22 -34
- package/dist/node/utils/filesystem.js +2 -30
- package/dist/node/utils/frontmatter.js +0 -28
- package/dist/node/utils/global.js +3 -31
- package/dist/node/utils/markdown.js +0 -28
- package/dist/node/utils/model-allowlist.js +110 -0
- package/dist/node/utils/model-guidance.js +78 -0
- package/dist/node/utils/registry-client.js +142 -0
- package/dist/node/utils/tarball.js +49 -0
- package/dist/sources/git-ref.js +7 -30
- package/dist/sources/git.d.ts +2 -2
- package/dist/sources/git.js +7 -30
- package/dist/sources/index.d.ts +2 -0
- package/dist/sources/index.js +337 -39
- package/dist/sources/local.js +0 -28
- package/dist/sources/npm-ref.js +0 -28
- package/dist/sources/npm.js +10 -37
- package/dist/sources/registry-ref.d.ts +30 -0
- package/dist/sources/registry-ref.js +37 -0
- package/dist/sources/registry.d.ts +18 -0
- package/dist/sources/registry.js +355 -0
- package/dist/targets/additional-targets.js +196 -37
- package/dist/targets/agents-md.js +5 -33
- package/dist/targets/base-target.d.ts +2 -0
- package/dist/targets/base-target.js +0 -28
- package/dist/targets/claude-code.js +211 -41
- package/dist/targets/codex-cli.js +7 -35
- package/dist/targets/copilot.js +202 -41
- package/dist/targets/cursor.js +188 -40
- package/dist/targets/gemini-cli.js +10 -38
- package/dist/targets/generic-md-target.js +196 -37
- package/dist/targets/index.js +414 -106
- package/dist/targets/opencode.js +171 -51
- package/dist/targets/registry.js +414 -106
- package/dist/utils/credentials.d.ts +19 -0
- package/dist/utils/credentials.js +38 -0
- package/dist/utils/diff.js +22 -34
- package/dist/utils/filesystem.js +2 -30
- package/dist/utils/frontmatter.js +0 -28
- package/dist/utils/global.js +3 -31
- package/dist/utils/markdown.js +0 -28
- package/dist/utils/model-allowlist.d.ts +39 -0
- package/dist/utils/model-allowlist.js +110 -0
- package/dist/utils/model-guidance.d.ts +6 -0
- package/dist/utils/model-guidance.js +78 -0
- package/dist/utils/registry-client.d.ts +141 -0
- package/dist/utils/registry-client.js +142 -0
- package/dist/utils/tarball.d.ts +13 -0
- package/dist/utils/tarball.js +49 -0
- package/package.json +171 -5
- package/templates/pack/models.json +38 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var __require = import.meta.require;
|
|
3
|
+
|
|
4
|
+
// src/utils/registry-client.ts
|
|
5
|
+
var DEFAULT_REGISTRY_URL = "https://registry.agentpacks.dev";
|
|
6
|
+
function createRegistryClient(config) {
|
|
7
|
+
return new RegistryClient({
|
|
8
|
+
registryUrl: config?.registryUrl ?? DEFAULT_REGISTRY_URL,
|
|
9
|
+
authToken: config?.authToken,
|
|
10
|
+
timeout: config?.timeout ?? 30000
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
class RegistryClient {
|
|
15
|
+
config;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.config = {
|
|
18
|
+
registryUrl: config.registryUrl.replace(/\/+$/, ""),
|
|
19
|
+
authToken: config.authToken,
|
|
20
|
+
timeout: config.timeout ?? 30000
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async search(params) {
|
|
24
|
+
const searchParams = new URLSearchParams;
|
|
25
|
+
if (params.query)
|
|
26
|
+
searchParams.set("q", params.query);
|
|
27
|
+
if (params.tags?.length)
|
|
28
|
+
searchParams.set("tags", params.tags.join(","));
|
|
29
|
+
if (params.targets?.length)
|
|
30
|
+
searchParams.set("targets", params.targets.join(","));
|
|
31
|
+
if (params.features?.length)
|
|
32
|
+
searchParams.set("features", params.features.join(","));
|
|
33
|
+
if (params.author)
|
|
34
|
+
searchParams.set("author", params.author);
|
|
35
|
+
if (params.sort)
|
|
36
|
+
searchParams.set("sort", params.sort);
|
|
37
|
+
if (params.limit)
|
|
38
|
+
searchParams.set("limit", String(params.limit));
|
|
39
|
+
if (params.offset)
|
|
40
|
+
searchParams.set("offset", String(params.offset));
|
|
41
|
+
const url = `${this.config.registryUrl}/packs?${searchParams.toString()}`;
|
|
42
|
+
const res = await this.fetch(url);
|
|
43
|
+
return res;
|
|
44
|
+
}
|
|
45
|
+
async info(packName) {
|
|
46
|
+
const url = `${this.config.registryUrl}/packs/${encodeURIComponent(packName)}`;
|
|
47
|
+
const res = await this.fetch(url);
|
|
48
|
+
return res;
|
|
49
|
+
}
|
|
50
|
+
async download(packName, version = "latest") {
|
|
51
|
+
const url = `${this.config.registryUrl}/packs/${encodeURIComponent(packName)}/versions/${encodeURIComponent(version)}/download`;
|
|
52
|
+
const response = await fetch(url, {
|
|
53
|
+
headers: this.headers(),
|
|
54
|
+
signal: AbortSignal.timeout(this.config.timeout)
|
|
55
|
+
});
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
throw new RegistryApiError(response.status, `Failed to download ${packName}@${version}: ${response.statusText}`);
|
|
58
|
+
}
|
|
59
|
+
const integrity = response.headers.get("x-integrity") ?? "";
|
|
60
|
+
const data = await response.arrayBuffer();
|
|
61
|
+
return { data, integrity };
|
|
62
|
+
}
|
|
63
|
+
async publish(tarball, metadata) {
|
|
64
|
+
if (!this.config.authToken) {
|
|
65
|
+
throw new Error("Authentication required. Run `agentpacks login` first.");
|
|
66
|
+
}
|
|
67
|
+
const formData = new FormData;
|
|
68
|
+
formData.append("tarball", new Blob([tarball], { type: "application/gzip" }), `${metadata.name}-${metadata.version}.tgz`);
|
|
69
|
+
formData.append("metadata", JSON.stringify(metadata));
|
|
70
|
+
const url = `${this.config.registryUrl}/packs`;
|
|
71
|
+
const response = await fetch(url, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: {
|
|
74
|
+
Authorization: `Bearer ${this.config.authToken}`
|
|
75
|
+
},
|
|
76
|
+
body: formData,
|
|
77
|
+
signal: AbortSignal.timeout(this.config.timeout)
|
|
78
|
+
});
|
|
79
|
+
if (!response.ok) {
|
|
80
|
+
const body = await response.text();
|
|
81
|
+
throw new RegistryApiError(response.status, `Publish failed: ${body || response.statusText}`);
|
|
82
|
+
}
|
|
83
|
+
return await response.json();
|
|
84
|
+
}
|
|
85
|
+
async featured(limit) {
|
|
86
|
+
const url = limit ? `${this.config.registryUrl}/featured?limit=${limit}` : `${this.config.registryUrl}/featured`;
|
|
87
|
+
const res = await this.fetch(url);
|
|
88
|
+
return res.packs;
|
|
89
|
+
}
|
|
90
|
+
async tags() {
|
|
91
|
+
const url = `${this.config.registryUrl}/tags`;
|
|
92
|
+
const res = await this.fetch(url);
|
|
93
|
+
return res.tags;
|
|
94
|
+
}
|
|
95
|
+
async stats() {
|
|
96
|
+
const url = `${this.config.registryUrl}/stats`;
|
|
97
|
+
return await this.fetch(url);
|
|
98
|
+
}
|
|
99
|
+
async health() {
|
|
100
|
+
try {
|
|
101
|
+
const url = `${this.config.registryUrl}/health`;
|
|
102
|
+
await this.fetch(url);
|
|
103
|
+
return true;
|
|
104
|
+
} catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async fetch(url) {
|
|
109
|
+
const response = await fetch(url, {
|
|
110
|
+
headers: this.headers(),
|
|
111
|
+
signal: AbortSignal.timeout(this.config.timeout)
|
|
112
|
+
});
|
|
113
|
+
if (!response.ok) {
|
|
114
|
+
const body = await response.text();
|
|
115
|
+
throw new RegistryApiError(response.status, body || response.statusText);
|
|
116
|
+
}
|
|
117
|
+
return response.json();
|
|
118
|
+
}
|
|
119
|
+
headers() {
|
|
120
|
+
const h = {
|
|
121
|
+
Accept: "application/json"
|
|
122
|
+
};
|
|
123
|
+
if (this.config.authToken) {
|
|
124
|
+
h["Authorization"] = `Bearer ${this.config.authToken}`;
|
|
125
|
+
}
|
|
126
|
+
return h;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
class RegistryApiError extends Error {
|
|
131
|
+
status;
|
|
132
|
+
constructor(status, message) {
|
|
133
|
+
super(message);
|
|
134
|
+
this.name = "RegistryApiError";
|
|
135
|
+
this.status = status;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// src/utils/credentials.ts
|
|
140
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
141
|
+
import { join, dirname } from "path";
|
|
142
|
+
import { homedir } from "os";
|
|
143
|
+
var CONFIG_DIR = join(homedir(), ".config", "agentpacks");
|
|
144
|
+
var CREDENTIALS_FILE = join(CONFIG_DIR, "credentials.json");
|
|
145
|
+
function loadCredentials() {
|
|
146
|
+
if (!existsSync(CREDENTIALS_FILE)) {
|
|
147
|
+
return { registryUrl: "https://registry.agentpacks.dev" };
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const raw = readFileSync(CREDENTIALS_FILE, "utf-8");
|
|
151
|
+
return JSON.parse(raw);
|
|
152
|
+
} catch {
|
|
153
|
+
return { registryUrl: "https://registry.agentpacks.dev" };
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function saveCredentials(credentials) {
|
|
157
|
+
mkdirSync(dirname(CREDENTIALS_FILE), { recursive: true });
|
|
158
|
+
writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2) + `
|
|
159
|
+
`, {
|
|
160
|
+
mode: 384
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function clearCredentials() {
|
|
164
|
+
if (existsSync(CREDENTIALS_FILE)) {
|
|
165
|
+
writeFileSync(CREDENTIALS_FILE, JSON.stringify({ registryUrl: "https://registry.agentpacks.dev" }) + `
|
|
166
|
+
`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// src/cli/search.ts
|
|
171
|
+
import chalk from "chalk";
|
|
172
|
+
async function runSearch(query, options) {
|
|
173
|
+
const credentials = loadCredentials();
|
|
174
|
+
const client = createRegistryClient({
|
|
175
|
+
registryUrl: credentials.registryUrl,
|
|
176
|
+
authToken: credentials.token
|
|
177
|
+
});
|
|
178
|
+
try {
|
|
179
|
+
const { packs, total } = await client.search({
|
|
180
|
+
query,
|
|
181
|
+
tags: options.tags?.split(","),
|
|
182
|
+
targets: options.targets?.split(","),
|
|
183
|
+
sort: options.sort,
|
|
184
|
+
limit: options.limit ? Number(options.limit) : 20
|
|
185
|
+
});
|
|
186
|
+
if (packs.length === 0) {
|
|
187
|
+
console.log(chalk.dim("No packs found."));
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
console.log(chalk.bold(`Found ${total} pack(s)${query ? ` matching "${query}"` : ""}:
|
|
191
|
+
`));
|
|
192
|
+
for (const pack of packs) {
|
|
193
|
+
const verified = pack.verified ? chalk.green(" [verified]") : "";
|
|
194
|
+
const featured = pack.featured ? chalk.yellow(" [featured]") : "";
|
|
195
|
+
console.log(` ${chalk.bold(pack.name)}${verified}${featured}`);
|
|
196
|
+
console.log(` ${pack.description}`);
|
|
197
|
+
console.log(chalk.dim(` v${pack.latestVersion} | ${pack.downloads} downloads | by ${pack.author}`));
|
|
198
|
+
if (options.verbose && pack.tags.length > 0) {
|
|
199
|
+
console.log(chalk.dim(` tags: ${pack.tags.join(", ")}`));
|
|
200
|
+
}
|
|
201
|
+
console.log();
|
|
202
|
+
}
|
|
203
|
+
} catch (err) {
|
|
204
|
+
console.log(chalk.red(`Search failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
export {
|
|
209
|
+
runSearch
|
|
210
|
+
};
|
package/dist/core/config.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export type TargetId = (typeof TARGET_IDS)[number];
|
|
|
7
7
|
/**
|
|
8
8
|
* All supported feature types.
|
|
9
9
|
*/
|
|
10
|
-
export declare const FEATURE_IDS: readonly ["rules", "commands", "agents", "skills", "hooks", "plugins", "mcp", "ignore"];
|
|
10
|
+
export declare const FEATURE_IDS: readonly ["rules", "commands", "agents", "skills", "hooks", "plugins", "mcp", "ignore", "models"];
|
|
11
11
|
export type FeatureId = (typeof FEATURE_IDS)[number];
|
|
12
12
|
/**
|
|
13
13
|
* Repository mode.
|
|
@@ -57,6 +57,7 @@ export declare const WorkspaceConfigSchema: z.ZodObject<{
|
|
|
57
57
|
packs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
58
58
|
skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
59
59
|
}, z.core.$strip>>>;
|
|
60
|
+
modelProfile: z.ZodOptional<z.ZodString>;
|
|
60
61
|
}, z.core.$strip>;
|
|
61
62
|
export type WorkspaceConfig = z.infer<typeof WorkspaceConfigSchema>;
|
|
62
63
|
/**
|
package/dist/core/config.js
CHANGED
|
@@ -1,51 +1,85 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
7
|
-
var __toCommonJS = (from) => {
|
|
8
|
-
var entry = __moduleCache.get(from), desc;
|
|
9
|
-
if (entry)
|
|
10
|
-
return entry;
|
|
11
|
-
entry = __defProp({}, "__esModule", { value: true });
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function")
|
|
13
|
-
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
14
|
-
get: () => from[key],
|
|
15
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
-
}));
|
|
17
|
-
__moduleCache.set(from, entry);
|
|
18
|
-
return entry;
|
|
19
|
-
};
|
|
20
|
-
var __export = (target, all) => {
|
|
21
|
-
for (var name in all)
|
|
22
|
-
__defProp(target, name, {
|
|
23
|
-
get: all[name],
|
|
24
|
-
enumerable: true,
|
|
25
|
-
configurable: true,
|
|
26
|
-
set: (newValue) => all[name] = () => newValue
|
|
27
|
-
});
|
|
28
|
-
};
|
|
29
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
30
2
|
var __require = import.meta.require;
|
|
31
3
|
|
|
32
4
|
// src/core/config.ts
|
|
33
|
-
var exports_config = {};
|
|
34
|
-
__export(exports_config, {
|
|
35
|
-
resolveTargets: () => resolveTargets,
|
|
36
|
-
resolveFeatures: () => resolveFeatures,
|
|
37
|
-
loadWorkspaceConfig: () => loadWorkspaceConfig,
|
|
38
|
-
loadPackManifest: () => loadPackManifest,
|
|
39
|
-
WorkspaceConfigSchema: () => WorkspaceConfigSchema,
|
|
40
|
-
TARGET_IDS: () => TARGET_IDS,
|
|
41
|
-
REPO_MODES: () => REPO_MODES,
|
|
42
|
-
PackManifestSchema: () => PackManifestSchema,
|
|
43
|
-
FEATURE_IDS: () => FEATURE_IDS
|
|
44
|
-
});
|
|
45
5
|
import { z } from "zod";
|
|
46
6
|
import { readFileSync, existsSync } from "fs";
|
|
47
7
|
import { resolve } from "path";
|
|
48
8
|
import { parse as parseJsonc } from "jsonc-parser";
|
|
9
|
+
var TARGET_IDS = [
|
|
10
|
+
"opencode",
|
|
11
|
+
"cursor",
|
|
12
|
+
"claudecode",
|
|
13
|
+
"codexcli",
|
|
14
|
+
"geminicli",
|
|
15
|
+
"copilot",
|
|
16
|
+
"agentsmd",
|
|
17
|
+
"cline",
|
|
18
|
+
"kilo",
|
|
19
|
+
"roo",
|
|
20
|
+
"qwencode",
|
|
21
|
+
"kiro",
|
|
22
|
+
"factorydroid",
|
|
23
|
+
"antigravity",
|
|
24
|
+
"junie",
|
|
25
|
+
"augmentcode",
|
|
26
|
+
"windsurf",
|
|
27
|
+
"warp",
|
|
28
|
+
"replit",
|
|
29
|
+
"zed"
|
|
30
|
+
];
|
|
31
|
+
var FEATURE_IDS = [
|
|
32
|
+
"rules",
|
|
33
|
+
"commands",
|
|
34
|
+
"agents",
|
|
35
|
+
"skills",
|
|
36
|
+
"hooks",
|
|
37
|
+
"plugins",
|
|
38
|
+
"mcp",
|
|
39
|
+
"ignore",
|
|
40
|
+
"models"
|
|
41
|
+
];
|
|
42
|
+
var REPO_MODES = ["repo", "monorepo", "metarepo"];
|
|
43
|
+
var PackManifestSchema = z.object({
|
|
44
|
+
name: z.string().min(1),
|
|
45
|
+
version: z.string().default("1.0.0"),
|
|
46
|
+
description: z.string().default(""),
|
|
47
|
+
author: z.union([
|
|
48
|
+
z.string(),
|
|
49
|
+
z.object({ name: z.string(), email: z.string().optional() })
|
|
50
|
+
]).optional(),
|
|
51
|
+
tags: z.array(z.string()).default([]),
|
|
52
|
+
dependencies: z.array(z.string()).default([]),
|
|
53
|
+
conflicts: z.array(z.string()).default([]),
|
|
54
|
+
targets: z.union([z.literal("*"), z.array(z.string())]).default("*"),
|
|
55
|
+
features: z.union([z.literal("*"), z.array(z.string())]).default("*")
|
|
56
|
+
});
|
|
57
|
+
var FeaturesSchema = z.union([
|
|
58
|
+
z.literal("*"),
|
|
59
|
+
z.array(z.string()),
|
|
60
|
+
z.record(z.string(), z.union([z.literal("*"), z.array(z.string())]))
|
|
61
|
+
]);
|
|
62
|
+
var WorkspaceConfigSchema = z.object({
|
|
63
|
+
$schema: z.string().optional(),
|
|
64
|
+
packs: z.array(z.string()).default(["./packs/default"]),
|
|
65
|
+
disabled: z.array(z.string()).default([]),
|
|
66
|
+
targets: z.union([z.literal("*"), z.array(z.string())]).default("*"),
|
|
67
|
+
features: FeaturesSchema.default("*"),
|
|
68
|
+
mode: z.enum(REPO_MODES).default("repo"),
|
|
69
|
+
baseDirs: z.array(z.string()).default(["."]),
|
|
70
|
+
global: z.boolean().default(false),
|
|
71
|
+
delete: z.boolean().default(true),
|
|
72
|
+
verbose: z.boolean().default(false),
|
|
73
|
+
silent: z.boolean().default(false),
|
|
74
|
+
overrides: z.record(z.string(), z.record(z.string(), z.string())).default({}),
|
|
75
|
+
sources: z.array(z.object({
|
|
76
|
+
source: z.string(),
|
|
77
|
+
packs: z.array(z.string()).optional(),
|
|
78
|
+
skills: z.array(z.string()).optional()
|
|
79
|
+
})).default([]),
|
|
80
|
+
modelProfile: z.string().optional()
|
|
81
|
+
});
|
|
82
|
+
var CONFIG_FILES = ["agentpacks.local.jsonc", "agentpacks.jsonc"];
|
|
49
83
|
function loadWorkspaceConfig(projectRoot) {
|
|
50
84
|
for (const filename of CONFIG_FILES) {
|
|
51
85
|
const filepath = resolve(projectRoot, filename);
|
|
@@ -91,83 +125,6 @@ function resolveTargets(config) {
|
|
|
91
125
|
return [...TARGET_IDS];
|
|
92
126
|
return config.targets;
|
|
93
127
|
}
|
|
94
|
-
var TARGET_IDS, FEATURE_IDS, REPO_MODES, PackManifestSchema, FeaturesSchema, WorkspaceConfigSchema, CONFIG_FILES;
|
|
95
|
-
var init_config = __esm(() => {
|
|
96
|
-
TARGET_IDS = [
|
|
97
|
-
"opencode",
|
|
98
|
-
"cursor",
|
|
99
|
-
"claudecode",
|
|
100
|
-
"codexcli",
|
|
101
|
-
"geminicli",
|
|
102
|
-
"copilot",
|
|
103
|
-
"agentsmd",
|
|
104
|
-
"cline",
|
|
105
|
-
"kilo",
|
|
106
|
-
"roo",
|
|
107
|
-
"qwencode",
|
|
108
|
-
"kiro",
|
|
109
|
-
"factorydroid",
|
|
110
|
-
"antigravity",
|
|
111
|
-
"junie",
|
|
112
|
-
"augmentcode",
|
|
113
|
-
"windsurf",
|
|
114
|
-
"warp",
|
|
115
|
-
"replit",
|
|
116
|
-
"zed"
|
|
117
|
-
];
|
|
118
|
-
FEATURE_IDS = [
|
|
119
|
-
"rules",
|
|
120
|
-
"commands",
|
|
121
|
-
"agents",
|
|
122
|
-
"skills",
|
|
123
|
-
"hooks",
|
|
124
|
-
"plugins",
|
|
125
|
-
"mcp",
|
|
126
|
-
"ignore"
|
|
127
|
-
];
|
|
128
|
-
REPO_MODES = ["repo", "monorepo", "metarepo"];
|
|
129
|
-
PackManifestSchema = z.object({
|
|
130
|
-
name: z.string().min(1),
|
|
131
|
-
version: z.string().default("1.0.0"),
|
|
132
|
-
description: z.string().default(""),
|
|
133
|
-
author: z.union([
|
|
134
|
-
z.string(),
|
|
135
|
-
z.object({ name: z.string(), email: z.string().optional() })
|
|
136
|
-
]).optional(),
|
|
137
|
-
tags: z.array(z.string()).default([]),
|
|
138
|
-
dependencies: z.array(z.string()).default([]),
|
|
139
|
-
conflicts: z.array(z.string()).default([]),
|
|
140
|
-
targets: z.union([z.literal("*"), z.array(z.string())]).default("*"),
|
|
141
|
-
features: z.union([z.literal("*"), z.array(z.string())]).default("*")
|
|
142
|
-
});
|
|
143
|
-
FeaturesSchema = z.union([
|
|
144
|
-
z.literal("*"),
|
|
145
|
-
z.array(z.string()),
|
|
146
|
-
z.record(z.string(), z.union([z.literal("*"), z.array(z.string())]))
|
|
147
|
-
]);
|
|
148
|
-
WorkspaceConfigSchema = z.object({
|
|
149
|
-
$schema: z.string().optional(),
|
|
150
|
-
packs: z.array(z.string()).default(["./packs/default"]),
|
|
151
|
-
disabled: z.array(z.string()).default([]),
|
|
152
|
-
targets: z.union([z.literal("*"), z.array(z.string())]).default("*"),
|
|
153
|
-
features: FeaturesSchema.default("*"),
|
|
154
|
-
mode: z.enum(REPO_MODES).default("repo"),
|
|
155
|
-
baseDirs: z.array(z.string()).default(["."]),
|
|
156
|
-
global: z.boolean().default(false),
|
|
157
|
-
delete: z.boolean().default(true),
|
|
158
|
-
verbose: z.boolean().default(false),
|
|
159
|
-
silent: z.boolean().default(false),
|
|
160
|
-
overrides: z.record(z.string(), z.record(z.string(), z.string())).default({}),
|
|
161
|
-
sources: z.array(z.object({
|
|
162
|
-
source: z.string(),
|
|
163
|
-
packs: z.array(z.string()).optional(),
|
|
164
|
-
skills: z.array(z.string()).optional()
|
|
165
|
-
})).default([])
|
|
166
|
-
});
|
|
167
|
-
CONFIG_FILES = ["agentpacks.local.jsonc", "agentpacks.jsonc"];
|
|
168
|
-
});
|
|
169
|
-
init_config();
|
|
170
|
-
|
|
171
128
|
export {
|
|
172
129
|
resolveTargets,
|
|
173
130
|
resolveFeatures,
|
|
@@ -1,32 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
7
|
-
var __toCommonJS = (from) => {
|
|
8
|
-
var entry = __moduleCache.get(from), desc;
|
|
9
|
-
if (entry)
|
|
10
|
-
return entry;
|
|
11
|
-
entry = __defProp({}, "__esModule", { value: true });
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function")
|
|
13
|
-
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
14
|
-
get: () => from[key],
|
|
15
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
-
}));
|
|
17
|
-
__moduleCache.set(from, entry);
|
|
18
|
-
return entry;
|
|
19
|
-
};
|
|
20
|
-
var __export = (target, all) => {
|
|
21
|
-
for (var name in all)
|
|
22
|
-
__defProp(target, name, {
|
|
23
|
-
get: all[name],
|
|
24
|
-
enumerable: true,
|
|
25
|
-
configurable: true,
|
|
26
|
-
set: (newValue) => all[name] = () => newValue
|
|
27
|
-
});
|
|
28
|
-
};
|
|
29
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
30
2
|
var __require = import.meta.require;
|
|
31
3
|
|
|
32
4
|
// src/core/dependency-resolver.ts
|
|
@@ -78,8 +50,12 @@ function topologicalSort(graph) {
|
|
|
78
50
|
const sorted = [];
|
|
79
51
|
while (queue.length > 0) {
|
|
80
52
|
const current = queue.shift();
|
|
53
|
+
if (!current)
|
|
54
|
+
continue;
|
|
81
55
|
sorted.push(current);
|
|
82
56
|
const node = graph.get(current);
|
|
57
|
+
if (!node)
|
|
58
|
+
continue;
|
|
83
59
|
for (const dep of node.dependencies) {
|
|
84
60
|
if (!graph.has(dep))
|
|
85
61
|
continue;
|
|
@@ -6,6 +6,7 @@ import type { ParsedSkill } from '../features/skills.js';
|
|
|
6
6
|
import type { ParsedHooks } from '../features/hooks.js';
|
|
7
7
|
import type { ParsedPlugin } from '../features/plugins.js';
|
|
8
8
|
import type { McpServerEntry } from '../features/mcp.js';
|
|
9
|
+
import { type ModelsConfig } from '../features/models.js';
|
|
9
10
|
/**
|
|
10
11
|
* Merged features from all active packs.
|
|
11
12
|
*/
|
|
@@ -18,6 +19,7 @@ export interface MergedFeatures {
|
|
|
18
19
|
plugins: ParsedPlugin[];
|
|
19
20
|
mcpServers: Record<string, McpServerEntry>;
|
|
20
21
|
ignorePatterns: string[];
|
|
22
|
+
models: ModelsConfig | null;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* Merges features from multiple packs with conflict detection.
|
|
@@ -58,4 +60,9 @@ export declare class FeatureMerger {
|
|
|
58
60
|
* Ignore patterns are additive (deduplicated).
|
|
59
61
|
*/
|
|
60
62
|
private mergeIgnore;
|
|
63
|
+
/**
|
|
64
|
+
* Models: delegate to mergeModelsConfigs.
|
|
65
|
+
* Returns null if no packs define models.
|
|
66
|
+
*/
|
|
67
|
+
private mergeModels;
|
|
61
68
|
}
|