@solaqua/skul 0.1.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.
Files changed (58) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +282 -0
  3. package/bin/skul.js +13 -0
  4. package/dist/bundle-discovery.d.ts +30 -0
  5. package/dist/bundle-discovery.js +284 -0
  6. package/dist/bundle-discovery.js.map +1 -0
  7. package/dist/bundle-fetch.d.ts +67 -0
  8. package/dist/bundle-fetch.js +378 -0
  9. package/dist/bundle-fetch.js.map +1 -0
  10. package/dist/bundle-items.d.ts +34 -0
  11. package/dist/bundle-items.js +149 -0
  12. package/dist/bundle-items.js.map +1 -0
  13. package/dist/bundle-manifest.d.ts +26 -0
  14. package/dist/bundle-manifest.js +196 -0
  15. package/dist/bundle-manifest.js.map +1 -0
  16. package/dist/bundle-materialization.d.ts +52 -0
  17. package/dist/bundle-materialization.js +587 -0
  18. package/dist/bundle-materialization.js.map +1 -0
  19. package/dist/bundle-translation.d.ts +38 -0
  20. package/dist/bundle-translation.js +502 -0
  21. package/dist/bundle-translation.js.map +1 -0
  22. package/dist/cli.d.ts +126 -0
  23. package/dist/cli.js +648 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/fs-utils.d.ts +7 -0
  26. package/dist/fs-utils.js +27 -0
  27. package/dist/fs-utils.js.map +1 -0
  28. package/dist/git-context.d.ts +14 -0
  29. package/dist/git-context.js +53 -0
  30. package/dist/git-context.js.map +1 -0
  31. package/dist/git-exclude.d.ts +13 -0
  32. package/dist/git-exclude.js +76 -0
  33. package/dist/git-exclude.js.map +1 -0
  34. package/dist/git-index.d.ts +106 -0
  35. package/dist/git-index.js +224 -0
  36. package/dist/git-index.js.map +1 -0
  37. package/dist/index.d.ts +21 -0
  38. package/dist/index.js +4190 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/registry.d.ts +91 -0
  41. package/dist/registry.js +551 -0
  42. package/dist/registry.js.map +1 -0
  43. package/dist/root-instruction-content.d.ts +11 -0
  44. package/dist/root-instruction-content.js +61 -0
  45. package/dist/root-instruction-content.js.map +1 -0
  46. package/dist/root-instruction-render.d.ts +31 -0
  47. package/dist/root-instruction-render.js +121 -0
  48. package/dist/root-instruction-render.js.map +1 -0
  49. package/dist/root-instruction-state.d.ts +41 -0
  50. package/dist/root-instruction-state.js +273 -0
  51. package/dist/root-instruction-state.js.map +1 -0
  52. package/dist/state-layout.d.ts +11 -0
  53. package/dist/state-layout.js +26 -0
  54. package/dist/state-layout.js.map +1 -0
  55. package/dist/tool-mapping.d.ts +35 -0
  56. package/dist/tool-mapping.js +227 -0
  57. package/dist/tool-mapping.js.map +1 -0
  58. package/package.json +72 -0
@@ -0,0 +1,26 @@
1
+ import { type ToolName, type ToolTargetName } from "./tool-mapping";
2
+ export declare const MANIFEST_FILE_NAME = "manifest.json";
3
+ export interface BundleManifestTarget {
4
+ path: string;
5
+ }
6
+ export interface BundleManifest {
7
+ name?: string;
8
+ tools: Partial<Record<ToolName, Partial<Record<ToolTargetName, BundleManifestTarget>>>>;
9
+ }
10
+ export interface CachedBundleLayout {
11
+ sourceSegments: string[];
12
+ sourceDir: string;
13
+ bundleDir: string;
14
+ manifestFile: string;
15
+ resolveBundlePath(...segments: string[]): string;
16
+ }
17
+ /** Parses and validates a manifest JSON object into the internal bundle schema. */
18
+ export declare function parseBundleManifest(input: unknown): BundleManifest;
19
+ /** Infers a bundle manifest from canonical directories and native tool paths on disk. */
20
+ export declare function inferBundleManifest(bundleDir: string): BundleManifest;
21
+ /** Resolves the cache paths Skul uses for one source/bundle pair. */
22
+ export declare function resolveCachedBundleLayout(options: {
23
+ libraryDir: string;
24
+ source: string;
25
+ bundle: string;
26
+ }): CachedBundleLayout;
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MANIFEST_FILE_NAME = void 0;
7
+ exports.parseBundleManifest = parseBundleManifest;
8
+ exports.inferBundleManifest = inferBundleManifest;
9
+ exports.resolveCachedBundleLayout = resolveCachedBundleLayout;
10
+ const node_fs_1 = __importDefault(require("node:fs"));
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const tool_mapping_1 = require("./tool-mapping");
13
+ exports.MANIFEST_FILE_NAME = "manifest.json";
14
+ /** Parses and validates a manifest JSON object into the internal bundle schema. */
15
+ function parseBundleManifest(input) {
16
+ const manifest = expectRecord(input, "manifest");
17
+ const toolsInput = expectRecord(manifest.tools, "tools");
18
+ const tools = Object.fromEntries(Object.entries(toolsInput).map(([toolName, targetsInput]) => {
19
+ const toolDef = parseToolDefinition(toolName, `tools.${toolName}`);
20
+ const toolTargetsInput = expectRecord(targetsInput, `tools.${toolName}`);
21
+ if (Object.keys(toolTargetsInput).length === 0) {
22
+ throw new Error(`tools.${toolName} must declare at least one target`);
23
+ }
24
+ const targets = Object.fromEntries(Object.entries(toolTargetsInput).map(([targetName, value]) => {
25
+ if (!(targetName in toolDef.targets)) {
26
+ throw new Error(`tools.${toolDef.name}.${targetName} is not supported for tool ${toolDef.name}`);
27
+ }
28
+ return [
29
+ targetName,
30
+ parseBundleManifestTarget(value, `tools.${toolDef.name}.${targetName}`),
31
+ ];
32
+ }));
33
+ return [toolDef.name, targets];
34
+ }));
35
+ if (Object.keys(tools).length === 0) {
36
+ throw new Error("tools must declare at least one tool");
37
+ }
38
+ return expandRootInstructionTargets({
39
+ ...(typeof manifest.name === "string" && manifest.name.trim() !== ""
40
+ ? { name: manifest.name }
41
+ : {}),
42
+ tools,
43
+ });
44
+ }
45
+ /** Infers a bundle manifest from canonical directories and native tool paths on disk. */
46
+ function inferBundleManifest(bundleDir) {
47
+ const tools = {};
48
+ const allTools = (0, tool_mapping_1.listToolDefinitions)();
49
+ const canonicalTargetNames = [
50
+ "skills",
51
+ "commands",
52
+ "agents",
53
+ ];
54
+ // Process canonical directories (skills/, commands/, agents/) — Claude Code canonical format.
55
+ // These apply to all tools that support the given target.
56
+ for (const targetName of canonicalTargetNames) {
57
+ if (isExistingDirectory(node_path_1.default.join(bundleDir, targetName))) {
58
+ for (const toolDef of allTools) {
59
+ const targetDef = toolDef.targets[targetName];
60
+ if (targetDef?.kind === "directory") {
61
+ if (!tools[toolDef.name])
62
+ tools[toolDef.name] = {};
63
+ tools[toolDef.name][targetName] = { path: targetName };
64
+ }
65
+ }
66
+ }
67
+ }
68
+ // Process native dotdirs (.claude/skills/, .cursor/commands/, etc.) — pre-authored native format.
69
+ // Native paths override canonical paths for the same tool + target.
70
+ for (const toolDef of allTools) {
71
+ for (const [targetName, targetDef] of Object.entries(toolDef.targets)) {
72
+ if (isExistingToolTarget(node_path_1.default.join(bundleDir, targetDef.path), targetDef.kind)) {
73
+ if (!tools[toolDef.name])
74
+ tools[toolDef.name] = {};
75
+ tools[toolDef.name][targetName] = {
76
+ path: targetDef.path,
77
+ };
78
+ }
79
+ }
80
+ }
81
+ return expandRootInstructionTargets({ tools });
82
+ }
83
+ function isExistingDirectory(dirPath) {
84
+ try {
85
+ return node_fs_1.default.statSync(dirPath).isDirectory();
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ function isExistingToolTarget(targetPath, kind) {
92
+ try {
93
+ const stat = node_fs_1.default.statSync(targetPath);
94
+ return kind === "directory" ? stat.isDirectory() : stat.isFile();
95
+ }
96
+ catch {
97
+ return false;
98
+ }
99
+ }
100
+ function expandRootInstructionTargets(manifest) {
101
+ const sourcePath = selectRootInstructionSourcePath(manifest.tools);
102
+ if (!sourcePath) {
103
+ return manifest;
104
+ }
105
+ const expandedTools = Object.fromEntries(Object.entries(manifest.tools).map(([toolName, targets]) => [
106
+ toolName,
107
+ { ...targets },
108
+ ]));
109
+ for (const toolDef of (0, tool_mapping_1.listToolDefinitions)()) {
110
+ if (!toolDef.targets.root_instruction) {
111
+ continue;
112
+ }
113
+ if (!expandedTools[toolDef.name]) {
114
+ expandedTools[toolDef.name] = {};
115
+ }
116
+ if (!expandedTools[toolDef.name].root_instruction) {
117
+ expandedTools[toolDef.name].root_instruction = { path: sourcePath };
118
+ }
119
+ }
120
+ return {
121
+ ...(manifest.name !== undefined ? { name: manifest.name } : {}),
122
+ tools: expandedTools,
123
+ };
124
+ }
125
+ function selectRootInstructionSourcePath(tools) {
126
+ for (const { name } of (0, tool_mapping_1.listToolDefinitions)()) {
127
+ const sourcePath = tools[name]?.root_instruction?.path;
128
+ if (sourcePath) {
129
+ return sourcePath;
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+ /** Resolves the cache paths Skul uses for one source/bundle pair. */
135
+ function resolveCachedBundleLayout(options) {
136
+ const libraryDir = expectNonEmptyString(options.libraryDir, "library directory");
137
+ const source = expectNonEmptyString(options.source, "source");
138
+ const bundle = expectSinglePathSegment(options.bundle, "bundle");
139
+ const sourceSegments = source
140
+ .split("/")
141
+ .map((segment) => expectSinglePathSegment(segment, "source"));
142
+ const sourceDir = node_path_1.default.join(libraryDir, ...sourceSegments);
143
+ const bundleDir = node_path_1.default.join(sourceDir, bundle);
144
+ return {
145
+ sourceSegments,
146
+ sourceDir,
147
+ bundleDir,
148
+ manifestFile: node_path_1.default.join(bundleDir, exports.MANIFEST_FILE_NAME),
149
+ resolveBundlePath: (...segments) => node_path_1.default.join(bundleDir, ...segments),
150
+ };
151
+ }
152
+ function parseBundleManifestTarget(input, label) {
153
+ const target = expectRecord(input, label);
154
+ return {
155
+ path: expectRelativePath(target.path, `${label}.path`),
156
+ };
157
+ }
158
+ function parseToolDefinition(input, label) {
159
+ const value = expectNonEmptyString(input, label);
160
+ const tools = (0, tool_mapping_1.listToolDefinitions)();
161
+ const toolDef = tools.find((t) => t.name === value);
162
+ if (toolDef) {
163
+ return toolDef;
164
+ }
165
+ throw new Error(`${label} must be one of: ${tools.map((t) => t.name).join(", ")}`);
166
+ }
167
+ function expectRecord(input, label) {
168
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
169
+ throw new Error(`${label} must be an object`);
170
+ }
171
+ return input;
172
+ }
173
+ function expectNonEmptyString(input, label) {
174
+ if (typeof input !== "string" || input.trim() === "") {
175
+ throw new Error(`${label} is required`);
176
+ }
177
+ return input;
178
+ }
179
+ function expectSinglePathSegment(input, label) {
180
+ const value = expectNonEmptyString(input, label);
181
+ if (value.includes("/") || value === "." || value === "..") {
182
+ throw new Error(`${label} must be a single path segment`);
183
+ }
184
+ return value;
185
+ }
186
+ function expectRelativePath(input, label) {
187
+ const value = expectNonEmptyString(input, label);
188
+ const normalized = node_path_1.default.normalize(value);
189
+ if (node_path_1.default.isAbsolute(value) ||
190
+ normalized === "." ||
191
+ normalized.startsWith("..")) {
192
+ throw new Error(`${label} must be a relative path`);
193
+ }
194
+ return normalized;
195
+ }
196
+ //# sourceMappingURL=bundle-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-manifest.js","sourceRoot":"","sources":["../src/bundle-manifest.ts"],"names":[],"mappings":";;;;;;AAkCA,kDA+CC;AAGD,kDA6CC;AAyED,8DAyBC;AAnOD,sDAAyB;AACzB,0DAA6B;AAE7B,iDAKwB;AAEX,QAAA,kBAAkB,GAAG,eAAe,CAAC;AAuBlD,mFAAmF;AACnF,SAAgB,mBAAmB,CAAC,KAAc;IAChD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE;QAC1D,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC,CAAC;QACnE,MAAM,gBAAgB,GAAG,YAAY,CAAC,YAAY,EAAE,SAAS,QAAQ,EAAE,CAAC,CAAC;QAEzE,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,mCAAmC,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAChC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE;YAC3D,IAAI,CAAC,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CACb,SAAS,OAAO,CAAC,IAAI,IAAI,UAAU,8BAA8B,OAAO,CAAC,IAAI,EAAE,CAChF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,UAAU;gBACV,yBAAyB,CACvB,KAAK,EACL,SAAS,OAAO,CAAC,IAAI,IAAI,UAAU,EAAE,CACtC;aACF,CAAC;QACJ,CAAC,CAAC,CACsD,CAAC;QAE3D,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAGH,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,4BAA4B,CAAC;QAClC,GAAG,CAAC,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAClE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;YACzB,CAAC,CAAC,EAAE,CAAC;QACP,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AAED,yFAAyF;AACzF,SAAgB,mBAAmB,CAAC,SAAiB;IACnD,MAAM,KAAK,GAEP,EAAE,CAAC;IACP,MAAM,QAAQ,GAAG,IAAA,kCAAmB,GAAE,CAAC;IACvC,MAAM,oBAAoB,GAAqB;QAC7C,QAAQ;QACR,UAAU;QACV,QAAQ;KACT,CAAC;IAEF,8FAA8F;IAC9F,0DAA0D;IAC1D,KAAK,MAAM,UAAU,IAAI,oBAAoB,EAAE,CAAC;QAC9C,IAAI,mBAAmB,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YAC1D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAE9C,IAAI,SAAS,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;oBACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;wBAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACnD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,kGAAkG;IAClG,oEAAoE;IACpE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtE,IACE,oBAAoB,CAClB,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,EACpC,SAAS,CAAC,IAAI,CACf,EACD,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACnD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC,UAA4B,CAAC,GAAG;oBACnD,IAAI,EAAE,SAAS,CAAC,IAAI;iBACrB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,4BAA4B,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,IAAI,CAAC;QACH,OAAO,iBAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,UAAkB,EAClB,IAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,iBAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CACnC,QAAwB;IAExB,MAAM,UAAU,GAAG,+BAA+B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CACtC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;QAC1D,QAAQ;QACR,EAAE,GAAG,OAAO,EAAE;KACf,CAAC,CACwB,CAAC;IAE7B,KAAK,MAAM,OAAO,IAAI,IAAA,kCAAmB,GAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACtC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC,gBAAgB,EAAE,CAAC;YACnD,aAAa,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC,gBAAgB,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACvE,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,KAAK,EAAE,aAAa;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B,CACtC,KAA8B;IAE9B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,IAAA,kCAAmB,GAAE,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC;QAEvD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qEAAqE;AACrE,SAAgB,yBAAyB,CAAC,OAIzC;IACC,MAAM,UAAU,GAAG,oBAAoB,CACrC,OAAO,CAAC,UAAU,EAClB,mBAAmB,CACpB,CAAC;IACF,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,MAAM;SAC1B,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,cAAc,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE/C,OAAO;QACL,cAAc;QACd,SAAS;QACT,SAAS;QACT,YAAY,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAAkB,CAAC;QACtD,iBAAiB,EAAE,CAAC,GAAG,QAAkB,EAAE,EAAE,CAC3C,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,KAAc,EACd,KAAa;IAEb,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE1C,OAAO;QACL,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,KAAa;IACxD,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAA,kCAAmB,GAAE,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAEpD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,oBAAoB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClE,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,KAAa;IACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,KAAsB,CAAC;AAChC,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,KAAa;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc,EAAE,KAAa;IAC5D,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEjD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,gCAAgC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,KAAa;IACvD,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,mBAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAEzC,IACE,mBAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACtB,UAAU,KAAK,GAAG;QAClB,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAC3B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0BAA0B,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { type BundleItemSelector } from "./bundle-items";
2
+ import type { BundleManifest } from "./bundle-manifest";
3
+ import type { FileConflictResolution } from "./cli";
4
+ import { type ToolMaterializationLayout, type ToolName } from "./tool-mapping";
5
+ export interface MaterializeBundleResult {
6
+ byTool: Partial<Record<ToolName, {
7
+ files: string[];
8
+ directories: string[];
9
+ }>>;
10
+ }
11
+ /**
12
+ * Predicts the initial repo-relative files a bundle targets before any
13
+ * conflict-resolution overwrites are applied.
14
+ *
15
+ * This is a side-effect-free preview used by higher-level safety checks such as
16
+ * root-instruction shadow protection, where Skul needs to know the exact
17
+ * root-instruction targets before it removes existing managed files or writes
18
+ * new content.
19
+ */
20
+ export declare function previewMaterializeBundleWriteTargets(options: {
21
+ repoRoot: string;
22
+ bundleDir: string;
23
+ manifest: BundleManifest;
24
+ tools?: ToolName[];
25
+ itemSelectors?: BundleItemSelector[];
26
+ pathLayout?: ToolMaterializationLayout;
27
+ disableModelInvocation?: boolean;
28
+ }): string[];
29
+ /**
30
+ * Materializes a bundle into the repository, returning the files and
31
+ * directories that became owned by each tool.
32
+ *
33
+ * Callers may optionally provide `assertSafeWriteTarget` to veto individual
34
+ * writes before they happen and `resolveFileConflict` to overwrite or abort
35
+ * colliding outputs.
36
+ */
37
+ export declare function materializeBundle(options: {
38
+ repoRoot: string;
39
+ bundleDir: string;
40
+ manifest: BundleManifest;
41
+ tools?: ToolName[];
42
+ itemSelectors?: BundleItemSelector[];
43
+ bundleName?: string;
44
+ bundleSource?: string;
45
+ assertSafeWriteTarget?: (repoRelativePath: string) => void;
46
+ allowFileOverwriteTargets?: Set<string>;
47
+ deferredWriteTargets?: Set<string>;
48
+ rootInstructionBaseContents?: Record<string, string>;
49
+ resolveFileConflict?: (conflictPath: string) => Promise<FileConflictResolution>;
50
+ pathLayout?: ToolMaterializationLayout;
51
+ disableModelInvocation?: boolean;
52
+ }): Promise<MaterializeBundleResult>;