@mka-rainmaker/ama 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/dist/analyzers/baseline/analyzer.d.ts +47 -0
  4. package/dist/analyzers/baseline/analyzer.d.ts.map +1 -0
  5. package/dist/analyzers/baseline/analyzer.js +84 -0
  6. package/dist/analyzers/baseline/analyzer.js.map +1 -0
  7. package/dist/analyzers/baseline/c.d.ts +12 -0
  8. package/dist/analyzers/baseline/c.d.ts.map +1 -0
  9. package/dist/analyzers/baseline/c.js +56 -0
  10. package/dist/analyzers/baseline/c.js.map +1 -0
  11. package/dist/analyzers/baseline/config.d.ts +21 -0
  12. package/dist/analyzers/baseline/config.d.ts.map +1 -0
  13. package/dist/analyzers/baseline/config.js +32 -0
  14. package/dist/analyzers/baseline/config.js.map +1 -0
  15. package/dist/analyzers/baseline/csharp.d.ts +9 -0
  16. package/dist/analyzers/baseline/csharp.d.ts.map +1 -0
  17. package/dist/analyzers/baseline/csharp.js +107 -0
  18. package/dist/analyzers/baseline/csharp.js.map +1 -0
  19. package/dist/analyzers/baseline/go.d.ts +11 -0
  20. package/dist/analyzers/baseline/go.d.ts.map +1 -0
  21. package/dist/analyzers/baseline/go.js +66 -0
  22. package/dist/analyzers/baseline/go.js.map +1 -0
  23. package/dist/analyzers/baseline/java.d.ts +9 -0
  24. package/dist/analyzers/baseline/java.d.ts.map +1 -0
  25. package/dist/analyzers/baseline/java.js +50 -0
  26. package/dist/analyzers/baseline/java.js.map +1 -0
  27. package/dist/analyzers/baseline/javascript.d.ts +10 -0
  28. package/dist/analyzers/baseline/javascript.d.ts.map +1 -0
  29. package/dist/analyzers/baseline/javascript.js +55 -0
  30. package/dist/analyzers/baseline/javascript.js.map +1 -0
  31. package/dist/analyzers/baseline/kotlin.d.ts +11 -0
  32. package/dist/analyzers/baseline/kotlin.d.ts.map +1 -0
  33. package/dist/analyzers/baseline/kotlin.js +67 -0
  34. package/dist/analyzers/baseline/kotlin.js.map +1 -0
  35. package/dist/analyzers/baseline/paths.d.ts +6 -0
  36. package/dist/analyzers/baseline/paths.d.ts.map +1 -0
  37. package/dist/analyzers/baseline/paths.js +17 -0
  38. package/dist/analyzers/baseline/paths.js.map +1 -0
  39. package/dist/analyzers/baseline/php.d.ts +11 -0
  40. package/dist/analyzers/baseline/php.d.ts.map +1 -0
  41. package/dist/analyzers/baseline/php.js +76 -0
  42. package/dist/analyzers/baseline/php.js.map +1 -0
  43. package/dist/analyzers/baseline/python.d.ts +10 -0
  44. package/dist/analyzers/baseline/python.d.ts.map +1 -0
  45. package/dist/analyzers/baseline/python.js +63 -0
  46. package/dist/analyzers/baseline/python.js.map +1 -0
  47. package/dist/analyzers/baseline/rust.d.ts +10 -0
  48. package/dist/analyzers/baseline/rust.d.ts.map +1 -0
  49. package/dist/analyzers/baseline/rust.js +45 -0
  50. package/dist/analyzers/baseline/rust.js.map +1 -0
  51. package/dist/analyzers/baseline/swift.d.ts +11 -0
  52. package/dist/analyzers/baseline/swift.d.ts.map +1 -0
  53. package/dist/analyzers/baseline/swift.js +19 -0
  54. package/dist/analyzers/baseline/swift.js.map +1 -0
  55. package/dist/analyzers/baseline/treesitter.d.ts +11 -0
  56. package/dist/analyzers/baseline/treesitter.d.ts.map +1 -0
  57. package/dist/analyzers/baseline/treesitter.js +87 -0
  58. package/dist/analyzers/baseline/treesitter.js.map +1 -0
  59. package/dist/analyzers/baseline/walk.d.ts +26 -0
  60. package/dist/analyzers/baseline/walk.d.ts.map +1 -0
  61. package/dist/analyzers/baseline/walk.js +76 -0
  62. package/dist/analyzers/baseline/walk.js.map +1 -0
  63. package/dist/analyzers/registry.d.ts +19 -0
  64. package/dist/analyzers/registry.d.ts.map +1 -0
  65. package/dist/analyzers/registry.js +43 -0
  66. package/dist/analyzers/registry.js.map +1 -0
  67. package/dist/analyzers/sfc/analyzer.d.ts +17 -0
  68. package/dist/analyzers/sfc/analyzer.d.ts.map +1 -0
  69. package/dist/analyzers/sfc/analyzer.js +141 -0
  70. package/dist/analyzers/sfc/analyzer.js.map +1 -0
  71. package/dist/analyzers/sidecar/analyzer.d.ts +29 -0
  72. package/dist/analyzers/sidecar/analyzer.d.ts.map +1 -0
  73. package/dist/analyzers/sidecar/analyzer.js +114 -0
  74. package/dist/analyzers/sidecar/analyzer.js.map +1 -0
  75. package/dist/analyzers/sidecar/protocol.d.ts +508 -0
  76. package/dist/analyzers/sidecar/protocol.d.ts.map +1 -0
  77. package/dist/analyzers/sidecar/protocol.js +102 -0
  78. package/dist/analyzers/sidecar/protocol.js.map +1 -0
  79. package/dist/analyzers/types.d.ts +46 -0
  80. package/dist/analyzers/types.d.ts.map +1 -0
  81. package/dist/analyzers/types.js +2 -0
  82. package/dist/analyzers/types.js.map +1 -0
  83. package/dist/analyzers/typescript/analyzer.d.ts +126 -0
  84. package/dist/analyzers/typescript/analyzer.d.ts.map +1 -0
  85. package/dist/analyzers/typescript/analyzer.js +1600 -0
  86. package/dist/analyzers/typescript/analyzer.js.map +1 -0
  87. package/dist/cli/commands/cycles.d.ts +6 -0
  88. package/dist/cli/commands/cycles.d.ts.map +1 -0
  89. package/dist/cli/commands/cycles.js +27 -0
  90. package/dist/cli/commands/cycles.js.map +1 -0
  91. package/dist/cli/commands/files.d.ts +6 -0
  92. package/dist/cli/commands/files.d.ts.map +1 -0
  93. package/dist/cli/commands/files.js +33 -0
  94. package/dist/cli/commands/files.js.map +1 -0
  95. package/dist/cli/commands/impact.d.ts +18 -0
  96. package/dist/cli/commands/impact.d.ts.map +1 -0
  97. package/dist/cli/commands/impact.js +113 -0
  98. package/dist/cli/commands/impact.js.map +1 -0
  99. package/dist/cli/commands/lifecycle.d.ts +5 -0
  100. package/dist/cli/commands/lifecycle.d.ts.map +1 -0
  101. package/dist/cli/commands/lifecycle.js +83 -0
  102. package/dist/cli/commands/lifecycle.js.map +1 -0
  103. package/dist/cli/commands/query.d.ts +31 -0
  104. package/dist/cli/commands/query.d.ts.map +1 -0
  105. package/dist/cli/commands/query.js +187 -0
  106. package/dist/cli/commands/query.js.map +1 -0
  107. package/dist/cli/commands/search.d.ts +21 -0
  108. package/dist/cli/commands/search.d.ts.map +1 -0
  109. package/dist/cli/commands/search.js +160 -0
  110. package/dist/cli/commands/search.js.map +1 -0
  111. package/dist/cli/commands/status.d.ts +6 -0
  112. package/dist/cli/commands/status.d.ts.map +1 -0
  113. package/dist/cli/commands/status.js +63 -0
  114. package/dist/cli/commands/status.js.map +1 -0
  115. package/dist/cli/commands/sync.d.ts +6 -0
  116. package/dist/cli/commands/sync.d.ts.map +1 -0
  117. package/dist/cli/commands/sync.js +57 -0
  118. package/dist/cli/commands/sync.js.map +1 -0
  119. package/dist/cli/emit.d.ts +9 -0
  120. package/dist/cli/emit.d.ts.map +1 -0
  121. package/dist/cli/emit.js +10 -0
  122. package/dist/cli/emit.js.map +1 -0
  123. package/dist/cli/index.d.ts +37 -0
  124. package/dist/cli/index.d.ts.map +1 -0
  125. package/dist/cli/index.js +128 -0
  126. package/dist/cli/index.js.map +1 -0
  127. package/dist/cli/paths.d.ts +7 -0
  128. package/dist/cli/paths.d.ts.map +1 -0
  129. package/dist/cli/paths.js +10 -0
  130. package/dist/cli/paths.js.map +1 -0
  131. package/dist/cli/query-runner.d.ts +13 -0
  132. package/dist/cli/query-runner.d.ts.map +1 -0
  133. package/dist/cli/query-runner.js +33 -0
  134. package/dist/cli/query-runner.js.map +1 -0
  135. package/dist/graph/dispatch.d.ts +17 -0
  136. package/dist/graph/dispatch.d.ts.map +1 -0
  137. package/dist/graph/dispatch.js +82 -0
  138. package/dist/graph/dispatch.js.map +1 -0
  139. package/dist/graph/id.d.ts +19 -0
  140. package/dist/graph/id.d.ts.map +1 -0
  141. package/dist/graph/id.js +17 -0
  142. package/dist/graph/id.js.map +1 -0
  143. package/dist/graph/index.d.ts +6 -0
  144. package/dist/graph/index.d.ts.map +1 -0
  145. package/dist/graph/index.js +4 -0
  146. package/dist/graph/index.js.map +1 -0
  147. package/dist/graph/types.d.ts +71 -0
  148. package/dist/graph/types.d.ts.map +1 -0
  149. package/dist/graph/types.js +52 -0
  150. package/dist/graph/types.js.map +1 -0
  151. package/dist/indexer/debouncer.d.ts +32 -0
  152. package/dist/indexer/debouncer.d.ts.map +1 -0
  153. package/dist/indexer/debouncer.js +81 -0
  154. package/dist/indexer/debouncer.js.map +1 -0
  155. package/dist/indexer/ignore.d.ts +55 -0
  156. package/dist/indexer/ignore.d.ts.map +1 -0
  157. package/dist/indexer/ignore.js +170 -0
  158. package/dist/indexer/ignore.js.map +1 -0
  159. package/dist/indexer/indexer.d.ts +112 -0
  160. package/dist/indexer/indexer.d.ts.map +1 -0
  161. package/dist/indexer/indexer.js +392 -0
  162. package/dist/indexer/indexer.js.map +1 -0
  163. package/dist/indexer/watcher.d.ts +50 -0
  164. package/dist/indexer/watcher.d.ts.map +1 -0
  165. package/dist/indexer/watcher.js +86 -0
  166. package/dist/indexer/watcher.js.map +1 -0
  167. package/dist/mcp/build-info.d.ts +16 -0
  168. package/dist/mcp/build-info.d.ts.map +1 -0
  169. package/dist/mcp/build-info.js +54 -0
  170. package/dist/mcp/build-info.js.map +1 -0
  171. package/dist/mcp/http.d.ts +18 -0
  172. package/dist/mcp/http.d.ts.map +1 -0
  173. package/dist/mcp/http.js +145 -0
  174. package/dist/mcp/http.js.map +1 -0
  175. package/dist/mcp/server.d.ts +22 -0
  176. package/dist/mcp/server.d.ts.map +1 -0
  177. package/dist/mcp/server.js +401 -0
  178. package/dist/mcp/server.js.map +1 -0
  179. package/dist/mcp/session.d.ts +155 -0
  180. package/dist/mcp/session.d.ts.map +1 -0
  181. package/dist/mcp/session.js +319 -0
  182. package/dist/mcp/session.js.map +1 -0
  183. package/dist/query/service.d.ts +329 -0
  184. package/dist/query/service.d.ts.map +1 -0
  185. package/dist/query/service.js +959 -0
  186. package/dist/query/service.js.map +1 -0
  187. package/dist/runtime/entrypoint.d.ts +11 -0
  188. package/dist/runtime/entrypoint.d.ts.map +1 -0
  189. package/dist/runtime/entrypoint.js +22 -0
  190. package/dist/runtime/entrypoint.js.map +1 -0
  191. package/dist/runtime/quiet-sqlite-warning.d.ts +14 -0
  192. package/dist/runtime/quiet-sqlite-warning.d.ts.map +1 -0
  193. package/dist/runtime/quiet-sqlite-warning.js +26 -0
  194. package/dist/runtime/quiet-sqlite-warning.js.map +1 -0
  195. package/dist/runtime/wasm-tier.d.ts +2 -0
  196. package/dist/runtime/wasm-tier.d.ts.map +1 -0
  197. package/dist/runtime/wasm-tier.js +54 -0
  198. package/dist/runtime/wasm-tier.js.map +1 -0
  199. package/dist/store/memory.d.ts +54 -0
  200. package/dist/store/memory.d.ts.map +1 -0
  201. package/dist/store/memory.js +210 -0
  202. package/dist/store/memory.js.map +1 -0
  203. package/dist/store/sqlite.d.ts +38 -0
  204. package/dist/store/sqlite.d.ts.map +1 -0
  205. package/dist/store/sqlite.js +298 -0
  206. package/dist/store/sqlite.js.map +1 -0
  207. package/dist/store/types.d.ts +76 -0
  208. package/dist/store/types.d.ts.map +1 -0
  209. package/dist/store/types.js +2 -0
  210. package/dist/store/types.js.map +1 -0
  211. package/package.json +59 -0
@@ -0,0 +1,187 @@
1
+ import { emitError } from "../emit.js";
2
+ import { withQuery } from "../query-runner.js";
3
+ const NO_INDEX = "No index found. Run `ama index` first.";
4
+ /** One compact line per node: kind, qualified name, location, tier. */
5
+ export function nodeLine(node) {
6
+ const where = node.range ? `${node.file}:${node.range.startLine}` : node.file;
7
+ return ` ${node.kind.padEnd(10)} ${node.qualifiedName || node.name} ${where} [${node.tier}]`;
8
+ }
9
+ /** Comma-separated qualified names, for the compact relationship summaries. */
10
+ function names(nodes) {
11
+ return nodes.map((n) => n.qualifiedName || n.name).join(", ");
12
+ }
13
+ /** Render a node list (callers/callees) for the terminal, or `--json`. */
14
+ export function renderNodeList(label, ref, nodes, json) {
15
+ if (json)
16
+ return JSON.stringify(nodes, null, 2);
17
+ if (nodes.length === 0)
18
+ return `No ${label} found for "${ref}".`;
19
+ const lines = [`${nodes.length} ${label} of "${ref}":`];
20
+ for (const node of nodes)
21
+ lines.push(nodeLine(node));
22
+ return lines.join("\n");
23
+ }
24
+ /** Render a {@link NodeView} (the `node` command) for the terminal, or `--json`. */
25
+ export function renderNodeView(view, json) {
26
+ if (json)
27
+ return JSON.stringify(view, null, 2);
28
+ const lines = [nodeLine(view.node).trimStart()];
29
+ // The symbol's own source — the point of a single-symbol detail view.
30
+ if (view.snippet)
31
+ lines.push("", view.snippet.text, "");
32
+ lines.push(` callers (${view.callers.length}): ${names(view.callers)}`, ` callees (${view.callees.length}): ${names(view.callees)}`, ` referrers (${view.referrers.length}): ${names(view.referrers)}`, ` dependents (${view.dependents.length}): ${names(view.dependents)}`);
33
+ return lines.join("\n");
34
+ }
35
+ /** Render a {@link FileSkeleton} (the `skeleton` command) for the terminal, or `--json`. */
36
+ export function renderFileSkeleton(skeleton, json) {
37
+ if (json)
38
+ return JSON.stringify(skeleton, null, 2);
39
+ const lines = [
40
+ `${skeleton.file.file} — ${skeleton.symbols.length} symbol(s), ` +
41
+ `${skeleton.dependents.length} dependent(s)`,
42
+ ];
43
+ for (const sym of skeleton.symbols)
44
+ lines.push(nodeLine(sym));
45
+ lines.push(` dependents (${skeleton.dependents.length}): ${names(skeleton.dependents)}`);
46
+ return lines.join("\n");
47
+ }
48
+ /** Render an {@link Exploration} (the `explore` command) for the terminal, or `--json`. */
49
+ export function renderExploration(exploration, json) {
50
+ if (json)
51
+ return JSON.stringify(exploration, null, 2);
52
+ const files = Object.entries(exploration.byFile);
53
+ const shown = exploration.relationships.length;
54
+ const matchSummary = exploration.totalMatches > shown
55
+ ? `showing top ${shown} of ${exploration.totalMatches} matches in ${files.length} file(s) (narrow the query to see more)`
56
+ : `matches in ${files.length} file(s)`;
57
+ const lines = [`Exploring "${exploration.question}" — ${matchSummary}:`];
58
+ for (const [file, nodes] of files)
59
+ lines.push(` ${file}: ${names(nodes)}`);
60
+ const blast = exploration.blastRadius.length;
61
+ const blastSummary = exploration.totalBlastRadius > blast
62
+ ? `${blast} of ${exploration.totalBlastRadius} symbol(s)`
63
+ : `${blast} symbol(s)`;
64
+ lines.push(`blast radius: ${blastSummary}`);
65
+ return lines.join("\n");
66
+ }
67
+ /** Build a `callers`/`callees`-style command from the QueryService method it wraps. */
68
+ function refQueryCommand(name, summary, pick) {
69
+ return {
70
+ name,
71
+ summary,
72
+ usage: `Usage: ama ${name} <symbol>`,
73
+ async run(args, ctx) {
74
+ const ref = args[0];
75
+ if (ref === undefined) {
76
+ emitError(ctx, `Usage: ama ${name} <symbol>`);
77
+ return 1;
78
+ }
79
+ const nodes = await withQuery(process.env.AMA_ROOT ?? ".", (query) => pick(query, ref));
80
+ if (nodes === undefined) {
81
+ emitError(ctx, NO_INDEX);
82
+ return 1;
83
+ }
84
+ ctx.write(renderNodeList(name, ref, nodes, ctx.json));
85
+ return 0;
86
+ },
87
+ };
88
+ }
89
+ export const callersCommand = refQueryCommand("callers", "List the callers of a symbol", (q, ref) => q.findCallers(ref).map((c) => c.symbol));
90
+ export const calleesCommand = refQueryCommand("callees", "List what a symbol calls", (q, ref) => q.findCallees(ref).map((c) => c.symbol));
91
+ export const implementationsCommand = refQueryCommand("implementations", "List classes that implement an interface", (q, ref) => q.findImplementations(ref));
92
+ export const interfacesCommand = refQueryCommand("interfaces", "List interfaces a class implements", (q, ref) => q.findInterfaces(ref));
93
+ export const importersCommand = refQueryCommand("importers", "List files that import a file or symbol", (q, ref) => q.findImporters(ref));
94
+ export const importsCommand = refQueryCommand("imports", "List what a file imports", (q, ref) => q.findImports(ref));
95
+ export const typeUsersCommand = refQueryCommand("type-users", "List symbols that use a type", (q, ref) => q.findTypeUsers(ref));
96
+ export const typesUsedCommand = refQueryCommand("types-used", "List the types a symbol uses", (q, ref) => q.findTypesUsed(ref));
97
+ export const returnsCommand = refQueryCommand("returns", "List the named type(s) a function or method returns", (q, ref) => q.findReturns(ref));
98
+ export const handlersCommand = refQueryCommand("handlers", "List the handler(s) a route maps to", (q, ref) => q.findHandlers(ref).map((h) => h.symbol));
99
+ export const routesCommand = refQueryCommand("routes", "List the routes that map to a symbol", (q, ref) => q.findRoutes(ref).map((r) => r.symbol));
100
+ export const referrersCommand = refQueryCommand("referrers", "List everything that references a symbol (variable readers, routes, dispatch)", (q, ref) => q.findReferrers(ref).map((r) => r.symbol));
101
+ export const overridesCommand = refQueryCommand("overrides", "List the supertype methods a method overrides/implements", (q, ref) => q.findOverrides(ref).map((o) => o.symbol));
102
+ export const overriddenByCommand = refQueryCommand("overridden-by", "List the methods that override a method", (q, ref) => q.findOverriddenBy(ref).map((o) => o.symbol));
103
+ export const nodeCommand = {
104
+ name: "node",
105
+ summary: "Show a symbol with its callers, callees, and dependents",
106
+ usage: "Usage: ama node <symbol>",
107
+ async run(args, ctx) {
108
+ const ref = args[0];
109
+ if (ref === undefined) {
110
+ emitError(ctx, "Usage: ama node <symbol>");
111
+ return 1;
112
+ }
113
+ // Wrap so the outer undefined ("no index") stays distinct from node()'s own
114
+ // undefined ("symbol not found").
115
+ const result = await withQuery(process.env.AMA_ROOT ?? ".", (query) => ({
116
+ view: query.node(ref),
117
+ }));
118
+ if (result === undefined) {
119
+ emitError(ctx, NO_INDEX);
120
+ return 1;
121
+ }
122
+ if (result.view === undefined) {
123
+ emitError(ctx, `Symbol not found: ${ref}`);
124
+ return 1;
125
+ }
126
+ ctx.write(renderNodeView(result.view, ctx.json));
127
+ return 0;
128
+ },
129
+ };
130
+ export const skeletonCommand = {
131
+ name: "skeleton",
132
+ summary: "Show a file's symbol outline and the files that depend on it",
133
+ usage: "Usage: ama skeleton <file>",
134
+ async run(args, ctx) {
135
+ const ref = args[0];
136
+ if (ref === undefined) {
137
+ emitError(ctx, "Usage: ama skeleton <file>");
138
+ return 1;
139
+ }
140
+ // Wrap so the outer undefined ("no index") stays distinct from
141
+ // fileSkeleton()'s own undefined ("file not found").
142
+ const result = await withQuery(process.env.AMA_ROOT ?? ".", (query) => ({
143
+ skeleton: query.fileSkeleton(ref),
144
+ }));
145
+ if (result === undefined) {
146
+ emitError(ctx, NO_INDEX);
147
+ return 1;
148
+ }
149
+ if (result.skeleton === undefined) {
150
+ emitError(ctx, `File not found: ${ref}`);
151
+ return 1;
152
+ }
153
+ ctx.write(renderFileSkeleton(result.skeleton, ctx.json));
154
+ return 0;
155
+ },
156
+ };
157
+ export const exploreCommand = {
158
+ name: "explore",
159
+ summary: "Explore symbols matching a question and their blast radius",
160
+ usage: "Usage: ama explore [--limit N] <question>",
161
+ async run(args, ctx) {
162
+ let limit;
163
+ const words = [];
164
+ for (let i = 0; i < args.length; i++) {
165
+ if (args[i] === "--limit" && i + 1 < args.length) {
166
+ const n = Number(args[++i]);
167
+ if (Number.isInteger(n) && n > 0)
168
+ limit = n;
169
+ continue;
170
+ }
171
+ words.push(args[i]);
172
+ }
173
+ const question = words.join(" ").trim();
174
+ if (question === "") {
175
+ emitError(ctx, "Usage: ama explore [--limit N] <question>");
176
+ return 1;
177
+ }
178
+ const exploration = await withQuery(process.env.AMA_ROOT ?? ".", (query) => query.explore(question, { limit }));
179
+ if (exploration === undefined) {
180
+ emitError(ctx, NO_INDEX);
181
+ return 1;
182
+ }
183
+ ctx.write(renderExploration(exploration, ctx.json));
184
+ return 0;
185
+ },
186
+ };
187
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/cli/commands/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type GraphNode, type NodeKind } from "../../graph/types.js";
2
+ import type { CliCommand } from "../index.js";
3
+ /** Result of parsing `search` arguments: the query plus filters, or an error. */
4
+ export interface SearchArgs {
5
+ query?: string;
6
+ kind?: NodeKind;
7
+ limit?: number;
8
+ error?: string;
9
+ }
10
+ /**
11
+ * Parse `search` positionals/flags. Returns `{ error }` (not a throw) on bad
12
+ * input so the command can print usage and exit 1; `--kind` is validated against
13
+ * {@link NODE_KINDS}, the single source of truth shared with the MCP schema.
14
+ */
15
+ export declare function parseSearchArgs(args: string[]): SearchArgs;
16
+ /** Render search hits for the terminal, or `--json` (the raw node array).
17
+ * `lowConfidence` appends a refine-the-query nudge in human mode (ama-b79). */
18
+ export declare function renderSearch(query: string, nodes: GraphNode[], json: boolean, lowConfidence?: boolean): string;
19
+ export declare const searchCommand: CliCommand;
20
+ export declare const searchCodeCommand: CliCommand;
21
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAc,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ9C,iFAAiF;AACjF,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA8B1D;AAED;gFACgF;AAChF,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,SAAS,EAAE,EAClB,IAAI,EAAE,OAAO,EACb,aAAa,UAAQ,GACpB,MAAM,CAaR;AAwBD,eAAO,MAAM,aAAa,EAAE,UAmB3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,UAyC/B,CAAC"}
@@ -0,0 +1,160 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { NODE_KINDS } from "../../graph/types.js";
4
+ import { createDefaultIndexer } from "../../indexer/indexer.js";
5
+ import { QueryService } from "../../query/service.js";
6
+ import { SqliteStore } from "../../store/sqlite.js";
7
+ import { emitError } from "../emit.js";
8
+ import { dbPathFor } from "../paths.js";
9
+ import { withQuery } from "../query-runner.js";
10
+ const USAGE = "Usage: ama search <query> [--kind <Kind>] [--limit <N>]\n" +
11
+ " query may include inline filters: path:src/api kind:Function lang:python name:handler";
12
+ /**
13
+ * Parse `search` positionals/flags. Returns `{ error }` (not a throw) on bad
14
+ * input so the command can print usage and exit 1; `--kind` is validated against
15
+ * {@link NODE_KINDS}, the single source of truth shared with the MCP schema.
16
+ */
17
+ export function parseSearchArgs(args) {
18
+ let query;
19
+ let kind;
20
+ let limit;
21
+ for (let i = 0; i < args.length; i++) {
22
+ const arg = args[i];
23
+ if (arg === undefined)
24
+ continue;
25
+ if (arg === "--kind") {
26
+ const value = args[i + 1];
27
+ i++;
28
+ if (value === undefined)
29
+ return { error: "--kind requires a value" };
30
+ if (!NODE_KINDS.includes(value)) {
31
+ return { error: `unknown --kind: ${value} (expected one of ${NODE_KINDS.join(", ")})` };
32
+ }
33
+ kind = value;
34
+ }
35
+ else if (arg === "--limit") {
36
+ const value = args[i + 1];
37
+ i++;
38
+ const n = Number(value);
39
+ if (!Number.isInteger(n) || n <= 0)
40
+ return { error: "--limit requires a positive integer" };
41
+ limit = n;
42
+ }
43
+ else if (arg.startsWith("--")) {
44
+ return { error: `unknown flag: ${arg}` };
45
+ }
46
+ else if (query === undefined) {
47
+ query = arg;
48
+ }
49
+ else {
50
+ return { error: `unexpected argument: ${arg}` };
51
+ }
52
+ }
53
+ return { query, kind, limit };
54
+ }
55
+ /** Render search hits for the terminal, or `--json` (the raw node array).
56
+ * `lowConfidence` appends a refine-the-query nudge in human mode (ama-b79). */
57
+ export function renderSearch(query, nodes, json, lowConfidence = false) {
58
+ if (json)
59
+ return JSON.stringify(nodes, null, 2);
60
+ if (nodes.length === 0)
61
+ return `No symbols match "${query}".`;
62
+ const lines = [`${nodes.length} result${nodes.length === 1 ? "" : "s"} for "${query}":`];
63
+ for (const node of nodes) {
64
+ const where = node.range ? `${node.file}:${node.range.startLine}` : node.file;
65
+ const label = node.qualifiedName || node.name;
66
+ lines.push(` ${node.kind.padEnd(10)} ${label} ${where} [${node.tier}]`);
67
+ }
68
+ if (lowConfidence) {
69
+ lines.push(" ⚠️ no exact or prefix match — loose substring hits; refine the query.");
70
+ }
71
+ return lines.join("\n");
72
+ }
73
+ /**
74
+ * Open the persisted index read-only and run the query. Returns `undefined`
75
+ * (not `[]`) when there is no usable index, so the command can distinguish
76
+ * "no index" from "indexed, zero matches".
77
+ */
78
+ async function runSearch(root, opts) {
79
+ const dbPath = dbPathFor(root);
80
+ if (!fs.existsSync(dbPath))
81
+ return undefined;
82
+ const abs = path.resolve(root);
83
+ const indexer = createDefaultIndexer(() => new SqliteStore(dbPath));
84
+ const opened = await indexer.open(abs);
85
+ if (!opened)
86
+ return undefined;
87
+ try {
88
+ return new QueryService(opened.store, abs).searchSymbolWithConfidence(opts.query ?? "", {
89
+ kind: opts.kind,
90
+ limit: opts.limit,
91
+ });
92
+ }
93
+ finally {
94
+ opened.store.close();
95
+ }
96
+ }
97
+ export const searchCommand = {
98
+ name: "search",
99
+ summary: "Find symbols by name, with inline path:/kind:/lang:/name: filters",
100
+ usage: USAGE,
101
+ async run(args, ctx) {
102
+ const parsed = parseSearchArgs(args);
103
+ if (parsed.error !== undefined || parsed.query === undefined) {
104
+ emitError(ctx, parsed.error ? `${parsed.error}\n${USAGE}` : USAGE);
105
+ return 1;
106
+ }
107
+ const root = process.env.AMA_ROOT ?? ".";
108
+ const hit = await runSearch(root, parsed);
109
+ if (hit === undefined) {
110
+ emitError(ctx, "No index found. Run `ama index` first.");
111
+ return 1;
112
+ }
113
+ ctx.write(renderSearch(parsed.query, hit.results, ctx.json, hit.lowConfidence));
114
+ return 0;
115
+ },
116
+ };
117
+ export const searchCodeCommand = {
118
+ name: "search-code",
119
+ summary: "Find symbols whose body text contains a string",
120
+ usage: "Usage: ama search-code <text> [--limit <N>]",
121
+ async run(args, ctx) {
122
+ let limit;
123
+ const terms = [];
124
+ for (let i = 0; i < args.length; i++) {
125
+ const arg = args[i];
126
+ if (arg === undefined)
127
+ continue;
128
+ if (arg === "--limit") {
129
+ const value = args[i + 1];
130
+ i++;
131
+ const n = Number(value);
132
+ if (!Number.isInteger(n) || n <= 0) {
133
+ emitError(ctx, "--limit requires a positive integer");
134
+ return 1;
135
+ }
136
+ limit = n;
137
+ }
138
+ else if (arg.startsWith("--")) {
139
+ emitError(ctx, `unknown flag: ${arg}`);
140
+ return 1;
141
+ }
142
+ else {
143
+ terms.push(arg);
144
+ }
145
+ }
146
+ const query = terms.join(" ");
147
+ if (query === "") {
148
+ emitError(ctx, "Usage: ama search-code <text> [--limit <N>]");
149
+ return 1;
150
+ }
151
+ const hits = await withQuery(process.env.AMA_ROOT ?? ".", (q) => q.searchCode(query, { limit }));
152
+ if (hits === undefined) {
153
+ emitError(ctx, "No index found. Run `ama index` first.");
154
+ return 1;
155
+ }
156
+ ctx.write(renderSearch(query, hits, ctx.json));
157
+ return 0;
158
+ },
159
+ };
160
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { IndexStatus } from "../../mcp/session.js";
2
+ import type { CliCommand } from "../index.js";
3
+ /** Render an {@link IndexStatus} for the terminal (human lines) or `--json`. */
4
+ export declare function renderStatus(status: IndexStatus, json: boolean): string;
5
+ export declare const statusCommand: CliCommand;
6
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA6B9C,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAgBvE;AAED,eAAO,MAAM,aAAa,EAAE,UAS3B,CAAC"}
@@ -0,0 +1,63 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { createDefaultIndexer } from "../../indexer/indexer.js";
4
+ import { serverStamp } from "../../mcp/build-info.js";
5
+ import { SqliteStore } from "../../store/sqlite.js";
6
+ import { dbPathFor } from "../paths.js";
7
+ /**
8
+ * Read a persisted index's stats without re-analyzing. Uses {@link Indexer.open}
9
+ * (not {@link AmaSession.open}) so a missing/stale index reports "not indexed"
10
+ * rather than silently triggering a full re-index — `status` reports, it never
11
+ * builds. `pendingSync` is always 0: a one-shot CLI process runs no watcher.
12
+ */
13
+ async function loadStatus(root, dbPath) {
14
+ if (!fs.existsSync(dbPath))
15
+ return { indexed: false, server: serverStamp };
16
+ const indexer = createDefaultIndexer(() => new SqliteStore(dbPath));
17
+ const opened = await indexer.open(path.resolve(root));
18
+ if (!opened)
19
+ return { indexed: false, server: serverStamp };
20
+ const { root: r, nodeCount, edgeCount, fileCount, languages } = opened.stats;
21
+ opened.store.close();
22
+ return {
23
+ indexed: true,
24
+ root: r,
25
+ nodeCount,
26
+ edgeCount,
27
+ fileCount,
28
+ languages,
29
+ pendingSync: 0,
30
+ projects: [{ root: r, nodeCount, edgeCount, fileCount }],
31
+ server: serverStamp,
32
+ };
33
+ }
34
+ /** Render an {@link IndexStatus} for the terminal (human lines) or `--json`. */
35
+ export function renderStatus(status, json) {
36
+ if (json)
37
+ return JSON.stringify(status, null, 2);
38
+ const rev = status.server.revision?.slice(0, 7) ?? "unknown";
39
+ const stamp = `ama ${status.server.version} (${rev})`;
40
+ if (!status.indexed) {
41
+ return ["No index found. Run `ama index` to build one.", `server: ${stamp}`].join("\n");
42
+ }
43
+ const lines = [
44
+ `Index: ${status.root}`,
45
+ ` ${status.fileCount} files · ${status.nodeCount} nodes · ${status.edgeCount} edges`,
46
+ ];
47
+ for (const lang of status.languages) {
48
+ lines.push(` ${lang.language} ${lang.tier} ${lang.files} files`);
49
+ }
50
+ lines.push(` pending sync: ${status.pendingSync}`, `server: ${stamp}`);
51
+ return lines.join("\n");
52
+ }
53
+ export const statusCommand = {
54
+ name: "status",
55
+ summary: "Show index statistics and pending-sync info",
56
+ async run(args, ctx) {
57
+ const root = args[0] ?? process.env.AMA_ROOT ?? ".";
58
+ const status = await loadStatus(root, dbPathFor(root));
59
+ ctx.write(renderStatus(status, ctx.json));
60
+ return 0;
61
+ },
62
+ };
63
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type SyncResult } from "../../indexer/indexer.js";
2
+ import type { CliCommand } from "../index.js";
3
+ /** Render a {@link SyncResult} for the terminal, or `--json` (the raw result). */
4
+ export declare function renderSync(result: SyncResult, json: boolean): string;
5
+ export declare const syncCommand: CliCommand;
6
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,0BAA0B,CAAC;AAGjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CASpE;AAsBD,eAAO,MAAM,WAAW,EAAE,UAazB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { createDefaultIndexer } from "../../indexer/indexer.js";
4
+ import { SqliteStore } from "../../store/sqlite.js";
5
+ import { emitError } from "../emit.js";
6
+ import { dbPathFor } from "../paths.js";
7
+ /** Render a {@link SyncResult} for the terminal, or `--json` (the raw result). */
8
+ export function renderSync(result, json) {
9
+ if (json)
10
+ return JSON.stringify(result, null, 2);
11
+ if (result.changed.length === 0 && result.removed.length === 0) {
12
+ return "Already up to date.";
13
+ }
14
+ const lines = [`Synced: ${result.changed.length} changed, ${result.removed.length} removed.`];
15
+ for (const file of result.changed)
16
+ lines.push(` ~ ${file}`);
17
+ for (const file of result.removed)
18
+ lines.push(` - ${file}`);
19
+ return lines.join("\n");
20
+ }
21
+ /**
22
+ * Open the persisted index and reconcile it with on-disk changes in place.
23
+ * Returns `undefined` when there is no usable index (so the command can say
24
+ * "run `ama index`" rather than building one) — `sync` is incremental and
25
+ * presupposes an existing index, unlike `index` which rebuilds from scratch.
26
+ */
27
+ async function runSync(root) {
28
+ const dbPath = dbPathFor(root);
29
+ if (!fs.existsSync(dbPath))
30
+ return undefined;
31
+ const abs = path.resolve(root);
32
+ const indexer = createDefaultIndexer(() => new SqliteStore(dbPath));
33
+ const opened = await indexer.open(abs);
34
+ if (!opened)
35
+ return undefined;
36
+ try {
37
+ return await indexer.sync(opened.store, abs);
38
+ }
39
+ finally {
40
+ opened.store.close();
41
+ }
42
+ }
43
+ export const syncCommand = {
44
+ name: "sync",
45
+ summary: "Incrementally reconcile the index with on-disk changes",
46
+ async run(args, ctx) {
47
+ const root = args[0] ?? process.env.AMA_ROOT ?? ".";
48
+ const result = await runSync(root);
49
+ if (result === undefined) {
50
+ emitError(ctx, "No index found. Run `ama index` first.");
51
+ return 1;
52
+ }
53
+ ctx.write(renderSync(result, ctx.json));
54
+ return 0;
55
+ },
56
+ };
57
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAmB,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,kFAAkF;AAClF,MAAM,UAAU,UAAU,CAAC,MAAkB,EAAE,IAAa;IAC1D,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,WAAW,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,MAAM,CAAC,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;IAC9F,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC7D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,OAAO,CAAC,IAAY;IACjC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAe;IACrC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,wDAAwD;IACjE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,SAAS,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;YACzD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,CAAC;IACX,CAAC;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CliContext } from "./index.js";
2
+ /**
3
+ * Route a diagnostic (usage, "no index", not-found) to stderr when an error sink
4
+ * is present, else fall back to stdout. Lives in its own leaf module — the type
5
+ * import of {@link CliContext} is erased, so command modules can import this
6
+ * value without forming a runtime cycle with the command registry in `index.ts`.
7
+ */
8
+ export declare function emitError(ctx: CliContext, line: string): void;
9
+ //# sourceMappingURL=emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/cli/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7D"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Route a diagnostic (usage, "no index", not-found) to stderr when an error sink
3
+ * is present, else fall back to stdout. Lives in its own leaf module — the type
4
+ * import of {@link CliContext} is erased, so command modules can import this
5
+ * value without forming a runtime cycle with the command registry in `index.ts`.
6
+ */
7
+ export function emitError(ctx, line) {
8
+ (ctx.error ?? ctx.write)(line);
9
+ }
10
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/cli/emit.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAe,EAAE,IAAY;IACrD,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ /** Global options parsed from argv and handed to each command. */
3
+ export interface CliContext {
4
+ /** True when `--json` was passed; commands should emit machine-readable JSON. */
5
+ readonly json: boolean;
6
+ /** Write a result line to stdout. */
7
+ write(line: string): void;
8
+ /**
9
+ * Write a diagnostic (usage, "no index", not-found) to stderr, keeping stdout
10
+ * reserved for results so a `--json` consumer's stream stays clean. Optional:
11
+ * `run()` always supplies it, but a direct `command.run(args, { write })` unit
12
+ * call may omit it — use {@link emitError} so diagnostics fall back to stdout.
13
+ */
14
+ error?(line: string): void;
15
+ /** Read all of piped stdin (for `git diff … | ama affected`); returns "" when
16
+ * stdin is a TTY or empty. Injectable so commands stay unit-testable. (ama-dx1) */
17
+ stdin?(): string;
18
+ }
19
+ /** A subcommand of the `ama` CLI. */
20
+ export interface CliCommand {
21
+ readonly name: string;
22
+ readonly summary: string;
23
+ /** One-line usage shown by `ama <command> --help`; falls back to the summary. */
24
+ readonly usage?: string;
25
+ run(args: string[], ctx: CliContext): number | Promise<number>;
26
+ }
27
+ /**
28
+ * Parse argv and dispatch to a command, returning a process exit code. `out`/`err`
29
+ * are injectable so the framework is unit-testable without touching real streams.
30
+ * Unlike the MCP server, the CLI *owns* stdout, so writing results there is fine.
31
+ */
32
+ export declare function run(argv: string[], commands: readonly CliCommand[], out?: (line: string) => void, err?: (line: string) => void): Promise<number>;
33
+ /** Registered commands. More domain commands (search/sync/…) are added here
34
+ * as the CLI epic progresses (ama-5gs.4+). */
35
+ export declare const COMMANDS: readonly CliCommand[];
36
+ export declare function main(): Promise<void>;
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAgCA,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,qCAAqC;IACrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;;OAKG;IACH,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;wFACoF;IACpF,KAAK,CAAC,IAAI,MAAM,CAAC;CAClB;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChE;AAgBD;;;;GAIG;AACH,wBAAsB,GAAG,CACvB,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,SAAS,UAAU,EAAE,EAC/B,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkD,EACzE,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkD,GACxE,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAaD;8CAC8C;AAC9C,eAAO,MAAM,QAAQ,EAAE,SAAS,UAAU,EA6BzC,CAAC;AAEF,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAY1C"}