@decohere/forge 0.0.1-dev.12 → 0.0.1-dev.121

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 (194) hide show
  1. package/README.md +141 -0
  2. package/commonjs/src/actions/build.action.js +8 -6
  3. package/commonjs/src/actions/clean.action.js +6 -8
  4. package/commonjs/src/actions/commit.action.js +4 -6
  5. package/commonjs/src/actions/copy.action.js +43 -12
  6. package/commonjs/src/actions/dependency-report.action.js +4 -6
  7. package/commonjs/src/actions/dependency-sync.action.js +3 -5
  8. package/commonjs/src/actions/docker.action.js +209 -0
  9. package/commonjs/src/actions/index.js +6 -2
  10. package/commonjs/src/actions/link.action.js +154 -0
  11. package/commonjs/src/actions/package.action.js +234 -0
  12. package/commonjs/src/actions/paths.action.js +109 -0
  13. package/commonjs/src/actions/publish.action.js +4 -6
  14. package/commonjs/src/actions/sync-lock-file.action.js +2 -4
  15. package/commonjs/src/actions/tag.action.js +6 -9
  16. package/commonjs/src/actions/typecheck.action.js +67 -0
  17. package/commonjs/src/actions/unlink.action.js +74 -0
  18. package/commonjs/src/actions/version.action.js +10 -14
  19. package/commonjs/src/actions/watch.action.js +3 -5
  20. package/commonjs/src/commands/build.command.js +4 -3
  21. package/commonjs/src/commands/dependency.command.js +1 -3
  22. package/commonjs/src/commands/docker.command.js +26 -0
  23. package/commonjs/src/commands/forge.command.js +1 -3
  24. package/commonjs/src/commands/index.js +5 -2
  25. package/commonjs/src/commands/link.command.js +90 -0
  26. package/commonjs/src/commands/package.command.js +36 -0
  27. package/commonjs/src/commands/paths.command.js +24 -0
  28. package/commonjs/src/commands/publish.command.js +1 -3
  29. package/commonjs/src/commands/tag.command.js +1 -3
  30. package/commonjs/src/commands/typecheck.command.js +24 -0
  31. package/commonjs/src/commands/version.command.js +1 -3
  32. package/commonjs/src/const.js +0 -2
  33. package/commonjs/src/create-workspace.js +42 -0
  34. package/commonjs/src/errors.js +2 -4
  35. package/commonjs/src/extensions/project.extensions.js +11 -13
  36. package/commonjs/src/factories/swc-config.factory.js +29 -9
  37. package/commonjs/src/forge.module.js +23 -22
  38. package/commonjs/src/index.js +11 -2
  39. package/commonjs/src/packaging/dependency-pinner.service.js +118 -0
  40. package/commonjs/src/packaging/deployable.js +44 -0
  41. package/commonjs/src/packaging/import-graph.service.js +137 -0
  42. package/commonjs/src/packaging/release-exports.js +90 -0
  43. package/commonjs/src/packaging/ui-assets.js +75 -0
  44. package/commonjs/src/semver/index.js +18 -0
  45. package/commonjs/src/semver/semver.js +92 -0
  46. package/commonjs/src/services/dependency-resolver.service.js +1 -3
  47. package/commonjs/src/services/file-writer.service.js +2 -11
  48. package/commonjs/src/services/incremental-watch.js +24 -0
  49. package/commonjs/src/services/output-cache.js +39 -0
  50. package/commonjs/src/services/swc-transpiler.js +85 -99
  51. package/commonjs/src/services/transpile-cache.js +44 -0
  52. package/commonjs/src/services/ts-program-host.js +4 -6
  53. package/commonjs/src/services/type-emission-program.js +24 -9
  54. package/commonjs/src/services/type-emitter.js +51 -16
  55. package/commonjs/src/types/build-target.type.js +0 -2
  56. package/commonjs/src/types/configuration.type.js +0 -2
  57. package/commonjs/src/types/dependency.types.js +0 -2
  58. package/commonjs/src/types/swc-config.type.js +0 -2
  59. package/commonjs/src/types/transform-response.model.js +3 -18
  60. package/commonjs/src/types/transformer.type.js +0 -2
  61. package/commonjs/src/types/workspace-config.type.js +0 -2
  62. package/commonjs/src/vitest/forge-build.plugin.js +28 -44
  63. package/commonjs/src/vitest/index.js +0 -2
  64. package/commonjs/src/workspace.config.js +39 -6
  65. package/es6/src/actions/build.action.js +7 -7
  66. package/es6/src/actions/clean.action.js +5 -8
  67. package/es6/src/actions/commit.action.js +3 -6
  68. package/es6/src/actions/copy.action.js +42 -12
  69. package/es6/src/actions/dependency-report.action.js +3 -7
  70. package/es6/src/actions/dependency-sync.action.js +2 -6
  71. package/es6/src/actions/docker.action.js +194 -0
  72. package/es6/src/actions/index.js +6 -2
  73. package/es6/src/actions/link.action.js +128 -0
  74. package/es6/src/actions/package.action.js +219 -0
  75. package/es6/src/actions/paths.action.js +86 -0
  76. package/es6/src/actions/publish.action.js +3 -6
  77. package/es6/src/actions/sync-lock-file.action.js +2 -4
  78. package/es6/src/actions/tag.action.js +5 -9
  79. package/es6/src/actions/typecheck.action.js +52 -0
  80. package/es6/src/actions/unlink.action.js +59 -0
  81. package/es6/src/actions/version.action.js +5 -10
  82. package/es6/src/actions/watch.action.js +2 -5
  83. package/es6/src/commands/build.command.js +4 -3
  84. package/es6/src/commands/dependency.command.js +1 -3
  85. package/es6/src/commands/docker.command.js +16 -0
  86. package/es6/src/commands/forge.command.js +1 -3
  87. package/es6/src/commands/index.js +5 -2
  88. package/es6/src/commands/link.command.js +67 -0
  89. package/es6/src/commands/package.command.js +26 -0
  90. package/es6/src/commands/paths.command.js +14 -0
  91. package/es6/src/commands/publish.command.js +1 -3
  92. package/es6/src/commands/tag.command.js +1 -3
  93. package/es6/src/commands/typecheck.command.js +14 -0
  94. package/es6/src/commands/version.command.js +1 -3
  95. package/es6/src/const.js +0 -2
  96. package/es6/src/create-workspace.js +30 -0
  97. package/es6/src/errors.js +1 -3
  98. package/es6/src/extensions/project.extensions.js +5 -7
  99. package/es6/src/factories/swc-config.factory.js +29 -9
  100. package/es6/src/forge.module.js +23 -22
  101. package/es6/src/index.js +3 -3
  102. package/es6/src/packaging/dependency-pinner.service.js +103 -0
  103. package/es6/src/packaging/deployable.js +21 -0
  104. package/es6/src/packaging/import-graph.service.js +122 -0
  105. package/es6/src/packaging/release-exports.js +80 -0
  106. package/es6/src/packaging/ui-assets.js +49 -0
  107. package/es6/src/semver/index.js +1 -0
  108. package/es6/src/semver/semver.js +71 -0
  109. package/es6/src/services/dependency-resolver.service.js +1 -3
  110. package/es6/src/services/file-writer.service.js +2 -11
  111. package/es6/src/services/incremental-watch.js +18 -0
  112. package/es6/src/services/output-cache.js +29 -0
  113. package/es6/src/services/swc-transpiler.js +85 -99
  114. package/es6/src/services/transpile-cache.js +29 -0
  115. package/es6/src/services/ts-program-host.js +4 -6
  116. package/es6/src/services/type-emission-program.js +24 -9
  117. package/es6/src/services/type-emitter.js +48 -16
  118. package/es6/src/types/build-target.type.js +0 -2
  119. package/es6/src/types/configuration.type.js +0 -2
  120. package/es6/src/types/dependency.types.js +0 -2
  121. package/es6/src/types/swc-config.type.js +0 -2
  122. package/es6/src/types/transform-response.model.js +0 -7
  123. package/es6/src/types/transformer.type.js +0 -2
  124. package/es6/src/types/workspace-config.type.js +0 -2
  125. package/es6/src/vitest/forge-build.plugin.js +27 -43
  126. package/es6/src/vitest/index.js +0 -2
  127. package/es6/src/workspace.config.js +39 -5
  128. package/package.json +6 -5
  129. package/types/src/actions/build.action.d.ts +5 -4
  130. package/types/src/actions/clean.action.d.ts +3 -3
  131. package/types/src/actions/commit.action.d.ts +3 -3
  132. package/types/src/actions/copy.action.d.ts +13 -3
  133. package/types/src/actions/dependency-report.action.d.ts +3 -3
  134. package/types/src/actions/dependency-sync.action.d.ts +3 -3
  135. package/types/src/actions/docker.action.d.ts +38 -0
  136. package/types/src/actions/index.d.ts +6 -0
  137. package/types/src/actions/link.action.d.ts +25 -0
  138. package/types/src/actions/package.action.d.ts +38 -0
  139. package/types/src/actions/paths.action.d.ts +28 -0
  140. package/types/src/actions/publish.action.d.ts +4 -4
  141. package/types/src/actions/sync-lock-file.action.d.ts +2 -2
  142. package/types/src/actions/tag.action.d.ts +3 -3
  143. package/types/src/actions/typecheck.action.d.ts +14 -0
  144. package/types/src/actions/unlink.action.d.ts +9 -0
  145. package/types/src/actions/version.action.d.ts +4 -4
  146. package/types/src/actions/watch.action.d.ts +3 -3
  147. package/types/src/commands/build.command.d.ts +3 -2
  148. package/types/src/commands/dependency.command.d.ts +2 -2
  149. package/types/src/commands/docker.command.d.ts +6 -0
  150. package/types/src/commands/forge.command.d.ts +2 -2
  151. package/types/src/commands/index.d.ts +5 -0
  152. package/types/src/commands/link.command.d.ts +29 -0
  153. package/types/src/commands/package.command.d.ts +11 -0
  154. package/types/src/commands/paths.command.d.ts +6 -0
  155. package/types/src/commands/publish.command.d.ts +1 -1
  156. package/types/src/commands/tag.command.d.ts +1 -1
  157. package/types/src/commands/typecheck.command.d.ts +6 -0
  158. package/types/src/commands/version.command.d.ts +1 -1
  159. package/types/src/create-workspace.d.ts +7 -0
  160. package/types/src/errors.d.ts +1 -1
  161. package/types/src/extensions/project.extensions.d.ts +2 -2
  162. package/types/src/factories/swc-config.factory.d.ts +3 -2
  163. package/types/src/forge.module.d.ts +16 -4
  164. package/types/src/index.d.ts +3 -1
  165. package/types/src/packaging/dependency-pinner.service.d.ts +20 -0
  166. package/types/src/packaging/deployable.d.ts +17 -0
  167. package/types/src/packaging/import-graph.service.d.ts +33 -0
  168. package/types/src/packaging/release-exports.d.ts +18 -0
  169. package/types/src/packaging/ui-assets.d.ts +21 -0
  170. package/types/src/semver/index.d.ts +1 -0
  171. package/types/src/semver/semver.d.ts +18 -0
  172. package/types/src/services/dependency-resolver.service.d.ts +1 -1
  173. package/types/src/services/file-writer.service.d.ts +1 -2
  174. package/types/src/services/incremental-watch.d.ts +13 -0
  175. package/types/src/services/output-cache.d.ts +10 -0
  176. package/types/src/services/swc-transpiler.d.ts +28 -15
  177. package/types/src/services/transpile-cache.d.ts +17 -0
  178. package/types/src/services/ts-program-host.d.ts +2 -2
  179. package/types/src/services/type-emission-program.d.ts +8 -3
  180. package/types/src/services/type-emitter.d.ts +21 -8
  181. package/types/src/types/configuration.type.d.ts +6 -1
  182. package/types/src/types/dependency.types.d.ts +1 -1
  183. package/types/src/types/swc-config.type.d.ts +7 -1
  184. package/types/src/types/transform-response.model.d.ts +2 -7
  185. package/types/src/types/transformer.type.d.ts +2 -11
  186. package/types/src/types/workspace-config.type.d.ts +3 -3
  187. package/types/src/vitest/forge-build.plugin.d.ts +0 -2
  188. package/types/src/workspace.config.d.ts +6 -0
  189. package/commonjs/src/mixins/caches-outputs.mixin.js +0 -44
  190. package/commonjs/src/mixins/incremental-transform.mixin.js +0 -36
  191. package/es6/src/mixins/caches-outputs.mixin.js +0 -34
  192. package/es6/src/mixins/incremental-transform.mixin.js +0 -26
  193. package/types/src/mixins/caches-outputs.mixin.d.ts +0 -7
  194. package/types/src/mixins/incremental-transform.mixin.d.ts +0 -13
@@ -0,0 +1,219 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ import fs from "node:fs/promises";
11
+ import path from "node:path";
12
+ import { injectable } from "@decohere/crucible/decorators";
13
+ import { Workspace } from "@decohere/workspace";
14
+ import { ActionResponse } from "@decohere/devkit/cli";
15
+ import { Npm } from "@decohere/devkit/interop";
16
+ import { io } from "@decohere/core/io";
17
+ import { scribe } from "@decohere/scribe";
18
+ import { ForgeError, formatUnknownError } from "../errors.js";
19
+ import { DependencyPinner } from "../packaging/dependency-pinner.service.js";
20
+ import { deployable, PACKAGE_DIR } from "../packaging/deployable.js";
21
+ import { ImportGraph } from "../packaging/import-graph.service.js";
22
+ import { releaseExports } from "../packaging/release-exports.js";
23
+ import { uiAssets } from "../packaging/ui-assets.js";
24
+ import { Release } from "../workspace.config.js";
25
+ export class PackageDeployable {
26
+ workspace;
27
+ importGraph;
28
+ pinner;
29
+ #logger = scribe.logger(PackageDeployable.name);
30
+ npm = new Npm();
31
+ constructor(workspace, importGraph, pinner){
32
+ this.workspace = workspace;
33
+ this.importGraph = importGraph;
34
+ this.pinner = pinner;
35
+ }
36
+ async run(options) {
37
+ const projects = this.workspace.getProjects(Release.name);
38
+ const selected = await this.select(projects, options.project);
39
+ if (typeof selected === "string") {
40
+ return ActionResponse.Error(PackageDeployable.name, selected);
41
+ }
42
+ if (selected.length === 0) {
43
+ this.#logger.info("No projects found with a Dockerfile — nothing to package");
44
+ return ActionResponse.Success(PackageDeployable.name, []);
45
+ }
46
+ const releaseProjects = await this.releaseProjects(projects);
47
+ const responses = [];
48
+ for (const project of selected){
49
+ responses.push(await this.packageProject(project, releaseProjects, projects));
50
+ }
51
+ return responses.some((response)=>!response.succeeded) ? ActionResponse.Error(PackageDeployable.name, responses) : ActionResponse.Success(PackageDeployable.name, responses);
52
+ }
53
+ /** The deployables to package, or the reason a named project cannot be one. */ async select(projects, requested) {
54
+ if (requested == null || requested === "") {
55
+ const found = [];
56
+ for (const project of projects){
57
+ if (await deployable.isDeployable(project)) {
58
+ found.push(project);
59
+ }
60
+ }
61
+ return found;
62
+ }
63
+ const project = projects.find((candidate)=>candidate.name === requested);
64
+ if (project == null) {
65
+ return `${requested} is not a workspace project. Known projects: ${projects.map((p)=>p.name).join(", ")}`;
66
+ }
67
+ if (!await deployable.isDeployable(project)) {
68
+ return `${requested} has no ${deployable.dockerfileName(project)}, so it is a library, not a deployable. ` + "Libraries are packaged into the deployables that import them.";
69
+ }
70
+ return [
71
+ project
72
+ ];
73
+ }
74
+ async releaseProjects(projects) {
75
+ const entries = await Promise.all(projects.map(async (project)=>{
76
+ const pkg = await project.getPackageJson();
77
+ return [
78
+ project.name,
79
+ {
80
+ name: project.name,
81
+ pkg,
82
+ projectRoot: path.resolve(project.projectRoot),
83
+ releaseDir: path.resolve(project.getOutDir())
84
+ }
85
+ ];
86
+ }));
87
+ return new Map(entries);
88
+ }
89
+ async packageProject(project, releaseProjects, projects) {
90
+ const outDir = path.join(path.resolve(project.projectRoot), PACKAGE_DIR);
91
+ const base = {
92
+ projectName: project.name,
93
+ outDir,
94
+ workspacePackages: [],
95
+ dependencies: {}
96
+ };
97
+ try {
98
+ const entry = releaseProjects.get(project.name);
99
+ if (!await io.directoryExists(path.join(entry.releaseDir, "es6"))) {
100
+ throw new ForgeError(`No release build for ${project.name}. Run \`forge build --configuration release\` first.`);
101
+ }
102
+ const ui = await uiAssets.resolve(project, projects);
103
+ const reached = await this.importGraph.walk(entry, releaseProjects);
104
+ const libraries = [
105
+ ...reached.workspace
106
+ ].filter((name)=>name !== project.name).sort().map((name)=>releaseProjects.get(name));
107
+ const dependencies = await this.pinner.pin(reached.thirdParty, [
108
+ entry,
109
+ ...libraries
110
+ ], releaseProjects, {
111
+ dir: path.resolve(this.workspace.rootDir),
112
+ pkg: await this.workspace.getPackageJson()
113
+ });
114
+ await this.write(entry, libraries, dependencies, outDir, ui);
115
+ const workspacePackages = [
116
+ ...reached.workspace
117
+ ].sort();
118
+ this.#logger.info(`Packaged ${project.name} to ${outDir}`, {
119
+ workspace: workspacePackages,
120
+ thirdParty: Object.keys(dependencies)
121
+ });
122
+ return {
123
+ projectName: project.name,
124
+ outDir,
125
+ workspacePackages,
126
+ dependencies,
127
+ succeeded: true,
128
+ message: `Packaged ${project.name} to ${outDir}`
129
+ };
130
+ } catch (reason) {
131
+ const message = formatUnknownError(reason);
132
+ return {
133
+ ...base,
134
+ succeeded: false,
135
+ message,
136
+ error: `${project.name}: ${message}`
137
+ };
138
+ }
139
+ }
140
+ async write(entry, libraries, dependencies, outDir, ui) {
141
+ await fs.rm(outDir, {
142
+ recursive: true,
143
+ force: true
144
+ });
145
+ await fs.mkdir(outDir, {
146
+ recursive: true
147
+ });
148
+ await this.writeJson(path.join(outDir, "package.json"), {
149
+ name: entry.name.replace(/^@/, "").replace("/", "-"),
150
+ version: entry.pkg.version,
151
+ private: true,
152
+ type: "module",
153
+ scripts: {
154
+ start: `node es6/${releaseExports.toJs(entry.pkg.main ?? "src/index.ts")}`
155
+ },
156
+ dependencies
157
+ });
158
+ // npm writes real folders. It also removes anything in node_modules it does not know,
159
+ // so the workspace libraries are copied in only after it has run.
160
+ if (Object.keys(dependencies).length > 0) {
161
+ await this.npm.installProduction({
162
+ cwd: outDir
163
+ });
164
+ }
165
+ await this.copyTree(path.join(entry.releaseDir, "es6"), path.join(outDir, "es6"));
166
+ const config = path.join(path.resolve(this.workspace.rootDir), "config");
167
+ if (await io.directoryExists(config)) {
168
+ await this.copyTree(config, path.join(outDir, "config"));
169
+ }
170
+ if (ui != null) {
171
+ await this.copyTree(ui.from, path.join(outDir, ui.to));
172
+ }
173
+ for (const library of libraries){
174
+ const target = path.join(outDir, "node_modules", ...library.name.split("/"));
175
+ await this.copyTree(path.join(library.releaseDir, "es6"), path.join(target, "es6"));
176
+ await this.writeJson(path.join(target, "package.json"), {
177
+ name: library.name,
178
+ version: library.pkg.version,
179
+ type: "module",
180
+ exports: releaseExports.build(library.pkg)
181
+ });
182
+ }
183
+ await this.assertNoSymlinks(outDir);
184
+ }
185
+ /** Copies file contents, never links: a symlink in the output would break outside the image. */ async copyTree(from, to) {
186
+ await fs.cp(from, to, {
187
+ recursive: true,
188
+ dereference: true
189
+ });
190
+ }
191
+ async writeJson(filePath, value) {
192
+ await io.writeFile(filePath, `${JSON.stringify(value, null, "\t")}\n`, {
193
+ mkdir: true,
194
+ encoding: "utf8"
195
+ });
196
+ }
197
+ async assertNoSymlinks(dir) {
198
+ for (const entry of (await fs.readdir(dir, {
199
+ withFileTypes: true
200
+ }))){
201
+ const entryPath = path.join(dir, entry.name);
202
+ if (entry.isSymbolicLink()) {
203
+ throw new ForgeError(`The packaged output must hold no symlinks, but found ${entryPath}`);
204
+ }
205
+ if (entry.isDirectory()) {
206
+ await this.assertNoSymlinks(entryPath);
207
+ }
208
+ }
209
+ }
210
+ }
211
+ PackageDeployable = _ts_decorate([
212
+ injectable(),
213
+ _ts_metadata("design:type", Function),
214
+ _ts_metadata("design:paramtypes", [
215
+ typeof Workspace === "undefined" ? Object : Workspace,
216
+ typeof ImportGraph === "undefined" ? Object : ImportGraph,
217
+ typeof DependencyPinner === "undefined" ? Object : DependencyPinner
218
+ ])
219
+ ], PackageDeployable);
@@ -0,0 +1,86 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ import { existsSync } from "node:fs";
11
+ import { readFile, writeFile } from "node:fs/promises";
12
+ import path from "node:path";
13
+ import { injectable } from "@decohere/crucible/decorators";
14
+ import { packageAliases, Workspace } from "@decohere/workspace";
15
+ import { ActionResponse } from "@decohere/devkit/cli";
16
+ import { scribe } from "@decohere/scribe";
17
+ export const PATHS_FILE = "tsconfig.paths.json";
18
+ export class Paths {
19
+ workspace;
20
+ #logger = scribe.logger(Paths.name);
21
+ constructor(workspace){
22
+ this.workspace = workspace;
23
+ }
24
+ async run(options) {
25
+ const file = path.join(this.workspace.rootDir, PATHS_FILE);
26
+ const content = Paths.render(this.workspace);
27
+ const current = existsSync(file) ? await readFile(file, "utf8") : null;
28
+ const changed = current !== content;
29
+ if (options.check) {
30
+ if (!changed) {
31
+ return ActionResponse.Success(Paths.name, [
32
+ {
33
+ file,
34
+ changed,
35
+ succeeded: true
36
+ }
37
+ ]);
38
+ }
39
+ const error = `${PATHS_FILE} is out of date. Run \`forge paths\` to update it.`;
40
+ this.#logger.error(error);
41
+ return ActionResponse.Error(Paths.name, [
42
+ {
43
+ file,
44
+ changed,
45
+ succeeded: false,
46
+ error
47
+ }
48
+ ]);
49
+ }
50
+ if (changed) {
51
+ await writeFile(file, content);
52
+ this.#logger.info(`Wrote ${PATHS_FILE}`);
53
+ }
54
+ return ActionResponse.Success(Paths.name, [
55
+ {
56
+ file,
57
+ changed,
58
+ succeeded: true
59
+ }
60
+ ]);
61
+ }
62
+ /** The file's content: convention and exported subpaths only, never the tsconfig's own paths. */ static render(workspace) {
63
+ const rootDir = path.resolve(workspace.rootDir);
64
+ const { paths } = packageAliases.build(workspace.getProjects("debug"), {
65
+ baseUrl: rootDir
66
+ });
67
+ const sorted = Object.fromEntries(Object.keys(paths).sort().map((key)=>[
68
+ key,
69
+ (paths[key] ?? []).map((target)=>`./${target}`)
70
+ ]));
71
+ const json = {
72
+ $comment: "Generated by `forge paths` from the workspace packages. Do not edit.",
73
+ compilerOptions: {
74
+ paths: sorted
75
+ }
76
+ };
77
+ return `${JSON.stringify(json, null, 2)}\n`;
78
+ }
79
+ }
80
+ Paths = _ts_decorate([
81
+ injectable(),
82
+ _ts_metadata("design:type", Function),
83
+ _ts_metadata("design:paramtypes", [
84
+ typeof Workspace === "undefined" ? Object : Workspace
85
+ ])
86
+ ], Paths);
@@ -8,10 +8,9 @@ function _ts_metadata(k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  }
10
10
  import { injectable } from "@decohere/crucible/decorators";
11
- // biome-ignore lint/style/useImportType: <DI>
12
- import { Workspace } from "@decohere/mesh";
13
- import { ActionResponse } from "@decohere/nexus/cli";
14
- import { Npm } from "@decohere/nexus/interop";
11
+ import { Workspace } from "@decohere/workspace";
12
+ import { ActionResponse } from "@decohere/devkit/cli";
13
+ import { Npm } from "@decohere/devkit/interop";
15
14
  import { scribe } from "@decohere/scribe";
16
15
  import { ForgeError, formatUnknownError } from "../errors.js";
17
16
  export class Publish {
@@ -143,5 +142,3 @@ Publish = _ts_decorate([
143
142
  typeof Workspace === "undefined" ? Object : Workspace
144
143
  ])
145
144
  ], Publish);
146
-
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL3B1Ymxpc2guYWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbiwgUmVzdWx0U3RhdHVzIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IEFjdGlvblJlc3BvbnNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IE5wbSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW50ZXJvcFwiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjtcbmltcG9ydCB7IEZvcmdlRXJyb3IsIGZvcm1hdFVua25vd25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcblxuZXhwb3J0IHR5cGUgUHVibGlzaE9wdGlvbnMgPSB7XG5cdGNvbmZpZ3VyYXRpb246IHN0cmluZztcblx0Y2hhbm5lbD86IHN0cmluZztcblx0ZHJ5UnVuPzogYm9vbGVhbjtcblx0dG9rZW4/OiBzdHJpbmc7XG5cdG90cD86IHN0cmluZztcblx0cHJvbXB0QXV0aD86IGJvb2xlYW47XG5cdHByb21wdE90cD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBQdWJsaXNoUmVzcG9uc2UgPSBSZXN1bHRTdGF0dXMgJiB7XG5cdHByb2plY3ROYW1lOiBzdHJpbmc7XG5cdG1lc3NhZ2U6IHN0cmluZztcblx0cGFja2FnZU5hbWU/OiBzdHJpbmc7XG59O1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHVibGlzaCBpbXBsZW1lbnRzIEFjdGlvbjxQdWJsaXNoT3B0aW9ucz4ge1xuXHQvLyBUT0RPOiBwcm9iYWJseSBiZXN0IHRvIGluamVjdCBucG1cblx0cHJpdmF0ZSByZWFkb25seSBucG0gPSBuZXcgTnBtKCk7XG5cdCNsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFB1Ymxpc2gubmFtZSk7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlOiBXb3Jrc3BhY2UpIHt9XG5cblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBQdWJsaXNoT3B0aW9ucyk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U8UHVibGlzaFJlc3BvbnNlPj4ge1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy53b3Jrc3BhY2UuZ2V0UHJvamVjdHMob3B0aW9ucy5jb25maWd1cmF0aW9uKTtcblx0XHRjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuKG9wdGlvbnMpO1xuXHRcdGNvbnN0IG90cCA9IGF3YWl0IHRoaXMucmVzb2x2ZU90cChvcHRpb25zKTtcblxuXHRcdGlmIChwcm9qZWN0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBGb3JnZUVycm9yKGBObyBwcm9qZWN0cyBmb3VuZCB0byBwdWJsaXNoYCk7XG5cdFx0fVxuXHRcdGNvbnN0IHB1Ymxpc2hSZXNwb25zZXMgPSBhd2FpdCB0aGlzLnB1Ymxpc2hQcm9qZWN0cyhwcm9qZWN0cywge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdHRva2VuLFxuXHRcdFx0b3RwLFxuXHRcdH0pO1xuXHRcdGNvbnN0IGZhaWxlZCA9IHB1Ymxpc2hSZXNwb25zZXMuZmlsdGVyKChyKSA9PiAhci5zdWNjZWVkZWQpO1xuXHRcdGlmIChmYWlsZWQubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gQWN0aW9uUmVzcG9uc2UuRXJyb3IoUHVibGlzaC5uYW1lLCBwdWJsaXNoUmVzcG9uc2VzKTtcblx0XHR9XG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoUHVibGlzaC5uYW1lLCBwdWJsaXNoUmVzcG9uc2VzKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBwdWJsaXNoUHJvamVjdHMocHJvamVjdHM6IHJlYWRvbmx5IFByb2plY3RbXSwgb3B0aW9uczogUHVibGlzaE9wdGlvbnMpIHtcblx0XHRyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRwcm9qZWN0c1xuXHRcdFx0XHQuZmlsdGVyKChwcm9qZWN0KSA9PiB7XG5cdFx0XHRcdFx0aWYgKHByb2plY3QuaXNQcml2YXRlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhgU2tpcHBpbmcgcHJpdmF0ZSBwYWNrYWdlOiAke3Byb2plY3QubmFtZX1gKTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5tYXAoYXN5bmMgKHByb2plY3QpID0+IGF3YWl0IHRoaXMucHVibGlzaFByb2plY3QocHJvamVjdCwgb3B0aW9ucykpLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHB1Ymxpc2hQcm9qZWN0KFxuXHRcdHByb2plY3Q6IFByb2plY3QsXG5cdFx0b3B0aW9uczogUHVibGlzaE9wdGlvbnMsXG5cdCk6IFByb21pc2U8UHVibGlzaFJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgeyBjaGFubmVsLCBkcnlSdW4sIHRva2VuLCBvdHAgfSA9IG9wdGlvbnM7XG5cdFx0Y29uc3Qgb3V0RGlyID0gcHJvamVjdC5nZXRPdXREaXIoKTtcblx0XHR0aGlzLiNsb2dnZXIuaW5mbyhgJHtkcnlSdW4gPyBcIltkcnktcnVuXSBcIiA6IFwiXCJ9UHVibGlzaGluZyAke3Byb2plY3QubmFtZX1gKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubnBtLnB1Ymxpc2gob3V0RGlyLCB7XG5cdFx0XHRcdGNoYW5uZWwsXG5cdFx0XHRcdGRyeVJ1bixcblx0XHRcdFx0YXV0aFRva2VuOiB0b2tlbixcblx0XHRcdFx0b3RwLFxuXHRcdFx0XHRza2lwSWZQdWJsaXNoZWQ6IHRydWUsXG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgcGFja2FnZU5hbWUgPSByZXNwb25zZS5kYXRhPy5qb2luKFwiXCIpO1xuXHRcdFx0dGhpcy4jbG9nZ2VyLnRyYWNlKGAke3Byb2plY3QubmFtZX0g4oaSICR7cGFja2FnZU5hbWUgPz8gcmVzcG9uc2UubWVzc2FnZX1gKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHByb2plY3ROYW1lOiBwcm9qZWN0Lm5hbWUsXG5cdFx0XHRcdHN1Y2NlZWRlZDogdHJ1ZSxcblx0XHRcdFx0bWVzc2FnZTogcmVzcG9uc2UubWVzc2FnZSxcblx0XHRcdFx0cGFja2FnZU5hbWUsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKHJlYXNvbikge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGZvcm1hdFVua25vd25FcnJvcihyZWFzb24pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cHJvamVjdE5hbWU6IHByb2plY3QubmFtZSxcblx0XHRcdFx0c3VjY2VlZGVkOiBmYWxzZSxcblx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0ZXJyb3I6IGAke3Byb2plY3QubmFtZX06ICR7bWVzc2FnZX1gLFxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJlc29sdmVUb2tlbihvcHRpb25zOiBQdWJsaXNoT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cdFx0aWYgKG9wdGlvbnMudG9rZW4/LnRyaW0oKSkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMudG9rZW4udHJpbSgpO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLnByb21wdEF1dGgpIHtcblx0XHRcdHJldHVybiBhd2FpdCB0aGlzLnByb21wdFNlY3JldChcIm5wbSBhY2Nlc3MgdG9rZW46IFwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyByZXNvbHZlT3RwKG9wdGlvbnM6IFB1Ymxpc2hPcHRpb25zKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAob3B0aW9ucy5vdHA/LnRyaW0oKSkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMub3RwLnRyaW0oKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5wcm9tcHRBdXRoIHx8IG9wdGlvbnMucHJvbXB0T3RwKSB7XG5cdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5wcm9tcHRTZWNyZXQoXCJucG0gT1RQOiBcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcHJvbXB0U2VjcmV0KGxhYmVsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRcdGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSB8fCAhcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcblx0XHRcdHRocm93IG5ldyBGb3JnZUVycm9yKGBDYW5ub3QgcHJvbXB0IGZvciBzZWNyZXQgd2l0aG91dCBhbiBpbnRlcmFjdGl2ZSBUVFlgKTtcblx0XHR9XG5cblx0XHRwcm9jZXNzLnN0ZG91dC53cml0ZShsYWJlbCk7XG5cdFx0Y29uc3Qgc3RkaW4gPSBwcm9jZXNzLnN0ZGluO1xuXHRcdHN0ZGluLnNldEVuY29kaW5nKFwidXRmOFwiKTtcblx0XHRzdGRpbi5yZXN1bWUoKTtcblx0XHRzdGRpbi5zZXRSYXdNb2RlPy4odHJ1ZSk7XG5cblx0XHRsZXQgdmFsdWUgPSBcIlwiO1xuXG5cdFx0cmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgY2xlYW51cCA9ICgpID0+IHtcblx0XHRcdFx0c3RkaW4uc2V0UmF3TW9kZT8uKGZhbHNlKTtcblx0XHRcdFx0c3RkaW4ucGF1c2UoKTtcblx0XHRcdFx0c3RkaW4ucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsIG9uRGF0YSk7XG5cdFx0XHRcdHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiXFxuXCIpO1xuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3Qgb25EYXRhID0gKGNodW5rOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3QgY2hhciA9IGNodW5rO1xuXHRcdFx0XHRpZiAoY2hhciA9PT0gXCJcXHUwMDAzXCIpIHtcblx0XHRcdFx0XHRjbGVhbnVwKCk7XG5cdFx0XHRcdFx0cmVqZWN0KG5ldyBGb3JnZUVycm9yKFwiSW5wdXQgY2FuY2VsbGVkXCIpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY2hhciA9PT0gXCJcXHJcIiB8fCBjaGFyID09PSBcIlxcblwiKSB7XG5cdFx0XHRcdFx0Y2xlYW51cCgpO1xuXHRcdFx0XHRcdHJlc29sdmUodmFsdWUudHJpbSgpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY2hhciA9PT0gXCJcXHUwMDA4XCIgfHwgY2hhciA9PT0gXCJcXHUwMDdmXCIpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIC0xKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YWx1ZSArPSBjaGFyO1xuXHRcdFx0fTtcblxuXHRcdFx0c3RkaW4ub24oXCJkYXRhXCIsIG9uRGF0YSk7XG5cdFx0fSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJOcG0iLCJzY3JpYmUiLCJGb3JnZUVycm9yIiwiZm9ybWF0VW5rbm93bkVycm9yIiwiUHVibGlzaCIsIm5wbSIsImxvZ2dlciIsIm5hbWUiLCJ3b3Jrc3BhY2UiLCJydW4iLCJvcHRpb25zIiwicHJvamVjdHMiLCJnZXRQcm9qZWN0cyIsImNvbmZpZ3VyYXRpb24iLCJ0b2tlbiIsInJlc29sdmVUb2tlbiIsIm90cCIsInJlc29sdmVPdHAiLCJsZW5ndGgiLCJwdWJsaXNoUmVzcG9uc2VzIiwicHVibGlzaFByb2plY3RzIiwiZmFpbGVkIiwiZmlsdGVyIiwiciIsInN1Y2NlZWRlZCIsIkVycm9yIiwiU3VjY2VzcyIsIlByb21pc2UiLCJhbGwiLCJwcm9qZWN0IiwiaXNQcml2YXRlIiwiaW5mbyIsIm1hcCIsInB1Ymxpc2hQcm9qZWN0IiwiY2hhbm5lbCIsImRyeVJ1biIsIm91dERpciIsImdldE91dERpciIsInJlc3BvbnNlIiwicHVibGlzaCIsImF1dGhUb2tlbiIsInNraXBJZlB1Ymxpc2hlZCIsInBhY2thZ2VOYW1lIiwiZGF0YSIsImpvaW4iLCJ0cmFjZSIsIm1lc3NhZ2UiLCJwcm9qZWN0TmFtZSIsInJlYXNvbiIsImVycm9yIiwidHJpbSIsInByb21wdEF1dGgiLCJwcm9tcHRTZWNyZXQiLCJ1bmRlZmluZWQiLCJwcm9tcHRPdHAiLCJsYWJlbCIsInByb2Nlc3MiLCJzdGRpbiIsImlzVFRZIiwic3Rkb3V0Iiwid3JpdGUiLCJzZXRFbmNvZGluZyIsInJlc3VtZSIsInNldFJhd01vZGUiLCJ2YWx1ZSIsInJlc29sdmUiLCJyZWplY3QiLCJjbGVhbnVwIiwicGF1c2UiLCJyZW1vdmVMaXN0ZW5lciIsIm9uRGF0YSIsImNodW5rIiwiY2hhciIsInNsaWNlIiwib24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLFNBQVNBLFVBQVUsUUFBUSxnQ0FBZ0M7QUFFM0QsOENBQThDO0FBQzlDLFNBQVNDLFNBQVMsUUFBUSxpQkFBaUI7QUFFM0MsU0FBU0MsY0FBYyxRQUFRLHNCQUFzQjtBQUNyRCxTQUFTQyxHQUFHLFFBQVEsMEJBQTBCO0FBQzlDLFNBQVNDLE1BQU0sUUFBUSxtQkFBbUI7QUFDMUMsU0FBU0MsVUFBVSxFQUFFQyxrQkFBa0IsUUFBUSxlQUFlO0FBbUI5RCxPQUFPLE1BQU1DOztJQUNaLG9DQUFvQztJQUNuQkMsTUFBTSxJQUFJTCxNQUFNO0lBQ2pDLENBQUEsTUFBTyxHQUFHQyxPQUFPSyxNQUFNLENBQUNGLFFBQVFHLElBQUksRUFBRTtJQUV0QyxZQUFtQixBQUFpQkMsU0FBb0IsQ0FBRTthQUF0QkEsWUFBQUE7SUFBdUI7SUFFM0QsTUFBYUMsSUFBSUMsT0FBdUIsRUFBNEM7UUFDbkYsTUFBTUMsV0FBVyxJQUFJLENBQUNILFNBQVMsQ0FBQ0ksV0FBVyxDQUFDRixRQUFRRyxhQUFhO1FBQ2pFLE1BQU1DLFFBQVEsTUFBTSxJQUFJLENBQUNDLFlBQVksQ0FBQ0w7UUFDdEMsTUFBTU0sTUFBTSxNQUFNLElBQUksQ0FBQ0MsVUFBVSxDQUFDUDtRQUVsQyxJQUFJQyxTQUFTTyxNQUFNLEtBQUssR0FBRztZQUMxQixNQUFNLElBQUloQixXQUFXLENBQUMsNEJBQTRCLENBQUM7UUFDcEQ7UUFDQSxNQUFNaUIsbUJBQW1CLE1BQU0sSUFBSSxDQUFDQyxlQUFlLENBQUNULFVBQVU7WUFDN0QsR0FBR0QsT0FBTztZQUNWSTtZQUNBRTtRQUNEO1FBQ0EsTUFBTUssU0FBU0YsaUJBQWlCRyxNQUFNLENBQUMsQ0FBQ0MsSUFBTSxDQUFDQSxFQUFFQyxTQUFTO1FBQzFELElBQUlILE9BQU9ILE1BQU0sRUFBRTtZQUNsQixPQUFPbkIsZUFBZTBCLEtBQUssQ0FBQ3JCLFFBQVFHLElBQUksRUFBRVk7UUFDM0M7UUFDQSxPQUFPcEIsZUFBZTJCLE9BQU8sQ0FBQ3RCLFFBQVFHLElBQUksRUFBRVk7SUFDN0M7SUFFQSxNQUFhQyxnQkFBZ0JULFFBQTRCLEVBQUVELE9BQXVCLEVBQUU7UUFDbkYsT0FBTyxNQUFNaUIsUUFBUUMsR0FBRyxDQUN2QmpCLFNBQ0VXLE1BQU0sQ0FBQyxDQUFDTztZQUNSLElBQUlBLFFBQVFDLFNBQVMsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLENBQUEsTUFBTyxDQUFDQyxJQUFJLENBQUMsQ0FBQywwQkFBMEIsRUFBRUYsUUFBUXRCLElBQUksRUFBRTtnQkFDN0QsT0FBTztZQUNSO1lBQ0EsT0FBTztRQUNSLEdBQ0N5QixHQUFHLENBQUMsT0FBT0gsVUFBWSxNQUFNLElBQUksQ0FBQ0ksY0FBYyxDQUFDSixTQUFTbkI7SUFFOUQ7SUFFQSxNQUFjdUIsZUFDYkosT0FBZ0IsRUFDaEJuQixPQUF1QixFQUNJO1FBQzNCLE1BQU0sRUFBRXdCLE9BQU8sRUFBRUMsTUFBTSxFQUFFckIsS0FBSyxFQUFFRSxHQUFHLEVBQUUsR0FBR047UUFDeEMsTUFBTTBCLFNBQVNQLFFBQVFRLFNBQVM7UUFDaEMsSUFBSSxDQUFDLENBQUEsTUFBTyxDQUFDTixJQUFJLENBQUMsR0FBR0ksU0FBUyxlQUFlLEdBQUcsV0FBVyxFQUFFTixRQUFRdEIsSUFBSSxFQUFFO1FBRTNFLElBQUk7WUFDSCxNQUFNK0IsV0FBVyxNQUFNLElBQUksQ0FBQ2pDLEdBQUcsQ0FBQ2tDLE9BQU8sQ0FBQ0gsUUFBUTtnQkFDL0NGO2dCQUNBQztnQkFDQUssV0FBVzFCO2dCQUNYRTtnQkFDQXlCLGlCQUFpQjtZQUNsQjtZQUVBLE1BQU1DLGNBQWNKLFNBQVNLLElBQUksRUFBRUMsS0FBSztZQUN4QyxJQUFJLENBQUMsQ0FBQSxNQUFPLENBQUNDLEtBQUssQ0FBQyxHQUFHaEIsUUFBUXRCLElBQUksQ0FBQyxHQUFHLEVBQUVtQyxlQUFlSixTQUFTUSxPQUFPLEVBQUU7WUFDekUsT0FBTztnQkFDTkMsYUFBYWxCLFFBQVF0QixJQUFJO2dCQUN6QmlCLFdBQVc7Z0JBQ1hzQixTQUFTUixTQUFTUSxPQUFPO2dCQUN6Qko7WUFDRDtRQUNELEVBQUUsT0FBT00sUUFBUTtZQUNoQixNQUFNRixVQUFVM0MsbUJBQW1CNkM7WUFDbkMsT0FBTztnQkFDTkQsYUFBYWxCLFFBQVF0QixJQUFJO2dCQUN6QmlCLFdBQVc7Z0JBQ1hzQjtnQkFDQUcsT0FBTyxHQUFHcEIsUUFBUXRCLElBQUksQ0FBQyxFQUFFLEVBQUV1QyxTQUFTO1lBQ3JDO1FBQ0Q7SUFDRDtJQUVBLE1BQWMvQixhQUFhTCxPQUF1QixFQUErQjtRQUNoRixJQUFJQSxRQUFRSSxLQUFLLEVBQUVvQyxRQUFRO1lBQzFCLE9BQU94QyxRQUFRSSxLQUFLLENBQUNvQyxJQUFJO1FBQzFCO1FBRUEsSUFBSXhDLFFBQVF5QyxVQUFVLEVBQUU7WUFDdkIsT0FBTyxNQUFNLElBQUksQ0FBQ0MsWUFBWSxDQUFDO1FBQ2hDO1FBRUEsT0FBT0M7SUFDUjtJQUVBLE1BQWNwQyxXQUFXUCxPQUF1QixFQUErQjtRQUM5RSxJQUFJQSxRQUFRTSxHQUFHLEVBQUVrQyxRQUFRO1lBQ3hCLE9BQU94QyxRQUFRTSxHQUFHLENBQUNrQyxJQUFJO1FBQ3hCO1FBRUEsSUFBSXhDLFFBQVF5QyxVQUFVLElBQUl6QyxRQUFRNEMsU0FBUyxFQUFFO1lBQzVDLE9BQU8sTUFBTSxJQUFJLENBQUNGLFlBQVksQ0FBQztRQUNoQztRQUVBLE9BQU9DO0lBQ1I7SUFFQSxNQUFjRCxhQUFhRyxLQUFhLEVBQStCO1FBQ3RFLElBQUksQ0FBQ0MsUUFBUUMsS0FBSyxDQUFDQyxLQUFLLElBQUksQ0FBQ0YsUUFBUUcsTUFBTSxDQUFDRCxLQUFLLEVBQUU7WUFDbEQsTUFBTSxJQUFJeEQsV0FBVyxDQUFDLG1EQUFtRCxDQUFDO1FBQzNFO1FBRUFzRCxRQUFRRyxNQUFNLENBQUNDLEtBQUssQ0FBQ0w7UUFDckIsTUFBTUUsUUFBUUQsUUFBUUMsS0FBSztRQUMzQkEsTUFBTUksV0FBVyxDQUFDO1FBQ2xCSixNQUFNSyxNQUFNO1FBQ1pMLE1BQU1NLFVBQVUsR0FBRztRQUVuQixJQUFJQyxRQUFRO1FBRVosT0FBTyxNQUFNLElBQUlyQyxRQUFnQixDQUFDc0MsU0FBU0M7WUFDMUMsTUFBTUMsVUFBVTtnQkFDZlYsTUFBTU0sVUFBVSxHQUFHO2dCQUNuQk4sTUFBTVcsS0FBSztnQkFDWFgsTUFBTVksY0FBYyxDQUFDLFFBQVFDO2dCQUM3QmQsUUFBUUcsTUFBTSxDQUFDQyxLQUFLLENBQUM7WUFDdEI7WUFFQSxNQUFNVSxTQUFTLENBQUNDO2dCQUNmLE1BQU1DLE9BQU9EO2dCQUNiLElBQUlDLFNBQVMsVUFBVTtvQkFDdEJMO29CQUNBRCxPQUFPLElBQUloRSxXQUFXO29CQUN0QjtnQkFDRDtnQkFFQSxJQUFJc0UsU0FBUyxRQUFRQSxTQUFTLE1BQU07b0JBQ25DTDtvQkFDQUYsUUFBUUQsTUFBTWQsSUFBSTtvQkFDbEI7Z0JBQ0Q7Z0JBRUEsSUFBSXNCLFNBQVMsWUFBWUEsU0FBUyxVQUFVO29CQUMzQ1IsUUFBUUEsTUFBTVMsS0FBSyxDQUFDLEdBQUcsQ0FBQztvQkFDeEI7Z0JBQ0Q7Z0JBRUFULFNBQVNRO1lBQ1Y7WUFFQWYsTUFBTWlCLEVBQUUsQ0FBQyxRQUFRSjtRQUNsQjtJQUNEO0FBQ0QifQ==
@@ -5,8 +5,8 @@ function _ts_decorate(decorators, target, key, desc) {
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  }
7
7
  import { injectable } from "@decohere/crucible/decorators";
8
- import { ActionResponse } from "@decohere/nexus/cli";
9
- import { Pnpm } from "@decohere/nexus/interop";
8
+ import { ActionResponse } from "@decohere/devkit/cli";
9
+ import { Pnpm } from "@decohere/devkit/interop";
10
10
  import { scribe } from "@decohere/scribe";
11
11
  import { formatUnknownError } from "../errors.js";
12
12
  export class SyncLockFile {
@@ -29,5 +29,3 @@ export class SyncLockFile {
29
29
  SyncLockFile = _ts_decorate([
30
30
  injectable()
31
31
  ], SyncLockFile);
32
-
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL3N5bmMtbG9jay1maWxlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBQbnBtIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pbnRlcm9wXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgZm9ybWF0VW5rbm93bkVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuXG5leHBvcnQgdHlwZSBTeW5jTG9ja0ZpbGVPcHRpb25zID0ge1xuXHRzeW5jPzogYm9vbGVhbjtcblx0ZHJ5UnVuPzogYm9vbGVhbjtcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTeW5jTG9ja0ZpbGUgaW1wbGVtZW50cyBBY3Rpb248U3luY0xvY2tGaWxlT3B0aW9ucz4ge1xuXHQjbG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihTeW5jTG9ja0ZpbGUubmFtZSk7XG5cdCNwbnBtID0gbmV3IFBucG0oKTtcblxuXHRwdWJsaWMgYXN5bmMgcnVuKG9wdGlvbnM6IFN5bmNMb2NrRmlsZU9wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdFx0Y29uc3Qgc2hvdWxkU3luYyA9IG9wdGlvbnMuc3luYyA/PyB0cnVlO1xuXG5cdFx0aWYgKG9wdGlvbnMuZHJ5UnVuIHx8ICFzaG91bGRTeW5jKSB7XG5cdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhcblx0XHRcdFx0b3B0aW9ucy5kcnlSdW4gPyBcIltkcnktcnVuXSBTa2lwcGluZyBsb2NrZmlsZSBzeW5jXCIgOiBcIlNraXBwaW5nIGxvY2tmaWxlIHN5bmNcIixcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gQWN0aW9uUmVzcG9uc2UuU2tpcHBlZChTeW5jTG9ja0ZpbGUubmFtZSk7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuI3BucG0uc3luY0xvY2tGaWxlKCk7XG5cdFx0fSBjYXRjaCAocmVhc29uKSB7XG5cdFx0XHRyZXR1cm4gQWN0aW9uUmVzcG9uc2UuRXJyb3IoXG5cdFx0XHRcdFN5bmNMb2NrRmlsZS5uYW1lLFxuXHRcdFx0XHRgRmFpbGVkIHN5bmNpbmcgbG9ja2ZpbGU6ICR7Zm9ybWF0VW5rbm93bkVycm9yKHJlYXNvbil9YCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoU3luY0xvY2tGaWxlLm5hbWUpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0YWJsZSIsIkFjdGlvblJlc3BvbnNlIiwiUG5wbSIsInNjcmliZSIsImZvcm1hdFVua25vd25FcnJvciIsIlN5bmNMb2NrRmlsZSIsImxvZ2dlciIsIm5hbWUiLCJydW4iLCJvcHRpb25zIiwic2hvdWxkU3luYyIsInN5bmMiLCJkcnlSdW4iLCJpbmZvIiwiU2tpcHBlZCIsInN5bmNMb2NrRmlsZSIsInJlYXNvbiIsIkVycm9yIiwiU3VjY2VzcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUUzRCxTQUFTQyxjQUFjLFFBQVEsc0JBQXNCO0FBQ3JELFNBQVNDLElBQUksUUFBUSwwQkFBMEI7QUFDL0MsU0FBU0MsTUFBTSxRQUFRLG1CQUFtQjtBQUMxQyxTQUFTQyxrQkFBa0IsUUFBUSxlQUFlO0FBUWxELE9BQU8sTUFBTUM7SUFDWixDQUFBLE1BQU8sR0FBR0YsT0FBT0csTUFBTSxDQUFDRCxhQUFhRSxJQUFJLEVBQUU7SUFDM0MsQ0FBQSxJQUFLLEdBQUcsSUFBSUwsT0FBTztJQUVuQixNQUFhTSxJQUFJQyxPQUE0QixFQUEyQjtRQUN2RSxNQUFNQyxhQUFhRCxRQUFRRSxJQUFJLElBQUk7UUFFbkMsSUFBSUYsUUFBUUcsTUFBTSxJQUFJLENBQUNGLFlBQVk7WUFDbEMsSUFBSSxDQUFDLENBQUEsTUFBTyxDQUFDRyxJQUFJLENBQ2hCSixRQUFRRyxNQUFNLEdBQUcscUNBQXFDO1lBRXZELE9BQU9YLGVBQWVhLE9BQU8sQ0FBQ1QsYUFBYUUsSUFBSTtRQUNoRDtRQUVBLElBQUk7WUFDSCxNQUFNLElBQUksQ0FBQyxDQUFBLElBQUssQ0FBQ1EsWUFBWTtRQUM5QixFQUFFLE9BQU9DLFFBQVE7WUFDaEIsT0FBT2YsZUFBZWdCLEtBQUssQ0FDMUJaLGFBQWFFLElBQUksRUFDakIsQ0FBQyx5QkFBeUIsRUFBRUgsbUJBQW1CWSxTQUFTO1FBRTFEO1FBRUEsT0FBT2YsZUFBZWlCLE9BQU8sQ0FBQ2IsYUFBYUUsSUFBSTtJQUNoRDtBQUNEIn0=
@@ -8,10 +8,9 @@ function _ts_metadata(k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  }
10
10
  import { injectable } from "@decohere/crucible/decorators";
11
- // biome-ignore lint/style/useImportType: <DI>
12
- import { Workspace } from "@decohere/mesh";
13
- import { ActionResponse } from "@decohere/nexus/cli";
14
- import { Git } from "@decohere/nexus/interop";
11
+ import { Workspace } from "@decohere/workspace";
12
+ import { ActionResponse } from "@decohere/devkit/cli";
13
+ import { Git } from "@decohere/devkit/interop";
15
14
  import { scribe } from "@decohere/scribe";
16
15
  import { ForgeError, formatUnknownError } from "../errors.js";
17
16
  export class Tag {
@@ -38,9 +37,8 @@ export class Tag {
38
37
  const git = new Git();
39
38
  await git.tag(tag);
40
39
  if (options.push) {
41
- const branch = await git.getBranchName();
42
- this.#logger.info(`Pushing branch: ${branch}`);
43
- await git.push(branch);
40
+ // Tag-only: Publish checks out a commit SHA (detached HEAD). Pushing a
41
+ // branch name is wrong there and unnecessary — the version label is the tag.
44
42
  this.#logger.info(`Pushing tag: ${tag}`);
45
43
  await git.pushTag(tag);
46
44
  }
@@ -63,5 +61,3 @@ Tag = _ts_decorate([
63
61
  typeof Workspace === "undefined" ? Object : Workspace
64
62
  ])
65
63
  ], Tag);
66
-
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL3RhZy5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBHaXQgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2ludGVyb3BcIjtcbmltcG9ydCB7IHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBGb3JnZUVycm9yLCBmb3JtYXRVbmtub3duRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFRhZ09wdGlvbnMgPSB7XG5cdHByZWZpeD86IHN0cmluZztcblx0ZHJ5UnVuPzogYm9vbGVhbjtcblx0cHVzaD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWdSZXNwb25zZSA9IHtcblx0dGFnOiBzdHJpbmc7XG5cdHN1Y2NlZWRlZDogYm9vbGVhbjtcblx0ZXJyb3I/OiBzdHJpbmc7XG59O1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGFnIGltcGxlbWVudHMgQWN0aW9uPFRhZ09wdGlvbnM+IHtcblx0I2xvZ2dlciA9IHNjcmliZS5sb2dnZXIoVGFnLm5hbWUpO1xuXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2U6IFdvcmtzcGFjZSkge31cblxuXHRwdWJsaWMgYXN5bmMgcnVuKG9wdGlvbnM6IFRhZ09wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPFRhZ1Jlc3BvbnNlPj4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy53b3Jrc3BhY2UuZ2V0VmVyc2lvbigpO1xuXHRcdFx0Y29uc3QgcHJlZml4ID0gb3B0aW9ucy5wcmVmaXggPz8gXCJ2XCI7XG5cdFx0XHRjb25zdCB0YWcgPSBgJHtwcmVmaXh9JHt2ZXJzaW9ufWA7XG5cblx0XHRcdGlmIChvcHRpb25zLmRyeVJ1bikge1xuXHRcdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhgW2RyeS1ydW5dICR7dGFnfWApO1xuXHRcdFx0XHRyZXR1cm4gQWN0aW9uUmVzcG9uc2UuU3VjY2VzczxUYWdSZXNwb25zZT4oVGFnLm5hbWUsIFt7IHRhZywgc3VjY2VlZGVkOiB0cnVlIH1dKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy4jbG9nZ2VyLmluZm8oYENyZWF0aW5nIHRhZzogJHt0YWd9YCk7XG5cdFx0XHRjb25zdCBnaXQgPSBuZXcgR2l0KCk7XG5cdFx0XHRhd2FpdCBnaXQudGFnKHRhZyk7XG5cblx0XHRcdGlmIChvcHRpb25zLnB1c2gpIHtcblx0XHRcdFx0Y29uc3QgYnJhbmNoID0gYXdhaXQgZ2l0LmdldEJyYW5jaE5hbWUoKTtcblx0XHRcdFx0dGhpcy4jbG9nZ2VyLmluZm8oYFB1c2hpbmcgYnJhbmNoOiAke2JyYW5jaH1gKTtcblx0XHRcdFx0YXdhaXQgZ2l0LnB1c2goYnJhbmNoKTtcblx0XHRcdFx0dGhpcy4jbG9nZ2VyLmluZm8oYFB1c2hpbmcgdGFnOiAke3RhZ31gKTtcblx0XHRcdFx0YXdhaXQgZ2l0LnB1c2hUYWcodGFnKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3M8VGFnUmVzcG9uc2U+KFRhZy5uYW1lLCBbeyB0YWcsIHN1Y2NlZWRlZDogdHJ1ZSB9XSk7XG5cdFx0fSBjYXRjaCAocmVhc29uKSB7XG5cdFx0XHRjb25zdCBlcnJvciA9IGZvcm1hdFVua25vd25FcnJvcihyZWFzb24pO1xuXHRcdFx0dGhyb3cgbmV3IEZvcmdlRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgdGFnOiAke2Vycm9yfWApO1xuXHRcdH1cblx0fVxufVxuIl0sIm5hbWVzIjpbImluamVjdGFibGUiLCJXb3Jrc3BhY2UiLCJBY3Rpb25SZXNwb25zZSIsIkdpdCIsInNjcmliZSIsIkZvcmdlRXJyb3IiLCJmb3JtYXRVbmtub3duRXJyb3IiLCJUYWciLCJsb2dnZXIiLCJuYW1lIiwid29ya3NwYWNlIiwicnVuIiwib3B0aW9ucyIsInZlcnNpb24iLCJnZXRWZXJzaW9uIiwicHJlZml4IiwidGFnIiwiZHJ5UnVuIiwiaW5mbyIsIlN1Y2Nlc3MiLCJzdWNjZWVkZWQiLCJnaXQiLCJwdXNoIiwiYnJhbmNoIiwiZ2V0QnJhbmNoTmFtZSIsInB1c2hUYWciLCJyZWFzb24iLCJlcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUMzRCw4Q0FBOEM7QUFDOUMsU0FBU0MsU0FBUyxRQUFRLGlCQUFpQjtBQUUzQyxTQUFTQyxjQUFjLFFBQVEsc0JBQXNCO0FBQ3JELFNBQVNDLEdBQUcsUUFBUSwwQkFBMEI7QUFDOUMsU0FBU0MsTUFBTSxRQUFRLG1CQUFtQjtBQUMxQyxTQUFTQyxVQUFVLEVBQUVDLGtCQUFrQixRQUFRLGVBQWU7QUFlOUQsT0FBTyxNQUFNQzs7SUFDWixDQUFBLE1BQU8sR0FBR0gsT0FBT0ksTUFBTSxDQUFDRCxJQUFJRSxJQUFJLEVBQUU7SUFDbEMsWUFBbUIsQUFBaUJDLFNBQW9CLENBQUU7YUFBdEJBLFlBQUFBO0lBQXVCO0lBRTNELE1BQWFDLElBQUlDLE9BQW1CLEVBQXdDO1FBQzNFLElBQUk7WUFDSCxNQUFNQyxVQUFVLE1BQU0sSUFBSSxDQUFDSCxTQUFTLENBQUNJLFVBQVU7WUFDL0MsTUFBTUMsU0FBU0gsUUFBUUcsTUFBTSxJQUFJO1lBQ2pDLE1BQU1DLE1BQU0sR0FBR0QsU0FBU0YsU0FBUztZQUVqQyxJQUFJRCxRQUFRSyxNQUFNLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxDQUFBLE1BQU8sQ0FBQ0MsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFRixLQUFLO2dCQUNwQyxPQUFPZCxlQUFlaUIsT0FBTyxDQUFjWixJQUFJRSxJQUFJLEVBQUU7b0JBQUM7d0JBQUVPO3dCQUFLSSxXQUFXO29CQUFLO2lCQUFFO1lBQ2hGO1lBRUEsSUFBSSxDQUFDLENBQUEsTUFBTyxDQUFDRixJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUVGLEtBQUs7WUFDeEMsTUFBTUssTUFBTSxJQUFJbEI7WUFDaEIsTUFBTWtCLElBQUlMLEdBQUcsQ0FBQ0E7WUFFZCxJQUFJSixRQUFRVSxJQUFJLEVBQUU7Z0JBQ2pCLE1BQU1DLFNBQVMsTUFBTUYsSUFBSUcsYUFBYTtnQkFDdEMsSUFBSSxDQUFDLENBQUEsTUFBTyxDQUFDTixJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRUssUUFBUTtnQkFDN0MsTUFBTUYsSUFBSUMsSUFBSSxDQUFDQztnQkFDZixJQUFJLENBQUMsQ0FBQSxNQUFPLENBQUNMLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRUYsS0FBSztnQkFDdkMsTUFBTUssSUFBSUksT0FBTyxDQUFDVDtZQUNuQjtZQUVBLE9BQU9kLGVBQWVpQixPQUFPLENBQWNaLElBQUlFLElBQUksRUFBRTtnQkFBQztvQkFBRU87b0JBQUtJLFdBQVc7Z0JBQUs7YUFBRTtRQUNoRixFQUFFLE9BQU9NLFFBQVE7WUFDaEIsTUFBTUMsUUFBUXJCLG1CQUFtQm9CO1lBQ2pDLE1BQU0sSUFBSXJCLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRXNCLE9BQU87UUFDdEQ7SUFDRDtBQUNEIn0=
@@ -0,0 +1,52 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ import { injectable } from "@decohere/crucible/decorators";
11
+ import { Workspace } from "@decohere/workspace";
12
+ import { ActionResponse } from "@decohere/devkit/cli";
13
+ import { Trace } from "@decohere/devkit/diagnostics";
14
+ import { scribe } from "@decohere/scribe";
15
+ import ts from "typescript";
16
+ import { ForgeError } from "../errors.js";
17
+ import { TypeEmitter } from "../services/type-emitter.js";
18
+ export class TypeCheck {
19
+ workspace;
20
+ typeEmitter;
21
+ #logger = scribe.logger(TypeCheck.name);
22
+ constructor(workspace, typeEmitter){
23
+ this.workspace = workspace;
24
+ this.typeEmitter = typeEmitter;
25
+ }
26
+ run = async (options)=>{
27
+ const projects = this.workspace.getProjects(options.configuration);
28
+ for (const project of projects){
29
+ this.#logger.info(`Type-checking ${project.name}`);
30
+ }
31
+ const { diagnostics, formatted } = await this.typeEmitter.checkProject([
32
+ ...projects
33
+ ]);
34
+ const errors = diagnostics.filter((diagnostic)=>diagnostic.category === ts.DiagnosticCategory.Error);
35
+ if (errors.length > 0) {
36
+ throw new ForgeError(formatted || "Type check failed");
37
+ }
38
+ if (formatted.length > 0) {
39
+ this.#logger.info(formatted);
40
+ }
41
+ return ActionResponse.Success(TypeCheck.name);
42
+ };
43
+ }
44
+ TypeCheck = _ts_decorate([
45
+ Trace,
46
+ injectable(),
47
+ _ts_metadata("design:type", Function),
48
+ _ts_metadata("design:paramtypes", [
49
+ typeof Workspace === "undefined" ? Object : Workspace,
50
+ typeof TypeEmitter === "undefined" ? Object : TypeEmitter
51
+ ])
52
+ ], TypeCheck);
@@ -0,0 +1,59 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import fs from "node:fs/promises";
8
+ import path from "node:path";
9
+ import { injectable } from "@decohere/crucible/decorators";
10
+ import { ActionResponse } from "@decohere/devkit/cli";
11
+ import { scribe } from "@decohere/scribe";
12
+ import { ForgeError } from "../errors.js";
13
+ import { LINK_MANIFEST } from "./link.action.js";
14
+ export class Unlink {
15
+ #logger = scribe.logger(Unlink.name);
16
+ run = async (options)=>{
17
+ const targetDir = path.resolve(options.targetDir);
18
+ const manifestPath = path.join(targetDir, LINK_MANIFEST);
19
+ const manifestStat = await fs.stat(manifestPath).catch(()=>null);
20
+ if (manifestStat == null) {
21
+ throw new ForgeError(`No link manifest found at "${manifestPath}". Nothing to unlink.`);
22
+ }
23
+ const manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
24
+ for (const { packageName, symlinkPath, originalPath } of manifest.links){
25
+ const stat = await fs.lstat(symlinkPath).catch(()=>null);
26
+ if (stat?.isSymbolicLink()) {
27
+ await fs.unlink(symlinkPath);
28
+ this.#logger.trace(`Removed symlink for ${packageName}`);
29
+ }
30
+ if (originalPath != null) {
31
+ const backupStat = await fs.stat(originalPath).catch(()=>null);
32
+ if (backupStat != null) {
33
+ await fs.rename(originalPath, symlinkPath);
34
+ this.#logger.trace(`Restored original dir for ${packageName}`);
35
+ } else {
36
+ // originalPath is a symlink target string — recreate the symlink
37
+ await fs.mkdir(path.dirname(symlinkPath), {
38
+ recursive: true
39
+ });
40
+ await fs.symlink(originalPath, symlinkPath, "dir");
41
+ this.#logger.trace(`Restored original symlink for ${packageName}`);
42
+ }
43
+ }
44
+ this.#logger.info(`Unlinked ${packageName}`);
45
+ }
46
+ await fs.unlink(manifestPath);
47
+ if (manifest.peerNodeModulesDir != null) {
48
+ await fs.rm(manifest.peerNodeModulesDir, {
49
+ recursive: true,
50
+ force: true
51
+ });
52
+ this.#logger.info(`Removed peer node_modules at ${manifest.peerNodeModulesDir}`);
53
+ }
54
+ return ActionResponse.Success(Unlink.name);
55
+ };
56
+ }
57
+ Unlink = _ts_decorate([
58
+ injectable()
59
+ ], Unlink);
@@ -11,11 +11,10 @@ import { execSync } from "node:child_process";
11
11
  import { readdir, readFile } from "node:fs/promises";
12
12
  import { join } from "node:path";
13
13
  import { injectable } from "@decohere/crucible/decorators";
14
- // biome-ignore lint/style/useImportType: <DI>
15
- import { Workspace } from "@decohere/mesh";
16
- import { ActionResponse } from "@decohere/nexus/cli";
17
- import { Git } from "@decohere/nexus/interop";
18
- import { Semver, SemverError, VersionTypes } from "@decohere/nexus/semver";
14
+ import { Workspace } from "@decohere/workspace";
15
+ import { ActionResponse } from "@decohere/devkit/cli";
16
+ import { Git } from "@decohere/devkit/interop";
17
+ import { Semver, SemverError, VersionTypes } from "../semver/index.js";
19
18
  import { scribe } from "@decohere/scribe";
20
19
  import { ForgeError, formatUnknownError } from "../errors.js";
21
20
  export const DefaultChannel = "beta";
@@ -63,9 +62,7 @@ export class Version {
63
62
  }
64
63
  await workspace.persistPackageJson((await workspace.getPackageJson()).withVersion(nextVersion.toString()));
65
64
  const responses = await Promise.all([
66
- ...[
67
- this.updatePackageJson(workspace.name, workspace, nextVersion)
68
- ],
65
+ this.updatePackageJson(workspace.name, workspace, nextVersion),
69
66
  ...projects.map((project)=>this.updatePackageJson(project.name, project, nextVersion))
70
67
  ]);
71
68
  const failed = responses.filter((r)=>!r.succeeded);
@@ -185,5 +182,3 @@ Version = _ts_decorate([
185
182
  typeof Workspace === "undefined" ? Object : Workspace
186
183
  ])
187
184
  ], Version);
188
-
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL3ZlcnNpb24uYWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmVhZGRpciwgcmVhZEZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgSGFzUGFja2FnZUpzb24gfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbi8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL3VzZUltcG9ydFR5cGU6IDxEST5cbmltcG9ydCB7IFdvcmtzcGFjZSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHR5cGUgeyBBY3Rpb24sIFJlc3VsdFN0YXR1cyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBHaXQgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2ludGVyb3BcIjtcbmltcG9ydCB7IFNlbXZlciwgU2VtdmVyRXJyb3IsIHR5cGUgVmVyc2lvblR5cGUsIFZlcnNpb25UeXBlcyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvc2VtdmVyXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgRm9yZ2VFcnJvciwgZm9ybWF0VW5rbm93bkVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuXG5leHBvcnQgdHlwZSBWZXJzaW9uUmVzcG9uc2UgPSBSZXN1bHRTdGF0dXMgJiB7XG5cdG5hbWU6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q2hhbm5lbCA9IFwiYmV0YVwiO1xuZXhwb3J0IGNvbnN0IERlZmF1bHRSZWxlYXNlVHlwZSA9IFZlcnNpb25UeXBlcy5wcmVyZWxlYXNlO1xuXG5leHBvcnQgdHlwZSBWZXJzaW9uT3B0aW9ucyA9IHtcblx0cmVsZWFzZVR5cGU/OiBWZXJzaW9uVHlwZTtcblx0Y2hhbm5lbD86IHN0cmluZztcblx0dmVyc2lvbj86IHN0cmluZztcblx0ZHJ5UnVuPzogYm9vbGVhbjtcblx0Y29tbWl0PzogYm9vbGVhbjtcblx0bWVzc2FnZT86IHN0cmluZztcblx0LyoqIFJlYWQgcGVuZGluZyAuY2hhbmdlc2V0IGVudHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBoaWdoZXN0IGJ1bXAgdHlwZSAqL1xuXHRmcm9tQ2hhbmdlc2V0cz86IGJvb2xlYW47XG59O1xuXG5jb25zdCBEZWZhdWx0VmVyc2lvbk9wdGlvbnM6IFZlcnNpb25PcHRpb25zID0ge1xuXHRyZWxlYXNlVHlwZTogRGVmYXVsdFJlbGVhc2VUeXBlLFxuXHRjaGFubmVsOiBEZWZhdWx0Q2hhbm5lbCxcblx0ZHJ5UnVuOiBmYWxzZSxcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBWZXJzaW9uIGltcGxlbWVudHMgQWN0aW9uPFZlcnNpb25PcHRpb25zPiB7XG5cdCNsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFZlcnNpb24ubmFtZSk7XG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHdvcmtzcGFjZTogV29ya3NwYWNlKSB7fVxuXHRwdWJsaWMgYXN5bmMgcnVuKG9wdGlvbnM6IFZlcnNpb25PcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy52ZXJzaW9uKHRoaXMud29ya3NwYWNlLCBvcHRpb25zKTtcblx0XHRjb25zdCBtZXNzYWdlcyA9IHJlc3BvbnNlLmRhdGFcblx0XHRcdC5mbGF0TWFwKChkKSA9PiAoIWQuc3VjY2VlZGVkICYmIGQuZXJyb3IgPyBbZC5lcnJvcl0gOiBbXSkpXG5cdFx0XHQuam9pbihcIlxcblwiKTtcblx0XHRpZiAobWVzc2FnZXMpIHtcblx0XHRcdHRocm93IG5ldyBGb3JnZUVycm9yKGBUaGVyZSB3YXMgYW4gZXJyb3IgdmVyc2lvbmluZyB0aGUgd29ya3NwYWNlICR7bWVzc2FnZXN9YCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3BvbnNlO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHZlcnNpb24oXG5cdFx0d29ya3NwYWNlOiBXb3Jrc3BhY2UsXG5cdFx0b3B0aW9uczogVmVyc2lvbk9wdGlvbnMgPSBEZWZhdWx0VmVyc2lvbk9wdGlvbnMsXG5cdCk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U8VmVyc2lvblJlc3BvbnNlPj4ge1xuXHRcdGNvbnN0IHByb2plY3RzID0gd29ya3NwYWNlLmdldFByb2plY3RzKFwiZGVidWdcIik7XG5cdFx0Y29uc3Qgcm9vdFZlcnNpb24gPSBhd2FpdCB0aGlzLnJlc29sdmVCYXNlVmVyc2lvbih3b3Jrc3BhY2UsIG9wdGlvbnMpO1xuXHRcdGNvbnN0IHJlbGVhc2VUeXBlID0gb3B0aW9ucy5mcm9tQ2hhbmdlc2V0c1xuXHRcdFx0PyBhd2FpdCB0aGlzLnJlc29sdmVSZWxlYXNlVHlwZUZyb21DaGFuZ2VzZXRzKClcblx0XHRcdDogKG9wdGlvbnMucmVsZWFzZVR5cGUgPz8gRGVmYXVsdFJlbGVhc2VUeXBlKTtcblx0XHRjb25zdCBjaGFubmVsID0gb3B0aW9ucy5jaGFubmVsID8/IERlZmF1bHRDaGFubmVsO1xuXHRcdGNvbnN0IG5leHRWZXJzaW9uID0gdGhpcy5nZXROZXh0VmVyc2lvbihyb290VmVyc2lvbiwgcmVsZWFzZVR5cGUsIGNoYW5uZWwpO1xuXHRcdHRoaXMuI2xvZ2dlci5pbmZvKGAke3Jvb3RWZXJzaW9ufSDihpIgJHtuZXh0VmVyc2lvbn0gWyR7cmVsZWFzZVR5cGV9XWApO1xuXG5cdFx0aWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG5cdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhcblx0XHRcdFx0YFtkcnktcnVuXSBXb3VsZCBidW1wIGFsbCBwYWNrYWdlcyB0byAke25leHRWZXJzaW9ufSDigJQgc2tpcHBpbmcgZmlsZSB3cml0ZXNgLFxuXHRcdFx0KTtcblx0XHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5TdWNjZXNzKFZlcnNpb24ubmFtZSwgW1xuXHRcdFx0XHR7IG5hbWU6IHdvcmtzcGFjZS5uYW1lLCBzdWNjZWVkZWQ6IHRydWUgfSxcblx0XHRcdFx0Li4ucHJvamVjdHMubWFwKChwKSA9PiAoeyBuYW1lOiBwLm5hbWUsIHN1Y2NlZWRlZDogdHJ1ZSB9KSksXG5cdFx0XHRdKTtcblx0XHR9XG5cblx0XHRhd2FpdCB3b3Jrc3BhY2UucGVyc2lzdFBhY2thZ2VKc29uKFxuXHRcdFx0KGF3YWl0IHdvcmtzcGFjZS5nZXRQYWNrYWdlSnNvbigpKS53aXRoVmVyc2lvbihuZXh0VmVyc2lvbi50b1N0cmluZygpKSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgcmVzcG9uc2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuXHRcdFx0Li4uW3RoaXMudXBkYXRlUGFja2FnZUpzb24od29ya3NwYWNlLm5hbWUsIHdvcmtzcGFjZSwgbmV4dFZlcnNpb24pXSxcblx0XHRcdC4uLnByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gdGhpcy51cGRhdGVQYWNrYWdlSnNvbihwcm9qZWN0Lm5hbWUsIHByb2plY3QsIG5leHRWZXJzaW9uKSksXG5cdFx0XSk7XG5cdFx0Y29uc3QgZmFpbGVkID0gcmVzcG9uc2VzLmZpbHRlcigocikgPT4gIXIuc3VjY2VlZGVkKTtcblx0XHRpZiAoZmFpbGVkLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLkVycm9yKFZlcnNpb24ubmFtZSwgcmVzcG9uc2VzKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5jb21taXQpIHtcblx0XHRcdGNvbnN0IGZpbGVzID0gW3dvcmtzcGFjZS5wYWNrYWdlSnNvblBhdGgsIC4uLnByb2plY3RzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpXTtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2UgPz8gYGNob3JlOiB2ZXJzaW9uIHBhY2thZ2VzICR7bmV4dFZlcnNpb259YDtcblx0XHRcdHRoaXMuI2xvZ2dlci5pbmZvKGBDb21taXR0aW5nOiAke21lc3NhZ2V9YCk7XG5cdFx0XHRhd2FpdCBuZXcgR2l0KCkuY29tbWl0KG1lc3NhZ2UsIHsgZmlsZXMgfSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoVmVyc2lvbi5uYW1lLCByZXNwb25zZXMpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyByZXNvbHZlQmFzZVZlcnNpb24oXG5cdFx0d29ya3NwYWNlOiBXb3Jrc3BhY2UsXG5cdFx0b3B0aW9uczogVmVyc2lvbk9wdGlvbnMsXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0aWYgKG9wdGlvbnMudmVyc2lvbiAhPSBudWxsICYmIG9wdGlvbnMudmVyc2lvbi50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMudmVyc2lvbi50cmltKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZ2l0VGFnVmVyc2lvbiA9IHRoaXMucmVzb2x2ZVZlcnNpb25Gcm9tR2l0VGFnKCk7XG5cdFx0aWYgKGdpdFRhZ1ZlcnNpb24gIT0gbnVsbCkge1xuXHRcdFx0dGhpcy4jbG9nZ2VyLmluZm8oYFVzaW5nIGxhdGVzdCBnaXQgdGFnIHZlcnNpb24gYXMgYmFzZTogJHtnaXRUYWdWZXJzaW9ufWApO1xuXHRcdFx0cmV0dXJuIGdpdFRhZ1ZlcnNpb247XG5cdFx0fVxuXG5cdFx0Y29uc3Qgd29ya3NwYWNlVmVyc2lvbiA9IGF3YWl0IHdvcmtzcGFjZS5nZXRWZXJzaW9uKCk7XG5cdFx0dGhpcy4jbG9nZ2VyLmluZm8oXG5cdFx0XHRgTm8gc2VtdmVyIGdpdCB0YWdzIGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gd29ya3NwYWNlIHBhY2thZ2UuanNvbiB2ZXJzaW9uOiAke3dvcmtzcGFjZVZlcnNpb259YCxcblx0XHQpO1xuXHRcdHJldHVybiB3b3Jrc3BhY2VWZXJzaW9uO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlVmVyc2lvbkZyb21HaXRUYWcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdGFncyA9IGV4ZWNTeW5jKCdnaXQgdGFnIC0tbGlzdCBcInYqXCIgLS1zb3J0PS12ZXJzaW9uOnJlZm5hbWUnLCB7XG5cdFx0XHRcdGVuY29kaW5nOiBcInV0ZjhcIixcblx0XHRcdH0pXG5cdFx0XHRcdC50cmltKClcblx0XHRcdFx0LnNwbGl0KFwiXFxuXCIpXG5cdFx0XHRcdC5maWx0ZXIoQm9vbGVhbik7XG5cblx0XHRcdGlmICh0YWdzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGFnc1swXS5yZXBsYWNlKC9edi8sIFwiXCIpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVhZHMgYWxsIHBlbmRpbmcgLmNoYW5nZXNldC8qLm1kIGVudHJpZXMgYW5kIHJldHVybnMgdGhlIGhpZ2hlc3QgYnVtcCB0eXBlXG5cdCAqIGZvdW5kIGFjcm9zcyBhbGwgb2YgdGhlbS4gUHJlY2VkZW5jZTogbWFqb3IgPiBtaW5vciA+IHBhdGNoLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyByZXNvbHZlUmVsZWFzZVR5cGVGcm9tQ2hhbmdlc2V0cygpOiBQcm9taXNlPFZlcnNpb25UeXBlPiB7XG5cdFx0Y29uc3QgY2hhbmdlc2V0RGlyID0gam9pbihwcm9jZXNzLmN3ZCgpLCBcIi5jaGFuZ2VzZXRcIik7XG5cdFx0bGV0IGVudHJpZXM6IHN0cmluZ1tdO1xuXHRcdHRyeSB7XG5cdFx0XHRlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihjaGFuZ2VzZXREaXIpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0dGhyb3cgbmV3IEZvcmdlRXJyb3IoXG5cdFx0XHRcdFwiTm8gLmNoYW5nZXNldCBkaXJlY3RvcnkgZm91bmQuIFJ1biBgcG5wbSBjaGFuZ2VzZXRgIHRvIGNyZWF0ZSBhbiBlbnRyeS5cIixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmlsZXMgPSBlbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5lbmRzV2l0aChcIi5tZFwiKSAmJiBlICE9PSBcIlJFQURNRS5tZFwiKTtcblx0XHRpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgRm9yZ2VFcnJvcihcblx0XHRcdFx0XCJObyBwZW5kaW5nIGNoYW5nZXNldCBlbnRyaWVzIGZvdW5kIGluIC5jaGFuZ2VzZXQvLiBSdW4gYHBucG0gY2hhbmdlc2V0YCB0byBjcmVhdGUgb25lLlwiLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBwcmVjZWRlbmNlOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0geyBtYWpvcjogMywgbWlub3I6IDIsIHBhdGNoOiAxLCBwcmVyZWxlYXNlOiAwIH07XG5cdFx0bGV0IG1heFR5cGU6IFZlcnNpb25UeXBlID0gVmVyc2lvblR5cGVzLnBhdGNoO1xuXHRcdGxldCBtYXhQcmVjZWRlbmNlID0gMDtcblxuXHRcdGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuXHRcdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oY2hhbmdlc2V0RGlyLCBmaWxlKSwgXCJ1dGY4XCIpO1xuXHRcdFx0Y29uc3QgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eLS0tXFxuKFtcXHNcXFNdKj8pXFxuLS0tLyk7XG5cdFx0XHRpZiAoIW1hdGNoKSBjb250aW51ZTtcblx0XHRcdGZvciAoY29uc3QgbGluZSBvZiBtYXRjaFsxXS5zcGxpdChcIlxcblwiKSkge1xuXHRcdFx0XHRjb25zdCBidW1wVHlwZSA9IGxpbmUubWF0Y2goL15cIlteXCJdK1wiXFxzKjpcXHMqKFxcdyspLyk/LlsxXSBhcyBWZXJzaW9uVHlwZSB8IHVuZGVmaW5lZDtcblx0XHRcdFx0Y29uc3QgcCA9IGJ1bXBUeXBlICE9IG51bGwgPyAocHJlY2VkZW5jZVtidW1wVHlwZV0gPz8gLTEpIDogLTE7XG5cdFx0XHRcdGlmIChwID4gbWF4UHJlY2VkZW5jZSkge1xuXHRcdFx0XHRcdG1heFR5cGUgPSBidW1wVHlwZSBhcyBWZXJzaW9uVHlwZTtcblx0XHRcdFx0XHRtYXhQcmVjZWRlbmNlID0gcDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuI2xvZ2dlci5pbmZvKGBSZXNvbHZlZCByZWxlYXNlIHR5cGUgZnJvbSAke2ZpbGVzLmxlbmd0aH0gY2hhbmdlc2V0KHMpOiAke21heFR5cGV9YCk7XG5cdFx0cmV0dXJuIG1heFR5cGU7XG5cdH1cblxuXHRwcml2YXRlIGdldE5leHRWZXJzaW9uKFxuXHRcdGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcsXG5cdFx0dmVyc2lvblR5cGU6IFZlcnNpb25UeXBlLFxuXHRcdHByZWlkOiBzdHJpbmcsXG5cdCk6IFNlbXZlciB7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBuZXcgU2VtdmVyKGN1cnJlbnRWZXJzaW9uKS5pbmNyZW1lbnQodmVyc2lvblR5cGUsIHByZWlkKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgU2VtdmVyRXJyb3IpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEZvcmdlRXJyb3IoZXJyb3IubWVzc2FnZSk7XG5cdFx0XHR9XG5cblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgdXBkYXRlUGFja2FnZUpzb24oXG5cdFx0bmFtZTogc3RyaW5nLFxuXHRcdGhhc0pzb246IEhhc1BhY2thZ2VKc29uLFxuXHRcdHZlcnNpb246IFNlbXZlcixcblx0KTogUHJvbWlzZTxWZXJzaW9uUmVzcG9uc2U+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCBoYXNKc29uLmdldFBhY2thZ2VKc29uKCk7XG5cdFx0XHRhd2FpdCBoYXNKc29uLnBlcnNpc3RQYWNrYWdlSnNvbihwYWNrYWdlSnNvbi53aXRoVmVyc2lvbih2ZXJzaW9uLnRvU3RyaW5nKCkpKTtcblx0XHRcdHRoaXMuI2xvZ2dlci50cmFjZShuYW1lKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHN1Y2NlZWRlZDogdHJ1ZSxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAocmVhc29uKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRzdWNjZWVkZWQ6IGZhbHNlLFxuXHRcdFx0XHRlcnJvcjogYCR7bmFtZX06ICR7Zm9ybWF0VW5rbm93bkVycm9yKHJlYXNvbil9YCxcblx0XHRcdH07XG5cdFx0fVxuXHR9XG59XG4iXSwibmFtZXMiOlsiZXhlY1N5bmMiLCJyZWFkZGlyIiwicmVhZEZpbGUiLCJqb2luIiwiaW5qZWN0YWJsZSIsIldvcmtzcGFjZSIsIkFjdGlvblJlc3BvbnNlIiwiR2l0IiwiU2VtdmVyIiwiU2VtdmVyRXJyb3IiLCJWZXJzaW9uVHlwZXMiLCJzY3JpYmUiLCJGb3JnZUVycm9yIiwiZm9ybWF0VW5rbm93bkVycm9yIiwiRGVmYXVsdENoYW5uZWwiLCJEZWZhdWx0UmVsZWFzZVR5cGUiLCJwcmVyZWxlYXNlIiwiRGVmYXVsdFZlcnNpb25PcHRpb25zIiwicmVsZWFzZVR5cGUiLCJjaGFubmVsIiwiZHJ5UnVuIiwiVmVyc2lvbiIsImxvZ2dlciIsIm5hbWUiLCJ3b3Jrc3BhY2UiLCJydW4iLCJvcHRpb25zIiwicmVzcG9uc2UiLCJ2ZXJzaW9uIiwibWVzc2FnZXMiLCJkYXRhIiwiZmxhdE1hcCIsImQiLCJzdWNjZWVkZWQiLCJlcnJvciIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJyb290VmVyc2lvbiIsInJlc29sdmVCYXNlVmVyc2lvbiIsImZyb21DaGFuZ2VzZXRzIiwicmVzb2x2ZVJlbGVhc2VUeXBlRnJvbUNoYW5nZXNldHMiLCJuZXh0VmVyc2lvbiIsImdldE5leHRWZXJzaW9uIiwiaW5mbyIsIlN1Y2Nlc3MiLCJtYXAiLCJwIiwicGVyc2lzdFBhY2thZ2VKc29uIiwiZ2V0UGFja2FnZUpzb24iLCJ3aXRoVmVyc2lvbiIsInRvU3RyaW5nIiwicmVzcG9uc2VzIiwiUHJvbWlzZSIsImFsbCIsInVwZGF0ZVBhY2thZ2VKc29uIiwicHJvamVjdCIsImZhaWxlZCIsImZpbHRlciIsInIiLCJsZW5ndGgiLCJFcnJvciIsImNvbW1pdCIsImZpbGVzIiwicGFja2FnZUpzb25QYXRoIiwibWVzc2FnZSIsInRyaW0iLCJnaXRUYWdWZXJzaW9uIiwicmVzb2x2ZVZlcnNpb25Gcm9tR2l0VGFnIiwid29ya3NwYWNlVmVyc2lvbiIsImdldFZlcnNpb24iLCJ0YWdzIiwiZW5jb2RpbmciLCJzcGxpdCIsIkJvb2xlYW4iLCJ1bmRlZmluZWQiLCJyZXBsYWNlIiwiY2hhbmdlc2V0RGlyIiwicHJvY2VzcyIsImN3ZCIsImVudHJpZXMiLCJlIiwiZW5kc1dpdGgiLCJwcmVjZWRlbmNlIiwibWFqb3IiLCJtaW5vciIsInBhdGNoIiwibWF4VHlwZSIsIm1heFByZWNlZGVuY2UiLCJmaWxlIiwiY29udGVudCIsIm1hdGNoIiwibGluZSIsImJ1bXBUeXBlIiwiY3VycmVudFZlcnNpb24iLCJ2ZXJzaW9uVHlwZSIsInByZWlkIiwiaW5jcmVtZW50IiwiaGFzSnNvbiIsInBhY2thZ2VKc29uIiwidHJhY2UiLCJyZWFzb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLFNBQVNBLFFBQVEsUUFBUSxxQkFBcUI7QUFDOUMsU0FBU0MsT0FBTyxFQUFFQyxRQUFRLFFBQVEsbUJBQW1CO0FBQ3JELFNBQVNDLElBQUksUUFBUSxZQUFZO0FBQ2pDLFNBQVNDLFVBQVUsUUFBUSxnQ0FBZ0M7QUFFM0Qs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
@@ -8,9 +8,8 @@ function _ts_metadata(k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  }
10
10
  import { injectable } from "@decohere/crucible/decorators";
11
- // biome-ignore lint/style/useImportType: <DI>
12
- import { Workspace } from "@decohere/mesh";
13
- import { ActionResponse } from "@decohere/nexus/cli";
11
+ import { Workspace } from "@decohere/workspace";
12
+ import { ActionResponse } from "@decohere/devkit/cli";
14
13
  import { scribe } from "@decohere/scribe";
15
14
  export class Watch {
16
15
  workspace;
@@ -38,5 +37,3 @@ Watch = _ts_decorate([
38
37
  typeof Workspace === "undefined" ? Object : Workspace
39
38
  ])
40
39
  ], Watch);
41
-
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL3dhdGNoLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IEFjdGlvblJlc3BvbnNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5cbmV4cG9ydCB0eXBlIFdhdGNoT3B0aW9ucyA9IHtcblx0d2F0Y2g6IGJvb2xlYW47XG5cdGNvbmZpZ3VyYXRpb246IHN0cmluZztcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXYXRjaCBpbXBsZW1lbnRzIEFjdGlvbjxXYXRjaE9wdGlvbnM+IHtcblx0I2xvZ2dlciA9IHNjcmliZS5sb2dnZXIoV2F0Y2gubmFtZSk7XG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHdvcmtzcGFjZTogV29ya3NwYWNlKSB7fVxuXG5cdHB1YmxpYyBydW4gPSBhc3luYyAob3B0aW9uczogV2F0Y2hPcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4gPT4ge1xuXHRcdGlmICghb3B0aW9ucy53YXRjaCkge1xuXHRcdFx0dGhpcy4jbG9nZ2VyLmluZm8oYFNraXBwaW5nICR7V2F0Y2gubmFtZX1gKTtcblx0XHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5Ta2lwcGVkKFdhdGNoLm5hbWUpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMud29ya3NwYWNlLndhdGNoKG9wdGlvbnMuY29uZmlndXJhdGlvbik7XG5cdFx0dGhpcy4jbG9nZ2VyLmluZm8oYFN0YXJ0aW5nIHdhdGNoYCk7XG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLkJsb2NraW5nKFdhdGNoLm5hbWUpO1xuXHR9O1xuXG5cdHB1YmxpYyBbU3ltYm9sLmRpc3Bvc2VdKCkge1xuXHRcdHRoaXMud29ya3NwYWNlLnN0b3BXYXRjaGluZygpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0YWJsZSIsIldvcmtzcGFjZSIsIkFjdGlvblJlc3BvbnNlIiwic2NyaWJlIiwiV2F0Y2giLCJsb2dnZXIiLCJuYW1lIiwid29ya3NwYWNlIiwicnVuIiwib3B0aW9ucyIsIndhdGNoIiwiaW5mbyIsIlNraXBwZWQiLCJjb25maWd1cmF0aW9uIiwiQmxvY2tpbmciLCJTeW1ib2wiLCJkaXNwb3NlIiwic3RvcFdhdGNoaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxTQUFTQSxVQUFVLFFBQVEsZ0NBQWdDO0FBQzNELDhDQUE4QztBQUM5QyxTQUFTQyxTQUFTLFFBQVEsaUJBQWlCO0FBRTNDLFNBQVNDLGNBQWMsUUFBUSxzQkFBc0I7QUFDckQsU0FBU0MsTUFBTSxRQUFRLG1CQUFtQjtBQVExQyxPQUFPLE1BQU1DOztJQUNaLENBQUEsTUFBTyxHQUFHRCxPQUFPRSxNQUFNLENBQUNELE1BQU1FLElBQUksRUFBRTtJQUNwQyxZQUFtQixBQUFpQkMsU0FBb0IsQ0FBRTthQUF0QkEsWUFBQUE7SUFBdUI7SUFFcERDLE1BQU0sT0FBT0M7UUFDbkIsSUFBSSxDQUFDQSxRQUFRQyxLQUFLLEVBQUU7WUFDbkIsSUFBSSxDQUFDLENBQUEsTUFBTyxDQUFDQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUVQLE1BQU1FLElBQUksRUFBRTtZQUMxQyxPQUFPSixlQUFlVSxPQUFPLENBQUNSLE1BQU1FLElBQUk7UUFDekM7UUFFQSxNQUFNLElBQUksQ0FBQ0MsU0FBUyxDQUFDRyxLQUFLLENBQUNELFFBQVFJLGFBQWE7UUFDaEQsSUFBSSxDQUFDLENBQUEsTUFBTyxDQUFDRixJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDbEMsT0FBT1QsZUFBZVksUUFBUSxDQUFDVixNQUFNRSxJQUFJO0lBQzFDLEVBQUU7SUFFSyxDQUFDUyxPQUFPQyxPQUFPLENBQUMsR0FBRztRQUN6QixJQUFJLENBQUNULFNBQVMsQ0FBQ1UsWUFBWTtJQUM1QjtBQUNEIn0=