@askrjs/cli 0.0.2 → 0.0.3

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 (96) hide show
  1. package/README.md +9 -7
  2. package/dist/add.js +554 -1
  3. package/dist/add.js.map +1 -0
  4. package/dist/cli.js +43 -14
  5. package/dist/cli.js.map +1 -1
  6. package/dist/discovery-Difb7Y4G.js +325 -0
  7. package/dist/discovery-Difb7Y4G.js.map +1 -0
  8. package/dist/generate.js +396 -0
  9. package/dist/generate.js.map +1 -0
  10. package/dist/openapi.js +5 -4
  11. package/dist/openapi.js.map +1 -1
  12. package/dist/planner-VAj7qlxr.js +287 -0
  13. package/dist/planner-VAj7qlxr.js.map +1 -0
  14. package/dist/range-YUs9eimn.js +127 -0
  15. package/dist/range-YUs9eimn.js.map +1 -0
  16. package/dist/registry-CyrRHRG5.js +211 -0
  17. package/dist/registry-CyrRHRG5.js.map +1 -0
  18. package/dist/skills/askr-dashboard-charts/SKILL.md +61 -44
  19. package/dist/skills/askr-dashboard-charts/agents/openai.yaml +2 -2
  20. package/dist/specification-DXnDOC-0.js +51 -0
  21. package/dist/specification-DXnDOC-0.js.map +1 -0
  22. package/dist/templates/full-stack/AGENTS.md +0 -1
  23. package/dist/templates/full-stack/README.md +0 -1
  24. package/dist/templates/full-stack/index.html +0 -1
  25. package/dist/templates/full-stack/package.json +4 -2
  26. package/dist/templates/full-stack/server.ts +5 -9
  27. package/dist/templates/full-stack/src/action-authorizations.ts +2 -2
  28. package/dist/templates/full-stack/src/actions/create-message.ts +5 -5
  29. package/dist/templates/full-stack/src/i18n.ts +4 -4
  30. package/dist/templates/full-stack/src/main.tsx +4 -5
  31. package/dist/templates/full-stack/src/pages/home.tsx +5 -5
  32. package/dist/templates/full-stack/src/pages/layout.tsx +15 -5
  33. package/dist/templates/full-stack/src/pages/not-found.tsx +5 -2
  34. package/dist/templates/full-stack/src/routes.tsx +11 -12
  35. package/dist/templates/full-stack/src/schemas.ts +1 -2
  36. package/dist/templates/full-stack/src/server/action-registry.ts +6 -10
  37. package/dist/templates/full-stack/src/server/actions/create-message.ts +4 -4
  38. package/dist/templates/full-stack/src/server/app.ts +67 -57
  39. package/dist/templates/full-stack/src/server/dependencies.ts +10 -10
  40. package/dist/templates/full-stack/src/server/entry-server.ts +3 -3
  41. package/dist/templates/full-stack/src/telemetry.ts +1 -2
  42. package/dist/templates/full-stack/src/vite-server.d.ts +2 -3
  43. package/dist/templates/full-stack/tests/actions/create-message.test.ts +7 -8
  44. package/dist/templates/full-stack/tsconfig.json +0 -1
  45. package/dist/templates/full-stack/vite.config.ts +5 -6
  46. package/dist/templates/spa/AGENTS.md +1 -1
  47. package/dist/templates/spa/package.json +1 -1
  48. package/dist/templates/spa/src/adapters/operations-client.ts +7 -2
  49. package/dist/templates/spa/src/pages/app/admin-home.tsx +21 -3
  50. package/dist/templates/spa/src/styles.css +1 -1
  51. package/dist/templates/ssg/tests/ssg-config.test.ts +3 -3
  52. package/dist/templates/ssr/server.ts +4 -10
  53. package/dist/templates/ssr/src/entry-server.tsx +6 -4
  54. package/dist/update.js +284 -2
  55. package/dist/update.js.map +1 -0
  56. package/dist/writer-D8qe_7ud.js +228 -0
  57. package/dist/writer-D8qe_7ud.js.map +1 -0
  58. package/package.json +11 -15
  59. package/skills/askr-dashboard-charts/SKILL.md +61 -44
  60. package/skills/askr-dashboard-charts/agents/openai.yaml +2 -2
  61. package/templates/full-stack/AGENTS.md +0 -1
  62. package/templates/full-stack/README.md +0 -1
  63. package/templates/full-stack/index.html +0 -1
  64. package/templates/full-stack/package.json +4 -2
  65. package/templates/full-stack/server.ts +5 -9
  66. package/templates/full-stack/src/action-authorizations.ts +2 -2
  67. package/templates/full-stack/src/actions/create-message.ts +5 -5
  68. package/templates/full-stack/src/i18n.ts +4 -4
  69. package/templates/full-stack/src/main.tsx +4 -5
  70. package/templates/full-stack/src/pages/home.tsx +5 -5
  71. package/templates/full-stack/src/pages/layout.tsx +15 -5
  72. package/templates/full-stack/src/pages/not-found.tsx +5 -2
  73. package/templates/full-stack/src/routes.tsx +11 -12
  74. package/templates/full-stack/src/schemas.ts +1 -2
  75. package/templates/full-stack/src/server/action-registry.ts +6 -10
  76. package/templates/full-stack/src/server/actions/create-message.ts +4 -4
  77. package/templates/full-stack/src/server/app.ts +67 -57
  78. package/templates/full-stack/src/server/dependencies.ts +10 -10
  79. package/templates/full-stack/src/server/entry-server.ts +3 -3
  80. package/templates/full-stack/src/telemetry.ts +1 -2
  81. package/templates/full-stack/src/vite-server.d.ts +2 -3
  82. package/templates/full-stack/tests/actions/create-message.test.ts +7 -8
  83. package/templates/full-stack/tsconfig.json +0 -1
  84. package/templates/full-stack/vite.config.ts +5 -6
  85. package/templates/spa/AGENTS.md +1 -1
  86. package/templates/spa/package.json +1 -1
  87. package/templates/spa/src/adapters/operations-client.ts +7 -2
  88. package/templates/spa/src/pages/app/admin-home.tsx +21 -3
  89. package/templates/spa/src/styles.css +1 -1
  90. package/templates/ssg/tests/ssg-config.test.ts +3 -3
  91. package/templates/ssr/server.ts +4 -10
  92. package/templates/ssr/src/entry-server.tsx +6 -4
  93. package/dist/add-DqhqRzBQ.js +0 -555
  94. package/dist/add-DqhqRzBQ.js.map +0 -1
  95. package/dist/update-DyW1na5V.js +0 -1140
  96. package/dist/update-DyW1na5V.js.map +0 -1
package/dist/update.js CHANGED
@@ -1,3 +1,285 @@
1
1
  #!/usr/bin/env node
2
- import { t as runUpdateCli } from "./update-DyW1na5V.js";
3
- export { runUpdateCli };
2
+ import { t as isDirectExecution } from "./is-direct-execution-Cdlr-ZUl.js";
3
+ import path from "node:path";
4
+ //#region src/bin/update.ts
5
+ function helpText(command) {
6
+ return [
7
+ `askr ${command} - ${command === "outdated" ? "List available dependency updates" : command === "update" ? "Apply safe dependency updates" : "Apply latest peer-compatible dependency upgrades"}`,
8
+ "",
9
+ "Usage:",
10
+ ` askr ${command} [packages...] [options]`,
11
+ "",
12
+ "Options:",
13
+ " --cwd <dir> Resolve a project from another directory",
14
+ " --workspace <glob> Select workspace names (repeatable)",
15
+ " --tag <tag> Use one registry dist-tag for selected packages",
16
+ " --json Emit one deterministic JSON object on stdout",
17
+ " --help, -h Show this help message",
18
+ "",
19
+ "Notes:",
20
+ " Package arguments are minimatch patterns and override persistent ignores.",
21
+ command === "outdated" ? " This command reports only and never writes files." : " The command changes package.json files only.",
22
+ " Lockfiles, installs, and lifecycle scripts are never touched."
23
+ ].join("\n");
24
+ }
25
+ function optionValue(args, index, option, errors) {
26
+ if (index + 1 >= args.length || args[index + 1].startsWith("-")) {
27
+ errors.push(`Missing value for ${option}`);
28
+ return null;
29
+ }
30
+ return args[index + 1];
31
+ }
32
+ function parseArgs(args) {
33
+ const parsed = {
34
+ cwd: process.cwd(),
35
+ help: false,
36
+ json: false,
37
+ packagePatterns: [],
38
+ workspacePatterns: [],
39
+ errors: []
40
+ };
41
+ let positionalOnly = false;
42
+ for (let index = 0; index < args.length; index += 1) {
43
+ const argument = args[index];
44
+ if (positionalOnly) parsed.packagePatterns.push(argument);
45
+ else if (argument === "--") positionalOnly = true;
46
+ else if (argument === "--help" || argument === "-h") parsed.help = true;
47
+ else if (argument === "--json") parsed.json = true;
48
+ else if (argument === "--cwd") {
49
+ const value = optionValue(args, index, "--cwd", parsed.errors);
50
+ if (value !== null) {
51
+ parsed.cwd = path.resolve(value);
52
+ index += 1;
53
+ }
54
+ } else if (argument.startsWith("--cwd=")) parsed.cwd = path.resolve(argument.slice(6));
55
+ else if (argument === "--workspace") {
56
+ const value = optionValue(args, index, "--workspace", parsed.errors);
57
+ if (value !== null) {
58
+ parsed.workspacePatterns.push(value);
59
+ index += 1;
60
+ }
61
+ } else if (argument.startsWith("--workspace=")) parsed.workspacePatterns.push(argument.slice(12));
62
+ else if (argument === "--tag") {
63
+ const value = optionValue(args, index, "--tag", parsed.errors);
64
+ if (value !== null) {
65
+ parsed.tag = value;
66
+ index += 1;
67
+ }
68
+ } else if (argument.startsWith("--tag=")) parsed.tag = argument.slice(6);
69
+ else if (argument.startsWith("-")) parsed.errors.push(`Unknown option: ${argument}`);
70
+ else parsed.packagePatterns.push(argument);
71
+ }
72
+ if (parsed.tag !== void 0 && (!parsed.tag || /\s/.test(parsed.tag))) parsed.errors.push("--tag must be a non-empty dist-tag without whitespace");
73
+ if (parsed.workspacePatterns.some((pattern) => !pattern)) parsed.errors.push("--workspace patterns must not be empty");
74
+ if (parsed.packagePatterns.some((pattern) => !pattern)) parsed.errors.push("Package patterns must not be empty");
75
+ return parsed;
76
+ }
77
+ function emptySummary() {
78
+ return {
79
+ packages: 0,
80
+ occurrences: 0,
81
+ changedOccurrences: 0,
82
+ current: 0,
83
+ safe: 0,
84
+ breaking: 0,
85
+ local: 0,
86
+ manual: 0,
87
+ error: 0
88
+ };
89
+ }
90
+ function serializableDecision(decision) {
91
+ return {
92
+ package: decision.package,
93
+ selectedTag: decision.selectedTag,
94
+ targetVersion: decision.targetVersion,
95
+ status: decision.status,
96
+ reason: decision.reason,
97
+ occurrences: decision.occurrences.map((occurrence) => ({
98
+ workspace: occurrence.workspace,
99
+ manifest: occurrence.relativeManifestPath,
100
+ section: occurrence.section,
101
+ currentSpecification: occurrence.currentSpecification,
102
+ proposedSpecification: occurrence.proposedSpecification,
103
+ allowedVersion: occurrence.allowedVersion,
104
+ status: occurrence.status,
105
+ reason: occurrence.reason
106
+ }))
107
+ };
108
+ }
109
+ function selectedWorkspaceJson(root, workspaces) {
110
+ return workspaces.map((workspace) => ({
111
+ name: workspace.name,
112
+ path: path.relative(root, workspace.directory).split(path.sep).join("/") || ".",
113
+ manifest: workspace.relativeManifestPath
114
+ }));
115
+ }
116
+ function emitJson(io, options) {
117
+ io.log(JSON.stringify({
118
+ root: options.root,
119
+ workspaces: options.workspaces,
120
+ summary: options.summary,
121
+ decisions: options.decisions.map(serializableDecision),
122
+ applied: { occurrences: options.applied },
123
+ errors: options.errors
124
+ }, null, 2));
125
+ }
126
+ function rangeText(occurrence, command) {
127
+ if (occurrence.proposedSpecification) return `${occurrence.currentSpecification} → ${occurrence.proposedSpecification}`;
128
+ if (occurrence.status === "breaking") return command === "upgrade" ? `${occurrence.currentSpecification} (${occurrence.reason})` : `${occurrence.currentSpecification} (available via askr upgrade)`;
129
+ return `${occurrence.currentSpecification} (${occurrence.reason})`;
130
+ }
131
+ function renderTable(rows) {
132
+ const headings = [
133
+ "Package",
134
+ "Allowed",
135
+ "Latest",
136
+ "Status",
137
+ "Range"
138
+ ];
139
+ const widths = headings.map((heading, column) => Math.max(heading.length, ...rows.map((row) => row[column].length)));
140
+ return [headings, ...rows].map((row) => row.map((value, column) => column === row.length - 1 ? value : value.padEnd(widths[column])).join(" "));
141
+ }
142
+ function emitHuman(io, decisions, summary, applied, command) {
143
+ const byWorkspace = /* @__PURE__ */ new Map();
144
+ for (const decision of decisions) for (const occurrence of decision.occurrences) {
145
+ if (occurrence.status === "current") continue;
146
+ const rows = byWorkspace.get(occurrence.workspace) ?? [];
147
+ const row = [
148
+ decision.package,
149
+ occurrence.allowedVersion ?? "-",
150
+ decision.targetVersion ?? "-",
151
+ occurrence.status,
152
+ rangeText(occurrence, command)
153
+ ];
154
+ if (!rows.some((existing) => existing.every((value, index) => value === row[index]))) rows.push(row);
155
+ byWorkspace.set(occurrence.workspace, rows);
156
+ }
157
+ if (byWorkspace.size === 0) io.log("All selected dependencies are current.");
158
+ else {
159
+ let first = true;
160
+ for (const [workspace, rows] of byWorkspace) {
161
+ if (!first) io.log("");
162
+ first = false;
163
+ io.log(workspace);
164
+ for (const line of renderTable(rows)) io.log(line);
165
+ }
166
+ }
167
+ const counts = [
168
+ "safe",
169
+ "breaking",
170
+ "current",
171
+ "manual",
172
+ "local",
173
+ "error"
174
+ ].filter((status) => summary[status] > 0).map((status) => `${summary[status]} ${status}`).join(", ");
175
+ io.log("");
176
+ io.log(`Scanned ${summary.packages} package${summary.packages === 1 ? "" : "s"}${counts ? `: ${counts}` : "."}`);
177
+ if (command !== "outdated") io.log(`Updated ${applied} manifest occurrence${applied === 1 ? "" : "s"}.`);
178
+ }
179
+ function collectEdits(decisions) {
180
+ return decisions.flatMap((decision) => decision.occurrences.flatMap((occurrence) => occurrence.proposedSpecification ? [{
181
+ manifestPath: occurrence.manifestPath,
182
+ section: occurrence.section,
183
+ package: decision.package,
184
+ currentSpecification: occurrence.currentSpecification,
185
+ proposedSpecification: occurrence.proposedSpecification
186
+ }] : []));
187
+ }
188
+ async function defaultRegistry(root, packageNames, requirements) {
189
+ const { fetchPackuments, loadNpmConfiguration } = await import("./registry-CyrRHRG5.js");
190
+ return fetchPackuments(packageNames, await loadNpmConfiguration(root), { requirements });
191
+ }
192
+ async function runDependencyCli(command, args, io = console, runtime = {}) {
193
+ const parsed = parseArgs(args);
194
+ if (parsed.help && parsed.errors.length === 0) {
195
+ io.log(helpText(command));
196
+ return 0;
197
+ }
198
+ if (parsed.errors.length > 0) {
199
+ for (const error of parsed.errors) io.error(`askr ${command}: ${error}`);
200
+ if (parsed.json) emitJson(io, {
201
+ root: null,
202
+ workspaces: [],
203
+ summary: emptySummary(),
204
+ decisions: [],
205
+ applied: 0,
206
+ errors: parsed.errors
207
+ });
208
+ return 1;
209
+ }
210
+ let root = null;
211
+ let selectedWorkspaces = [];
212
+ try {
213
+ const [{ discoverProject }, { planUpdates }] = await Promise.all([import("./discovery-Difb7Y4G.js"), import("./planner-VAj7qlxr.js")]);
214
+ const project = await discoverProject({
215
+ cwd: parsed.cwd,
216
+ packagePatterns: parsed.packagePatterns,
217
+ workspacePatterns: parsed.workspacePatterns
218
+ });
219
+ root = project.root;
220
+ selectedWorkspaces = project.selectedWorkspaces;
221
+ const lookupNames = project.occurrences.some((occurrence) => occurrence.kind === "fetch") ? project.contextOccurrences.filter((occurrence) => occurrence.registryManaged).map((occurrence) => occurrence.package) : [];
222
+ const registry = runtime.registry ?? defaultRegistry;
223
+ const specifications = /* @__PURE__ */ new Map();
224
+ for (const occurrence of project.contextOccurrences) {
225
+ const entries = specifications.get(occurrence.package) ?? [];
226
+ if (!entries.includes(occurrence.currentSpecification)) entries.push(occurrence.currentSpecification);
227
+ specifications.set(occurrence.package, entries);
228
+ }
229
+ const results = lookupNames.length > 0 ? await registry(project.root, lookupNames, { specifications }) : {
230
+ packuments: /* @__PURE__ */ new Map(),
231
+ failures: /* @__PURE__ */ new Map()
232
+ };
233
+ const plan = planUpdates({
234
+ occurrences: project.occurrences,
235
+ contextOccurrences: project.contextOccurrences,
236
+ packuments: results.packuments,
237
+ failures: results.failures,
238
+ tags: project.policy.tags,
239
+ cliTag: parsed.tag,
240
+ force: command === "upgrade"
241
+ });
242
+ let applied = 0;
243
+ const errors = [];
244
+ if (!plan.hasErrors && command !== "outdated") try {
245
+ applied = await (runtime.writer ?? (await import("./writer-D8qe_7ud.js")).writeManifestEdits)(collectEdits(plan.decisions));
246
+ } catch {
247
+ errors.push("Unable to replace package manifests; completed replacements were rolled back when possible.");
248
+ }
249
+ if (plan.hasErrors) errors.push("One or more registry lookups or package plans failed.");
250
+ if (parsed.json) emitJson(io, {
251
+ root: project.root,
252
+ workspaces: selectedWorkspaceJson(project.root, project.selectedWorkspaces),
253
+ summary: plan.summary,
254
+ decisions: plan.decisions,
255
+ applied,
256
+ errors
257
+ });
258
+ else emitHuman(io, plan.decisions, plan.summary, applied, command);
259
+ for (const error of errors) io.error(`askr ${command}: ${error}`);
260
+ return errors.length > 0 ? 1 : 0;
261
+ } catch (error) {
262
+ const message = error instanceof Error ? error.message : "Update failed.";
263
+ io.error(`askr ${command}: ${message}`);
264
+ if (parsed.json) emitJson(io, {
265
+ root,
266
+ workspaces: root ? selectedWorkspaceJson(root, selectedWorkspaces) : [],
267
+ summary: emptySummary(),
268
+ decisions: [],
269
+ applied: 0,
270
+ errors: [message]
271
+ });
272
+ return 1;
273
+ }
274
+ }
275
+ const runUpdateCli = (args, io = console, runtime = {}) => runDependencyCli("update", args, io, runtime);
276
+ const runUpgradeCli = (args, io = console, runtime = {}) => runDependencyCli("upgrade", args, io, runtime);
277
+ const runOutdatedCli = (args, io = console, runtime = {}) => runDependencyCli("outdated", args, io, runtime);
278
+ async function main() {
279
+ process.exit(await runUpdateCli(process.argv.slice(2)));
280
+ }
281
+ if (isDirectExecution(import.meta.url)) main();
282
+ //#endregion
283
+ export { runOutdatedCli, runUpdateCli, runUpgradeCli };
284
+
285
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","names":[],"sources":["../src/bin/update.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport path from \"node:path\";\nimport { isDirectExecution } from \"./is-direct-execution\";\nimport type { PackumentResults, RegistryRequirements } from \"../update/registry\";\nimport type {\n ManifestValueEdit,\n PackageDecision,\n PlannedOccurrence,\n UpdateSummary,\n WorkspaceManifest,\n} from \"../update/types\";\n\ntype CliIo = Pick<Console, \"error\" | \"log\">;\n\ninterface ParsedArgs {\n cwd: string;\n help: boolean;\n json: boolean;\n packagePatterns: string[];\n tag?: string;\n workspacePatterns: string[];\n errors: string[];\n}\n\ninterface UpdateRuntime {\n registry?: (\n root: string,\n packageNames: string[],\n requirements?: RegistryRequirements,\n ) => Promise<PackumentResults>;\n writer?: typeof import(\"../update/writer\").writeManifestEdits;\n}\n\ntype DependencyCommand = \"outdated\" | \"update\" | \"upgrade\";\n\nfunction helpText(command: DependencyCommand): string {\n const description =\n command === \"outdated\"\n ? \"List available dependency updates\"\n : command === \"update\"\n ? \"Apply safe dependency updates\"\n : \"Apply latest peer-compatible dependency upgrades\";\n return [\n `askr ${command} - ${description}`,\n \"\",\n \"Usage:\",\n ` askr ${command} [packages...] [options]`,\n \"\",\n \"Options:\",\n \" --cwd <dir> Resolve a project from another directory\",\n \" --workspace <glob> Select workspace names (repeatable)\",\n \" --tag <tag> Use one registry dist-tag for selected packages\",\n \" --json Emit one deterministic JSON object on stdout\",\n \" --help, -h Show this help message\",\n \"\",\n \"Notes:\",\n \" Package arguments are minimatch patterns and override persistent ignores.\",\n command === \"outdated\"\n ? \" This command reports only and never writes files.\"\n : \" The command changes package.json files only.\",\n \" Lockfiles, installs, and lifecycle scripts are never touched.\",\n ].join(\"\\n\");\n}\n\nfunction optionValue(\n args: string[],\n index: number,\n option: string,\n errors: string[],\n): string | null {\n if (index + 1 >= args.length || args[index + 1].startsWith(\"-\")) {\n errors.push(`Missing value for ${option}`);\n return null;\n }\n return args[index + 1];\n}\n\nfunction parseArgs(args: string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n cwd: process.cwd(),\n help: false,\n json: false,\n packagePatterns: [],\n workspacePatterns: [],\n errors: [],\n };\n let positionalOnly = false;\n\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index];\n if (positionalOnly) {\n parsed.packagePatterns.push(argument);\n } else if (argument === \"--\") {\n positionalOnly = true;\n } else if (argument === \"--help\" || argument === \"-h\") {\n parsed.help = true;\n } else if (argument === \"--json\") {\n parsed.json = true;\n } else if (argument === \"--cwd\") {\n const value = optionValue(args, index, \"--cwd\", parsed.errors);\n if (value !== null) {\n parsed.cwd = path.resolve(value);\n index += 1;\n }\n } else if (argument.startsWith(\"--cwd=\")) {\n parsed.cwd = path.resolve(argument.slice(\"--cwd=\".length));\n } else if (argument === \"--workspace\") {\n const value = optionValue(args, index, \"--workspace\", parsed.errors);\n if (value !== null) {\n parsed.workspacePatterns.push(value);\n index += 1;\n }\n } else if (argument.startsWith(\"--workspace=\")) {\n parsed.workspacePatterns.push(argument.slice(\"--workspace=\".length));\n } else if (argument === \"--tag\") {\n const value = optionValue(args, index, \"--tag\", parsed.errors);\n if (value !== null) {\n parsed.tag = value;\n index += 1;\n }\n } else if (argument.startsWith(\"--tag=\")) {\n parsed.tag = argument.slice(\"--tag=\".length);\n } else if (argument.startsWith(\"-\")) {\n parsed.errors.push(`Unknown option: ${argument}`);\n } else {\n parsed.packagePatterns.push(argument);\n }\n }\n\n if (parsed.tag !== undefined && (!parsed.tag || /\\s/.test(parsed.tag))) {\n parsed.errors.push(\"--tag must be a non-empty dist-tag without whitespace\");\n }\n if (parsed.workspacePatterns.some((pattern) => !pattern)) {\n parsed.errors.push(\"--workspace patterns must not be empty\");\n }\n if (parsed.packagePatterns.some((pattern) => !pattern)) {\n parsed.errors.push(\"Package patterns must not be empty\");\n }\n return parsed;\n}\n\nfunction emptySummary(): UpdateSummary {\n return {\n packages: 0,\n occurrences: 0,\n changedOccurrences: 0,\n current: 0,\n safe: 0,\n breaking: 0,\n local: 0,\n manual: 0,\n error: 0,\n };\n}\n\nfunction serializableDecision(decision: PackageDecision): Record<string, unknown> {\n return {\n package: decision.package,\n selectedTag: decision.selectedTag,\n targetVersion: decision.targetVersion,\n status: decision.status,\n reason: decision.reason,\n occurrences: decision.occurrences.map((occurrence) => ({\n workspace: occurrence.workspace,\n manifest: occurrence.relativeManifestPath,\n section: occurrence.section,\n currentSpecification: occurrence.currentSpecification,\n proposedSpecification: occurrence.proposedSpecification,\n allowedVersion: occurrence.allowedVersion,\n status: occurrence.status,\n reason: occurrence.reason,\n })),\n };\n}\n\nfunction selectedWorkspaceJson(\n root: string,\n workspaces: WorkspaceManifest[],\n): Array<Record<string, unknown>> {\n return workspaces.map((workspace) => ({\n name: workspace.name,\n path: path.relative(root, workspace.directory).split(path.sep).join(\"/\") || \".\",\n manifest: workspace.relativeManifestPath,\n }));\n}\n\nfunction emitJson(\n io: CliIo,\n options: {\n root: string | null;\n workspaces: Array<Record<string, unknown>>;\n summary: UpdateSummary;\n decisions: PackageDecision[];\n applied: number;\n errors: string[];\n },\n): void {\n io.log(\n JSON.stringify(\n {\n root: options.root,\n workspaces: options.workspaces,\n summary: options.summary,\n decisions: options.decisions.map(serializableDecision),\n applied: { occurrences: options.applied },\n errors: options.errors,\n },\n null,\n 2,\n ),\n );\n}\n\nfunction rangeText(occurrence: PlannedOccurrence, command: DependencyCommand): string {\n if (occurrence.proposedSpecification) {\n return `${occurrence.currentSpecification} → ${occurrence.proposedSpecification}`;\n }\n if (occurrence.status === \"breaking\") {\n return command === \"upgrade\"\n ? `${occurrence.currentSpecification} (${occurrence.reason})`\n : `${occurrence.currentSpecification} (available via askr upgrade)`;\n }\n return `${occurrence.currentSpecification} (${occurrence.reason})`;\n}\n\nfunction renderTable(rows: string[][]): string[] {\n const headings = [\"Package\", \"Allowed\", \"Latest\", \"Status\", \"Range\"];\n const widths = headings.map((heading, column) =>\n Math.max(heading.length, ...rows.map((row) => row[column].length)),\n );\n return [headings, ...rows].map((row) =>\n row\n .map((value, column) => (column === row.length - 1 ? value : value.padEnd(widths[column])))\n .join(\" \"),\n );\n}\n\nfunction emitHuman(\n io: CliIo,\n decisions: PackageDecision[],\n summary: UpdateSummary,\n applied: number,\n command: DependencyCommand,\n): void {\n const byWorkspace = new Map<string, string[][]>();\n for (const decision of decisions) {\n for (const occurrence of decision.occurrences) {\n if (occurrence.status === \"current\") continue;\n const rows = byWorkspace.get(occurrence.workspace) ?? [];\n const row = [\n decision.package,\n occurrence.allowedVersion ?? \"-\",\n decision.targetVersion ?? \"-\",\n occurrence.status,\n rangeText(occurrence, command),\n ];\n if (!rows.some((existing) => existing.every((value, index) => value === row[index]))) {\n rows.push(row);\n }\n byWorkspace.set(occurrence.workspace, rows);\n }\n }\n\n if (byWorkspace.size === 0) {\n io.log(\"All selected dependencies are current.\");\n } else {\n let first = true;\n for (const [workspace, rows] of byWorkspace) {\n if (!first) io.log(\"\");\n first = false;\n io.log(workspace);\n for (const line of renderTable(rows)) io.log(line);\n }\n }\n\n const counts = ([\"safe\", \"breaking\", \"current\", \"manual\", \"local\", \"error\"] as const)\n .filter((status) => summary[status] > 0)\n .map((status) => `${summary[status]} ${status}`)\n .join(\", \");\n io.log(\"\");\n io.log(\n `Scanned ${summary.packages} package${summary.packages === 1 ? \"\" : \"s\"}${counts ? `: ${counts}` : \".\"}`,\n );\n if (command !== \"outdated\") {\n io.log(`Updated ${applied} manifest occurrence${applied === 1 ? \"\" : \"s\"}.`);\n }\n}\n\nfunction collectEdits(decisions: PackageDecision[]): ManifestValueEdit[] {\n return decisions.flatMap((decision) =>\n decision.occurrences.flatMap((occurrence) =>\n occurrence.proposedSpecification\n ? [\n {\n manifestPath: occurrence.manifestPath,\n section: occurrence.section,\n package: decision.package,\n currentSpecification: occurrence.currentSpecification,\n proposedSpecification: occurrence.proposedSpecification,\n },\n ]\n : [],\n ),\n );\n}\n\nasync function defaultRegistry(\n root: string,\n packageNames: string[],\n requirements?: RegistryRequirements,\n): Promise<PackumentResults> {\n const { fetchPackuments, loadNpmConfiguration } = await import(\"../update/registry\");\n const configuration = await loadNpmConfiguration(root);\n return fetchPackuments(packageNames, configuration, { requirements });\n}\n\nasync function runDependencyCli(\n command: DependencyCommand,\n args: string[],\n io: CliIo = console,\n runtime: UpdateRuntime = {},\n): Promise<number> {\n const parsed = parseArgs(args);\n if (parsed.help && parsed.errors.length === 0) {\n io.log(helpText(command));\n return 0;\n }\n if (parsed.errors.length > 0) {\n for (const error of parsed.errors) io.error(`askr ${command}: ${error}`);\n if (parsed.json) {\n emitJson(io, {\n root: null,\n workspaces: [],\n summary: emptySummary(),\n decisions: [],\n applied: 0,\n errors: parsed.errors,\n });\n }\n return 1;\n }\n\n let root: string | null = null;\n let selectedWorkspaces: WorkspaceManifest[] = [];\n try {\n const [{ discoverProject }, { planUpdates }] = await Promise.all([\n import(\"../update/discovery\"),\n import(\"../update/planner\"),\n ]);\n const project = await discoverProject({\n cwd: parsed.cwd,\n packagePatterns: parsed.packagePatterns,\n workspacePatterns: parsed.workspacePatterns,\n });\n root = project.root;\n selectedWorkspaces = project.selectedWorkspaces;\n\n const hasRegistryCandidate = project.occurrences.some(\n (occurrence) => occurrence.kind === \"fetch\",\n );\n const lookupNames = hasRegistryCandidate\n ? project.contextOccurrences\n .filter((occurrence) => occurrence.registryManaged)\n .map((occurrence) => occurrence.package)\n : [];\n const registry = runtime.registry ?? defaultRegistry;\n const specifications = new Map<string, string[]>();\n for (const occurrence of project.contextOccurrences) {\n const entries = specifications.get(occurrence.package) ?? [];\n if (!entries.includes(occurrence.currentSpecification)) {\n entries.push(occurrence.currentSpecification);\n }\n specifications.set(occurrence.package, entries);\n }\n const results =\n lookupNames.length > 0\n ? await registry(project.root, lookupNames, { specifications })\n : { packuments: new Map(), failures: new Map() };\n const plan = planUpdates({\n occurrences: project.occurrences,\n contextOccurrences: project.contextOccurrences,\n packuments: results.packuments,\n failures: results.failures,\n tags: project.policy.tags,\n cliTag: parsed.tag,\n force: command === \"upgrade\",\n });\n\n let applied = 0;\n const errors: string[] = [];\n if (!plan.hasErrors && command !== \"outdated\") {\n try {\n const writer = runtime.writer ?? (await import(\"../update/writer\")).writeManifestEdits;\n applied = await writer(collectEdits(plan.decisions));\n } catch {\n errors.push(\n \"Unable to replace package manifests; completed replacements were rolled back when possible.\",\n );\n }\n }\n if (plan.hasErrors) errors.push(\"One or more registry lookups or package plans failed.\");\n\n if (parsed.json) {\n emitJson(io, {\n root: project.root,\n workspaces: selectedWorkspaceJson(project.root, project.selectedWorkspaces),\n summary: plan.summary,\n decisions: plan.decisions,\n applied,\n errors,\n });\n } else {\n emitHuman(io, plan.decisions, plan.summary, applied, command);\n }\n for (const error of errors) io.error(`askr ${command}: ${error}`);\n return errors.length > 0 ? 1 : 0;\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Update failed.\";\n io.error(`askr ${command}: ${message}`);\n if (parsed.json) {\n emitJson(io, {\n root,\n workspaces: root ? selectedWorkspaceJson(root, selectedWorkspaces) : [],\n summary: emptySummary(),\n decisions: [],\n applied: 0,\n errors: [message],\n });\n }\n return 1;\n }\n}\n\nexport const runUpdateCli = (args: string[], io: CliIo = console, runtime: UpdateRuntime = {}) =>\n runDependencyCli(\"update\", args, io, runtime);\nexport const runUpgradeCli = (args: string[], io: CliIo = console, runtime: UpdateRuntime = {}) =>\n runDependencyCli(\"upgrade\", args, io, runtime);\nexport const runOutdatedCli = (args: string[], io: CliIo = console, runtime: UpdateRuntime = {}) =>\n runDependencyCli(\"outdated\", args, io, runtime);\n\nasync function main(): Promise<void> {\n process.exit(await runUpdateCli(process.argv.slice(2)));\n}\n\nif (isDirectExecution(import.meta.url)) void main();\n"],"mappings":"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"}
@@ -0,0 +1,228 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ //#region src/update/writer.ts
5
+ function groupEdits(edits) {
6
+ const grouped = /* @__PURE__ */ new Map();
7
+ for (const edit of edits) {
8
+ const entries = grouped.get(edit.manifestPath) ?? [];
9
+ entries.push(edit);
10
+ grouped.set(edit.manifestPath, entries);
11
+ }
12
+ for (const entries of grouped.values()) entries.sort((left, right) => left.section.localeCompare(right.section) || left.package.localeCompare(right.package));
13
+ return new Map([...grouped].sort(([left], [right]) => left.localeCompare(right)));
14
+ }
15
+ var JsonTreeParser = class {
16
+ source;
17
+ index = 0;
18
+ constructor(source) {
19
+ this.source = source;
20
+ if (source.charCodeAt(0) === 65279) this.index = 1;
21
+ }
22
+ parse() {
23
+ const node = this.parseValue();
24
+ this.skipWhitespace();
25
+ if (this.index !== this.source.length) throw new Error("Unexpected content after JSON value");
26
+ return node;
27
+ }
28
+ skipWhitespace() {
29
+ while (/[ \t\r\n]/.test(this.source[this.index] ?? "")) this.index += 1;
30
+ }
31
+ parseValue() {
32
+ this.skipWhitespace();
33
+ const token = this.source[this.index];
34
+ if (token === "{") return this.parseObject();
35
+ if (token === "[") return this.parseArray();
36
+ if (token === "\"") return this.parseString();
37
+ return this.parsePrimitive();
38
+ }
39
+ parseString() {
40
+ const start = this.index;
41
+ this.index += 1;
42
+ while (this.index < this.source.length) {
43
+ const token = this.source[this.index];
44
+ if (token === "\\") {
45
+ this.index += 2;
46
+ continue;
47
+ }
48
+ this.index += 1;
49
+ if (token === "\"") {
50
+ const raw = this.source.slice(start, this.index);
51
+ const value = JSON.parse(raw);
52
+ if (typeof value !== "string") throw new Error("Invalid JSON string");
53
+ return {
54
+ end: this.index,
55
+ kind: "string",
56
+ start,
57
+ value
58
+ };
59
+ }
60
+ }
61
+ throw new Error("Unterminated JSON string");
62
+ }
63
+ parseObject() {
64
+ const start = this.index;
65
+ const properties = /* @__PURE__ */ new Map();
66
+ this.index += 1;
67
+ this.skipWhitespace();
68
+ if (this.source[this.index] === "}") {
69
+ this.index += 1;
70
+ return {
71
+ end: this.index,
72
+ kind: "object",
73
+ properties,
74
+ start
75
+ };
76
+ }
77
+ while (this.index < this.source.length) {
78
+ this.skipWhitespace();
79
+ if (this.source[this.index] !== "\"") throw new Error("Expected a JSON object key");
80
+ const key = this.parseString().value;
81
+ this.skipWhitespace();
82
+ if (this.source[this.index] !== ":") throw new Error("Expected ':' after JSON object key");
83
+ this.index += 1;
84
+ properties.set(key, this.parseValue());
85
+ this.skipWhitespace();
86
+ if (this.source[this.index] === "}") {
87
+ this.index += 1;
88
+ return {
89
+ end: this.index,
90
+ kind: "object",
91
+ properties,
92
+ start
93
+ };
94
+ }
95
+ if (this.source[this.index] !== ",") throw new Error("Expected ',' in JSON object");
96
+ this.index += 1;
97
+ }
98
+ throw new Error("Unterminated JSON object");
99
+ }
100
+ parseArray() {
101
+ const start = this.index;
102
+ this.index += 1;
103
+ this.skipWhitespace();
104
+ if (this.source[this.index] === "]") {
105
+ this.index += 1;
106
+ return {
107
+ end: this.index,
108
+ kind: "array",
109
+ start
110
+ };
111
+ }
112
+ while (this.index < this.source.length) {
113
+ this.parseValue();
114
+ this.skipWhitespace();
115
+ if (this.source[this.index] === "]") {
116
+ this.index += 1;
117
+ return {
118
+ end: this.index,
119
+ kind: "array",
120
+ start
121
+ };
122
+ }
123
+ if (this.source[this.index] !== ",") throw new Error("Expected ',' in JSON array");
124
+ this.index += 1;
125
+ }
126
+ throw new Error("Unterminated JSON array");
127
+ }
128
+ parsePrimitive() {
129
+ const start = this.index;
130
+ while (this.index < this.source.length && !/[ \t\r\n,\]}]/.test(this.source[this.index])) this.index += 1;
131
+ if (start === this.index) throw new Error("Expected a JSON value");
132
+ JSON.parse(this.source.slice(start, this.index));
133
+ return {
134
+ end: this.index,
135
+ kind: "other",
136
+ start
137
+ };
138
+ }
139
+ };
140
+ function renderReplacement(source, edits) {
141
+ let manifest;
142
+ try {
143
+ manifest = new JsonTreeParser(source).parse();
144
+ } catch {
145
+ throw new Error("Manifest changed to invalid JSON before writing.");
146
+ }
147
+ if (manifest.kind !== "object") throw new Error("Manifest changed to invalid JSON before writing.");
148
+ const replacements = [];
149
+ const seen = /* @__PURE__ */ new Set();
150
+ for (const edit of edits) {
151
+ const key = `${edit.section}\u0000${edit.package}`;
152
+ if (seen.has(key)) throw new Error(`Duplicate manifest edit: ${edit.manifestPath}`);
153
+ seen.add(key);
154
+ const current = (manifest.properties?.get(edit.section))?.properties?.get(edit.package);
155
+ if (current?.kind !== "string" || current.value !== edit.currentSpecification) throw new Error(`Manifest changed before writing: ${edit.manifestPath}`);
156
+ replacements.push({
157
+ start: current.start,
158
+ end: current.end,
159
+ value: JSON.stringify(edit.proposedSpecification)
160
+ });
161
+ }
162
+ let result = source;
163
+ replacements.sort((left, right) => right.start - left.start);
164
+ for (const replacement of replacements) result = `${result.slice(0, replacement.start)}${replacement.value}${result.slice(replacement.end)}`;
165
+ return result;
166
+ }
167
+ async function cleanup(paths) {
168
+ await Promise.all(paths.map((filePath) => fs.rm(filePath, { force: true }).catch(() => void 0)));
169
+ }
170
+ async function rollback(replaced) {
171
+ let complete = true;
172
+ for (const staged of [...replaced].reverse()) {
173
+ const rollbackPath = path.join(path.dirname(staged.manifestPath), `.${path.basename(staged.manifestPath)}.askr-rollback-${randomUUID()}`);
174
+ try {
175
+ await fs.writeFile(rollbackPath, staged.original, {
176
+ flag: "wx",
177
+ mode: staged.mode
178
+ });
179
+ await fs.rename(rollbackPath, staged.manifestPath);
180
+ } catch {
181
+ complete = false;
182
+ await fs.rm(rollbackPath, { force: true }).catch(() => void 0);
183
+ }
184
+ }
185
+ return complete;
186
+ }
187
+ async function writeManifestEdits(edits, options = {}) {
188
+ if (edits.length === 0) return 0;
189
+ const staged = [];
190
+ const replace = options.replace ?? fs.rename;
191
+ try {
192
+ for (const [manifestPath, manifestEdits] of groupEdits(edits)) {
193
+ const [original, stat] = await Promise.all([fs.readFile(manifestPath), fs.stat(manifestPath)]);
194
+ const replacement = renderReplacement(original.toString("utf8"), manifestEdits);
195
+ const temporaryPath = path.join(path.dirname(manifestPath), `.${path.basename(manifestPath)}.askr-update-${randomUUID()}`);
196
+ await fs.writeFile(temporaryPath, replacement, {
197
+ flag: "wx",
198
+ mode: stat.mode
199
+ });
200
+ staged.push({
201
+ manifestPath,
202
+ original,
203
+ replacement,
204
+ temporaryPath,
205
+ mode: stat.mode
206
+ });
207
+ }
208
+ } catch (error) {
209
+ await cleanup(staged.map((entry) => entry.temporaryPath));
210
+ throw error;
211
+ }
212
+ const replaced = [];
213
+ try {
214
+ for (const manifest of staged) {
215
+ await replace(manifest.temporaryPath, manifest.manifestPath);
216
+ replaced.push(manifest);
217
+ }
218
+ } catch {
219
+ const rollbackComplete = await rollback(replaced);
220
+ await cleanup(staged.map((entry) => entry.temporaryPath));
221
+ throw new Error(rollbackComplete ? "Manifest replacement failed; completed replacements were rolled back." : "Manifest replacement failed and rollback was incomplete.");
222
+ }
223
+ return edits.length;
224
+ }
225
+ //#endregion
226
+ export { writeManifestEdits };
227
+
228
+ //# sourceMappingURL=writer-D8qe_7ud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer-D8qe_7ud.js","names":[],"sources":["../src/update/writer.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ManifestValueEdit } from \"./types\";\n\ninterface StagedManifest {\n manifestPath: string;\n original: Buffer;\n replacement: string;\n temporaryPath: string;\n mode: number;\n}\n\ninterface WriterOptions {\n replace?: (temporaryPath: string, manifestPath: string) => Promise<void>;\n}\n\nfunction groupEdits(edits: ManifestValueEdit[]): Map<string, ManifestValueEdit[]> {\n const grouped = new Map<string, ManifestValueEdit[]>();\n for (const edit of edits) {\n const entries = grouped.get(edit.manifestPath) ?? [];\n entries.push(edit);\n grouped.set(edit.manifestPath, entries);\n }\n for (const entries of grouped.values()) {\n entries.sort(\n (left, right) =>\n left.section.localeCompare(right.section) || left.package.localeCompare(right.package),\n );\n }\n return new Map([...grouped].sort(([left], [right]) => left.localeCompare(right)));\n}\n\ninterface JsonNode {\n end: number;\n kind: \"array\" | \"object\" | \"other\" | \"string\";\n properties?: Map<string, JsonNode>;\n start: number;\n value?: string;\n}\n\nclass JsonTreeParser {\n private index = 0;\n\n constructor(private readonly source: string) {\n if (source.charCodeAt(0) === 0xfeff) this.index = 1;\n }\n\n parse(): JsonNode {\n const node = this.parseValue();\n this.skipWhitespace();\n if (this.index !== this.source.length) throw new Error(\"Unexpected content after JSON value\");\n return node;\n }\n\n private skipWhitespace(): void {\n while (/[ \\t\\r\\n]/.test(this.source[this.index] ?? \"\")) this.index += 1;\n }\n\n private parseValue(): JsonNode {\n this.skipWhitespace();\n const token = this.source[this.index];\n if (token === \"{\") return this.parseObject();\n if (token === \"[\") return this.parseArray();\n if (token === '\"') return this.parseString();\n return this.parsePrimitive();\n }\n\n private parseString(): JsonNode {\n const start = this.index;\n this.index += 1;\n while (this.index < this.source.length) {\n const token = this.source[this.index];\n if (token === \"\\\\\") {\n this.index += 2;\n continue;\n }\n this.index += 1;\n if (token === '\"') {\n const raw = this.source.slice(start, this.index);\n const value = JSON.parse(raw) as unknown;\n if (typeof value !== \"string\") throw new Error(\"Invalid JSON string\");\n return { end: this.index, kind: \"string\", start, value };\n }\n }\n throw new Error(\"Unterminated JSON string\");\n }\n\n private parseObject(): JsonNode {\n const start = this.index;\n const properties = new Map<string, JsonNode>();\n this.index += 1;\n this.skipWhitespace();\n if (this.source[this.index] === \"}\") {\n this.index += 1;\n return { end: this.index, kind: \"object\", properties, start };\n }\n\n while (this.index < this.source.length) {\n this.skipWhitespace();\n if (this.source[this.index] !== '\"') throw new Error(\"Expected a JSON object key\");\n const key = this.parseString().value!;\n this.skipWhitespace();\n if (this.source[this.index] !== \":\") throw new Error(\"Expected ':' after JSON object key\");\n this.index += 1;\n properties.set(key, this.parseValue());\n this.skipWhitespace();\n if (this.source[this.index] === \"}\") {\n this.index += 1;\n return { end: this.index, kind: \"object\", properties, start };\n }\n if (this.source[this.index] !== \",\") throw new Error(\"Expected ',' in JSON object\");\n this.index += 1;\n }\n throw new Error(\"Unterminated JSON object\");\n }\n\n private parseArray(): JsonNode {\n const start = this.index;\n this.index += 1;\n this.skipWhitespace();\n if (this.source[this.index] === \"]\") {\n this.index += 1;\n return { end: this.index, kind: \"array\", start };\n }\n\n while (this.index < this.source.length) {\n this.parseValue();\n this.skipWhitespace();\n if (this.source[this.index] === \"]\") {\n this.index += 1;\n return { end: this.index, kind: \"array\", start };\n }\n if (this.source[this.index] !== \",\") throw new Error(\"Expected ',' in JSON array\");\n this.index += 1;\n }\n throw new Error(\"Unterminated JSON array\");\n }\n\n private parsePrimitive(): JsonNode {\n const start = this.index;\n while (this.index < this.source.length && !/[ \\t\\r\\n,\\]}]/.test(this.source[this.index])) {\n this.index += 1;\n }\n if (start === this.index) throw new Error(\"Expected a JSON value\");\n JSON.parse(this.source.slice(start, this.index));\n return { end: this.index, kind: \"other\", start };\n }\n}\n\nfunction renderReplacement(source: string, edits: ManifestValueEdit[]): string {\n let manifest: JsonNode;\n try {\n manifest = new JsonTreeParser(source).parse();\n } catch {\n throw new Error(\"Manifest changed to invalid JSON before writing.\");\n }\n if (manifest.kind !== \"object\")\n throw new Error(\"Manifest changed to invalid JSON before writing.\");\n\n const replacements: Array<{ start: number; end: number; value: string }> = [];\n const seen = new Set<string>();\n for (const edit of edits) {\n const key = `${edit.section}\\u0000${edit.package}`;\n if (seen.has(key)) throw new Error(`Duplicate manifest edit: ${edit.manifestPath}`);\n seen.add(key);\n const dependencies = manifest.properties?.get(edit.section);\n const current = dependencies?.properties?.get(edit.package);\n if (current?.kind !== \"string\" || current.value !== edit.currentSpecification) {\n throw new Error(`Manifest changed before writing: ${edit.manifestPath}`);\n }\n replacements.push({\n start: current.start,\n end: current.end,\n value: JSON.stringify(edit.proposedSpecification),\n });\n }\n\n let result = source;\n replacements.sort((left, right) => right.start - left.start);\n for (const replacement of replacements) {\n result = `${result.slice(0, replacement.start)}${replacement.value}${result.slice(replacement.end)}`;\n }\n return result;\n}\n\nasync function cleanup(paths: string[]): Promise<void> {\n await Promise.all(\n paths.map((filePath) => fs.rm(filePath, { force: true }).catch(() => undefined)),\n );\n}\n\nasync function rollback(replaced: StagedManifest[]): Promise<boolean> {\n let complete = true;\n for (const staged of [...replaced].reverse()) {\n const rollbackPath = path.join(\n path.dirname(staged.manifestPath),\n `.${path.basename(staged.manifestPath)}.askr-rollback-${randomUUID()}`,\n );\n try {\n await fs.writeFile(rollbackPath, staged.original, { flag: \"wx\", mode: staged.mode });\n await fs.rename(rollbackPath, staged.manifestPath);\n } catch {\n complete = false;\n await fs.rm(rollbackPath, { force: true }).catch(() => undefined);\n }\n }\n return complete;\n}\n\nexport async function writeManifestEdits(\n edits: ManifestValueEdit[],\n options: WriterOptions = {},\n): Promise<number> {\n if (edits.length === 0) return 0;\n const staged: StagedManifest[] = [];\n const replace = options.replace ?? fs.rename;\n\n try {\n for (const [manifestPath, manifestEdits] of groupEdits(edits)) {\n const [original, stat] = await Promise.all([\n fs.readFile(manifestPath),\n fs.stat(manifestPath),\n ]);\n const replacement = renderReplacement(original.toString(\"utf8\"), manifestEdits);\n const temporaryPath = path.join(\n path.dirname(manifestPath),\n `.${path.basename(manifestPath)}.askr-update-${randomUUID()}`,\n );\n await fs.writeFile(temporaryPath, replacement, { flag: \"wx\", mode: stat.mode });\n staged.push({ manifestPath, original, replacement, temporaryPath, mode: stat.mode });\n }\n } catch (error) {\n await cleanup(staged.map((entry) => entry.temporaryPath));\n throw error;\n }\n\n const replaced: StagedManifest[] = [];\n try {\n for (const manifest of staged) {\n await replace(manifest.temporaryPath, manifest.manifestPath);\n replaced.push(manifest);\n }\n } catch {\n const rollbackComplete = await rollback(replaced);\n await cleanup(staged.map((entry) => entry.temporaryPath));\n throw new Error(\n rollbackComplete\n ? \"Manifest replacement failed; completed replacements were rolled back.\"\n : \"Manifest replacement failed and rollback was incomplete.\",\n );\n }\n\n return edits.length;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askrjs/cli",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Unified CLI for the Askr platform",
5
5
  "homepage": "https://github.com/askrjs/askr-cli#readme",
6
6
  "bugs": {
@@ -45,24 +45,20 @@
45
45
  "prepublishOnly": "npm run check"
46
46
  },
47
47
  "dependencies": {
48
- "@npmcli/config": "^9.0.0",
49
- "@npmcli/map-workspaces": "^4.0.2",
50
- "jsonc-parser": "^3.3.1",
48
+ "js-yaml": "^4.3.0",
51
49
  "minimatch": "^10.2.5",
52
- "npm-package-arg": "^13.0.2",
53
- "npm-registry-fetch": "^19.1.1",
54
50
  "semver": "^7.8.5",
55
- "tsx": "^4.23.1",
56
- "yaml": "^2.9.0"
51
+ "tsx": "^4.23.1"
57
52
  },
58
53
  "devDependencies": {
59
- "@askrjs/askr": "file:../askr",
60
- "@askrjs/charts": "file:../askr-charts",
61
- "@askrjs/logos": "file:../askr-logos",
62
- "@askrjs/lucide": "file:../askr-lucide",
63
- "@askrjs/themes": "file:../askr-themes",
64
- "@askrjs/ui": "file:../askr-ui",
65
- "@askrjs/vite": "file:../askr-vite",
54
+ "@askrjs/askr": ">=0.0.53 <0.1.0",
55
+ "@askrjs/charts": ">=0.1.0 <0.2.0",
56
+ "@askrjs/logos": ">=0.0.3 <0.1.0",
57
+ "@askrjs/lucide": ">=0.0.3 <0.1.0",
58
+ "@askrjs/themes": ">=0.0.12 <0.1.0",
59
+ "@askrjs/ui": ">=0.0.13 <0.1.0",
60
+ "@askrjs/vite": ">=0.0.6 <0.1.0",
61
+ "@types/js-yaml": "^4.0.9",
66
62
  "@types/node": "^25.9.2",
67
63
  "@types/semver": "^7.7.1",
68
64
  "publint": "^0.3.21",