@warpgogol/forge 0.11.0 → 0.12.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 (38) hide show
  1. package/dist/bin/cli.js +0 -0
  2. package/dist/os/core/core.module.d.ts.map +1 -1
  3. package/dist/os/core/core.module.js +123 -0
  4. package/dist/os/core/core.module.js.map +1 -1
  5. package/dist/os/core/handlers/assets-check.d.ts +19 -0
  6. package/dist/os/core/handlers/assets-check.d.ts.map +1 -0
  7. package/dist/os/core/handlers/assets-check.js +91 -0
  8. package/dist/os/core/handlers/assets-check.js.map +1 -0
  9. package/dist/os/core/handlers/assets-helpers.d.ts +28 -0
  10. package/dist/os/core/handlers/assets-helpers.d.ts.map +1 -0
  11. package/dist/os/core/handlers/assets-helpers.js +127 -0
  12. package/dist/os/core/handlers/assets-helpers.js.map +1 -0
  13. package/dist/os/core/handlers/assets-list.d.ts +9 -0
  14. package/dist/os/core/handlers/assets-list.d.ts.map +1 -0
  15. package/dist/os/core/handlers/assets-list.js +76 -0
  16. package/dist/os/core/handlers/assets-list.js.map +1 -0
  17. package/dist/os/core/handlers/determinism-check.d.ts +20 -0
  18. package/dist/os/core/handlers/determinism-check.d.ts.map +1 -0
  19. package/dist/os/core/handlers/determinism-check.js +296 -0
  20. package/dist/os/core/handlers/determinism-check.js.map +1 -0
  21. package/dist/os/core/handlers/release-prepare.d.ts +25 -0
  22. package/dist/os/core/handlers/release-prepare.d.ts.map +1 -0
  23. package/dist/os/core/handlers/release-prepare.js +226 -0
  24. package/dist/os/core/handlers/release-prepare.js.map +1 -0
  25. package/dist/os/core/handlers/release-publish.d.ts +13 -0
  26. package/dist/os/core/handlers/release-publish.d.ts.map +1 -0
  27. package/dist/os/core/handlers/release-publish.js +173 -0
  28. package/dist/os/core/handlers/release-publish.js.map +1 -0
  29. package/dist/src/profiles/profile-schema.d.ts +73 -0
  30. package/dist/src/profiles/profile-schema.d.ts.map +1 -1
  31. package/dist/src/profiles/profile-schema.js +32 -0
  32. package/dist/src/profiles/profile-schema.js.map +1 -1
  33. package/dist/src/profiles/stack-profile.d.ts +23 -0
  34. package/dist/src/profiles/stack-profile.d.ts.map +1 -1
  35. package/dist/src/profiles/stack-profile.js +6 -0
  36. package/dist/src/profiles/stack-profile.js.map +1 -1
  37. package/package.json +165 -69
  38. package/profiles/editframe-html.yaml +16 -0
@@ -0,0 +1,296 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>forge.determinism.check — verify artifact determinism by building twice and comparing output hashes. Profile-driven via determinism.inputs glob patterns.</purpose>
4
+ <non-goals>
5
+ <item>Do not implement build or validate logic — those are separate handlers.</item>
6
+ <item>Do not import from @warpgogol/* in autonomous modules — os/core/ may import from @warpgogol/*.</item>
7
+ </non-goals>
8
+ </MODULE_CONTRACT>
9
+ <CHANGE_SUMMARY>
10
+ <item>RFC-0678: initial forge.determinism.check handler with profile resolution, --dry-run, --artifact, cache, and double-build hash comparison.</item>
11
+ </CHANGE_SUMMARY>
12
+ */
13
+ import { exec } from "node:child_process";
14
+ import { promisify } from "node:util";
15
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
16
+ import { existsSync } from "node:fs";
17
+ import { join, relative, dirname } from "node:path";
18
+ import { createHash } from "node:crypto";
19
+ import { collectFiles } from "@warpgogol/share/fs";
20
+ import { byteHashFile } from "@warpgogol/fingerprint";
21
+ import { resolveActiveProfile, resolveLifecycleFlags } from "./profile-resolve.js";
22
+ const execAsync = promisify(exec);
23
+ function globToRegex(pattern) {
24
+ let regex = "";
25
+ let i = 0;
26
+ while (i < pattern.length) {
27
+ const char = pattern[i];
28
+ if (char === "*") {
29
+ if (pattern[i + 1] === "*") {
30
+ regex += ".*";
31
+ i += 2;
32
+ if (pattern[i] === "/")
33
+ i++;
34
+ }
35
+ else {
36
+ regex += "[^/]*";
37
+ i++;
38
+ }
39
+ }
40
+ else if (char === "?") {
41
+ regex += "[^/]";
42
+ i++;
43
+ }
44
+ else if (".+^${}()|[]\\".includes(char)) {
45
+ regex += "\\" + char;
46
+ i++;
47
+ }
48
+ else {
49
+ regex += char;
50
+ i++;
51
+ }
52
+ }
53
+ return new RegExp("^" + regex + "$");
54
+ }
55
+ function matchesGlob(filePath, patterns) {
56
+ return patterns.some((pattern) => globToRegex(pattern).test(filePath));
57
+ }
58
+ async function computeInputHash(workspaceRoot, inputPatterns) {
59
+ const allFiles = await collectFiles(workspaceRoot, {
60
+ ignore: (name) => name.startsWith("-") ||
61
+ name.startsWith("old-") ||
62
+ name === "node_modules" ||
63
+ name === "dist" ||
64
+ name === ".turbo" ||
65
+ name === ".cache" ||
66
+ name === ".git",
67
+ });
68
+ const matched = allFiles
69
+ .map((abs) => relative(workspaceRoot, abs))
70
+ .filter((rel) => matchesGlob(rel, inputPatterns))
71
+ .sort();
72
+ const hasher = createHash("sha256");
73
+ for (const relPath of matched) {
74
+ const absPath = join(workspaceRoot, relPath);
75
+ const fileHash = await byteHashFile(absPath);
76
+ hasher.update(relPath + "\0" + fileHash + "\0");
77
+ }
78
+ return `sha256:${hasher.digest("hex")}`;
79
+ }
80
+ async function readCache(cachePath) {
81
+ try {
82
+ const content = await readFile(cachePath, "utf8");
83
+ return JSON.parse(content);
84
+ }
85
+ catch {
86
+ return { entries: {} };
87
+ }
88
+ }
89
+ async function writeCache(cachePath, cache) {
90
+ const dir = dirname(cachePath);
91
+ if (!existsSync(dir)) {
92
+ await mkdir(dir, { recursive: true });
93
+ }
94
+ await writeFile(cachePath, JSON.stringify(cache, null, 2) + "\n", "utf8");
95
+ }
96
+ export async function runDeterminismCheck(input, context) {
97
+ const { workspaceRoot, logger } = context;
98
+ const { dryRun, profileIdOverride } = resolveLifecycleFlags(input, context);
99
+ const artifactFilter = typeof input.flags["artifact"] === "string"
100
+ ? input.flags["artifact"]
101
+ : undefined;
102
+ const resolved = resolveActiveProfile(workspaceRoot, context.forgeRoot, profileIdOverride);
103
+ if (!resolved) {
104
+ return {
105
+ data: {
106
+ command: "forge.determinism.check",
107
+ profileId: "",
108
+ artifacts: [],
109
+ allDeterministic: false,
110
+ },
111
+ exitCode: 1,
112
+ summary: "No active profile found. Set `profile` in forge.yaml or use --profile <id>.",
113
+ nextSteps: [
114
+ { action: "Set profile in forge.yaml or use --profile <id>", kind: "required" },
115
+ ],
116
+ };
117
+ }
118
+ const { profile } = resolved;
119
+ if (!profile.artifacts || profile.artifacts.length === 0) {
120
+ return {
121
+ data: {
122
+ command: "forge.determinism.check",
123
+ profileId: profile.id,
124
+ artifacts: [],
125
+ allDeterministic: false,
126
+ },
127
+ exitCode: 1,
128
+ summary: `Profile ${profile.id} does not declare any artifacts.`,
129
+ nextSteps: [
130
+ { action: `Add artifacts section to profile ${profile.id}`, kind: "required" },
131
+ ],
132
+ };
133
+ }
134
+ if (artifactFilter) {
135
+ const found = profile.artifacts.find((a) => a.id === artifactFilter);
136
+ if (!found) {
137
+ return {
138
+ data: {
139
+ command: "forge.determinism.check",
140
+ profileId: profile.id,
141
+ artifacts: [],
142
+ allDeterministic: false,
143
+ },
144
+ exitCode: 1,
145
+ summary: `Artifact ${artifactFilter} not declared in profile ${profile.id}.`,
146
+ nextSteps: [
147
+ { action: `Check artifacts in profile ${profile.id}`, kind: "required" },
148
+ ],
149
+ };
150
+ }
151
+ }
152
+ const artifactsToCheck = artifactFilter
153
+ ? profile.artifacts.filter((a) => a.id === artifactFilter)
154
+ : profile.artifacts;
155
+ const hashableArtifacts = artifactsToCheck.filter((a) => a.determinism?.hashable === true);
156
+ if (hashableArtifacts.length === 0) {
157
+ return {
158
+ data: {
159
+ command: "forge.determinism.check",
160
+ profileId: profile.id,
161
+ artifacts: [],
162
+ allDeterministic: true,
163
+ },
164
+ exitCode: 0,
165
+ summary: `Profile ${profile.id} has no hashable artifacts — nothing to check.`,
166
+ };
167
+ }
168
+ if (dryRun) {
169
+ const items = hashableArtifacts.map((a) => ({
170
+ artifactId: a.id,
171
+ inputs: a.determinism.inputs,
172
+ }));
173
+ logger.info(`[dry-run] forge.determinism.check — profile: ${profile.id}`);
174
+ for (const item of items) {
175
+ logger.info(` ${item.artifactId}: inputs=${item.inputs.join(", ")}`);
176
+ }
177
+ return {
178
+ data: {
179
+ command: "forge.determinism.check",
180
+ profileId: profile.id,
181
+ artifacts: items.map((item) => ({
182
+ artifactId: item.artifactId,
183
+ hashable: true,
184
+ inputs: item.inputs,
185
+ inputHash: "",
186
+ firstBuildHash: null,
187
+ secondBuildHash: null,
188
+ deterministic: true,
189
+ cached: false,
190
+ })),
191
+ allDeterministic: true,
192
+ },
193
+ summary: `[dry-run] ${items.length} hashable artifact(s) resolved`,
194
+ };
195
+ }
196
+ const cachePath = join(workspaceRoot, "dist", ".determinism-cache.json");
197
+ const cache = await readCache(cachePath);
198
+ const results = [];
199
+ for (const artifact of hashableArtifacts) {
200
+ const determinism = artifact.determinism;
201
+ const produceCommand = artifact.produce?.command ?? "";
202
+ const outputPath = artifact.produce?.output ?? "";
203
+ if (!produceCommand || !outputPath) {
204
+ results.push({
205
+ artifactId: artifact.id,
206
+ hashable: true,
207
+ inputs: determinism.inputs,
208
+ inputHash: "",
209
+ firstBuildHash: null,
210
+ secondBuildHash: null,
211
+ deterministic: false,
212
+ cached: false,
213
+ error: "Artifact has no produce.command or produce.output — cannot verify determinism",
214
+ });
215
+ logger.error(` ${artifact.id}: no produce command or output`);
216
+ continue;
217
+ }
218
+ const inputHash = await computeInputHash(workspaceRoot, determinism.inputs);
219
+ const cacheKey = `${artifact.id}:${inputHash}:${produceCommand}`;
220
+ const cachedEntry = cache.entries[cacheKey];
221
+ if (cachedEntry) {
222
+ results.push({
223
+ artifactId: artifact.id,
224
+ hashable: true,
225
+ inputs: determinism.inputs,
226
+ inputHash,
227
+ firstBuildHash: cachedEntry.outputHash,
228
+ secondBuildHash: cachedEntry.outputHash,
229
+ deterministic: cachedEntry.deterministic,
230
+ cached: true,
231
+ });
232
+ logger.success(` ${artifact.id}: cached (deterministic=${cachedEntry.deterministic})`);
233
+ continue;
234
+ }
235
+ const absOutputPath = join(workspaceRoot, outputPath);
236
+ try {
237
+ await execAsync(produceCommand, { cwd: workspaceRoot, timeout: 60_000 });
238
+ const firstHash = await byteHashFile(absOutputPath);
239
+ await execAsync(produceCommand, { cwd: workspaceRoot, timeout: 60_000 });
240
+ const secondHash = await byteHashFile(absOutputPath);
241
+ const deterministic = firstHash === secondHash;
242
+ results.push({
243
+ artifactId: artifact.id,
244
+ hashable: true,
245
+ inputs: determinism.inputs,
246
+ inputHash,
247
+ firstBuildHash: firstHash,
248
+ secondBuildHash: secondHash,
249
+ deterministic,
250
+ cached: false,
251
+ });
252
+ cache.entries[cacheKey] = {
253
+ inputHash,
254
+ produceCommand,
255
+ outputHash: firstHash,
256
+ deterministic,
257
+ };
258
+ if (deterministic) {
259
+ logger.success(` ${artifact.id}: deterministic`);
260
+ }
261
+ else {
262
+ logger.error(` ${artifact.id}: NON-DETERMINISTIC (hashes differ)`);
263
+ }
264
+ }
265
+ catch (err) {
266
+ const e = err;
267
+ results.push({
268
+ artifactId: artifact.id,
269
+ hashable: true,
270
+ inputs: determinism.inputs,
271
+ inputHash,
272
+ firstBuildHash: null,
273
+ secondBuildHash: null,
274
+ deterministic: false,
275
+ cached: false,
276
+ error: e.stderr ?? e.message,
277
+ });
278
+ logger.error(` ${artifact.id}: build failed (${e.message})`);
279
+ }
280
+ }
281
+ await writeCache(cachePath, cache);
282
+ const allDeterministic = results.every((r) => r.deterministic);
283
+ return {
284
+ data: {
285
+ command: "forge.determinism.check",
286
+ profileId: profile.id,
287
+ artifacts: results,
288
+ allDeterministic,
289
+ },
290
+ exitCode: allDeterministic ? 0 : 1,
291
+ summary: allDeterministic
292
+ ? `forge.determinism.check: all ${results.length} artifact(s) deterministic`
293
+ : `forge.determinism.check: ${results.filter((r) => !r.deterministic).length} artifact(s) non-deterministic`,
294
+ };
295
+ }
296
+ //# sourceMappingURL=determinism-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"determinism-check.js","sourceRoot":"","sources":["../../../../os/core/handlers/determinism-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ForgeCommandInput, ForgeCommandResult, ForgeRuntimeContext } from "../../../src/types.ts";
2
+ export interface ReleaseManifest {
3
+ schemaVersion: string;
4
+ releaseId: string;
5
+ profileId: string;
6
+ version: string;
7
+ createdAt: string;
8
+ artifacts: Array<{
9
+ artifactId: string;
10
+ path: string;
11
+ hash: string;
12
+ size: number;
13
+ deterministic: boolean;
14
+ }>;
15
+ determinismChecked: boolean;
16
+ validationPassed: boolean;
17
+ }
18
+ export interface ForgeReleasePrepareResult {
19
+ command: "forge.release.prepare";
20
+ profileId: string;
21
+ releaseDir: string;
22
+ manifest: ReleaseManifest;
23
+ }
24
+ export declare function runReleasePrepare(input: ForgeCommandInput, context: ForgeRuntimeContext): Promise<ForgeCommandResult<ForgeReleasePrepareResult>>;
25
+ //# sourceMappingURL=release-prepare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-prepare.d.ts","sourceRoot":"","sources":["../../../../os/core/handlers/release-prepare.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAO/B,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,KAAK,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC,CAAC;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,uBAAuB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAuDD,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC,CAqLxD"}
@@ -0,0 +1,226 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>forge.release.prepare — bundle built artifacts into a release package with a manifest. Supports --dry-run, --json, --profile.</purpose>
4
+ <non-goals>
5
+ <item>Do not implement publish logic — that lives in release-publish.ts.</item>
6
+ <item>Do not import from @warpgogol/* in autonomous modules — os/core/ may import from @warpgogol/*.</item>
7
+ </non-goals>
8
+ </MODULE_CONTRACT>
9
+ <CHANGE_SUMMARY>
10
+ <item>RFC-0680: initial forge.release.prepare handler with manifest generation, artifact hashing, --dry-run.</item>
11
+ <item>RFC-0680 review fix: remove unused artifactId param from findBuiltArtifacts (A-2).</item>
12
+ <item>RFC-0680 review fix: use writeFileIfChanged for manifest write (B-1, DNA-34).</item>
13
+ <item>RFC-0680 review fix: document validationPassed semantics (G-3).</item>
14
+ </CHANGE_SUMMARY>
15
+ */
16
+ import { readFile, copyFile, mkdir, stat } from "node:fs/promises";
17
+ import { join, basename } from "node:path";
18
+ import { createHash } from "node:crypto";
19
+ import { resolveActiveProfile, resolveLifecycleFlags } from "./profile-resolve.js";
20
+ import { byteHashFile } from "@warpgogol/fingerprint";
21
+ import { collectFiles } from "@warpgogol/share/fs";
22
+ import { writeFileIfChanged } from "../../../src/utils/fs-idempotent.js";
23
+ function generateReleaseId(profileId, shortHash) {
24
+ const ts = new Date().toISOString().replace(/[:.]/g, "-").slice(0, -5);
25
+ return `${profileId}-${ts}-${shortHash}`;
26
+ }
27
+ async function readVersionFromPackageJson(workspaceRoot) {
28
+ try {
29
+ const raw = await readFile(join(workspaceRoot, "package.json"), "utf8");
30
+ const pkg = JSON.parse(raw);
31
+ return pkg.version ?? "0.0.0";
32
+ }
33
+ catch {
34
+ return "0.0.0";
35
+ }
36
+ }
37
+ async function findBuiltArtifacts(workspaceRoot, extensions, produceOutput) {
38
+ if (produceOutput) {
39
+ const outputPattern = produceOutput.replace("{composition}", "*");
40
+ const basePattern = basename(outputPattern);
41
+ const isGlob = basePattern.includes("*");
42
+ if (!isGlob) {
43
+ const fullPath = join(workspaceRoot, produceOutput);
44
+ try {
45
+ const s = await stat(fullPath);
46
+ return [fullPath];
47
+ }
48
+ catch {
49
+ return [];
50
+ }
51
+ }
52
+ // Extract extension from the output pattern (e.g. "*.mp4" → ".mp4")
53
+ const extMatch = basePattern.match(/(\.[^.]+)$/);
54
+ const outputExts = extMatch ? [extMatch[1]] : extensions;
55
+ const distDir = join(workspaceRoot, "dist");
56
+ const files = await collectFiles(distDir, {
57
+ extensions: outputExts,
58
+ ignore: (name) => name.startsWith("-") || name.startsWith("old-") || name === ".DS_Store",
59
+ });
60
+ const regex = new RegExp("^" + basePattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*") + "$");
61
+ return files.filter((f) => regex.test(basename(f)));
62
+ }
63
+ const distDir = join(workspaceRoot, "dist");
64
+ return collectFiles(distDir, {
65
+ extensions,
66
+ ignore: (name) => name.startsWith("-") || name.startsWith("old-") || name === ".DS_Store",
67
+ });
68
+ }
69
+ export async function runReleasePrepare(input, context) {
70
+ const { workspaceRoot, logger } = context;
71
+ const { dryRun, profileIdOverride } = resolveLifecycleFlags(input, context);
72
+ const resolved = resolveActiveProfile(workspaceRoot, context.forgeRoot, profileIdOverride);
73
+ if (!resolved) {
74
+ return {
75
+ data: {
76
+ command: "forge.release.prepare",
77
+ profileId: "",
78
+ releaseDir: "",
79
+ manifest: {
80
+ schemaVersion: "1",
81
+ releaseId: "",
82
+ profileId: "",
83
+ version: "",
84
+ createdAt: "",
85
+ artifacts: [],
86
+ determinismChecked: false,
87
+ validationPassed: false,
88
+ },
89
+ },
90
+ exitCode: 1,
91
+ summary: "No active profile found. Set `profile` in forge.yaml or use --profile <id>.",
92
+ nextSteps: [{ action: "Set profile in forge.yaml or use --profile <id>", kind: "required" }],
93
+ };
94
+ }
95
+ const { profile } = resolved;
96
+ if (!profile.release) {
97
+ return {
98
+ data: {
99
+ command: "forge.release.prepare",
100
+ profileId: profile.id,
101
+ releaseDir: "",
102
+ manifest: {
103
+ schemaVersion: "1",
104
+ releaseId: "",
105
+ profileId: profile.id,
106
+ version: "",
107
+ createdAt: "",
108
+ artifacts: [],
109
+ determinismChecked: false,
110
+ validationPassed: false,
111
+ },
112
+ },
113
+ exitCode: 1,
114
+ summary: `Profile ${profile.id} does not declare a release configuration.`,
115
+ };
116
+ }
117
+ const releaseConfig = profile.release;
118
+ const releaseDir = join(workspaceRoot, releaseConfig.outputDir);
119
+ const artifacts = profile.artifacts ?? [];
120
+ const includeArtifacts = releaseConfig.includeArtifacts;
121
+ const filteredArtifacts = includeArtifacts
122
+ ? artifacts.filter((a) => includeArtifacts.includes(a.id))
123
+ : artifacts.filter((a) => a.produce?.output);
124
+ const version = await readVersionFromPackageJson(workspaceRoot);
125
+ const manifestArtifacts = [];
126
+ let allHashes = "";
127
+ for (const artifact of filteredArtifacts) {
128
+ const builtFiles = await findBuiltArtifacts(workspaceRoot, artifact.extensions, artifact.produce?.output);
129
+ if (builtFiles.length === 0) {
130
+ return {
131
+ data: {
132
+ command: "forge.release.prepare",
133
+ profileId: profile.id,
134
+ releaseDir: "",
135
+ manifest: {
136
+ schemaVersion: "1",
137
+ releaseId: "",
138
+ profileId: profile.id,
139
+ version,
140
+ createdAt: "",
141
+ artifacts: [],
142
+ determinismChecked: false,
143
+ validationPassed: false,
144
+ },
145
+ },
146
+ exitCode: 1,
147
+ summary: `Artifact ${artifact.id} has no built output — run \`forge build\` first.`,
148
+ };
149
+ }
150
+ for (const builtFile of builtFiles) {
151
+ const relPath = builtFile.replace(workspaceRoot + "/", "");
152
+ let hash = "";
153
+ let size = 0;
154
+ if (!dryRun) {
155
+ hash = await byteHashFile(builtFile);
156
+ const stats = await stat(builtFile);
157
+ size = stats.size;
158
+ allHashes += hash;
159
+ }
160
+ manifestArtifacts.push({
161
+ artifactId: artifact.id,
162
+ path: relPath,
163
+ hash,
164
+ size,
165
+ deterministic: artifact.determinism?.hashable ?? false,
166
+ });
167
+ }
168
+ }
169
+ const shortHash = allHashes
170
+ ? createHash("sha256").update(allHashes).digest("hex").slice(0, 8)
171
+ : "dryrun00";
172
+ const releaseId = generateReleaseId(profile.id, shortHash);
173
+ const createdAt = new Date().toISOString();
174
+ const manifest = {
175
+ schemaVersion: "1",
176
+ releaseId,
177
+ profileId: profile.id,
178
+ version,
179
+ createdAt,
180
+ artifacts: manifestArtifacts,
181
+ determinismChecked: false,
182
+ validationPassed: true,
183
+ };
184
+ // G-3 note: validationPassed is set to true because forge.release.prepare
185
+ // does not run validation itself — the operator is expected to run
186
+ // `forge.validate` before `forge.release.prepare`. This mirrors the
187
+ // prepare-then-publish separation: prepare assumes prior validation.
188
+ if (dryRun) {
189
+ logger.info(`[dry-run] forge.release.prepare — profile: ${profile.id}`);
190
+ logger.info(` releaseId: ${releaseId}`);
191
+ logger.info(` version: ${version}`);
192
+ logger.info(` outputDir: ${releaseConfig.outputDir}`);
193
+ for (const a of manifestArtifacts) {
194
+ logger.info(` artifact: ${a.artifactId} — ${a.path}`);
195
+ }
196
+ return {
197
+ data: {
198
+ command: "forge.release.prepare",
199
+ profileId: profile.id,
200
+ releaseDir: releaseConfig.outputDir,
201
+ manifest,
202
+ },
203
+ summary: `[dry-run] Release prepared: ${manifestArtifacts.length} artifact(s), releaseId: ${releaseId}`,
204
+ };
205
+ }
206
+ await mkdir(releaseDir, { recursive: true });
207
+ for (const a of manifestArtifacts) {
208
+ const srcPath = join(workspaceRoot, a.path);
209
+ const dstPath = join(releaseDir, basename(a.path));
210
+ await copyFile(srcPath, dstPath);
211
+ }
212
+ const manifestPath = join(releaseDir, releaseConfig.manifestName);
213
+ await writeFileIfChanged(manifestPath, JSON.stringify(manifest, null, 2) + "\n");
214
+ logger.success(` Release prepared: ${manifestArtifacts.length} artifact(s)`);
215
+ logger.info(` Manifest: ${manifestPath}`);
216
+ return {
217
+ data: {
218
+ command: "forge.release.prepare",
219
+ profileId: profile.id,
220
+ releaseDir: releaseConfig.outputDir,
221
+ manifest,
222
+ },
223
+ summary: `Release prepared: ${manifestArtifacts.length} artifact(s), releaseId: ${releaseId}`,
224
+ };
225
+ }
226
+ //# sourceMappingURL=release-prepare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-prepare.js","sourceRoot":"","sources":["../../../../os/core/handlers/release-prepare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ForgeCommandInput, ForgeCommandResult, ForgeRuntimeContext } from "../../../src/types.ts";
2
+ export interface ForgeReleasePublishResult {
3
+ command: "forge.release.publish";
4
+ profileId: string;
5
+ target: string;
6
+ publishedFiles: Array<{
7
+ path: string;
8
+ targetPath: string;
9
+ }>;
10
+ manifestPath: string;
11
+ }
12
+ export declare function runReleasePublish(input: ForgeCommandInput, context: ForgeRuntimeContext): Promise<ForgeCommandResult<ForgeReleasePublishResult>>;
13
+ //# sourceMappingURL=release-publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-publish.d.ts","sourceRoot":"","sources":["../../../../os/core/handlers/release-publish.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAI/B,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,uBAAuB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,YAAY,EAAE,MAAM,CAAC;CACtB;AAYD,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC,CAmKxD"}