sysprom 1.0.0 → 1.0.5

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 (148) hide show
  1. package/README.md +207 -0
  2. package/dist/schema.json +510 -0
  3. package/dist/src/canonical-json.d.ts +23 -0
  4. package/dist/src/canonical-json.js +120 -0
  5. package/dist/src/cli/commands/add.d.ts +22 -0
  6. package/dist/src/cli/commands/add.js +95 -0
  7. package/dist/src/cli/commands/check.d.ts +10 -0
  8. package/dist/src/cli/commands/check.js +33 -0
  9. package/dist/src/cli/commands/graph.d.ts +15 -0
  10. package/dist/src/cli/commands/graph.js +32 -0
  11. package/dist/src/cli/commands/init.d.ts +2 -0
  12. package/dist/src/cli/commands/init.js +44 -0
  13. package/dist/src/cli/commands/json2md.d.ts +2 -0
  14. package/dist/src/cli/commands/json2md.js +60 -0
  15. package/dist/src/cli/commands/md2json.d.ts +2 -0
  16. package/dist/src/cli/commands/md2json.js +29 -0
  17. package/dist/src/cli/commands/plan.d.ts +2 -0
  18. package/dist/src/cli/commands/plan.js +227 -0
  19. package/dist/src/cli/commands/query.d.ts +2 -0
  20. package/dist/src/cli/commands/query.js +275 -0
  21. package/dist/src/cli/commands/remove.d.ts +13 -0
  22. package/dist/src/cli/commands/remove.js +50 -0
  23. package/dist/src/cli/commands/rename.d.ts +14 -0
  24. package/dist/src/cli/commands/rename.js +34 -0
  25. package/dist/src/cli/commands/search.d.ts +11 -0
  26. package/dist/src/cli/commands/search.js +37 -0
  27. package/dist/src/cli/commands/speckit.d.ts +2 -0
  28. package/dist/src/cli/commands/speckit.js +318 -0
  29. package/dist/src/cli/commands/stats.d.ts +10 -0
  30. package/dist/src/cli/commands/stats.js +51 -0
  31. package/dist/src/cli/commands/task.d.ts +2 -0
  32. package/dist/src/cli/commands/task.js +162 -0
  33. package/dist/src/cli/commands/update.d.ts +2 -0
  34. package/dist/src/cli/commands/update.js +219 -0
  35. package/dist/src/cli/commands/validate.d.ts +10 -0
  36. package/dist/src/cli/commands/validate.js +30 -0
  37. package/dist/src/cli/define-command.d.ts +34 -0
  38. package/dist/src/cli/define-command.js +237 -0
  39. package/dist/src/cli/index.d.ts +2 -0
  40. package/dist/src/cli/index.js +3 -0
  41. package/dist/src/cli/program.d.ts +4 -0
  42. package/dist/src/cli/program.js +46 -0
  43. package/dist/src/cli/shared.d.ts +26 -0
  44. package/dist/src/cli/shared.js +41 -0
  45. package/dist/src/generate-schema.d.ts +1 -0
  46. package/dist/src/generate-schema.js +9 -0
  47. package/dist/src/index.d.ts +48 -0
  48. package/dist/src/index.js +99 -0
  49. package/dist/src/io.d.ts +22 -0
  50. package/dist/src/io.js +66 -0
  51. package/dist/src/json-to-md.d.ts +26 -0
  52. package/dist/src/json-to-md.js +498 -0
  53. package/dist/src/md-to-json.d.ts +22 -0
  54. package/dist/src/md-to-json.js +548 -0
  55. package/dist/src/operations/add-node.d.ts +887 -0
  56. package/dist/src/operations/add-node.js +21 -0
  57. package/dist/src/operations/add-plan-task.d.ts +594 -0
  58. package/dist/src/operations/add-plan-task.js +25 -0
  59. package/dist/src/operations/add-relationship.d.ts +635 -0
  60. package/dist/src/operations/add-relationship.js +25 -0
  61. package/dist/src/operations/check.d.ts +301 -0
  62. package/dist/src/operations/check.js +66 -0
  63. package/dist/src/operations/define-operation.d.ts +14 -0
  64. package/dist/src/operations/define-operation.js +21 -0
  65. package/dist/src/operations/graph.d.ts +303 -0
  66. package/dist/src/operations/graph.js +71 -0
  67. package/dist/src/operations/index.d.ts +38 -0
  68. package/dist/src/operations/index.js +45 -0
  69. package/dist/src/operations/init-document.d.ts +299 -0
  70. package/dist/src/operations/init-document.js +26 -0
  71. package/dist/src/operations/json-to-markdown.d.ts +298 -0
  72. package/dist/src/operations/json-to-markdown.js +13 -0
  73. package/dist/src/operations/mark-task-done.d.ts +594 -0
  74. package/dist/src/operations/mark-task-done.js +26 -0
  75. package/dist/src/operations/mark-task-undone.d.ts +594 -0
  76. package/dist/src/operations/mark-task-undone.js +26 -0
  77. package/dist/src/operations/markdown-to-json.d.ts +298 -0
  78. package/dist/src/operations/markdown-to-json.js +13 -0
  79. package/dist/src/operations/next-id.d.ts +322 -0
  80. package/dist/src/operations/next-id.js +29 -0
  81. package/dist/src/operations/node-history.d.ts +313 -0
  82. package/dist/src/operations/node-history.js +55 -0
  83. package/dist/src/operations/plan-add-task.d.ts +595 -0
  84. package/dist/src/operations/plan-add-task.js +18 -0
  85. package/dist/src/operations/plan-gate.d.ts +351 -0
  86. package/dist/src/operations/plan-gate.js +41 -0
  87. package/dist/src/operations/plan-init.d.ts +299 -0
  88. package/dist/src/operations/plan-init.js +17 -0
  89. package/dist/src/operations/plan-progress.d.ts +313 -0
  90. package/dist/src/operations/plan-progress.js +23 -0
  91. package/dist/src/operations/plan-status.d.ts +349 -0
  92. package/dist/src/operations/plan-status.js +41 -0
  93. package/dist/src/operations/query-node.d.ts +1065 -0
  94. package/dist/src/operations/query-node.js +27 -0
  95. package/dist/src/operations/query-nodes.d.ts +594 -0
  96. package/dist/src/operations/query-nodes.js +23 -0
  97. package/dist/src/operations/query-relationships.d.ts +343 -0
  98. package/dist/src/operations/query-relationships.js +27 -0
  99. package/dist/src/operations/remove-node.d.ts +895 -0
  100. package/dist/src/operations/remove-node.js +58 -0
  101. package/dist/src/operations/remove-relationship.d.ts +622 -0
  102. package/dist/src/operations/remove-relationship.js +26 -0
  103. package/dist/src/operations/rename.d.ts +594 -0
  104. package/dist/src/operations/rename.js +113 -0
  105. package/dist/src/operations/search.d.ts +593 -0
  106. package/dist/src/operations/search.js +39 -0
  107. package/dist/src/operations/speckit-diff.d.ts +330 -0
  108. package/dist/src/operations/speckit-diff.js +89 -0
  109. package/dist/src/operations/speckit-export.d.ts +300 -0
  110. package/dist/src/operations/speckit-export.js +17 -0
  111. package/dist/src/operations/speckit-import.d.ts +299 -0
  112. package/dist/src/operations/speckit-import.js +39 -0
  113. package/dist/src/operations/speckit-sync.d.ts +900 -0
  114. package/dist/src/operations/speckit-sync.js +116 -0
  115. package/dist/src/operations/state-at.d.ts +309 -0
  116. package/dist/src/operations/state-at.js +53 -0
  117. package/dist/src/operations/stats.d.ts +324 -0
  118. package/dist/src/operations/stats.js +85 -0
  119. package/dist/src/operations/task-list.d.ts +305 -0
  120. package/dist/src/operations/task-list.js +44 -0
  121. package/dist/src/operations/timeline.d.ts +312 -0
  122. package/dist/src/operations/timeline.js +46 -0
  123. package/dist/src/operations/trace-from-node.d.ts +1197 -0
  124. package/dist/src/operations/trace-from-node.js +36 -0
  125. package/dist/src/operations/update-metadata.d.ts +593 -0
  126. package/dist/src/operations/update-metadata.js +18 -0
  127. package/dist/src/operations/update-node.d.ts +957 -0
  128. package/dist/src/operations/update-node.js +24 -0
  129. package/dist/src/operations/update-plan-task.d.ts +595 -0
  130. package/dist/src/operations/update-plan-task.js +31 -0
  131. package/dist/src/operations/validate.d.ts +310 -0
  132. package/dist/src/operations/validate.js +82 -0
  133. package/dist/src/schema.d.ts +891 -0
  134. package/dist/src/schema.js +356 -0
  135. package/dist/src/speckit/generate.d.ts +7 -0
  136. package/dist/src/speckit/generate.js +546 -0
  137. package/dist/src/speckit/index.d.ts +4 -0
  138. package/dist/src/speckit/index.js +4 -0
  139. package/dist/src/speckit/parse.d.ts +11 -0
  140. package/dist/src/speckit/parse.js +712 -0
  141. package/dist/src/speckit/plan.d.ts +125 -0
  142. package/dist/src/speckit/plan.js +636 -0
  143. package/dist/src/speckit/project.d.ts +39 -0
  144. package/dist/src/speckit/project.js +141 -0
  145. package/dist/src/text.d.ts +23 -0
  146. package/dist/src/text.js +32 -0
  147. package/package.json +86 -8
  148. package/schema.json +510 -0
@@ -0,0 +1,275 @@
1
+ import pc from "picocolors";
2
+ import * as z from "zod";
3
+ import { textToString } from "../../text.js";
4
+ import { inputArg, readOpts, loadDoc } from "../shared.js";
5
+ import { queryNodesOp, queryNodeOp, queryRelationshipsOp, traceFromNodeOp, timelineOp, nodeHistoryOp, stateAtOp, } from "../../operations/index.js";
6
+ import { NodeType, NodeStatus } from "../../schema.js";
7
+ // ---------------------------------------------------------------------------
8
+ // Presentation helpers
9
+ // ---------------------------------------------------------------------------
10
+ function printNode(r, verbose) {
11
+ if (verbose) {
12
+ console.log(`${pc.cyan(r.id)} — ${pc.bold(r.name)}`);
13
+ console.log(` ${pc.dim("Type")}: ${r.type}`);
14
+ if (r.status)
15
+ console.log(` ${pc.dim("Status")}: ${pc.yellow(r.status)}`);
16
+ if (r.description)
17
+ console.log(` ${pc.dim("Description")}: ${textToString(r.description)}`);
18
+ if (r.context)
19
+ console.log(` ${pc.dim("Context")}: ${textToString(r.context)}`);
20
+ if (r.rationale)
21
+ console.log(` ${pc.dim("Rationale")}: ${textToString(r.rationale)}`);
22
+ if (r.selected)
23
+ console.log(` ${pc.dim("Selected")}: ${r.selected}`);
24
+ if (r.options) {
25
+ console.log(` ${pc.dim("Options")}:`);
26
+ for (const o of r.options)
27
+ console.log(` ${o.id}: ${textToString(o.description)}`);
28
+ }
29
+ if (r.scope)
30
+ console.log(` ${pc.dim("Scope")}: ${r.scope.join(", ")}`);
31
+ if (r.lifecycle) {
32
+ const states = Object.entries(r.lifecycle)
33
+ .map(([k, v]) => `${k}=${String(v)}`)
34
+ .join(", ");
35
+ console.log(` ${pc.dim("Lifecycle")}: ${states}`);
36
+ }
37
+ if (r.includes)
38
+ console.log(` ${pc.dim("Includes")}: ${r.includes.join(", ")}`);
39
+ console.log("");
40
+ }
41
+ else {
42
+ const desc = r.description
43
+ ? " — " + textToString(r.description).slice(0, 60)
44
+ : "";
45
+ console.log(`${pc.cyan(r.id.padEnd(12))} ${pc.dim(r.type.padEnd(16))} ${pc.bold(r.name)}${desc}`);
46
+ }
47
+ }
48
+ function isTraceTreeNode(value) {
49
+ if (typeof value !== "object" || value === null)
50
+ return false;
51
+ return ("id" in value &&
52
+ typeof value.id === "string" &&
53
+ "children" in value &&
54
+ Array.isArray(value.children));
55
+ }
56
+ function printTraceTree(tn, depth) {
57
+ if (!tn.node)
58
+ return;
59
+ const indent = " ".repeat(depth);
60
+ console.log(`${indent}${pc.cyan(tn.id)} — ${pc.bold(tn.node.name)} (${pc.dim(tn.node.type)})`);
61
+ for (const child of tn.children) {
62
+ printTraceTree(child, depth + 1);
63
+ }
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // Arg/opt schemas
67
+ // ---------------------------------------------------------------------------
68
+ const nodesArgs = z.object({
69
+ input: inputArg,
70
+ });
71
+ const nodesOpts = readOpts.extend({
72
+ type: NodeType.optional().describe("filter by node type"),
73
+ status: NodeStatus.optional().describe("filter by node status"),
74
+ });
75
+ const nodeArgs = z.object({
76
+ input: inputArg,
77
+ id: z.string().describe("node ID to retrieve"),
78
+ });
79
+ const nodeOpts = readOpts;
80
+ const relsArgs = z.object({
81
+ input: inputArg,
82
+ });
83
+ const relsOpts = readOpts.extend({
84
+ from: z.string().optional().describe("filter relationships by source node"),
85
+ to: z.string().optional().describe("filter relationships by target node"),
86
+ type: z.string().optional().describe("filter by relationship type"),
87
+ });
88
+ const traceArgs = z.object({
89
+ input: inputArg,
90
+ id: z.string().describe("node ID to start trace from"),
91
+ });
92
+ const traceOpts = readOpts;
93
+ const timelineArgs = z.object({
94
+ input: inputArg,
95
+ });
96
+ const timelineOpts = readOpts.extend({
97
+ node: z.string().optional().describe("filter events to a specific node"),
98
+ });
99
+ const stateAtArgs = z.object({
100
+ input: inputArg,
101
+ time: z.string().describe("ISO timestamp to query"),
102
+ });
103
+ const stateAtOpts = readOpts;
104
+ // ---------------------------------------------------------------------------
105
+ // Subcommands
106
+ // ---------------------------------------------------------------------------
107
+ const nodesSubcommand = {
108
+ name: "nodes",
109
+ description: queryNodesOp.def.description,
110
+ apiLink: queryNodesOp.def.name,
111
+ args: nodesArgs,
112
+ opts: nodesOpts,
113
+ action(rawArgs, rawOpts) {
114
+ const args = nodesArgs.parse(rawArgs);
115
+ const opts = nodesOpts.parse(rawOpts);
116
+ const { doc } = loadDoc(args.input);
117
+ const nodes = queryNodesOp({ doc, type: opts.type, status: opts.status });
118
+ if (opts.json) {
119
+ console.log(JSON.stringify(nodes, null, 2));
120
+ }
121
+ else {
122
+ for (const n of nodes)
123
+ printNode(n, false);
124
+ console.log(`\n${String(nodes.length)} node(s)`);
125
+ }
126
+ },
127
+ };
128
+ const nodeSubcommand = {
129
+ name: "node",
130
+ description: queryNodeOp.def.description,
131
+ apiLink: queryNodeOp.def.name,
132
+ args: nodeArgs,
133
+ opts: nodeOpts,
134
+ action(rawArgs, rawOpts) {
135
+ const args = nodeArgs.parse(rawArgs);
136
+ const opts = nodeOpts.parse(rawOpts);
137
+ const { doc } = loadDoc(args.input);
138
+ const result = queryNodeOp({ doc, id: args.id });
139
+ if (!result) {
140
+ console.error(`Node not found: ${args.id}`);
141
+ process.exit(1);
142
+ }
143
+ if (opts.json) {
144
+ console.log(JSON.stringify(result.node, null, 2));
145
+ }
146
+ else {
147
+ printNode(result.node, true);
148
+ if (result.outgoing.length > 0) {
149
+ console.log(`${pc.dim("Outgoing relationships")}:`);
150
+ for (const r of result.outgoing)
151
+ console.log(` → ${pc.dim(r.type)} → ${pc.cyan(r.to)}`);
152
+ }
153
+ if (result.incoming.length > 0) {
154
+ console.log(`${pc.dim("Incoming relationships")}:`);
155
+ for (const r of result.incoming)
156
+ console.log(` ← ${pc.dim(r.type)} ← ${pc.cyan(r.from)}`);
157
+ }
158
+ }
159
+ },
160
+ };
161
+ const relsSubcommand = {
162
+ name: "rels",
163
+ description: queryRelationshipsOp.def.description,
164
+ apiLink: queryRelationshipsOp.def.name,
165
+ args: relsArgs,
166
+ opts: relsOpts,
167
+ action(rawArgs, rawOpts) {
168
+ const args = relsArgs.parse(rawArgs);
169
+ const opts = relsOpts.parse(rawOpts);
170
+ const { doc } = loadDoc(args.input);
171
+ const rels = queryRelationshipsOp({
172
+ doc,
173
+ from: opts.from,
174
+ to: opts.to,
175
+ type: opts.type,
176
+ });
177
+ if (opts.json) {
178
+ console.log(JSON.stringify(rels, null, 2));
179
+ }
180
+ else {
181
+ for (const r of rels) {
182
+ console.log(`${pc.cyan(r.from.padEnd(12))} ${pc.dim(r.type.padEnd(20))} ${pc.cyan(r.to)}`);
183
+ }
184
+ console.log(`\n${String(rels.length)} relationship(s)`);
185
+ }
186
+ },
187
+ };
188
+ const traceSubcommand = {
189
+ name: "trace",
190
+ description: traceFromNodeOp.def.description,
191
+ apiLink: traceFromNodeOp.def.name,
192
+ args: traceArgs,
193
+ opts: traceOpts,
194
+ action(rawArgs, rawOpts) {
195
+ const args = traceArgs.parse(rawArgs);
196
+ const opts = traceOpts.parse(rawOpts);
197
+ const { doc } = loadDoc(args.input);
198
+ const trace = traceFromNodeOp({ doc, startId: args.id });
199
+ if (opts.json) {
200
+ console.log(JSON.stringify(trace, null, 2));
201
+ }
202
+ else if (isTraceTreeNode(trace)) {
203
+ printTraceTree(trace, 0);
204
+ }
205
+ },
206
+ };
207
+ const timelineSubcommand = {
208
+ name: "timeline",
209
+ description: timelineOp.def.description,
210
+ apiLink: timelineOp.def.name,
211
+ args: timelineArgs,
212
+ opts: timelineOpts,
213
+ action(rawArgs, rawOpts) {
214
+ const args = timelineArgs.parse(rawArgs);
215
+ const opts = timelineOpts.parse(rawOpts);
216
+ const { doc } = loadDoc(args.input);
217
+ const events = opts.node
218
+ ? nodeHistoryOp({ doc, nodeId: opts.node })
219
+ : timelineOp({ doc });
220
+ if (opts.json) {
221
+ console.log(JSON.stringify(events, null, 2));
222
+ }
223
+ else {
224
+ if (events.length === 0) {
225
+ console.log("(no timestamped events)");
226
+ }
227
+ else {
228
+ for (const event of events) {
229
+ console.log(`${event.timestamp} ${event.nodeId} (${event.nodeType}) ${event.state}`);
230
+ }
231
+ }
232
+ }
233
+ },
234
+ };
235
+ const stateAtSubcommand = {
236
+ name: "state-at",
237
+ description: stateAtOp.def.description,
238
+ apiLink: stateAtOp.def.name,
239
+ args: stateAtArgs,
240
+ opts: stateAtOpts,
241
+ action(rawArgs, rawOpts) {
242
+ const args = stateAtArgs.parse(rawArgs);
243
+ const opts = stateAtOpts.parse(rawOpts);
244
+ const { doc } = loadDoc(args.input);
245
+ const result = stateAtOp({ doc, timestamp: args.time });
246
+ if (opts.json) {
247
+ console.log(JSON.stringify(result, null, 2));
248
+ }
249
+ else {
250
+ if (result.length === 0) {
251
+ console.log(`(no active states at ${args.time})`);
252
+ }
253
+ else {
254
+ for (const nodeState of result) {
255
+ console.log(`${nodeState.nodeId} (${nodeState.nodeName}): ${nodeState.activeStates.join(", ")}`);
256
+ }
257
+ }
258
+ }
259
+ },
260
+ };
261
+ // ---------------------------------------------------------------------------
262
+ // Main command
263
+ // ---------------------------------------------------------------------------
264
+ export const queryCommand = {
265
+ name: "query",
266
+ description: "Query nodes, relationships, traces, and temporal state",
267
+ subcommands: [
268
+ nodesSubcommand,
269
+ nodeSubcommand,
270
+ relsSubcommand,
271
+ traceSubcommand,
272
+ timelineSubcommand,
273
+ stateAtSubcommand,
274
+ ],
275
+ };
@@ -0,0 +1,13 @@
1
+ import * as z from "zod";
2
+ import type { CommandDef } from "../define-command.js";
3
+ declare const argsSchema: z.ZodObject<{
4
+ input: z.ZodString;
5
+ nodeId: z.ZodString;
6
+ }, z.core.$strip>;
7
+ declare const optsSchema: z.ZodObject<{
8
+ json: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
9
+ dryRun: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
10
+ sync: z.ZodOptional<z.ZodString>;
11
+ }, z.core.$strip>;
12
+ export declare const removeCommand: CommandDef<typeof argsSchema, typeof optsSchema>;
13
+ export {};
@@ -0,0 +1,50 @@
1
+ import * as z from "zod";
2
+ import { removeNodeOp } from "../../operations/index.js";
3
+ import { inputArg, mutationOpts, loadDoc, persistDoc } from "../shared.js";
4
+ const argsSchema = z.object({
5
+ input: inputArg,
6
+ nodeId: z.string().describe("ID of the node to remove"),
7
+ });
8
+ const optsSchema = mutationOpts;
9
+ export const removeCommand = {
10
+ name: "remove",
11
+ description: removeNodeOp.def.description,
12
+ apiLink: removeNodeOp.def.name,
13
+ args: argsSchema,
14
+ opts: optsSchema,
15
+ action(args, opts) {
16
+ const loaded = loadDoc(args.input);
17
+ const { doc } = loaded;
18
+ const targetId = args.nodeId;
19
+ const removedNode = doc.nodes.find((n) => n.id === targetId);
20
+ try {
21
+ const result = removeNodeOp({ doc, id: targetId });
22
+ // Count removed relationships
23
+ const before = (doc.relationships ?? []).length;
24
+ const after = (result.doc.relationships ?? []).length;
25
+ const removedRels = before - after;
26
+ persistDoc(result.doc, loaded, opts);
27
+ if (opts.json) {
28
+ console.log(JSON.stringify({
29
+ removed: removedNode,
30
+ removedRelationships: removedRels,
31
+ warnings: result.warnings,
32
+ }, null, 2));
33
+ }
34
+ else {
35
+ if (removedRels > 0) {
36
+ console.log(`Removed ${String(removedRels)} relationship(s) involving ${targetId}`);
37
+ }
38
+ // Print warnings
39
+ for (const warning of result.warnings) {
40
+ console.warn(`Warning: ${warning}`);
41
+ }
42
+ console.log(`${opts.dryRun ? "[dry-run] Would remove" : "Removed"} ${String(removedNode?.type)} ${targetId} — ${String(removedNode?.name)}`);
43
+ }
44
+ }
45
+ catch (err) {
46
+ console.error(err instanceof Error ? err.message : String(err));
47
+ process.exit(1);
48
+ }
49
+ },
50
+ };
@@ -0,0 +1,14 @@
1
+ import * as z from "zod";
2
+ import type { CommandDef } from "../define-command.js";
3
+ declare const argsSchema: z.ZodObject<{
4
+ input: z.ZodString;
5
+ oldId: z.ZodString;
6
+ newId: z.ZodString;
7
+ }, z.core.$strip>;
8
+ declare const optsSchema: z.ZodObject<{
9
+ json: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
10
+ dryRun: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
11
+ sync: z.ZodOptional<z.ZodString>;
12
+ }, z.core.$strip>;
13
+ export declare const renameCommand: CommandDef<typeof argsSchema, typeof optsSchema>;
14
+ export {};
@@ -0,0 +1,34 @@
1
+ import * as z from "zod";
2
+ import { renameOp } from "../../operations/index.js";
3
+ import { inputArg, mutationOpts, loadDoc, persistDoc } from "../shared.js";
4
+ const argsSchema = z.object({
5
+ input: inputArg,
6
+ oldId: z.string().describe("Current node ID"),
7
+ newId: z.string().describe("New node ID"),
8
+ });
9
+ const optsSchema = mutationOpts;
10
+ export const renameCommand = {
11
+ name: "rename",
12
+ description: renameOp.def.description,
13
+ apiLink: renameOp.def.name,
14
+ args: argsSchema,
15
+ opts: optsSchema,
16
+ action(args, opts) {
17
+ try {
18
+ const loaded = loadDoc(args.input);
19
+ const { doc } = loaded;
20
+ const updated = renameOp({ doc, oldId: args.oldId, newId: args.newId });
21
+ persistDoc(updated, loaded, opts);
22
+ if (opts.json) {
23
+ console.log(JSON.stringify({ oldId: args.oldId, newId: args.newId }, null, 2));
24
+ }
25
+ else {
26
+ console.log(`${opts.dryRun ? "[dry-run] Would rename" : "Renamed"} ${args.oldId} → ${args.newId}`);
27
+ }
28
+ }
29
+ catch (err) {
30
+ console.error(err instanceof Error ? err.message : String(err));
31
+ process.exit(1);
32
+ }
33
+ },
34
+ };
@@ -0,0 +1,11 @@
1
+ import * as z from "zod";
2
+ import type { CommandDef } from "../define-command.js";
3
+ declare const argsSchema: z.ZodObject<{
4
+ input: z.ZodString;
5
+ term: z.ZodString;
6
+ }, z.core.$strip>;
7
+ declare const optsSchema: z.ZodObject<{
8
+ json: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
9
+ }, z.core.$strip>;
10
+ export declare const searchCommand: CommandDef<typeof argsSchema, typeof optsSchema>;
11
+ export {};
@@ -0,0 +1,37 @@
1
+ import * as z from "zod";
2
+ import { searchOp } from "../../operations/index.js";
3
+ import { inputArg, readOpts, loadDoc } from "../shared.js";
4
+ import { textToString } from "../../text.js";
5
+ const argsSchema = z.object({
6
+ input: inputArg,
7
+ term: z.string().describe("Search term"),
8
+ });
9
+ const optsSchema = readOpts;
10
+ export const searchCommand = {
11
+ name: "search",
12
+ description: searchOp.def.description,
13
+ apiLink: searchOp.def.name,
14
+ args: argsSchema,
15
+ opts: optsSchema,
16
+ action(args, opts) {
17
+ const { doc } = loadDoc(args.input);
18
+ const matches = searchOp({ doc, term: args.term });
19
+ if (opts.json) {
20
+ console.log(JSON.stringify(matches, null, 2));
21
+ }
22
+ else {
23
+ if (matches.length === 0) {
24
+ console.log(`No matches for "${args.term}"`);
25
+ }
26
+ else {
27
+ for (const m of matches) {
28
+ const desc = m.description
29
+ ? " — " + textToString(m.description).slice(0, 60)
30
+ : "";
31
+ console.log(`${m.id.padEnd(12)} ${m.type.padEnd(16)} ${m.name}${desc}`);
32
+ }
33
+ console.log(`\n${String(matches.length)} match(es)`);
34
+ }
35
+ }
36
+ },
37
+ };
@@ -0,0 +1,2 @@
1
+ import type { CommandDef } from "../define-command.js";
2
+ export declare const speckitCommand: CommandDef;