@bastani/atomic 0.9.5-alpha.6 → 0.9.5-alpha.7
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/CHANGELOG.md +18 -0
- package/dist/builtin/cursor/package.json +2 -2
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/bun/split-loader.d.ts +2 -0
- package/dist/bun/split-loader.d.ts.map +1 -0
- package/dist/bun/split-loader.js +37 -0
- package/dist/bun/split-loader.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -4
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts +5 -4
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +15 -9
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +1 -1
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +1 -1
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/builtin-packages.d.ts.map +1 -1
- package/dist/core/builtin-packages.js +8 -4
- package/dist/core/builtin-packages.js.map +1 -1
- package/dist/core/copilot-model-catalog.d.ts.map +1 -1
- package/dist/core/copilot-model-catalog.js +3 -2
- package/dist/core/copilot-model-catalog.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +8 -3
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/openai-responses-payload-sanitizer.d.ts +6 -0
- package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -0
- package/dist/core/openai-responses-payload-sanitizer.js +59 -0
- package/dist/core/openai-responses-payload-sanitizer.js.map +1 -0
- package/dist/core/package-manager-auto-resources.d.ts +2 -2
- package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
- package/dist/core/package-manager-auto-resources.js +32 -52
- package/dist/core/package-manager-auto-resources.js.map +1 -1
- package/dist/core/package-manager-resolver.d.ts.map +1 -1
- package/dist/core/package-manager-resolver.js +23 -14
- package/dist/core/package-manager-resolver.js.map +1 -1
- package/dist/core/package-manager-resource-collector.d.ts +3 -3
- package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
- package/dist/core/package-manager-resource-collector.js +76 -73
- package/dist/core/package-manager-resource-collector.js.map +1 -1
- package/dist/core/package-manager-resource-files.d.ts +9 -8
- package/dist/core/package-manager-resource-files.d.ts.map +1 -1
- package/dist/core/package-manager-resource-files.js +92 -81
- package/dist/core/package-manager-resource-files.js.map +1 -1
- package/dist/core/prompt-templates-async.d.ts +3 -0
- package/dist/core/prompt-templates-async.d.ts.map +1 -0
- package/dist/core/prompt-templates-async.js +118 -0
- package/dist/core/prompt-templates-async.js.map +1 -0
- package/dist/core/provider-context-usage.d.ts +11 -0
- package/dist/core/provider-context-usage.d.ts.map +1 -0
- package/dist/core/provider-context-usage.js +58 -0
- package/dist/core/provider-context-usage.js.map +1 -0
- package/dist/core/resource-loader-assets.d.ts +3 -3
- package/dist/core/resource-loader-assets.d.ts.map +1 -1
- package/dist/core/resource-loader-assets.js +66 -83
- package/dist/core/resource-loader-assets.js.map +1 -1
- package/dist/core/resource-loader-core.d.ts +1 -1
- package/dist/core/resource-loader-core.d.ts.map +1 -1
- package/dist/core/resource-loader-core.js +5 -5
- package/dist/core/resource-loader-core.js.map +1 -1
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.js +43 -7
- package/dist/core/resource-loader-reload.js.map +1 -1
- package/dist/core/resource-loader-types.d.ts +7 -1
- package/dist/core/resource-loader-types.d.ts.map +1 -1
- package/dist/core/resource-loader-types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +6 -4
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/skills-async.d.ts +3 -0
- package/dist/core/skills-async.d.ts.map +1 -0
- package/dist/core/skills-async.js +269 -0
- package/dist/core/skills-async.js.map +1 -0
- package/dist/main-deferred-startup.d.ts +2 -0
- package/dist/main-deferred-startup.d.ts.map +1 -1
- package/dist/main-deferred-startup.js +2 -0
- package/dist/main-deferred-startup.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +4 -4
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +10 -1
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.d.ts +6 -0
- package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.js +27 -13
- package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-editor-actions.js +13 -13
- package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js +16 -0
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +48 -0
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +5 -0
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +18 -6
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +3 -3
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-onboarding.js +1 -0
- package/dist/modes/interactive/interactive-onboarding.js.map +1 -1
- package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-process-lifecycle.js +43 -6
- package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +57 -0
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-resource-disclosure.js +3 -2
- package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-resource-rendering.js +10 -8
- package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +59 -52
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.js +3 -0
- package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +1 -1
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/utils/module-require.d.ts +11 -0
- package/dist/utils/module-require.d.ts.map +1 -1
- package/dist/utils/module-require.js +14 -1
- package/dist/utils/module-require.js.map +1 -1
- package/dist/utils/split-launcher.d.ts +38 -0
- package/dist/utils/split-launcher.d.ts.map +1 -0
- package/dist/utils/split-launcher.js +63 -0
- package/dist/utils/split-launcher.js.map +1 -0
- package/docs/compaction.md +3 -0
- package/docs/keybindings.md +2 -2
- package/docs/providers.md +1 -1
- package/docs/settings.md +2 -2
- package/docs/usage.md +1 -1
- package/npm-shrinkwrap.json +23 -23
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager-resource-collector.d.ts","sourceRoot":"","sources":["../../src/core/package-manager-resource-collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-manager-resource-collector.d.ts","sourceRoot":"","sources":["../../src/core/package-manager-resource-collector.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAe9H,wBAAsB,uBAAuB,CAC5C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,mBAAmB,EAChC,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,QAAQ,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CA+BlB;AA0DD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpK;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW1G","sourcesContent":["import { access, readFile, stat } from \"node:fs/promises\";\nimport { glob } from \"glob\";\nimport { resolve } from \"node:path\";\nimport { addResource, getTargetMap } from \"./package-manager-resource-accumulator.ts\";\nimport { collectResourceFiles } from \"./package-manager-resource-files.ts\";\nimport { conventionDirsForResource, getManifestFromPackageJson, manifestEntriesForResource } from \"./package-manager-manifest.ts\";\nimport { applyPatterns, hasGlobPattern, isOverridePattern, splitPatterns } from \"./package-manager-resource-patterns.ts\";\nimport { resolvePathFromBase } from \"./package-manager-paths.ts\";\nimport type { PackageFilter, PathMetadata, ResourceAccumulator, ResourceMap, ResourceType } from \"./package-manager-types.ts\";\n\nasync function exists(path: string): Promise<boolean> {\n\ttry { await access(path); return true; } catch { return false; }\n}\n\nasync function readPiManifest(packageRoot: string): Promise<ReturnType<typeof getManifestFromPackageJson> | null> {\n\ttry {\n\t\tconst content = await readFile(resolve(packageRoot, \"package.json\"), \"utf-8\");\n\t\treturn getManifestFromPackageJson(JSON.parse(content) as Record<string, unknown>);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function collectPackageResources(\n\tpackageRoot: string,\n\taccumulator: ResourceAccumulator,\n\tfilter: PackageFilter | undefined,\n\tmetadata: PathMetadata,\n): Promise<boolean> {\n\tif (filter) {\n\t\tfor (const resourceType of [\"extensions\", \"skills\", \"prompts\", \"themes\", \"workflows\"] as const) {\n\t\t\tconst patterns = filter[resourceType as keyof PackageFilter];\n\t\t\tconst target = getTargetMap(accumulator, resourceType);\n\t\t\tif (patterns !== undefined) await applyPackageFilter(packageRoot, patterns, resourceType, target, metadata);\n\t\t\telse await collectDefaultResources(packageRoot, resourceType, target, metadata);\n\t\t}\n\t\treturn true;\n\t}\n\tconst manifest = await readPiManifest(packageRoot);\n\tif (manifest) {\n\t\tfor (const resourceType of [\"extensions\", \"skills\", \"prompts\", \"themes\", \"workflows\"] as const) {\n\t\t\tconst entries = manifestEntriesForResource(manifest, resourceType);\n\t\t\tif (entries !== undefined) {\n\t\t\t\tawait addManifestEntries(entries, packageRoot, resourceType, getTargetMap(accumulator, resourceType), metadata);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (resourceType === \"workflows\") await collectDefaultResources(packageRoot, resourceType, getTargetMap(accumulator, resourceType), metadata);\n\t\t}\n\t\treturn true;\n\t}\n\tlet hasAnyDir = false;\n\tfor (const resourceType of [\"extensions\", \"skills\", \"prompts\", \"themes\", \"workflows\"] as const) {\n\t\tfor (const dir of conventionDirsForResource(packageRoot, resourceType)) {\n\t\t\tif (!(await exists(dir))) continue;\n\t\t\tfor (const f of await collectResourceFiles(dir, resourceType)) addResource(getTargetMap(accumulator, resourceType), f, metadata, true);\n\t\t\thasAnyDir = true;\n\t\t}\n\t}\n\treturn hasAnyDir;\n}\n\nasync function collectDefaultResources(packageRoot: string, resourceType: ResourceType, target: ResourceMap, metadata: PathMetadata): Promise<void> {\n\tconst manifest = await readPiManifest(packageRoot);\n\tconst entries = manifestEntriesForResource(manifest, resourceType);\n\tif (entries !== undefined) {\n\t\tawait addManifestEntries(entries, packageRoot, resourceType, target, metadata);\n\t\treturn;\n\t}\n\tfor (const dir of conventionDirsForResource(packageRoot, resourceType)) {\n\t\tif (!(await exists(dir))) continue;\n\t\tfor (const f of await collectResourceFiles(dir, resourceType)) addResource(target, f, metadata, true);\n\t}\n}\n\nasync function applyPackageFilter(packageRoot: string, userPatterns: string[], resourceType: ResourceType, target: ResourceMap, metadata: PathMetadata): Promise<void> {\n\tconst { allFiles } = await collectManifestFiles(packageRoot, resourceType);\n\tif (userPatterns.length === 0) {\n\t\tfor (const f of allFiles) addResource(target, f, metadata, false);\n\t\treturn;\n\t}\n\tconst enabledByUser = applyPatterns(allFiles, userPatterns, packageRoot);\n\tfor (const f of allFiles) addResource(target, f, metadata, enabledByUser.has(f));\n}\n\nasync function collectManifestFiles(packageRoot: string, resourceType: ResourceType): Promise<{ allFiles: string[]; enabledByManifest: Set<string> }> {\n\tconst manifest = await readPiManifest(packageRoot);\n\tconst entries = manifestEntriesForResource(manifest, resourceType);\n\tif (entries && entries.length > 0) {\n\t\tconst allFiles = await collectFilesFromManifestEntries(entries, packageRoot, resourceType);\n\t\tconst manifestPatterns = entries.filter(isOverridePattern);\n\t\tconst enabledByManifest = manifestPatterns.length > 0 ? applyPatterns(allFiles, manifestPatterns, packageRoot) : new Set(allFiles);\n\t\treturn { allFiles: Array.from(enabledByManifest), enabledByManifest };\n\t}\n\tconst allFiles: string[] = [];\n\tfor (const dir of conventionDirsForResource(packageRoot, resourceType)) {\n\t\tif (await exists(dir)) allFiles.push(...await collectResourceFiles(dir, resourceType));\n\t}\n\treturn { allFiles, enabledByManifest: new Set(allFiles) };\n}\n\nasync function addManifestEntries(entries: string[] | undefined, root: string, resourceType: ResourceType, target: ResourceMap, metadata: PathMetadata): Promise<void> {\n\tif (!entries) return;\n\tconst allFiles = await collectFilesFromManifestEntries(entries, root, resourceType);\n\tconst patterns = entries.filter(isOverridePattern);\n\tconst enabledPaths = applyPatterns(allFiles, patterns, root);\n\tfor (const f of allFiles) if (enabledPaths.has(f)) addResource(target, f, metadata, true);\n}\n\nasync function collectFilesFromManifestEntries(entries: string[], root: string, resourceType: ResourceType): Promise<string[]> {\n\tconst resolved: string[] = [];\n\tfor (const entry of entries.filter((entry) => !isOverridePattern(entry))) {\n\t\tif (!hasGlobPattern(entry)) resolved.push(resolve(root, entry));\n\t\telse resolved.push(...(await glob(entry, { cwd: root, absolute: true, dot: false, nodir: false })).map((match) => resolve(match)));\n\t}\n\treturn collectFilesFromPaths(resolved, resourceType);\n}\n\nexport async function resolveLocalEntries(entries: string[], resourceType: ResourceType, target: ResourceMap, metadata: PathMetadata, baseDir: string): Promise<void> {\n\tif (entries.length === 0) return;\n\tconst { plain, patterns } = splitPatterns(entries);\n\tconst resolvedPlain = plain.map((p) => resolvePathFromBase(p, baseDir));\n\tconst allFiles = await collectFilesFromPaths(resolvedPlain, resourceType);\n\tconst enabledPaths = applyPatterns(allFiles, patterns, baseDir);\n\tfor (const f of allFiles) addResource(target, f, metadata, enabledPaths.has(f));\n}\n\nexport async function collectFilesFromPaths(paths: string[], resourceType: ResourceType): Promise<string[]> {\n\tconst files: string[] = [];\n\tfor (const p of paths) {\n\t\tif (!(await exists(p))) continue;\n\t\ttry {\n\t\t\tconst stats = await stat(p);\n\t\t\tif (stats.isFile()) files.push(p);\n\t\t\telse if (stats.isDirectory()) files.push(...await collectResourceFiles(p, resourceType));\n\t\t} catch {}\n\t}\n\treturn files;\n}\n"]}
|
|
@@ -1,145 +1,148 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { access, readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { glob } from "glob";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { addResource, getTargetMap } from "./package-manager-resource-accumulator.js";
|
|
5
5
|
import { collectResourceFiles } from "./package-manager-resource-files.js";
|
|
6
|
-
import { conventionDirsForResource,
|
|
7
|
-
import { applyPatterns, hasGlobPattern, isOverridePattern, splitPatterns
|
|
6
|
+
import { conventionDirsForResource, getManifestFromPackageJson, manifestEntriesForResource } from "./package-manager-manifest.js";
|
|
7
|
+
import { applyPatterns, hasGlobPattern, isOverridePattern, splitPatterns } from "./package-manager-resource-patterns.js";
|
|
8
8
|
import { resolvePathFromBase } from "./package-manager-paths.js";
|
|
9
|
-
|
|
9
|
+
async function exists(path) {
|
|
10
|
+
try {
|
|
11
|
+
await access(path);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function readPiManifest(packageRoot) {
|
|
19
|
+
try {
|
|
20
|
+
const content = await readFile(resolve(packageRoot, "package.json"), "utf-8");
|
|
21
|
+
return getManifestFromPackageJson(JSON.parse(content));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function collectPackageResources(packageRoot, accumulator, filter, metadata) {
|
|
10
28
|
if (filter) {
|
|
11
29
|
for (const resourceType of ["extensions", "skills", "prompts", "themes", "workflows"]) {
|
|
12
30
|
const patterns = filter[resourceType];
|
|
13
31
|
const target = getTargetMap(accumulator, resourceType);
|
|
14
|
-
if (patterns !== undefined)
|
|
15
|
-
applyPackageFilter(packageRoot, patterns, resourceType, target, metadata);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
collectDefaultResources(packageRoot, resourceType, target, metadata);
|
|
19
|
-
}
|
|
32
|
+
if (patterns !== undefined)
|
|
33
|
+
await applyPackageFilter(packageRoot, patterns, resourceType, target, metadata);
|
|
34
|
+
else
|
|
35
|
+
await collectDefaultResources(packageRoot, resourceType, target, metadata);
|
|
20
36
|
}
|
|
21
37
|
return true;
|
|
22
38
|
}
|
|
23
|
-
const manifest = readPiManifest(packageRoot);
|
|
39
|
+
const manifest = await readPiManifest(packageRoot);
|
|
24
40
|
if (manifest) {
|
|
25
41
|
for (const resourceType of ["extensions", "skills", "prompts", "themes", "workflows"]) {
|
|
26
42
|
const entries = manifestEntriesForResource(manifest, resourceType);
|
|
27
43
|
if (entries !== undefined) {
|
|
28
|
-
addManifestEntries(entries, packageRoot, resourceType, getTargetMap(accumulator, resourceType), metadata);
|
|
44
|
+
await addManifestEntries(entries, packageRoot, resourceType, getTargetMap(accumulator, resourceType), metadata);
|
|
29
45
|
continue;
|
|
30
46
|
}
|
|
31
|
-
if (resourceType === "workflows")
|
|
32
|
-
collectDefaultResources(packageRoot, resourceType, getTargetMap(accumulator, resourceType), metadata);
|
|
33
|
-
}
|
|
47
|
+
if (resourceType === "workflows")
|
|
48
|
+
await collectDefaultResources(packageRoot, resourceType, getTargetMap(accumulator, resourceType), metadata);
|
|
34
49
|
}
|
|
35
50
|
return true;
|
|
36
51
|
}
|
|
37
52
|
let hasAnyDir = false;
|
|
38
53
|
for (const resourceType of ["extensions", "skills", "prompts", "themes", "workflows"]) {
|
|
39
54
|
for (const dir of conventionDirsForResource(packageRoot, resourceType)) {
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
hasAnyDir = true;
|
|
46
|
-
}
|
|
55
|
+
if (!(await exists(dir)))
|
|
56
|
+
continue;
|
|
57
|
+
for (const f of await collectResourceFiles(dir, resourceType))
|
|
58
|
+
addResource(getTargetMap(accumulator, resourceType), f, metadata, true);
|
|
59
|
+
hasAnyDir = true;
|
|
47
60
|
}
|
|
48
61
|
}
|
|
49
62
|
return hasAnyDir;
|
|
50
63
|
}
|
|
51
|
-
function collectDefaultResources(packageRoot, resourceType, target, metadata) {
|
|
52
|
-
const manifest = readPiManifest(packageRoot);
|
|
64
|
+
async function collectDefaultResources(packageRoot, resourceType, target, metadata) {
|
|
65
|
+
const manifest = await readPiManifest(packageRoot);
|
|
53
66
|
const entries = manifestEntriesForResource(manifest, resourceType);
|
|
54
67
|
if (entries !== undefined) {
|
|
55
|
-
addManifestEntries(entries, packageRoot, resourceType, target, metadata);
|
|
68
|
+
await addManifestEntries(entries, packageRoot, resourceType, target, metadata);
|
|
56
69
|
return;
|
|
57
70
|
}
|
|
58
71
|
for (const dir of conventionDirsForResource(packageRoot, resourceType)) {
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
}
|
|
72
|
+
if (!(await exists(dir)))
|
|
73
|
+
continue;
|
|
74
|
+
for (const f of await collectResourceFiles(dir, resourceType))
|
|
75
|
+
addResource(target, f, metadata, true);
|
|
65
76
|
}
|
|
66
77
|
}
|
|
67
|
-
function applyPackageFilter(packageRoot, userPatterns, resourceType, target, metadata) {
|
|
68
|
-
const { allFiles } = collectManifestFiles(packageRoot, resourceType);
|
|
78
|
+
async function applyPackageFilter(packageRoot, userPatterns, resourceType, target, metadata) {
|
|
79
|
+
const { allFiles } = await collectManifestFiles(packageRoot, resourceType);
|
|
69
80
|
if (userPatterns.length === 0) {
|
|
70
|
-
for (const f of allFiles)
|
|
81
|
+
for (const f of allFiles)
|
|
71
82
|
addResource(target, f, metadata, false);
|
|
72
|
-
}
|
|
73
83
|
return;
|
|
74
84
|
}
|
|
75
85
|
const enabledByUser = applyPatterns(allFiles, userPatterns, packageRoot);
|
|
76
|
-
for (const f of allFiles)
|
|
86
|
+
for (const f of allFiles)
|
|
77
87
|
addResource(target, f, metadata, enabledByUser.has(f));
|
|
78
|
-
}
|
|
79
88
|
}
|
|
80
|
-
function collectManifestFiles(packageRoot, resourceType) {
|
|
81
|
-
const manifest = readPiManifest(packageRoot);
|
|
89
|
+
async function collectManifestFiles(packageRoot, resourceType) {
|
|
90
|
+
const manifest = await readPiManifest(packageRoot);
|
|
82
91
|
const entries = manifestEntriesForResource(manifest, resourceType);
|
|
83
92
|
if (entries && entries.length > 0) {
|
|
84
|
-
const allFiles = collectFilesFromManifestEntries(entries, packageRoot, resourceType);
|
|
93
|
+
const allFiles = await collectFilesFromManifestEntries(entries, packageRoot, resourceType);
|
|
85
94
|
const manifestPatterns = entries.filter(isOverridePattern);
|
|
86
95
|
const enabledByManifest = manifestPatterns.length > 0 ? applyPatterns(allFiles, manifestPatterns, packageRoot) : new Set(allFiles);
|
|
87
96
|
return { allFiles: Array.from(enabledByManifest), enabledByManifest };
|
|
88
97
|
}
|
|
89
|
-
const allFiles =
|
|
98
|
+
const allFiles = [];
|
|
99
|
+
for (const dir of conventionDirsForResource(packageRoot, resourceType)) {
|
|
100
|
+
if (await exists(dir))
|
|
101
|
+
allFiles.push(...await collectResourceFiles(dir, resourceType));
|
|
102
|
+
}
|
|
90
103
|
return { allFiles, enabledByManifest: new Set(allFiles) };
|
|
91
104
|
}
|
|
92
|
-
function addManifestEntries(entries, root, resourceType, target, metadata) {
|
|
105
|
+
async function addManifestEntries(entries, root, resourceType, target, metadata) {
|
|
93
106
|
if (!entries)
|
|
94
107
|
return;
|
|
95
|
-
const allFiles = collectFilesFromManifestEntries(entries, root, resourceType);
|
|
108
|
+
const allFiles = await collectFilesFromManifestEntries(entries, root, resourceType);
|
|
96
109
|
const patterns = entries.filter(isOverridePattern);
|
|
97
110
|
const enabledPaths = applyPatterns(allFiles, patterns, root);
|
|
98
|
-
for (const f of allFiles)
|
|
99
|
-
if (enabledPaths.has(f))
|
|
111
|
+
for (const f of allFiles)
|
|
112
|
+
if (enabledPaths.has(f))
|
|
100
113
|
addResource(target, f, metadata, true);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
114
|
}
|
|
104
|
-
function collectFilesFromManifestEntries(entries, root, resourceType) {
|
|
105
|
-
const
|
|
106
|
-
const
|
|
107
|
-
if (!hasGlobPattern(entry))
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
absolute: true,
|
|
113
|
-
dot: false,
|
|
114
|
-
nodir: false,
|
|
115
|
-
}).map((match) => resolve(match));
|
|
116
|
-
});
|
|
115
|
+
async function collectFilesFromManifestEntries(entries, root, resourceType) {
|
|
116
|
+
const resolved = [];
|
|
117
|
+
for (const entry of entries.filter((entry) => !isOverridePattern(entry))) {
|
|
118
|
+
if (!hasGlobPattern(entry))
|
|
119
|
+
resolved.push(resolve(root, entry));
|
|
120
|
+
else
|
|
121
|
+
resolved.push(...(await glob(entry, { cwd: root, absolute: true, dot: false, nodir: false })).map((match) => resolve(match)));
|
|
122
|
+
}
|
|
117
123
|
return collectFilesFromPaths(resolved, resourceType);
|
|
118
124
|
}
|
|
119
|
-
export function resolveLocalEntries(entries, resourceType, target, metadata, baseDir) {
|
|
125
|
+
export async function resolveLocalEntries(entries, resourceType, target, metadata, baseDir) {
|
|
120
126
|
if (entries.length === 0)
|
|
121
127
|
return;
|
|
122
128
|
const { plain, patterns } = splitPatterns(entries);
|
|
123
129
|
const resolvedPlain = plain.map((p) => resolvePathFromBase(p, baseDir));
|
|
124
|
-
const allFiles = collectFilesFromPaths(resolvedPlain, resourceType);
|
|
130
|
+
const allFiles = await collectFilesFromPaths(resolvedPlain, resourceType);
|
|
125
131
|
const enabledPaths = applyPatterns(allFiles, patterns, baseDir);
|
|
126
|
-
for (const f of allFiles)
|
|
132
|
+
for (const f of allFiles)
|
|
127
133
|
addResource(target, f, metadata, enabledPaths.has(f));
|
|
128
|
-
}
|
|
129
134
|
}
|
|
130
|
-
export function collectFilesFromPaths(paths, resourceType) {
|
|
135
|
+
export async function collectFilesFromPaths(paths, resourceType) {
|
|
131
136
|
const files = [];
|
|
132
137
|
for (const p of paths) {
|
|
133
|
-
if (!
|
|
138
|
+
if (!(await exists(p)))
|
|
134
139
|
continue;
|
|
135
140
|
try {
|
|
136
|
-
const stats =
|
|
137
|
-
if (stats.isFile())
|
|
141
|
+
const stats = await stat(p);
|
|
142
|
+
if (stats.isFile())
|
|
138
143
|
files.push(p);
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
files.push(...collectResourceFiles(p, resourceType));
|
|
142
|
-
}
|
|
144
|
+
else if (stats.isDirectory())
|
|
145
|
+
files.push(...await collectResourceFiles(p, resourceType));
|
|
143
146
|
}
|
|
144
147
|
catch { }
|
|
145
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager-resource-collector.js","sourceRoot":"","sources":["../../src/core/package-manager-resource-collector.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, statSync } from \"node:fs\";\nimport { globSync } from \"glob\";\nimport { resolve } from \"node:path\";\nimport { addResource, getTargetMap } from \"./package-manager-resource-accumulator.ts\";\nimport { collectResourceFiles } from \"./package-manager-resource-files.ts\";\nimport { conventionDirsForResource, manifestEntriesForResource, readPiManifest } from \"./package-manager-manifest.ts\";\nimport {\n\tapplyPatterns,\n\thasGlobPattern,\n\tisOverridePattern,\n\tsplitPatterns,\n} from \"./package-manager-resource-patterns.ts\";\nimport { resolvePathFromBase } from \"./package-manager-paths.ts\";\nimport type {\n\tPackageFilter,\n\tPathMetadata,\n\tResourceAccumulator,\n\tResourceMap,\n\tResourceType,\n} from \"./package-manager-types.ts\";\n\nexport function collectPackageResources(\n\tpackageRoot: string,\n\taccumulator: ResourceAccumulator,\n\tfilter: PackageFilter | undefined,\n\tmetadata: PathMetadata,\n): boolean {\n\tif (filter) {\n\t\tfor (const resourceType of [\"extensions\", \"skills\", \"prompts\", \"themes\", \"workflows\"] as const) {\n\t\t\tconst patterns = filter[resourceType as keyof PackageFilter];\n\t\t\tconst target = getTargetMap(accumulator, resourceType);\n\t\t\tif (patterns !== undefined) {\n\t\t\t\tapplyPackageFilter(packageRoot, patterns, resourceType, target, metadata);\n\t\t\t} else {\n\t\t\t\tcollectDefaultResources(packageRoot, resourceType, target, metadata);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tconst manifest = readPiManifest(packageRoot);\n\tif (manifest) {\n\t\tfor (const resourceType of [\"extensions\", \"skills\", \"prompts\", \"themes\", \"workflows\"] as const) {\n\t\t\tconst entries = manifestEntriesForResource(manifest, resourceType);\n\t\t\tif (entries !== undefined) {\n\t\t\t\taddManifestEntries(entries, packageRoot, resourceType, getTargetMap(accumulator, resourceType), metadata);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (resourceType === \"workflows\") {\n\t\t\t\tcollectDefaultResources(packageRoot, resourceType, getTargetMap(accumulator, resourceType), metadata);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tlet hasAnyDir = false;\n\tfor (const resourceType of [\"extensions\", \"skills\", \"prompts\", \"themes\", \"workflows\"] as const) {\n\t\tfor (const dir of conventionDirsForResource(packageRoot, resourceType)) {\n\t\t\tif (existsSync(dir)) {\n\t\t\t\tconst files = collectResourceFiles(dir, resourceType);\n\t\t\t\tfor (const f of files) {\n\t\t\t\t\taddResource(getTargetMap(accumulator, resourceType), f, metadata, true);\n\t\t\t\t}\n\t\t\t\thasAnyDir = true;\n\t\t\t}\n\t\t}\n\t}\n\treturn hasAnyDir;\n}\n\nfunction collectDefaultResources(\n\tpackageRoot: string,\n\tresourceType: ResourceType,\n\ttarget: ResourceMap,\n\tmetadata: PathMetadata,\n): void {\n\tconst manifest = readPiManifest(packageRoot);\n\tconst entries = manifestEntriesForResource(manifest, resourceType);\n\tif (entries !== undefined) {\n\t\taddManifestEntries(entries, packageRoot, resourceType, target, metadata);\n\t\treturn;\n\t}\n\tfor (const dir of conventionDirsForResource(packageRoot, resourceType)) {\n\t\tif (existsSync(dir)) {\n\t\t\tconst files = collectResourceFiles(dir, resourceType);\n\t\t\tfor (const f of files) {\n\t\t\t\taddResource(target, f, metadata, true);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction applyPackageFilter(\n\tpackageRoot: string,\n\tuserPatterns: string[],\n\tresourceType: ResourceType,\n\ttarget: ResourceMap,\n\tmetadata: PathMetadata,\n): void {\n\tconst { allFiles } = collectManifestFiles(packageRoot, resourceType);\n\tif (userPatterns.length === 0) {\n\t\tfor (const f of allFiles) {\n\t\t\taddResource(target, f, metadata, false);\n\t\t}\n\t\treturn;\n\t}\n\n\tconst enabledByUser = applyPatterns(allFiles, userPatterns, packageRoot);\n\tfor (const f of allFiles) {\n\t\taddResource(target, f, metadata, enabledByUser.has(f));\n\t}\n}\n\nfunction collectManifestFiles(\n\tpackageRoot: string,\n\tresourceType: ResourceType,\n): { allFiles: string[]; enabledByManifest: Set<string> } {\n\tconst manifest = readPiManifest(packageRoot);\n\tconst entries = manifestEntriesForResource(manifest, resourceType);\n\tif (entries && entries.length > 0) {\n\t\tconst allFiles = collectFilesFromManifestEntries(entries, packageRoot, resourceType);\n\t\tconst manifestPatterns = entries.filter(isOverridePattern);\n\t\tconst enabledByManifest =\n\t\t\tmanifestPatterns.length > 0 ? applyPatterns(allFiles, manifestPatterns, packageRoot) : new Set(allFiles);\n\t\treturn { allFiles: Array.from(enabledByManifest), enabledByManifest };\n\t}\n\n\tconst allFiles = conventionDirsForResource(packageRoot, resourceType).flatMap((dir) =>\n\t\texistsSync(dir) ? collectResourceFiles(dir, resourceType) : [],\n\t);\n\treturn { allFiles, enabledByManifest: new Set(allFiles) };\n}\n\nfunction addManifestEntries(\n\tentries: string[] | undefined,\n\troot: string,\n\tresourceType: ResourceType,\n\ttarget: ResourceMap,\n\tmetadata: PathMetadata,\n): void {\n\tif (!entries) return;\n\n\tconst allFiles = collectFilesFromManifestEntries(entries, root, resourceType);\n\tconst patterns = entries.filter(isOverridePattern);\n\tconst enabledPaths = applyPatterns(allFiles, patterns, root);\n\n\tfor (const f of allFiles) {\n\t\tif (enabledPaths.has(f)) {\n\t\t\taddResource(target, f, metadata, true);\n\t\t}\n\t}\n}\n\nfunction collectFilesFromManifestEntries(entries: string[], root: string, resourceType: ResourceType): string[] {\n\tconst sourceEntries = entries.filter((entry) => !isOverridePattern(entry));\n\tconst resolved = sourceEntries.flatMap((entry) => {\n\t\tif (!hasGlobPattern(entry)) {\n\t\t\treturn [resolve(root, entry)];\n\t\t}\n\t\treturn globSync(entry, {\n\t\t\tcwd: root,\n\t\t\tabsolute: true,\n\t\t\tdot: false,\n\t\t\tnodir: false,\n\t\t}).map((match) => resolve(match));\n\t});\n\treturn collectFilesFromPaths(resolved, resourceType);\n}\n\nexport function resolveLocalEntries(\n\tentries: string[],\n\tresourceType: ResourceType,\n\ttarget: ResourceMap,\n\tmetadata: PathMetadata,\n\tbaseDir: string,\n): void {\n\tif (entries.length === 0) return;\n\n\tconst { plain, patterns } = splitPatterns(entries);\n\tconst resolvedPlain = plain.map((p) => resolvePathFromBase(p, baseDir));\n\tconst allFiles = collectFilesFromPaths(resolvedPlain, resourceType);\n\tconst enabledPaths = applyPatterns(allFiles, patterns, baseDir);\n\n\tfor (const f of allFiles) {\n\t\taddResource(target, f, metadata, enabledPaths.has(f));\n\t}\n}\n\nexport function collectFilesFromPaths(paths: string[], resourceType: ResourceType): string[] {\n\tconst files: string[] = [];\n\tfor (const p of paths) {\n\t\tif (!existsSync(p)) continue;\n\t\ttry {\n\t\t\tconst stats = statSync(p);\n\t\t\tif (stats.isFile()) {\n\t\t\t\tfiles.push(p);\n\t\t\t} else if (stats.isDirectory()) {\n\t\t\t\tfiles.push(...collectResourceFiles(p, resourceType));\n\t\t\t}\n\t\t} catch {}\n\t}\n\treturn files;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"package-manager-resource-collector.js","sourceRoot":"","sources":["../../src/core/package-manager-resource-collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAClI,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACzH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,KAAK,UAAU,MAAM,CAAC,IAAY;IACjC,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,WAAmB;IAChD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9E,OAAO,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,WAAmB,EACnB,WAAgC,EAChC,MAAiC,EACjC,QAAsB;IAEtB,IAAI,MAAM,EAAE,CAAC;QACZ,KAAK,MAAM,YAAY,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAU,EAAE,CAAC;YAChG,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAmC,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YACvD,IAAI,QAAQ,KAAK,SAAS;gBAAE,MAAM,kBAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;;gBACvG,MAAM,uBAAuB,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,QAAQ,EAAE,CAAC;QACd,KAAK,MAAM,YAAY,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAU,EAAE,CAAC;YAChG,MAAM,OAAO,GAAG,0BAA0B,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAChH,SAAS;YACV,CAAC;YACD,IAAI,YAAY,KAAK,WAAW;gBAAE,MAAM,uBAAuB,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC/I,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,MAAM,YAAY,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAU,EAAE,CAAC;QAChG,KAAK,MAAM,GAAG,IAAI,yBAAyB,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;YACxE,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;gBAAE,SAAS;YACnC,KAAK,MAAM,CAAC,IAAI,MAAM,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAC;gBAAE,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvI,SAAS,GAAG,IAAI,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,WAAmB,EAAE,YAA0B,EAAE,MAAmB,EAAE,QAAsB;IAClI,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,0BAA0B,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/E,OAAO;IACR,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,yBAAyB,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;YAAE,SAAS;QACnC,KAAK,MAAM,CAAC,IAAI,MAAM,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAC;YAAE,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvG,CAAC;AACF,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,WAAmB,EAAE,YAAsB,EAAE,YAA0B,EAAE,MAAmB,EAAE,QAAsB;IACrJ,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC3E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAClE,OAAO;IACR,CAAC;IACD,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,WAAmB,EAAE,YAA0B;IAClF,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,0BAA0B,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;QAC3F,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnI,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACvE,CAAC;IACD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,yBAAyB,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;QACxE,IAAI,MAAM,MAAM,CAAC,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAA6B,EAAE,IAAY,EAAE,YAA0B,EAAE,MAAmB,EAAE,QAAsB;IACrJ,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC3F,CAAC;AAED,KAAK,UAAU,+BAA+B,CAAC,OAAiB,EAAE,IAAY,EAAE,YAA0B;IACzG,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;;YAC3D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpI,CAAC;IACD,OAAO,qBAAqB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAiB,EAAE,YAA0B,EAAE,MAAmB,EAAE,QAAsB,EAAE,OAAe;IACpJ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAe,EAAE,YAA0B;IACtF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QACjC,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,KAAK,CAAC,MAAM,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAC7B,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,oBAAoB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;QAC1F,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["import { access, readFile, stat } from \"node:fs/promises\";\nimport { glob } from \"glob\";\nimport { resolve } from \"node:path\";\nimport { addResource, getTargetMap } from \"./package-manager-resource-accumulator.ts\";\nimport { collectResourceFiles } from \"./package-manager-resource-files.ts\";\nimport { conventionDirsForResource, getManifestFromPackageJson, manifestEntriesForResource } from \"./package-manager-manifest.ts\";\nimport { applyPatterns, hasGlobPattern, isOverridePattern, splitPatterns } from \"./package-manager-resource-patterns.ts\";\nimport { resolvePathFromBase } from \"./package-manager-paths.ts\";\nimport type { PackageFilter, PathMetadata, ResourceAccumulator, ResourceMap, ResourceType } from \"./package-manager-types.ts\";\n\nasync function exists(path: string): Promise<boolean> {\n\ttry { await access(path); return true; } catch { return false; }\n}\n\nasync function readPiManifest(packageRoot: string): Promise<ReturnType<typeof getManifestFromPackageJson> | null> {\n\ttry {\n\t\tconst content = await readFile(resolve(packageRoot, \"package.json\"), \"utf-8\");\n\t\treturn getManifestFromPackageJson(JSON.parse(content) as Record<string, unknown>);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function collectPackageResources(\n\tpackageRoot: string,\n\taccumulator: ResourceAccumulator,\n\tfilter: PackageFilter | undefined,\n\tmetadata: PathMetadata,\n): Promise<boolean> {\n\tif (filter) {\n\t\tfor (const resourceType of [\"extensions\", \"skills\", \"prompts\", \"themes\", \"workflows\"] as const) {\n\t\t\tconst patterns = filter[resourceType as keyof PackageFilter];\n\t\t\tconst target = getTargetMap(accumulator, resourceType);\n\t\t\tif (patterns !== undefined) await applyPackageFilter(packageRoot, patterns, resourceType, target, metadata);\n\t\t\telse await collectDefaultResources(packageRoot, resourceType, target, metadata);\n\t\t}\n\t\treturn true;\n\t}\n\tconst manifest = await readPiManifest(packageRoot);\n\tif (manifest) {\n\t\tfor (const resourceType of [\"extensions\", \"skills\", \"prompts\", \"themes\", \"workflows\"] as const) {\n\t\t\tconst entries = manifestEntriesForResource(manifest, resourceType);\n\t\t\tif (entries !== undefined) {\n\t\t\t\tawait addManifestEntries(entries, packageRoot, resourceType, getTargetMap(accumulator, resourceType), metadata);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (resourceType === \"workflows\") await collectDefaultResources(packageRoot, resourceType, getTargetMap(accumulator, resourceType), metadata);\n\t\t}\n\t\treturn true;\n\t}\n\tlet hasAnyDir = false;\n\tfor (const resourceType of [\"extensions\", \"skills\", \"prompts\", \"themes\", \"workflows\"] as const) {\n\t\tfor (const dir of conventionDirsForResource(packageRoot, resourceType)) {\n\t\t\tif (!(await exists(dir))) continue;\n\t\t\tfor (const f of await collectResourceFiles(dir, resourceType)) addResource(getTargetMap(accumulator, resourceType), f, metadata, true);\n\t\t\thasAnyDir = true;\n\t\t}\n\t}\n\treturn hasAnyDir;\n}\n\nasync function collectDefaultResources(packageRoot: string, resourceType: ResourceType, target: ResourceMap, metadata: PathMetadata): Promise<void> {\n\tconst manifest = await readPiManifest(packageRoot);\n\tconst entries = manifestEntriesForResource(manifest, resourceType);\n\tif (entries !== undefined) {\n\t\tawait addManifestEntries(entries, packageRoot, resourceType, target, metadata);\n\t\treturn;\n\t}\n\tfor (const dir of conventionDirsForResource(packageRoot, resourceType)) {\n\t\tif (!(await exists(dir))) continue;\n\t\tfor (const f of await collectResourceFiles(dir, resourceType)) addResource(target, f, metadata, true);\n\t}\n}\n\nasync function applyPackageFilter(packageRoot: string, userPatterns: string[], resourceType: ResourceType, target: ResourceMap, metadata: PathMetadata): Promise<void> {\n\tconst { allFiles } = await collectManifestFiles(packageRoot, resourceType);\n\tif (userPatterns.length === 0) {\n\t\tfor (const f of allFiles) addResource(target, f, metadata, false);\n\t\treturn;\n\t}\n\tconst enabledByUser = applyPatterns(allFiles, userPatterns, packageRoot);\n\tfor (const f of allFiles) addResource(target, f, metadata, enabledByUser.has(f));\n}\n\nasync function collectManifestFiles(packageRoot: string, resourceType: ResourceType): Promise<{ allFiles: string[]; enabledByManifest: Set<string> }> {\n\tconst manifest = await readPiManifest(packageRoot);\n\tconst entries = manifestEntriesForResource(manifest, resourceType);\n\tif (entries && entries.length > 0) {\n\t\tconst allFiles = await collectFilesFromManifestEntries(entries, packageRoot, resourceType);\n\t\tconst manifestPatterns = entries.filter(isOverridePattern);\n\t\tconst enabledByManifest = manifestPatterns.length > 0 ? applyPatterns(allFiles, manifestPatterns, packageRoot) : new Set(allFiles);\n\t\treturn { allFiles: Array.from(enabledByManifest), enabledByManifest };\n\t}\n\tconst allFiles: string[] = [];\n\tfor (const dir of conventionDirsForResource(packageRoot, resourceType)) {\n\t\tif (await exists(dir)) allFiles.push(...await collectResourceFiles(dir, resourceType));\n\t}\n\treturn { allFiles, enabledByManifest: new Set(allFiles) };\n}\n\nasync function addManifestEntries(entries: string[] | undefined, root: string, resourceType: ResourceType, target: ResourceMap, metadata: PathMetadata): Promise<void> {\n\tif (!entries) return;\n\tconst allFiles = await collectFilesFromManifestEntries(entries, root, resourceType);\n\tconst patterns = entries.filter(isOverridePattern);\n\tconst enabledPaths = applyPatterns(allFiles, patterns, root);\n\tfor (const f of allFiles) if (enabledPaths.has(f)) addResource(target, f, metadata, true);\n}\n\nasync function collectFilesFromManifestEntries(entries: string[], root: string, resourceType: ResourceType): Promise<string[]> {\n\tconst resolved: string[] = [];\n\tfor (const entry of entries.filter((entry) => !isOverridePattern(entry))) {\n\t\tif (!hasGlobPattern(entry)) resolved.push(resolve(root, entry));\n\t\telse resolved.push(...(await glob(entry, { cwd: root, absolute: true, dot: false, nodir: false })).map((match) => resolve(match)));\n\t}\n\treturn collectFilesFromPaths(resolved, resourceType);\n}\n\nexport async function resolveLocalEntries(entries: string[], resourceType: ResourceType, target: ResourceMap, metadata: PathMetadata, baseDir: string): Promise<void> {\n\tif (entries.length === 0) return;\n\tconst { plain, patterns } = splitPatterns(entries);\n\tconst resolvedPlain = plain.map((p) => resolvePathFromBase(p, baseDir));\n\tconst allFiles = await collectFilesFromPaths(resolvedPlain, resourceType);\n\tconst enabledPaths = applyPatterns(allFiles, patterns, baseDir);\n\tfor (const f of allFiles) addResource(target, f, metadata, enabledPaths.has(f));\n}\n\nexport async function collectFilesFromPaths(paths: string[], resourceType: ResourceType): Promise<string[]> {\n\tconst files: string[] = [];\n\tfor (const p of paths) {\n\t\tif (!(await exists(p))) continue;\n\t\ttry {\n\t\t\tconst stats = await stat(p);\n\t\t\tif (stats.isFile()) files.push(p);\n\t\t\telse if (stats.isDirectory()) files.push(...await collectResourceFiles(p, resourceType));\n\t\t} catch {}\n\t}\n\treturn files;\n}\n"]}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import ignore from "ignore";
|
|
2
2
|
import { type ResourceType } from "./package-manager-types.ts";
|
|
3
3
|
type IgnoreMatcher = ReturnType<typeof ignore>;
|
|
4
|
-
export declare function collectFiles(dir: string, filePattern: RegExp, skipNodeModules?: boolean, ignoreMatcher?: IgnoreMatcher, rootDir?: string): string[];
|
|
5
4
|
type SkillDiscoveryMode = "pi" | "agents";
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function
|
|
8
|
-
export declare function
|
|
9
|
-
export declare function
|
|
10
|
-
export declare function
|
|
11
|
-
export declare function
|
|
12
|
-
export declare function
|
|
5
|
+
export declare function collectFiles(dir: string, filePattern: RegExp, skipNodeModules?: boolean, ignoreMatcher?: IgnoreMatcher, rootDir?: string): Promise<string[]>;
|
|
6
|
+
export declare function collectAutoSkillEntries(dir: string, mode: SkillDiscoveryMode): Promise<string[]>;
|
|
7
|
+
export declare function collectAncestorAgentsSkillDirs(startDir: string): Promise<string[]>;
|
|
8
|
+
export declare function collectAutoPromptEntries(dir: string): Promise<string[]>;
|
|
9
|
+
export declare function collectAutoThemeEntries(dir: string): Promise<string[]>;
|
|
10
|
+
export declare function resolveExtensionEntries(dir: string): Promise<string[] | null>;
|
|
11
|
+
export declare function collectAutoExtensionEntries(dir: string): Promise<string[]>;
|
|
12
|
+
export declare function collectResourceFiles(dir: string, resourceType: ResourceType): Promise<string[]>;
|
|
13
|
+
export declare function isPathUnder(target: string, root: string): boolean;
|
|
13
14
|
export {};
|
|
14
15
|
//# sourceMappingURL=package-manager-resource-files.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager-resource-files.d.ts","sourceRoot":"","sources":["../../src/core/package-manager-resource-files.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG9E,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AAiE/C,wBAAgB,YAAY,CAC3B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,eAAe,UAAO,EACtB,aAAa,CAAC,EAAE,aAAa,EAC7B,OAAO,CAAC,EAAE,MAAM,GACd,MAAM,EAAE,CA8BV;AAED,KAAK,kBAAkB,GAAG,IAAI,GAAG,QAAQ,CAAC;AA+C1C,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAEvF;AAYD,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAczE;AAsBD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAE7D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAmBpE;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA6BjE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,EAAE,CAQtF","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport ignore from \"ignore\";\nimport { readPiManifestFile } from \"./package-manager-manifest.ts\";\nimport { toPosixPath } from \"./package-manager-resource-patterns.ts\";\nimport { FILE_PATTERNS, type ResourceType } from \"./package-manager-types.ts\";\n\nconst IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"];\ntype IgnoreMatcher = ReturnType<typeof ignore>;\n\ntype DirEntryInfo = {\n\tfullPath: string;\n\tisDir: boolean;\n\tisFile: boolean;\n};\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n\tconst trimmed = line.trim();\n\tif (!trimmed) return null;\n\tif (trimmed.startsWith(\"#\") && !trimmed.startsWith(\"\\\\#\")) return null;\n\n\tlet pattern = line;\n\tlet negated = false;\n\tif (pattern.startsWith(\"!\")) {\n\t\tnegated = true;\n\t\tpattern = pattern.slice(1);\n\t} else if (pattern.startsWith(\"\\\\!\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\tif (pattern.startsWith(\"/\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\n\tconst prefixed = prefix ? `${prefix}${pattern}` : pattern;\n\treturn negated ? `!${prefixed}` : prefixed;\n}\n\nfunction addIgnoreRules(ig: IgnoreMatcher, dir: string, rootDir: string): void {\n\tconst relativeDir = relative(rootDir, dir);\n\tconst prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : \"\";\n\n\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\tconst ignorePath = join(dir, filename);\n\t\tif (!existsSync(ignorePath)) continue;\n\t\ttry {\n\t\t\tconst content = readFileSync(ignorePath, \"utf-8\");\n\t\t\tconst patterns = content\n\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t\t.filter((line): line is string => Boolean(line));\n\t\t\tif (patterns.length > 0) {\n\t\t\t\tig.add(patterns);\n\t\t\t}\n\t\t} catch {}\n\t}\n}\n\nfunction getEntryInfo(dir: string, name: string, isDirectory: boolean, isFileEntry: boolean, isSymlink: boolean): DirEntryInfo | null {\n\tconst fullPath = join(dir, name);\n\tlet isDir = isDirectory;\n\tlet isFile = isFileEntry;\n\tif (isSymlink) {\n\t\ttry {\n\t\t\tconst stats = statSync(fullPath);\n\t\t\tisDir = stats.isDirectory();\n\t\t\tisFile = stats.isFile();\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\treturn { fullPath, isDir, isFile };\n}\n\nexport function collectFiles(\n\tdir: string,\n\tfilePattern: RegExp,\n\tskipNodeModules = true,\n\tignoreMatcher?: IgnoreMatcher,\n\trootDir?: string,\n): string[] {\n\tconst files: string[] = [];\n\tif (!existsSync(dir)) return files;\n\n\tconst root = rootDir ?? dir;\n\tconst ig = ignoreMatcher ?? ignore();\n\taddIgnoreRules(ig, dir, root);\n\n\ttry {\n\t\tconst entries = readdirSync(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.name.startsWith(\".\")) continue;\n\t\t\tif (skipNodeModules && entry.name === \"node_modules\") continue;\n\n\t\t\tconst info = getEntryInfo(dir, entry.name, entry.isDirectory(), entry.isFile(), entry.isSymbolicLink());\n\t\t\tif (!info) continue;\n\n\t\t\tconst relPath = toPosixPath(relative(root, info.fullPath));\n\t\t\tconst ignorePath = info.isDir ? `${relPath}/` : relPath;\n\t\t\tif (ig.ignores(ignorePath)) continue;\n\n\t\t\tif (info.isDir) {\n\t\t\t\tfiles.push(...collectFiles(info.fullPath, filePattern, skipNodeModules, ig, root));\n\t\t\t} else if (info.isFile && filePattern.test(entry.name)) {\n\t\t\t\tfiles.push(info.fullPath);\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\treturn files;\n}\n\ntype SkillDiscoveryMode = \"pi\" | \"agents\";\n\nfunction collectSkillEntries(\n\tdir: string,\n\tmode: SkillDiscoveryMode,\n\tignoreMatcher?: IgnoreMatcher,\n\trootDir?: string,\n): string[] {\n\tconst entries: string[] = [];\n\tif (!existsSync(dir)) return entries;\n\n\tconst root = rootDir ?? dir;\n\tconst ig = ignoreMatcher ?? ignore();\n\taddIgnoreRules(ig, dir, root);\n\n\ttry {\n\t\tconst dirEntries = readdirSync(dir, { withFileTypes: true });\n\t\tfor (const entry of dirEntries) {\n\t\t\tif (entry.name !== \"SKILL.md\") continue;\n\t\t\tconst info = getEntryInfo(dir, entry.name, entry.isDirectory(), entry.isFile(), entry.isSymbolicLink());\n\t\t\tif (!info) continue;\n\t\t\tconst relPath = toPosixPath(relative(root, info.fullPath));\n\t\t\tif (info.isFile && !ig.ignores(relPath)) {\n\t\t\t\tentries.push(info.fullPath);\n\t\t\t\treturn entries;\n\t\t\t}\n\t\t}\n\n\t\tfor (const entry of dirEntries) {\n\t\t\tif (entry.name.startsWith(\".\")) continue;\n\t\t\tif (entry.name === \"node_modules\") continue;\n\t\t\tconst info = getEntryInfo(dir, entry.name, entry.isDirectory(), entry.isFile(), entry.isSymbolicLink());\n\t\t\tif (!info) continue;\n\n\t\t\tconst relPath = toPosixPath(relative(root, info.fullPath));\n\t\t\tif (mode === \"pi\" && dir === root && info.isFile && entry.name.endsWith(\".md\") && !ig.ignores(relPath)) {\n\t\t\t\tentries.push(info.fullPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!info.isDir || ig.ignores(`${relPath}/`)) continue;\n\t\t\tentries.push(...collectSkillEntries(info.fullPath, mode, ig, root));\n\t\t}\n\t} catch {}\n\n\treturn entries;\n}\n\nexport function collectAutoSkillEntries(dir: string, mode: SkillDiscoveryMode): string[] {\n\treturn collectSkillEntries(dir, mode);\n}\n\nfunction findGitRepoRoot(startDir: string): string | null {\n\tlet dir = resolve(startDir);\n\twhile (true) {\n\t\tif (existsSync(join(dir, \".git\"))) return dir;\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) return null;\n\t\tdir = parent;\n\t}\n}\n\nexport function collectAncestorAgentsSkillDirs(startDir: string): string[] {\n\tconst skillDirs: string[] = [];\n\tconst resolvedStartDir = resolve(startDir);\n\tconst gitRepoRoot = findGitRepoRoot(resolvedStartDir);\n\n\tlet dir = resolvedStartDir;\n\twhile (true) {\n\t\tskillDirs.push(join(dir, \".agents\", \"skills\"));\n\t\tif (gitRepoRoot && dir === gitRepoRoot) break;\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) break;\n\t\tdir = parent;\n\t}\n\treturn skillDirs;\n}\n\nfunction collectFlatEntries(dir: string, extension: string): string[] {\n\tconst entries: string[] = [];\n\tif (!existsSync(dir)) return entries;\n\n\tconst ig = ignore();\n\taddIgnoreRules(ig, dir, dir);\n\ttry {\n\t\tconst dirEntries = readdirSync(dir, { withFileTypes: true });\n\t\tfor (const entry of dirEntries) {\n\t\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\t\t\tconst info = getEntryInfo(dir, entry.name, entry.isDirectory(), entry.isFile(), entry.isSymbolicLink());\n\t\t\tif (!info) continue;\n\t\t\tconst relPath = toPosixPath(relative(dir, info.fullPath));\n\t\t\tif (ig.ignores(relPath)) continue;\n\t\t\tif (info.isFile && entry.name.endsWith(extension)) entries.push(info.fullPath);\n\t\t}\n\t} catch {}\n\treturn entries;\n}\n\nexport function collectAutoPromptEntries(dir: string): string[] {\n\treturn collectFlatEntries(dir, \".md\");\n}\n\nexport function collectAutoThemeEntries(dir: string): string[] {\n\treturn collectFlatEntries(dir, \".json\");\n}\n\nexport function resolveExtensionEntries(dir: string): string[] | null {\n\tconst packageJsonPath = join(dir, \"package.json\");\n\tif (existsSync(packageJsonPath)) {\n\t\tconst manifest = readPiManifestFile(packageJsonPath);\n\t\tif (manifest?.extensions?.length) {\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const extPath of manifest.extensions) {\n\t\t\t\tconst resolvedExtPath = resolve(dir, extPath);\n\t\t\t\tif (existsSync(resolvedExtPath)) entries.push(resolvedExtPath);\n\t\t\t}\n\t\t\tif (entries.length > 0) return entries;\n\t\t}\n\t}\n\n\tconst indexTs = join(dir, \"index.ts\");\n\tconst indexJs = join(dir, \"index.js\");\n\tif (existsSync(indexTs)) return [indexTs];\n\tif (existsSync(indexJs)) return [indexJs];\n\treturn null;\n}\n\nexport function collectAutoExtensionEntries(dir: string): string[] {\n\tconst entries: string[] = [];\n\tif (!existsSync(dir)) return entries;\n\n\tconst rootEntries = resolveExtensionEntries(dir);\n\tif (rootEntries) return rootEntries;\n\n\tconst ig = ignore();\n\taddIgnoreRules(ig, dir, dir);\n\ttry {\n\t\tconst dirEntries = readdirSync(dir, { withFileTypes: true });\n\t\tfor (const entry of dirEntries) {\n\t\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\t\t\tconst info = getEntryInfo(dir, entry.name, entry.isDirectory(), entry.isFile(), entry.isSymbolicLink());\n\t\t\tif (!info) continue;\n\n\t\t\tconst relPath = toPosixPath(relative(dir, info.fullPath));\n\t\t\tconst ignorePath = info.isDir ? `${relPath}/` : relPath;\n\t\t\tif (ig.ignores(ignorePath)) continue;\n\n\t\t\tif (info.isFile && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".js\"))) {\n\t\t\t\tentries.push(info.fullPath);\n\t\t\t} else if (info.isDir) {\n\t\t\t\tconst resolvedEntries = resolveExtensionEntries(info.fullPath);\n\t\t\t\tif (resolvedEntries) entries.push(...resolvedEntries);\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn entries;\n}\n\nexport function collectResourceFiles(dir: string, resourceType: ResourceType): string[] {\n\tif (resourceType === \"skills\") {\n\t\treturn collectSkillEntries(dir, \"pi\");\n\t}\n\tif (resourceType === \"extensions\") {\n\t\treturn collectAutoExtensionEntries(dir);\n\t}\n\treturn collectFiles(dir, FILE_PATTERNS[resourceType]);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"package-manager-resource-files.d.ts","sourceRoot":"","sources":["../../src/core/package-manager-resource-files.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAI5B,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI9E,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AAC/C,KAAK,kBAAkB,GAAG,IAAI,GAAG,QAAQ,CAAC;AAqD1C,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,UAAO,EAAE,aAAa,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsB/J;AAmCD,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEtG;AAYD,wBAAsB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAaxF;AAuBD,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE7E;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE5E;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAqBnF;AAED,wBAAsB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0BhF;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIrG;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAIjE","sourcesContent":["import { access, readdir, readFile, stat } from \"node:fs/promises\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport ignore from \"ignore\";\nimport { yieldToEventLoopIfSlow } from \"../utils/event-loop.ts\";\nimport { getManifestFromPackageJson } from \"./package-manager-manifest.ts\";\nimport { toPosixPath } from \"./package-manager-resource-patterns.ts\";\nimport { FILE_PATTERNS, type ResourceType } from \"./package-manager-types.ts\";\n\nconst IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"];\nconst RESOURCE_DISCOVERY_YIELD_AFTER_MS = 8;\ntype IgnoreMatcher = ReturnType<typeof ignore>;\ntype SkillDiscoveryMode = \"pi\" | \"agents\";\n\ntype DirEntryInfo = {\n\tfullPath: string;\n\tisDir: boolean;\n\tisFile: boolean;\n};\n\nasync function exists(path: string): Promise<boolean> {\n\ttry { await access(path); return true; } catch { return false; }\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n\tconst trimmed = line.trim();\n\tif (!trimmed || (trimmed.startsWith(\"#\") && !trimmed.startsWith(\"\\\\#\"))) return null;\n\tlet pattern = line;\n\tlet negated = false;\n\tif (pattern.startsWith(\"!\")) { negated = true; pattern = pattern.slice(1); }\n\telse if (pattern.startsWith(\"\\\\!\")) pattern = pattern.slice(1);\n\tif (pattern.startsWith(\"/\")) pattern = pattern.slice(1);\n\tconst prefixed = prefix ? `${prefix}${pattern}` : pattern;\n\treturn negated ? `!${prefixed}` : prefixed;\n}\n\nasync function addIgnoreRules(ig: IgnoreMatcher, dir: string, rootDir: string): Promise<void> {\n\tconst relativeDir = relative(rootDir, dir);\n\tconst prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : \"\";\n\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\ttry {\n\t\t\tconst content = await readFile(join(dir, filename), \"utf-8\");\n\t\t\tconst patterns = content\n\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t\t.filter((line): line is string => Boolean(line));\n\t\t\tif (patterns.length > 0) ig.add(patterns);\n\t\t} catch {}\n\t}\n}\n\nasync function getEntryInfo(dir: string, name: string, isDirectory: boolean, isFileEntry: boolean, isSymlink: boolean): Promise<DirEntryInfo | null> {\n\tconst fullPath = join(dir, name);\n\tlet isDir = isDirectory;\n\tlet isFile = isFileEntry;\n\tif (isSymlink) {\n\t\ttry {\n\t\t\tconst stats = await stat(fullPath);\n\t\t\tisDir = stats.isDirectory();\n\t\t\tisFile = stats.isFile();\n\t\t} catch { return null; }\n\t}\n\treturn { fullPath, isDir, isFile };\n}\n\nexport async function collectFiles(dir: string, filePattern: RegExp, skipNodeModules = true, ignoreMatcher?: IgnoreMatcher, rootDir?: string): Promise<string[]> {\n\tconst files: string[] = [];\n\tif (!(await exists(dir))) return files;\n\tconst root = rootDir ?? dir;\n\tconst ig = ignoreMatcher ?? ignore();\n\tawait addIgnoreRules(ig, dir, root);\n\tconst startedAt = Date.now();\n\ttry {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tawait yieldToEventLoopIfSlow(startedAt, RESOURCE_DISCOVERY_YIELD_AFTER_MS);\n\t\t\tif (entry.name.startsWith(\".\") || (skipNodeModules && entry.name === \"node_modules\")) continue;\n\t\t\tconst info = await getEntryInfo(dir, entry.name, entry.isDirectory(), entry.isFile(), entry.isSymbolicLink());\n\t\t\tif (!info) continue;\n\t\t\tconst relPath = toPosixPath(relative(root, info.fullPath));\n\t\t\tconst ignorePath = info.isDir ? `${relPath}/` : relPath;\n\t\t\tif (ig.ignores(ignorePath)) continue;\n\t\t\tif (info.isDir) files.push(...await collectFiles(info.fullPath, filePattern, skipNodeModules, ig, root));\n\t\t\telse if (info.isFile && filePattern.test(entry.name)) files.push(info.fullPath);\n\t\t}\n\t} catch {}\n\treturn files;\n}\n\nasync function collectSkillEntries(dir: string, mode: SkillDiscoveryMode, ignoreMatcher?: IgnoreMatcher, rootDir?: string): Promise<string[]> {\n\tconst entries: string[] = [];\n\tif (!(await exists(dir))) return entries;\n\tconst root = rootDir ?? dir;\n\tconst ig = ignoreMatcher ?? ignore();\n\tawait addIgnoreRules(ig, dir, root);\n\tconst startedAt = Date.now();\n\ttry {\n\t\tconst dirEntries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of dirEntries) {\n\t\t\tif (entry.name !== \"SKILL.md\") continue;\n\t\t\tconst info = await getEntryInfo(dir, entry.name, entry.isDirectory(), entry.isFile(), entry.isSymbolicLink());\n\t\t\tif (!info) continue;\n\t\t\tconst relPath = toPosixPath(relative(root, info.fullPath));\n\t\t\tif (info.isFile && !ig.ignores(relPath)) { entries.push(info.fullPath); return entries; }\n\t\t}\n\t\tfor (const entry of dirEntries) {\n\t\t\tawait yieldToEventLoopIfSlow(startedAt, RESOURCE_DISCOVERY_YIELD_AFTER_MS);\n\t\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\t\t\tconst info = await getEntryInfo(dir, entry.name, entry.isDirectory(), entry.isFile(), entry.isSymbolicLink());\n\t\t\tif (!info) continue;\n\t\t\tconst relPath = toPosixPath(relative(root, info.fullPath));\n\t\t\tif (mode === \"pi\" && dir === root && info.isFile && entry.name.endsWith(\".md\") && !ig.ignores(relPath)) {\n\t\t\t\tentries.push(info.fullPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!info.isDir || ig.ignores(`${relPath}/`)) continue;\n\t\t\tentries.push(...await collectSkillEntries(info.fullPath, mode, ig, root));\n\t\t}\n\t} catch {}\n\treturn entries;\n}\n\nexport async function collectAutoSkillEntries(dir: string, mode: SkillDiscoveryMode): Promise<string[]> {\n\treturn collectSkillEntries(dir, mode);\n}\n\nasync function findGitRepoRoot(startDir: string): Promise<string | null> {\n\tlet dir = resolve(startDir);\n\twhile (true) {\n\t\tif (await exists(join(dir, \".git\"))) return dir;\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) return null;\n\t\tdir = parent;\n\t}\n}\n\nexport async function collectAncestorAgentsSkillDirs(startDir: string): Promise<string[]> {\n\tconst skillDirs: string[] = [];\n\tconst resolvedStartDir = resolve(startDir);\n\tconst gitRepoRoot = await findGitRepoRoot(resolvedStartDir);\n\tlet dir = resolvedStartDir;\n\twhile (true) {\n\t\tskillDirs.push(join(dir, \".agents\", \"skills\"));\n\t\tif (gitRepoRoot && dir === gitRepoRoot) break;\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) break;\n\t\tdir = parent;\n\t}\n\treturn skillDirs;\n}\n\nasync function collectFlatEntries(dir: string, extension: string): Promise<string[]> {\n\tconst entries: string[] = [];\n\tif (!(await exists(dir))) return entries;\n\tconst ig = ignore();\n\tawait addIgnoreRules(ig, dir, dir);\n\tconst startedAt = Date.now();\n\ttry {\n\t\tconst dirEntries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of dirEntries) {\n\t\t\tawait yieldToEventLoopIfSlow(startedAt, RESOURCE_DISCOVERY_YIELD_AFTER_MS);\n\t\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\t\t\tconst info = await getEntryInfo(dir, entry.name, entry.isDirectory(), entry.isFile(), entry.isSymbolicLink());\n\t\t\tif (!info) continue;\n\t\t\tconst relPath = toPosixPath(relative(dir, info.fullPath));\n\t\t\tif (ig.ignores(relPath)) continue;\n\t\t\tif (info.isFile && entry.name.endsWith(extension)) entries.push(info.fullPath);\n\t\t}\n\t} catch {}\n\treturn entries;\n}\n\nexport async function collectAutoPromptEntries(dir: string): Promise<string[]> {\n\treturn collectFlatEntries(dir, \".md\");\n}\n\nexport async function collectAutoThemeEntries(dir: string): Promise<string[]> {\n\treturn collectFlatEntries(dir, \".json\");\n}\n\nexport async function resolveExtensionEntries(dir: string): Promise<string[] | null> {\n\tconst packageJsonPath = join(dir, \"package.json\");\n\tif (await exists(packageJsonPath)) {\n\t\ttry {\n\t\t\tconst pkg = JSON.parse(await readFile(packageJsonPath, \"utf-8\")) as Record<string, unknown>;\n\t\t\tconst manifest = getManifestFromPackageJson(pkg);\n\t\t\tif (manifest?.extensions?.length) {\n\t\t\t\tconst entries: string[] = [];\n\t\t\t\tfor (const extPath of manifest.extensions) {\n\t\t\t\t\tconst resolvedExtPath = resolve(dir, extPath);\n\t\t\t\t\tif (await exists(resolvedExtPath)) entries.push(resolvedExtPath);\n\t\t\t\t}\n\t\t\t\tif (entries.length > 0) return entries;\n\t\t\t}\n\t\t} catch {}\n\t}\n\tconst indexTs = join(dir, \"index.ts\");\n\tconst indexJs = join(dir, \"index.js\");\n\tif (await exists(indexTs)) return [indexTs];\n\tif (await exists(indexJs)) return [indexJs];\n\treturn null;\n}\n\nexport async function collectAutoExtensionEntries(dir: string): Promise<string[]> {\n\tconst entries: string[] = [];\n\tif (!(await exists(dir))) return entries;\n\tconst rootEntries = await resolveExtensionEntries(dir);\n\tif (rootEntries) return rootEntries;\n\tconst ig = ignore();\n\tawait addIgnoreRules(ig, dir, dir);\n\tconst startedAt = Date.now();\n\ttry {\n\t\tconst dirEntries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of dirEntries) {\n\t\t\tawait yieldToEventLoopIfSlow(startedAt, RESOURCE_DISCOVERY_YIELD_AFTER_MS);\n\t\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\t\t\tconst info = await getEntryInfo(dir, entry.name, entry.isDirectory(), entry.isFile(), entry.isSymbolicLink());\n\t\t\tif (!info) continue;\n\t\t\tconst relPath = toPosixPath(relative(dir, info.fullPath));\n\t\t\tconst ignorePath = info.isDir ? `${relPath}/` : relPath;\n\t\t\tif (ig.ignores(ignorePath)) continue;\n\t\t\tif (info.isFile && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".js\"))) entries.push(info.fullPath);\n\t\t\telse if (info.isDir) {\n\t\t\t\tconst resolvedEntries = await resolveExtensionEntries(info.fullPath);\n\t\t\t\tif (resolvedEntries) entries.push(...resolvedEntries);\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn entries;\n}\n\nexport async function collectResourceFiles(dir: string, resourceType: ResourceType): Promise<string[]> {\n\tif (resourceType === \"skills\") return collectSkillEntries(dir, \"pi\");\n\tif (resourceType === \"extensions\") return collectAutoExtensionEntries(dir);\n\treturn collectFiles(dir, FILE_PATTERNS[resourceType]);\n}\n\nexport function isPathUnder(target: string, root: string): boolean {\n\tconst resolvedRoot = resolve(root);\n\tconst resolvedTarget = resolve(target);\n\treturn resolvedTarget === resolvedRoot || resolvedTarget.startsWith(resolvedRoot.endsWith(sep) ? resolvedRoot : `${resolvedRoot}${sep}`);\n}\n"]}
|