agentloom 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -72
- package/bin/cli.mjs +3 -2
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +149 -17
- package/dist/commands/add.d.ts +7 -0
- package/dist/commands/add.js +122 -31
- package/dist/commands/agent.d.ts +2 -0
- package/dist/commands/agent.js +85 -0
- package/dist/commands/command.d.ts +2 -0
- package/dist/commands/command.js +98 -0
- package/dist/commands/delete.d.ts +9 -0
- package/dist/commands/delete.js +444 -0
- package/dist/commands/entity-utils.d.ts +13 -0
- package/dist/commands/entity-utils.js +58 -0
- package/dist/commands/find.d.ts +21 -0
- package/dist/commands/find.js +944 -0
- package/dist/commands/mcp.js +133 -55
- package/dist/commands/skills.d.ts +2 -1
- package/dist/commands/skills.js +105 -9
- package/dist/commands/sync.d.ts +6 -0
- package/dist/commands/sync.js +12 -10
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.js +286 -21
- package/dist/core/argv.d.ts +2 -1
- package/dist/core/argv.js +42 -2
- package/dist/core/commands.d.ts +13 -0
- package/dist/core/commands.js +65 -0
- package/dist/core/copy.d.ts +6 -0
- package/dist/core/copy.js +126 -65
- package/dist/core/importer.d.ts +28 -1
- package/dist/core/importer.js +1104 -41
- package/dist/core/lockfile.js +86 -3
- package/dist/core/manage-agents-bootstrap.d.ts +10 -0
- package/dist/core/manage-agents-bootstrap.js +40 -0
- package/dist/core/manifest.js +7 -1
- package/dist/core/router.d.ts +16 -0
- package/dist/core/router.js +66 -0
- package/dist/core/scope.d.ts +1 -1
- package/dist/core/scope.js +12 -8
- package/dist/core/settings.d.ts +4 -3
- package/dist/core/settings.js +10 -8
- package/dist/core/skills.d.ts +23 -0
- package/dist/core/skills.js +328 -0
- package/dist/core/sources.d.ts +3 -1
- package/dist/core/sources.js +31 -1
- package/dist/core/telemetry.d.ts +26 -0
- package/dist/core/telemetry.js +124 -0
- package/dist/sync/index.d.ts +7 -1
- package/dist/sync/index.js +395 -131
- package/dist/types.d.ts +16 -1
- package/package.json +5 -4
package/dist/core/lockfile.js
CHANGED
|
@@ -6,9 +6,64 @@ const EMPTY_LOCK = {
|
|
|
6
6
|
export function readLockfile(paths) {
|
|
7
7
|
const lock = readJsonIfExists(paths.lockPath);
|
|
8
8
|
if (!lock || lock.version !== 1 || !Array.isArray(lock.entries)) {
|
|
9
|
-
return
|
|
9
|
+
return createEmptyLockfile();
|
|
10
10
|
}
|
|
11
|
-
return
|
|
11
|
+
return {
|
|
12
|
+
version: 1,
|
|
13
|
+
entries: lock.entries.map((entry) => ({
|
|
14
|
+
...entry,
|
|
15
|
+
importedAgents: Array.isArray(entry.importedAgents)
|
|
16
|
+
? entry.importedAgents
|
|
17
|
+
: [],
|
|
18
|
+
importedCommands: Array.isArray(entry.importedCommands)
|
|
19
|
+
? entry.importedCommands
|
|
20
|
+
: [],
|
|
21
|
+
selectedSourceCommands: Array.isArray(entry.selectedSourceCommands)
|
|
22
|
+
? entry.selectedSourceCommands
|
|
23
|
+
: undefined,
|
|
24
|
+
commandRenameMap: normalizeRenameMap(entry.commandRenameMap),
|
|
25
|
+
importedMcpServers: Array.isArray(entry.importedMcpServers)
|
|
26
|
+
? entry.importedMcpServers
|
|
27
|
+
: [],
|
|
28
|
+
selectedSourceMcpServers: Array.isArray(entry.selectedSourceMcpServers)
|
|
29
|
+
? entry.selectedSourceMcpServers
|
|
30
|
+
: undefined,
|
|
31
|
+
importedSkills: Array.isArray(entry.importedSkills)
|
|
32
|
+
? entry.importedSkills
|
|
33
|
+
: [],
|
|
34
|
+
selectedSourceSkills: Array.isArray(entry.selectedSourceSkills)
|
|
35
|
+
? entry.selectedSourceSkills
|
|
36
|
+
: undefined,
|
|
37
|
+
skillsProviders: Array.isArray(entry.skillsProviders)
|
|
38
|
+
? entry.skillsProviders
|
|
39
|
+
: undefined,
|
|
40
|
+
skillRenameMap: normalizeRenameMap(entry.skillRenameMap),
|
|
41
|
+
trackedEntities: Array.isArray(entry.trackedEntities)
|
|
42
|
+
? entry.trackedEntities
|
|
43
|
+
: undefined,
|
|
44
|
+
})),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function createEmptyLockfile() {
|
|
48
|
+
return {
|
|
49
|
+
version: EMPTY_LOCK.version,
|
|
50
|
+
entries: [],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function normalizeRenameMap(value) {
|
|
54
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
const normalized = {};
|
|
58
|
+
for (const [sourceName, importedName] of Object.entries(value)) {
|
|
59
|
+
if (typeof sourceName === "string" &&
|
|
60
|
+
sourceName.trim() &&
|
|
61
|
+
typeof importedName === "string" &&
|
|
62
|
+
importedName.trim()) {
|
|
63
|
+
normalized[sourceName] = importedName;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
12
67
|
}
|
|
13
68
|
export function writeLockfile(paths, lockfile) {
|
|
14
69
|
writeJsonAtomic(paths.lockPath, lockfile);
|
|
@@ -16,10 +71,38 @@ export function writeLockfile(paths, lockfile) {
|
|
|
16
71
|
export function upsertLockEntry(lockfile, entry) {
|
|
17
72
|
const index = lockfile.entries.findIndex((item) => item.source === entry.source &&
|
|
18
73
|
item.sourceType === entry.sourceType &&
|
|
19
|
-
item.subdir === entry.subdir
|
|
74
|
+
item.subdir === entry.subdir &&
|
|
75
|
+
sameRequestedAgents(item.requestedAgents, entry.requestedAgents) &&
|
|
76
|
+
sameSelection(item.selectedSourceCommands, entry.selectedSourceCommands) &&
|
|
77
|
+
sameSelection(item.selectedSourceMcpServers, entry.selectedSourceMcpServers) &&
|
|
78
|
+
sameSelection(item.selectedSourceSkills, entry.selectedSourceSkills) &&
|
|
79
|
+
sameSelection(item.skillsProviders, entry.skillsProviders));
|
|
20
80
|
if (index >= 0) {
|
|
21
81
|
lockfile.entries[index] = entry;
|
|
22
82
|
return;
|
|
23
83
|
}
|
|
24
84
|
lockfile.entries.push(entry);
|
|
25
85
|
}
|
|
86
|
+
function sameRequestedAgents(left, right) {
|
|
87
|
+
const normalizedLeft = normalizeSelectionForKey(left);
|
|
88
|
+
const normalizedRight = normalizeSelectionForKey(right);
|
|
89
|
+
if (normalizedLeft.length !== normalizedRight.length) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return normalizedLeft.every((value, index) => value === normalizedRight[index]);
|
|
93
|
+
}
|
|
94
|
+
function sameSelection(left, right) {
|
|
95
|
+
const normalizedLeft = normalizeSelectionForKey(left);
|
|
96
|
+
const normalizedRight = normalizeSelectionForKey(right);
|
|
97
|
+
if (normalizedLeft.length !== normalizedRight.length) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
return normalizedLeft.every((value, index) => value === normalizedRight[index]);
|
|
101
|
+
}
|
|
102
|
+
function normalizeSelectionForKey(value) {
|
|
103
|
+
if (!Array.isArray(value) || value.length === 0)
|
|
104
|
+
return [];
|
|
105
|
+
return [
|
|
106
|
+
...new Set(value.map((item) => item.trim().toLowerCase()).filter(Boolean)),
|
|
107
|
+
].sort();
|
|
108
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function getGlobalManageAgentsSkillPath(homeDir?: string): string;
|
|
2
|
+
export declare function getLocalManageAgentsSkillPath(cwd?: string): string;
|
|
3
|
+
export declare function maybePromptManageAgentsBootstrap(options: {
|
|
4
|
+
command: string;
|
|
5
|
+
help: boolean;
|
|
6
|
+
yes: boolean;
|
|
7
|
+
homeDir?: string;
|
|
8
|
+
cwd?: string;
|
|
9
|
+
interactive?: boolean;
|
|
10
|
+
}): Promise<boolean>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { confirm, isCancel } from "@clack/prompts";
|
|
5
|
+
const SKIP_COMMANDS = new Set([
|
|
6
|
+
"help",
|
|
7
|
+
"--help",
|
|
8
|
+
"-h",
|
|
9
|
+
"version",
|
|
10
|
+
"--version",
|
|
11
|
+
"-v",
|
|
12
|
+
]);
|
|
13
|
+
export function getGlobalManageAgentsSkillPath(homeDir = os.homedir()) {
|
|
14
|
+
return path.join(homeDir, ".agents", "skills", "manage-agents", "SKILL.md");
|
|
15
|
+
}
|
|
16
|
+
export function getLocalManageAgentsSkillPath(cwd = process.cwd()) {
|
|
17
|
+
return path.join(cwd, ".agents", "skills", "manage-agents", "SKILL.md");
|
|
18
|
+
}
|
|
19
|
+
export async function maybePromptManageAgentsBootstrap(options) {
|
|
20
|
+
if (process.env.AGENTLOOM_DISABLE_MANAGE_AGENTS_PROMPT === "1")
|
|
21
|
+
return false;
|
|
22
|
+
const interactive = options.interactive ?? Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
23
|
+
if (!interactive || options.help || options.yes)
|
|
24
|
+
return false;
|
|
25
|
+
const loweredCommand = options.command.trim().toLowerCase();
|
|
26
|
+
if (SKIP_COMMANDS.has(loweredCommand))
|
|
27
|
+
return false;
|
|
28
|
+
const globalSkillPath = getGlobalManageAgentsSkillPath(options.homeDir);
|
|
29
|
+
const localSkillPath = getLocalManageAgentsSkillPath(options.cwd);
|
|
30
|
+
if (fs.existsSync(globalSkillPath) || fs.existsSync(localSkillPath)) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const accepted = await confirm({
|
|
34
|
+
message: 'Global skill "manage-agents" is missing. It helps agents reliably manage Agentloom resources (find/create/import/update/sync/delete). Install it after this command completes?',
|
|
35
|
+
initialValue: true,
|
|
36
|
+
});
|
|
37
|
+
if (isCancel(accepted) || accepted !== true)
|
|
38
|
+
return false;
|
|
39
|
+
return true;
|
|
40
|
+
}
|
package/dist/core/manifest.js
CHANGED
|
@@ -10,7 +10,13 @@ export function readManifest(paths) {
|
|
|
10
10
|
!Array.isArray(manifest.generatedFiles)) {
|
|
11
11
|
return { ...EMPTY_MANIFEST };
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
const generatedByEntity = manifest.generatedByEntity && typeof manifest.generatedByEntity === "object"
|
|
14
|
+
? manifest.generatedByEntity
|
|
15
|
+
: undefined;
|
|
16
|
+
return {
|
|
17
|
+
...manifest,
|
|
18
|
+
generatedByEntity,
|
|
19
|
+
};
|
|
14
20
|
}
|
|
15
21
|
export function writeManifest(paths, manifest) {
|
|
16
22
|
writeJsonAtomic(paths.manifestPath, manifest);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { EntityType } from "../types.js";
|
|
2
|
+
export type AggregateVerb = "add" | "find" | "update" | "sync" | "delete";
|
|
3
|
+
export type EntityVerb = "add" | "list" | "delete" | "find" | "update" | "sync";
|
|
4
|
+
export type McpServerVerb = "add" | "list" | "delete";
|
|
5
|
+
export type CommandRoute = {
|
|
6
|
+
mode: "aggregate";
|
|
7
|
+
verb: AggregateVerb;
|
|
8
|
+
} | {
|
|
9
|
+
mode: "entity";
|
|
10
|
+
entity: EntityType;
|
|
11
|
+
verb: EntityVerb;
|
|
12
|
+
} | {
|
|
13
|
+
mode: "mcp-server";
|
|
14
|
+
verb: McpServerVerb;
|
|
15
|
+
};
|
|
16
|
+
export declare function parseCommandRoute(argv: string[]): CommandRoute | null;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const AGGREGATE_VERBS = new Set([
|
|
2
|
+
"add",
|
|
3
|
+
"find",
|
|
4
|
+
"update",
|
|
5
|
+
"sync",
|
|
6
|
+
"delete",
|
|
7
|
+
]);
|
|
8
|
+
const ENTITY_NOUNS = new Set(["agent", "command", "mcp", "skill"]);
|
|
9
|
+
const ENTITY_VERBS = new Set([
|
|
10
|
+
"add",
|
|
11
|
+
"list",
|
|
12
|
+
"delete",
|
|
13
|
+
"find",
|
|
14
|
+
"update",
|
|
15
|
+
"sync",
|
|
16
|
+
]);
|
|
17
|
+
const MCP_SERVER_VERBS = new Set(["add", "list", "delete"]);
|
|
18
|
+
export function parseCommandRoute(argv) {
|
|
19
|
+
const root = argv[0]?.trim().toLowerCase();
|
|
20
|
+
if (!root)
|
|
21
|
+
return null;
|
|
22
|
+
if (AGGREGATE_VERBS.has(root)) {
|
|
23
|
+
return {
|
|
24
|
+
mode: "aggregate",
|
|
25
|
+
verb: root,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (!ENTITY_NOUNS.has(root)) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const action = argv[1]?.trim().toLowerCase();
|
|
32
|
+
if (!action || action === "--help" || action === "-h" || action === "help") {
|
|
33
|
+
return {
|
|
34
|
+
mode: "entity",
|
|
35
|
+
entity: root,
|
|
36
|
+
verb: "list",
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (root === "mcp" && action === "server") {
|
|
40
|
+
const serverVerb = argv[2]?.trim().toLowerCase();
|
|
41
|
+
if (!serverVerb ||
|
|
42
|
+
serverVerb === "--help" ||
|
|
43
|
+
serverVerb === "-h" ||
|
|
44
|
+
serverVerb === "help") {
|
|
45
|
+
return {
|
|
46
|
+
mode: "mcp-server",
|
|
47
|
+
verb: "list",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (!MCP_SERVER_VERBS.has(serverVerb)) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
mode: "mcp-server",
|
|
55
|
+
verb: serverVerb,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (!ENTITY_VERBS.has(action)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
mode: "entity",
|
|
63
|
+
entity: root,
|
|
64
|
+
verb: action,
|
|
65
|
+
};
|
|
66
|
+
}
|
package/dist/core/scope.d.ts
CHANGED
|
@@ -5,5 +5,5 @@ export interface ScopeResolutionOptions {
|
|
|
5
5
|
local?: boolean;
|
|
6
6
|
interactive?: boolean;
|
|
7
7
|
}
|
|
8
|
-
export declare function buildScopePaths(cwd: string, scope: Scope): ScopePaths;
|
|
8
|
+
export declare function buildScopePaths(cwd: string, scope: Scope, homeDir?: string): ScopePaths;
|
|
9
9
|
export declare function resolveScope(options: ScopeResolutionOptions): Promise<ScopePaths>;
|
package/dist/core/scope.js
CHANGED
|
@@ -3,9 +3,8 @@ import os from "node:os";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { cancel, isCancel, select } from "@clack/prompts";
|
|
5
5
|
import { getGlobalSettingsPath, readSettings } from "./settings.js";
|
|
6
|
-
export function buildScopePaths(cwd, scope) {
|
|
6
|
+
export function buildScopePaths(cwd, scope, homeDir = os.homedir()) {
|
|
7
7
|
const workspaceRoot = cwd;
|
|
8
|
-
const homeDir = os.homedir();
|
|
9
8
|
const agentsRoot = scope === "local"
|
|
10
9
|
? path.join(workspaceRoot, ".agents")
|
|
11
10
|
: path.join(homeDir, ".agents");
|
|
@@ -15,6 +14,8 @@ export function buildScopePaths(cwd, scope) {
|
|
|
15
14
|
homeDir,
|
|
16
15
|
agentsRoot,
|
|
17
16
|
agentsDir: path.join(agentsRoot, "agents"),
|
|
17
|
+
commandsDir: path.join(agentsRoot, "commands"),
|
|
18
|
+
skillsDir: path.join(agentsRoot, "skills"),
|
|
18
19
|
mcpPath: path.join(agentsRoot, "mcp.json"),
|
|
19
20
|
lockPath: path.join(agentsRoot, "agents.lock.json"),
|
|
20
21
|
settingsPath: path.join(agentsRoot, "settings.local.json"),
|
|
@@ -31,22 +32,25 @@ export async function resolveScope(options) {
|
|
|
31
32
|
if (options.local)
|
|
32
33
|
return buildScopePaths(cwd, "local");
|
|
33
34
|
const hasLocalAgents = fs.existsSync(path.join(cwd, ".agents"));
|
|
34
|
-
if (!hasLocalAgents) {
|
|
35
|
-
return buildScopePaths(cwd, "global");
|
|
36
|
-
}
|
|
37
35
|
const interactive = options.interactive ?? (process.stdin.isTTY && process.stdout.isTTY);
|
|
38
36
|
if (!interactive) {
|
|
39
|
-
return buildScopePaths(cwd, "local");
|
|
37
|
+
return buildScopePaths(cwd, hasLocalAgents ? "local" : "global");
|
|
40
38
|
}
|
|
41
39
|
const globalSettings = readSettings(getGlobalSettingsPath());
|
|
42
|
-
const defaultScope = globalSettings.lastScope === "
|
|
40
|
+
const defaultScope = globalSettings.lastScope === "local" ? "local" : "global";
|
|
43
41
|
const selected = await select({
|
|
44
42
|
message: "Choose scope for this command",
|
|
45
43
|
options: [
|
|
46
44
|
{
|
|
47
45
|
value: "local",
|
|
48
46
|
label: ".agents in this repository",
|
|
49
|
-
hint:
|
|
47
|
+
hint: hasLocalAgents
|
|
48
|
+
? defaultScope === "local"
|
|
49
|
+
? "default"
|
|
50
|
+
: undefined
|
|
51
|
+
: defaultScope === "local"
|
|
52
|
+
? "default (creates .agents)"
|
|
53
|
+
: "creates .agents",
|
|
50
54
|
},
|
|
51
55
|
{
|
|
52
56
|
value: "global",
|
package/dist/core/settings.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AgentloomSettings, Provider, Scope, ScopePaths } from "../types.js";
|
|
2
2
|
export declare function getGlobalSettingsPath(homeDir?: string): string;
|
|
3
|
-
export declare function readSettings(settingsPath: string):
|
|
4
|
-
export declare function writeSettings(settingsPath: string, settings:
|
|
3
|
+
export declare function readSettings(settingsPath: string): AgentloomSettings;
|
|
4
|
+
export declare function writeSettings(settingsPath: string, settings: AgentloomSettings): void;
|
|
5
5
|
export declare function updateLastScope(settingsPath: string, scope: Scope, providers?: Provider[]): void;
|
|
6
|
+
export declare function updateLastScopeBestEffort(settingsPath: string, scope: Scope, providers?: Provider[]): void;
|
|
6
7
|
export declare function settingsPathForScope(paths: ScopePaths): string;
|
package/dist/core/settings.js
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
import os from "node:os";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { readJsonIfExists, writeJsonAtomic } from "./fs.js";
|
|
4
|
+
import { ALL_PROVIDERS } from "../types.js";
|
|
4
5
|
const DEFAULT_SETTINGS = {
|
|
5
6
|
version: 1,
|
|
6
|
-
defaultProviders: [
|
|
7
|
-
"cursor",
|
|
8
|
-
"claude",
|
|
9
|
-
"codex",
|
|
10
|
-
"opencode",
|
|
11
|
-
"gemini",
|
|
12
|
-
"copilot",
|
|
13
|
-
],
|
|
7
|
+
defaultProviders: [...ALL_PROVIDERS],
|
|
14
8
|
telemetry: {
|
|
15
9
|
enabled: true,
|
|
16
10
|
},
|
|
@@ -49,6 +43,14 @@ export function updateLastScope(settingsPath, scope, providers) {
|
|
|
49
43
|
}
|
|
50
44
|
writeSettings(settingsPath, next);
|
|
51
45
|
}
|
|
46
|
+
export function updateLastScopeBestEffort(settingsPath, scope, providers) {
|
|
47
|
+
try {
|
|
48
|
+
updateLastScope(settingsPath, scope, providers);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Global preference persistence should not block command execution.
|
|
52
|
+
}
|
|
53
|
+
}
|
|
52
54
|
export function settingsPathForScope(paths) {
|
|
53
55
|
return paths.settingsPath;
|
|
54
56
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Provider, ScopePaths } from "../types.js";
|
|
2
|
+
export interface CanonicalSkill {
|
|
3
|
+
name: string;
|
|
4
|
+
sourcePath: string;
|
|
5
|
+
skillPath: string;
|
|
6
|
+
layout: "nested" | "root";
|
|
7
|
+
}
|
|
8
|
+
export declare const ROOT_SKILL_ARTIFACT_DIRS: readonly ["references", "assets", "scripts", "templates", "examples"];
|
|
9
|
+
export declare function parseSkillsDir(skillsDir: string): CanonicalSkill[];
|
|
10
|
+
export declare function normalizeSkillSelector(value: string): string;
|
|
11
|
+
export declare function resolveSkillSelections(skills: CanonicalSkill[], selectors: string[]): {
|
|
12
|
+
selected: CanonicalSkill[];
|
|
13
|
+
unmatched: string[];
|
|
14
|
+
};
|
|
15
|
+
export declare function copyRootSkillArtifacts(sourceRoot: string, targetDir: string): void;
|
|
16
|
+
export declare function copySkillArtifacts(skill: CanonicalSkill, targetDir: string): void;
|
|
17
|
+
export declare function skillContentMatchesTarget(skill: CanonicalSkill, targetDir: string): boolean;
|
|
18
|
+
export declare function applySkillProviderSideEffects(options: {
|
|
19
|
+
paths: ScopePaths;
|
|
20
|
+
providers: Provider[];
|
|
21
|
+
dryRun?: boolean;
|
|
22
|
+
warn?: (message: string) => void;
|
|
23
|
+
}): void;
|