patram 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/bin/patram.js +4 -4
  2. package/lib/cli/arguments.types.d.ts +1 -0
  3. package/lib/cli/commands/check.js +27 -15
  4. package/lib/cli/commands/fields.js +0 -4
  5. package/lib/cli/commands/queries.js +179 -1
  6. package/lib/cli/commands/query.js +1 -8
  7. package/lib/cli/commands/refs.js +3 -10
  8. package/lib/cli/commands/show.js +1 -8
  9. package/lib/cli/help-metadata.js +106 -111
  10. package/lib/cli/main.js +10 -10
  11. package/lib/cli/parse-arguments-helpers.js +416 -66
  12. package/lib/cli/parse-arguments.js +4 -4
  13. package/lib/cli/render-help.js +10 -4
  14. package/lib/config/defaults.js +33 -25
  15. package/lib/config/load-patram-config.d.ts +19 -33
  16. package/lib/config/load-patram-config.js +18 -121
  17. package/lib/config/load-patram-config.types.d.ts +3 -40
  18. package/lib/config/manage-stored-queries-helpers.d.ts +69 -0
  19. package/lib/config/manage-stored-queries-helpers.js +320 -0
  20. package/lib/config/manage-stored-queries-jsonc.d.ts +31 -0
  21. package/lib/config/manage-stored-queries-jsonc.js +95 -0
  22. package/lib/config/manage-stored-queries.d.ts +77 -0
  23. package/lib/config/manage-stored-queries.js +300 -0
  24. package/lib/config/patram-config.d.ts +34 -34
  25. package/lib/config/patram-config.js +3 -3
  26. package/lib/config/patram-config.types.d.ts +5 -11
  27. package/lib/config/resolve-patram-graph-config.d.ts +5 -1
  28. package/lib/config/resolve-patram-graph-config.js +3 -119
  29. package/lib/config/schema.d.ts +158 -269
  30. package/lib/config/schema.js +72 -210
  31. package/lib/config/validate-patram-config-value.d.ts +13 -0
  32. package/lib/config/validate-patram-config-value.js +94 -0
  33. package/lib/config/validation.d.ts +2 -12
  34. package/lib/config/validation.js +125 -483
  35. package/lib/find-close-match.d.ts +4 -1
  36. package/lib/graph/build-graph-identity.d.ts +1 -32
  37. package/lib/graph/build-graph-identity.js +5 -269
  38. package/lib/graph/build-graph.d.ts +13 -4
  39. package/lib/graph/build-graph.js +347 -488
  40. package/lib/graph/build-graph.types.d.ts +8 -9
  41. package/lib/graph/check-directive-metadata-helpers.d.ts +30 -0
  42. package/lib/graph/check-directive-metadata-helpers.js +126 -0
  43. package/lib/graph/check-directive-metadata.d.ts +8 -9
  44. package/lib/graph/check-directive-metadata.js +70 -561
  45. package/lib/graph/check-directive-path-target.d.ts +6 -13
  46. package/lib/graph/check-directive-path-target.js +26 -57
  47. package/lib/graph/check-directive-value.d.ts +1 -5
  48. package/lib/graph/check-directive-value.js +40 -180
  49. package/lib/graph/check-graph.d.ts +5 -5
  50. package/lib/graph/check-graph.js +8 -6
  51. package/lib/graph/document-node-identity.d.ts +23 -7
  52. package/lib/graph/document-node-identity.js +417 -160
  53. package/lib/graph/graph-node.d.ts +42 -0
  54. package/lib/graph/graph-node.js +83 -0
  55. package/lib/graph/inspect-reverse-references.js +16 -11
  56. package/lib/graph/load-project-graph.d.ts +7 -7
  57. package/lib/graph/load-project-graph.js +7 -7
  58. package/lib/graph/parse-where-clause.types.d.ts +3 -2
  59. package/lib/graph/query/cypher-reader.d.ts +59 -0
  60. package/lib/graph/query/cypher-reader.js +151 -0
  61. package/lib/graph/query/cypher-support.d.ts +79 -0
  62. package/lib/graph/query/cypher-support.js +213 -0
  63. package/lib/graph/query/cypher-tokenize.d.ts +13 -0
  64. package/lib/graph/query/cypher-tokenize.js +225 -0
  65. package/lib/graph/query/cypher.types.d.ts +43 -0
  66. package/lib/graph/query/execute.d.ts +7 -7
  67. package/lib/graph/query/execute.js +71 -33
  68. package/lib/graph/query/inspect.js +58 -24
  69. package/lib/graph/query/parse-cypher-patterns.d.ts +27 -0
  70. package/lib/graph/query/parse-cypher-patterns.js +382 -0
  71. package/lib/graph/query/parse-cypher.d.ts +7 -0
  72. package/lib/graph/query/parse-cypher.js +580 -0
  73. package/lib/graph/query/parse-query.d.ts +13 -0
  74. package/lib/graph/query/parse-query.js +97 -0
  75. package/lib/graph/query/resolve.d.ts +6 -0
  76. package/lib/graph/query/resolve.js +81 -24
  77. package/lib/output/command-output.js +12 -5
  78. package/lib/output/compact-layout.js +221 -0
  79. package/lib/output/format-output-item-block.js +31 -1
  80. package/lib/output/format-output-metadata.js +16 -29
  81. package/lib/output/format-stored-query-block.js +95 -0
  82. package/lib/output/layout-incoming-references.js +101 -19
  83. package/lib/output/layout-stored-queries.js +23 -330
  84. package/lib/output/list-queries.js +1 -1
  85. package/lib/output/render-field-discovery.js +11 -2
  86. package/lib/output/render-output-view.js +9 -5
  87. package/lib/output/renderers/json.js +5 -26
  88. package/lib/output/renderers/plain.js +155 -35
  89. package/lib/output/renderers/rich.js +250 -36
  90. package/lib/output/resolve-check-target.js +120 -11
  91. package/lib/output/resolved-link-layout.js +43 -0
  92. package/lib/output/rich-source/render.js +193 -35
  93. package/lib/output/show-document.js +25 -18
  94. package/lib/output/view-model/index.js +124 -103
  95. package/lib/parse/jsdoc/parse-jsdoc-blocks.js +1 -1
  96. package/lib/parse/jsdoc/parse-jsdoc-claims.js +12 -6
  97. package/lib/parse/markdown/parse-markdown-claims.js +99 -62
  98. package/lib/parse/markdown/parse-markdown-directives.d.ts +10 -6
  99. package/lib/parse/markdown/parse-markdown-directives.js +104 -18
  100. package/lib/parse/markdown/parse-markdown-prose.d.ts +27 -0
  101. package/lib/parse/markdown/parse-markdown-prose.js +243 -0
  102. package/lib/parse/parse-claims.d.ts +2 -6
  103. package/lib/parse/parse-claims.js +11 -53
  104. package/lib/parse/tagged-fenced/tagged-fenced-blocks.d.ts +4 -4
  105. package/lib/parse/tagged-fenced/tagged-fenced-blocks.js +4 -4
  106. package/lib/parse/yaml/parse-yaml-claims.js +4 -4
  107. package/lib/patram.d.ts +9 -3
  108. package/lib/patram.js +1 -1
  109. package/lib/scan/discover-fields.js +194 -55
  110. package/lib/scan/list-source-files.d.ts +4 -4
  111. package/lib/scan/list-source-files.js +4 -4
  112. package/package.json +2 -1
  113. package/lib/directive-validation-test-helpers.js +0 -87
  114. package/lib/graph/query/parse.d.ts +0 -75
  115. package/lib/graph/query/parse.js +0 -1064
  116. package/lib/output/derived-summary.js +0 -280
  117. package/lib/output/format-derived-summary-row.js +0 -9
@@ -87,14 +87,15 @@ const COMMAND_DEFINITIONS = {
87
87
  'patram check',
88
88
  'patram check docs',
89
89
  'patram check docs/patram.md',
90
+ 'patram check docs docs/patram.md',
90
91
  ],
91
- extra_positionals_message: 'Check accepts at most one path.',
92
+ extra_positionals_message: 'Check accepts zero or more paths.',
92
93
  help_topics: [],
93
- max_positionals: 1,
94
+ max_positionals: Number.POSITIVE_INFINITY,
94
95
  min_positionals: 0,
95
96
  missing_argument_examples: [],
96
97
  missing_argument_label: null,
97
- missing_usage_lines: ['patram check [path]'],
98
+ missing_usage_lines: ['patram check [path ...]'],
98
99
  option_column_width: 10,
99
100
  options: [
100
101
  {
@@ -110,7 +111,7 @@ const COMMAND_DEFINITIONS = {
110
111
  root_summary: 'Validate a project, directory, or file',
111
112
  summary:
112
113
  'Validate a project, directory, or file and report graph diagnostics.',
113
- usage_lines: ['patram check [path] [options]'],
114
+ usage_lines: ['patram check [path ...] [options]'],
114
115
  },
115
116
  fields: {
116
117
  allowed_option_names: new Set(),
@@ -141,41 +142,42 @@ const COMMAND_DEFINITIONS = {
141
142
  },
142
143
  query: {
143
144
  allowed_option_names: new Set([
145
+ 'cypher',
144
146
  'explain',
145
147
  'limit',
146
148
  'lint',
147
149
  'offset',
148
- 'where',
149
150
  ]),
150
151
  examples: [
151
152
  'patram query active-plans',
152
- "patram query --where 'tracked_in=doc:docs/plans/v0/worktracking-agent-guidance.md'",
153
- "patram query --where 'status not in [done, dropped, superseded]'",
154
- "patram query --where '$class=plan and none(in:tracked_in, $class=decision)'",
155
- "patram query --where 'count(in:decided_by, $class=task) = 0'",
153
+ 'patram query --cypher "MATCH (n:Plan) WHERE n.status = \'active\' RETURN n"',
154
+ 'patram query --cypher "MATCH (n) WHERE id(n) = \'plan:v0/worktracking-agent-guidance\' RETURN n"',
155
+ "patram query --cypher \"MATCH (n) WHERE n.status NOT IN ['done', 'dropped', 'superseded'] RETURN n\"",
156
+ 'patram query --cypher "MATCH (n:Plan) WHERE NOT EXISTS { MATCH (decision:Decision)-[:TRACKED_IN]->(n) } RETURN n"',
157
+ 'patram query --cypher "MATCH (n:Decision) WHERE COUNT { MATCH (task:Task)-[:DECIDED_BY]->(n) } = 0 RETURN n"',
156
158
  'patram query ready-tasks --explain',
157
- "patram query --where '$class=decision and status=accepted and count(in:decided_by, $class=task) = 0' --lint",
159
+ 'patram query --cypher "MATCH (n:Decision) WHERE n.status = \'accepted\' AND COUNT { MATCH (task:Task)-[:DECIDED_BY]->(n) } = 0 RETURN n" --lint',
158
160
  'patram query active-plans --limit 10 --offset 20',
159
161
  ],
160
162
  extra_positionals_message:
161
- 'Query accepts either "--where" or a stored query name.',
163
+ 'Query accepts "--cypher" or a stored query name.',
162
164
  help_topics: ['query-language'],
163
165
  max_positionals: 1,
164
166
  min_positionals: 0,
165
167
  missing_argument_examples: [
166
168
  'patram query active-plans',
167
- "patram query --where 'tracked_in=doc:docs/plans/v0/worktracking-agent-guidance.md'",
169
+ 'patram query --cypher "MATCH (n:Plan) WHERE n.status = \'active\' RETURN n"',
168
170
  ],
169
- missing_argument_label: "<name> or --where '<clause>'",
171
+ missing_argument_label: "<name> or --cypher '<query>'",
170
172
  missing_usage_lines: [
171
173
  'patram query <name> [options]',
172
- "patram query --where '<clause>' [options]",
174
+ `patram query --cypher '<query>' [options]`,
173
175
  ],
174
176
  option_column_width: 19,
175
177
  options: [
176
178
  {
177
- description: 'Run an ad hoc query instead of a stored query',
178
- label: '--where <clause>',
179
+ description: 'Run an ad hoc Cypher query instead of a stored query',
180
+ label: '--cypher <query>',
179
181
  },
180
182
  {
181
183
  description: 'Skip the first N matches',
@@ -203,35 +205,57 @@ const COMMAND_DEFINITIONS = {
203
205
  },
204
206
  ],
205
207
  related: ['queries', 'show'],
206
- root_summary: 'Run a stored query or an ad hoc where clause',
208
+ root_summary: 'Run a stored query or an ad hoc Cypher query',
207
209
  summary:
208
- 'Run a stored query or an ad hoc where clause against graph nodes.',
210
+ 'Run a stored query or an ad hoc Cypher query against graph nodes.',
209
211
  syntax_lines: [
210
- '$id=<value> | $class=<value> | $path=<value> | status=<value>',
211
- '$id^=<prefix> | $path^=<prefix> | title~<text>',
212
- '<field> in [<value>, ...] | <field> not in [<value>, ...]',
213
- '<relation>:* | <relation>=<target-id>',
214
- 'any(<traversal>, <term> and <term>)',
215
- 'none(<traversal>, <term> and <term>)',
216
- 'count(<traversal>, <term> and <term>) <comparison> <number>',
212
+ 'MATCH (n) RETURN n',
213
+ "MATCH (n:Label) WHERE n.status = 'active' RETURN n",
214
+ "MATCH (n) WHERE id(n) = 'command:query' RETURN n",
215
+ 'MATCH (n) WHERE EXISTS { MATCH ... } RETURN n',
216
+ 'MATCH (n) WHERE COUNT { MATCH ... } = 0 RETURN n',
217
217
  ],
218
218
  usage_lines: [
219
219
  'patram query <name> [options]',
220
- "patram query --where '<clause>' [options]",
220
+ `patram query --cypher '<query>' [options]`,
221
221
  ],
222
222
  },
223
223
  queries: {
224
- allowed_option_names: new Set(),
225
- examples: ['patram queries'],
226
- extra_positionals_message: 'Queries does not accept positional arguments.',
224
+ allowed_option_names: new Set(['cypher', 'desc', 'name']),
225
+ examples: [
226
+ 'patram queries',
227
+ `patram queries add active-plans --cypher "MATCH (n:Plan) WHERE n.status = 'active' RETURN n"`,
228
+ "patram queries update ready-tasks --desc 'Show tasks that are ready.'",
229
+ `patram queries update ready-tasks --cypher "MATCH (n:Task) WHERE n.status = 'ready' RETURN n"`,
230
+ 'patram queries remove ready-tasks',
231
+ ],
232
+ extra_positionals_message:
233
+ 'Queries accepts no positionals unless using add, update, or remove.',
227
234
  help_topics: [],
228
- max_positionals: 0,
235
+ max_positionals: 2,
229
236
  min_positionals: 0,
230
237
  missing_argument_examples: [],
231
238
  missing_argument_label: null,
232
- missing_usage_lines: ['patram queries'],
233
- option_column_width: 10,
239
+ missing_usage_lines: [
240
+ 'patram queries',
241
+ 'patram queries add <name> --cypher <query>',
242
+ 'patram queries update <name> [--name <new_name>] [--cypher <query>] [--desc <text>]',
243
+ 'patram queries remove <name>',
244
+ ],
245
+ option_column_width: 19,
234
246
  options: [
247
+ {
248
+ description: 'Persist a new stored Cypher query',
249
+ label: '--cypher <query>',
250
+ },
251
+ {
252
+ description: 'Set or rename the stored query name for update',
253
+ label: '--name <new_name>',
254
+ },
255
+ {
256
+ description: 'Set or clear the stored query description',
257
+ label: '--desc <text>',
258
+ },
235
259
  {
236
260
  description: 'Print plain text output',
237
261
  label: '--plain',
@@ -242,15 +266,21 @@ const COMMAND_DEFINITIONS = {
242
266
  },
243
267
  ],
244
268
  related: ['query'],
245
- root_summary: 'List stored queries',
246
- summary: 'List the stored queries defined in the project configuration.',
247
- usage_lines: ['patram queries [options]'],
269
+ root_summary: 'List and manage stored queries',
270
+ summary:
271
+ 'List stored queries or mutate them through add, update, and remove.',
272
+ usage_lines: [
273
+ 'patram queries [options]',
274
+ `patram queries add <name> --cypher <query> [--desc <text>] [options]`,
275
+ 'patram queries update <name> [--name <new_name>] [--cypher <query>] [--desc <text>] [options]',
276
+ 'patram queries remove <name> [options]',
277
+ ],
248
278
  },
249
279
  refs: {
250
- allowed_option_names: new Set(['where']),
280
+ allowed_option_names: new Set(['cypher']),
251
281
  examples: [
252
282
  'patram refs docs/decisions/query-language.md',
253
- "patram refs docs/decisions/query-language.md --where '$class=document'",
283
+ 'patram refs docs/decisions/query-language.md --cypher "MATCH (n:Document) RETURN n"',
254
284
  'patram refs docs/decisions/query-language.md --json',
255
285
  ],
256
286
  extra_positionals_message: 'Refs accepts exactly one file path.',
@@ -259,15 +289,15 @@ const COMMAND_DEFINITIONS = {
259
289
  min_positionals: 1,
260
290
  missing_argument_examples: [
261
291
  'patram refs docs/decisions/query-language.md',
262
- "patram refs docs/patram.md --where '$class=document'",
292
+ 'patram refs docs/patram.md --cypher "MATCH (n:Document) RETURN n"',
263
293
  ],
264
294
  missing_argument_label: '<file>',
265
295
  missing_usage_lines: ['patram refs <file>'],
266
296
  option_column_width: 19,
267
297
  options: [
268
298
  {
269
- description: 'Filter incoming source nodes with a where clause',
270
- label: '--where <clause>',
299
+ description: 'Filter incoming source nodes with a Cypher query',
300
+ label: '--cypher <query>',
271
301
  },
272
302
  {
273
303
  description: 'Print plain text output',
@@ -320,102 +350,67 @@ const COMMAND_DEFINITIONS = {
320
350
  const HELP_TOPIC_DEFINITIONS = {
321
351
  'query-language': {
322
352
  examples: [
323
- '$class=decision and status=accepted',
324
- '$class=task or status=done',
325
- '($class=task or status=blocked) and title~Show',
326
- '$path^=docs/plans/',
327
- 'title~query',
328
- 'tracked_in=doc:docs/plans/v0/worktracking-agent-guidance.md',
329
- 'implements_command=command:query',
330
- 'status not in [done, dropped, superseded]',
331
- 'any(in:tracked_in, $class=task and status in [pending, ready, in_progress, blocked])',
332
- 'none(in:tracked_in, $class=decision)',
333
- 'count(in:decided_by, $class=task) = 0',
334
- 'not uses_term=term:graph',
353
+ "MATCH (n:Decision) WHERE n.status = 'accepted' RETURN n",
354
+ "MATCH (n:Task) WHERE n.status IN ['pending', 'ready'] RETURN n",
355
+ "MATCH (n) WHERE path(n) ENDS WITH '/README.md' RETURN n",
356
+ 'MATCH (n:Plan) WHERE NOT EXISTS { MATCH (decision:Decision)-[:TRACKED_IN]->(n) } RETURN n',
357
+ 'MATCH (n:Decision) WHERE COUNT { MATCH (task:Task)-[:DECIDED_BY]->(n) } = 0 RETURN n',
358
+ "MATCH (n) WHERE EXISTS { MATCH (n)-[:IMPLEMENTS_COMMAND]->(command:Command) WHERE id(command) = 'command:query' } RETURN n",
335
359
  ],
336
- lead: 'Query language filters graph nodes with field, relation, traversal, and aggregate terms.',
360
+ lead: 'Query language uses a constrained Cypher subset for graph node selection.',
337
361
  operators: [
338
362
  {
339
- description: 'Exact field match or exact count comparison',
340
- label: '=',
341
- },
342
- {
343
- description: 'Prefix match for structural id and path',
344
- label: '^=',
345
- },
346
- {
347
- description: 'Contains text for title',
348
- label: '~',
349
- },
350
- {
351
- description: 'Set membership for supported fields',
352
- label: 'in',
363
+ description: 'Equality and exact value comparison',
364
+ label: '= | <>',
353
365
  },
354
366
  {
355
- description: 'Set exclusion for supported fields',
356
- label: 'not in',
367
+ description: 'String prefix, suffix, and contains checks',
368
+ label: 'STARTS WITH | ENDS WITH | CONTAINS',
357
369
  },
358
370
  {
359
- description: 'Negate one term',
360
- label: 'not',
371
+ description: 'Set membership checks',
372
+ label: 'IN | NOT IN',
361
373
  },
362
374
  {
363
- description: 'Combine terms',
364
- label: 'and',
375
+ description: 'Boolean composition',
376
+ label: 'AND | OR | NOT',
365
377
  },
366
378
  {
367
- description: 'Match either side',
368
- label: 'or',
379
+ description: 'Relation existence subqueries',
380
+ label: 'EXISTS { ... }',
369
381
  },
370
382
  {
371
- description: 'Group boolean expressions',
372
- label: '( )',
373
- },
374
- {
375
- description: 'Count comparisons',
376
- label: '!= < > >= <=',
383
+ description: 'Related-node count comparisons',
384
+ label: 'COUNT { ... }',
377
385
  },
378
386
  ],
379
387
  relation_terms: [
380
388
  {
381
- description: 'Match nodes with at least one outgoing relation',
382
- label: '<relation>:*',
383
- },
384
- {
385
- description: 'Match nodes linked to an exact target id',
386
- label: '<relation>=<target-id>',
389
+ description: 'Outgoing relation match',
390
+ label: '(n)-[:RELATION]->(target)',
387
391
  },
388
392
  {
389
- description: 'Traverse one incoming relation hop',
390
- label: 'in:<relation>',
393
+ description: 'Incoming relation match',
394
+ label: '(source)-[:RELATION]->(n)',
391
395
  },
392
396
  {
393
- description: 'Traverse one outgoing relation hop',
394
- label: 'out:<relation>',
397
+ description: 'Label-qualified related node pattern',
398
+ label: '(n)-[:RELATION]->(target:Label)',
395
399
  },
396
400
  ],
397
401
  terms: [
398
- 'Exact match: $id, $class, $path, status',
399
- 'Prefix match: $id, $path',
400
- 'Contains text: title',
401
- 'Set membership: $id, $class, $path, status, title',
402
+ 'Root match: MATCH (n) or MATCH (n:Label)',
403
+ 'Return shape: RETURN n',
404
+ 'Structural functions: id(n), path(n)',
405
+ 'Labels select class membership: MATCH (n:Label)',
406
+ 'Common fields: n.title, n.status, n.kind',
407
+ 'Subqueries: EXISTS { MATCH ... WHERE ... } and COUNT { MATCH ... WHERE ... }',
402
408
  ],
403
409
  usage_lines: [
404
- '<field>=<value>',
405
- '$id^=<prefix>',
406
- '$path^=<prefix>',
407
- 'title~<text>',
408
- '<field> in [<value>, ...]',
409
- '<field> not in [<value>, ...]',
410
- '<relation>:*',
411
- '<relation>=<target-id>',
412
- 'any(<traversal>, <term> and <term>)',
413
- 'none(<traversal>, <term> and <term>)',
414
- 'count(<traversal>, <term> and <term>) <comparison> <number>',
415
- 'not <term>',
416
- '<term> and <term>',
417
- '<term> or <term>',
418
- '(<expression>)',
410
+ 'MATCH (n) RETURN n',
411
+ 'MATCH (n:Label) WHERE <predicate> RETURN n',
412
+ 'MATCH (n) WHERE EXISTS { MATCH ... } RETURN n',
413
+ 'MATCH (n) WHERE COUNT { MATCH ... } <comparison> <number> RETURN n',
419
414
  ],
420
415
  },
421
416
  };
@@ -529,7 +524,7 @@ function listOptionLabels(command_name) {
529
524
  } else {
530
525
  option_labels.add('--limit');
531
526
  option_labels.add('--offset');
532
- option_labels.add('--where');
527
+ option_labels.add('--cypher');
533
528
  }
534
529
 
535
530
  return [...option_labels];
package/lib/cli/main.js CHANGED
@@ -16,16 +16,16 @@ import { runShowCommand } from './commands/show.js';
16
16
  * Loads repo state and routes `check`, `fields`, `query`, `queries`, and
17
17
  * `show` through the shared output pipeline.
18
18
  *
19
- * Kind: cli
20
- * Status: active
21
- * Implements Command: ../../docs/reference/commands/check.md
22
- * Implements Command: ../../docs/reference/commands/query.md
23
- * Implements Command: ../../docs/reference/commands/queries.md
24
- * Implements Command: ../../docs/reference/commands/refs.md
25
- * Implements Command: ../../docs/reference/commands/show.md
26
- * Tracked in: ../../docs/plans/v0/source-anchor-dogfooding.md
27
- * Decided by: ../../docs/decisions/cli-output-architecture.md
28
- * Decided by: ../../docs/decisions/cli-argument-parser.md
19
+ * kind: cli
20
+ * status: active
21
+ * implements_command: ../../docs/reference/commands/check.md
22
+ * implements_command: ../../docs/reference/commands/query.md
23
+ * implements_command: ../../docs/reference/commands/queries.md
24
+ * implements_command: ../../docs/reference/commands/refs.md
25
+ * implements_command: ../../docs/reference/commands/show.md
26
+ * tracked_in: ../../docs/plans/v0/source-anchor-dogfooding.md
27
+ * decided_by: ../../docs/decisions/cli-output-architecture.md
28
+ * decided_by: ../../docs/decisions/cli-argument-parser.md
29
29
  * @patram
30
30
  * @see {@link ./parse-arguments.js}
31
31
  * @see {@link ./commands/query.js}