gitsheets-axi 2.0.0 → 2.2.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 (65) hide show
  1. package/dist/src/cli.d.ts +1 -1
  2. package/dist/src/cli.d.ts.map +1 -1
  3. package/dist/src/cli.js +17 -9
  4. package/dist/src/cli.js.map +1 -1
  5. package/dist/src/commands/count.d.ts +4 -0
  6. package/dist/src/commands/count.d.ts.map +1 -0
  7. package/dist/src/commands/count.js +84 -0
  8. package/dist/src/commands/count.js.map +1 -0
  9. package/dist/src/commands/delete.d.ts +1 -1
  10. package/dist/src/commands/delete.d.ts.map +1 -1
  11. package/dist/src/commands/delete.js +132 -43
  12. package/dist/src/commands/delete.js.map +1 -1
  13. package/dist/src/commands/distinct.d.ts +4 -0
  14. package/dist/src/commands/distinct.d.ts.map +1 -0
  15. package/dist/src/commands/distinct.js +81 -0
  16. package/dist/src/commands/distinct.js.map +1 -0
  17. package/dist/src/commands/home.js +2 -2
  18. package/dist/src/commands/home.js.map +1 -1
  19. package/dist/src/commands/patch.d.ts +1 -1
  20. package/dist/src/commands/patch.d.ts.map +1 -1
  21. package/dist/src/commands/patch.js +238 -49
  22. package/dist/src/commands/patch.js.map +1 -1
  23. package/dist/src/commands/query.d.ts +1 -1
  24. package/dist/src/commands/query.d.ts.map +1 -1
  25. package/dist/src/commands/query.js +129 -58
  26. package/dist/src/commands/query.js.map +1 -1
  27. package/dist/src/commands/rename.d.ts +4 -0
  28. package/dist/src/commands/rename.d.ts.map +1 -0
  29. package/dist/src/commands/rename.js +131 -0
  30. package/dist/src/commands/rename.js.map +1 -0
  31. package/dist/src/commands/sheets.js +15 -6
  32. package/dist/src/commands/sheets.js.map +1 -1
  33. package/dist/src/commands/upsert.d.ts +9 -1
  34. package/dist/src/commands/upsert.d.ts.map +1 -1
  35. package/dist/src/commands/upsert.js +134 -33
  36. package/dist/src/commands/upsert.js.map +1 -1
  37. package/dist/src/output/sheet-schema.d.ts +2 -3
  38. package/dist/src/output/sheet-schema.d.ts.map +1 -1
  39. package/dist/src/output/sheet-schema.js +3 -5
  40. package/dist/src/output/sheet-schema.js.map +1 -1
  41. package/dist/src/util/aggregate.d.ts +13 -0
  42. package/dist/src/util/aggregate.d.ts.map +1 -0
  43. package/dist/src/util/aggregate.js +44 -0
  44. package/dist/src/util/aggregate.js.map +1 -0
  45. package/dist/src/util/export-file.d.ts +22 -0
  46. package/dist/src/util/export-file.d.ts.map +1 -0
  47. package/dist/src/util/export-file.js +67 -0
  48. package/dist/src/util/export-file.js.map +1 -0
  49. package/dist/src/util/filter.d.ts +30 -0
  50. package/dist/src/util/filter.d.ts.map +1 -0
  51. package/dist/src/util/filter.js +138 -0
  52. package/dist/src/util/filter.js.map +1 -0
  53. package/dist/src/util/hints.d.ts +8 -0
  54. package/dist/src/util/hints.d.ts.map +1 -0
  55. package/dist/src/util/hints.js +8 -0
  56. package/dist/src/util/hints.js.map +1 -0
  57. package/dist/src/util/open-sheet.d.ts +13 -0
  58. package/dist/src/util/open-sheet.d.ts.map +1 -0
  59. package/dist/src/util/open-sheet.js +31 -0
  60. package/dist/src/util/open-sheet.js.map +1 -0
  61. package/dist/src/util/parse-records.d.ts +26 -0
  62. package/dist/src/util/parse-records.d.ts.map +1 -0
  63. package/dist/src/util/parse-records.js +76 -0
  64. package/dist/src/util/parse-records.js.map +1 -0
  65. package/package.json +3 -2
@@ -1,23 +1,37 @@
1
1
  import { AxiError } from 'axi-sdk-js';
2
2
  import { translateError } from '../errors.js';
3
- import { renderListResponse } from '../output/render.js';
3
+ import { joinBlocks, renderHelp, renderListResponse, renderObject, } from '../output/render.js';
4
4
  import { field } from '../output/schema.js';
5
5
  import { defaultSheetSchema, fieldsWithExtras, } from '../output/sheet-schema.js';
6
- export const QUERY_HELP = `usage: gitsheets-axi query <sheet> [--filter k=v ...] [--fields a,b,c] [--limit n]
7
- flags[4]:
8
- --filter <k>=<v> Equality match against record field (repeatable)
6
+ import { openSheetForCommand } from '../util/open-sheet.js';
7
+ import { exportRecords } from '../util/export-file.js';
8
+ import { buildPredicate } from '../util/filter.js';
9
+ import { facetCounts, sortRecords } from '../util/aggregate.js';
10
+ export const QUERY_HELP = `usage: gitsheets-axi query <sheet> [--filter expr ...] [--fields a,b] [--sort f [--desc]] [--limit n] [--group-by f] [--json-out[=path]] [--ndjson-out[=path]] [--csv-out[=path]]
11
+ flags[9]:
12
+ --filter <expr> Filter clause (repeatable): k=v · k!=v · k<v · k>v ·
13
+ k<=v · k>=v · k~regex · "k in (a,b)" · k:present · k:empty
9
14
  --fields <list> Extra columns beyond the default schema (comma-separated)
10
- --limit <n> Cap results (default: 100, max: 10000)
11
- --prefix <p> Tenant sub-tree scope (see gitsheets --prefix)
15
+ --sort <field> Sort records by a field (missing values sort last)
16
+ --desc Sort descending (with --sort)
17
+ --limit <n> Cap the stdout preview (default: 100, max: 10000)
18
+ --group-by <field> Faceted counts by a field instead of a record list
19
+ --prefix <p> Tenant sub-tree scope
20
+ --json-out[=path] Also write the FULL matched result to a JSON array file
21
+ --ndjson-out[=path] Also write the FULL matched result to an NDJSON file
22
+ --csv-out[=path] Also write the FULL matched result to a CSV file (flat)
12
23
  examples:
13
- gitsheets-axi query users
14
- gitsheets-axi query users --filter status=active --limit 50
15
- gitsheets-axi query posts --fields title,published
24
+ gitsheets-axi query repos --filter status=unclassified
25
+ gitsheets-axi query repos --filter 'pushed_at<2022-01-01' --sort pushed_at
26
+ gitsheets-axi query repos --group-by target_team
27
+ gitsheets-axi query repos --filter 'target_team in (archive,sencha)' --ndjson-out
16
28
  output:
17
- Default schema is format-aware:
18
- TOML sheets — path-template fields + first scalar properties (cap 4)
19
- Markdown/MDX — path-template fields + title + body_size (never body content)
20
- --fields appends additional columns.
29
+ Default schema is format-aware (TOML: path fields + first scalars, cap 4;
30
+ Markdown: path fields + title + body_size). --fields appends columns.
31
+ --group-by emits {value,count} facets (biggest first) over the filtered set.
32
+ export (--json-out / --ndjson-out / --csv-out):
33
+ stdout stays the TOON preview; the file carries EVERY matched record (ignores
34
+ --limit). JSON/NDJSON verbatim (round-trip into upsert); CSV flat + lossy.
21
35
  `;
22
36
  function parseQueryFlags(args) {
23
37
  const sheetName = args[0];
@@ -31,38 +45,84 @@ function parseQueryFlags(args) {
31
45
  extras: [],
32
46
  limit: 100,
33
47
  prefix: undefined,
48
+ sort: undefined,
49
+ desc: false,
50
+ groupBy: undefined,
51
+ exportFormat: undefined,
52
+ exportPath: undefined,
53
+ };
54
+ const setExport = (format, arg) => {
55
+ if (flags.exportFormat) {
56
+ throw new AxiError('Only one export flag is allowed per invocation', 'VALIDATION_ERROR', [
57
+ 'Pass one of --json-out / --ndjson-out / --csv-out',
58
+ ]);
59
+ }
60
+ flags.exportFormat = format;
61
+ const eq = arg.indexOf('=');
62
+ if (eq !== -1) {
63
+ const p = arg.slice(eq + 1);
64
+ if (!p) {
65
+ throw new AxiError(`${arg.slice(0, eq)} was given an empty path`, 'VALIDATION_ERROR', [
66
+ 'Use the bare flag for an auto temp path, or --…-out=/real/path',
67
+ ]);
68
+ }
69
+ flags.exportPath = p;
70
+ }
34
71
  };
35
72
  for (let i = 1; i < args.length; i++) {
36
73
  const arg = args[i];
74
+ if (arg === undefined)
75
+ continue;
76
+ if (arg === '--json-out' || arg.startsWith('--json-out=')) {
77
+ setExport('json', arg);
78
+ continue;
79
+ }
80
+ if (arg === '--ndjson-out' || arg.startsWith('--ndjson-out=')) {
81
+ setExport('ndjson', arg);
82
+ continue;
83
+ }
84
+ if (arg === '--csv-out' || arg.startsWith('--csv-out=')) {
85
+ setExport('csv', arg);
86
+ continue;
87
+ }
37
88
  const next = args[i + 1];
38
89
  switch (arg) {
39
- case '--filter': {
40
- if (!next || !next.includes('=')) {
41
- throw new AxiError('--filter expects key=value', 'VALIDATION_ERROR', ['Example: --filter status=active']);
42
- }
43
- const eq = next.indexOf('=');
44
- flags.filters.push([next.slice(0, eq), next.slice(eq + 1)]);
90
+ case '--filter':
91
+ if (!next)
92
+ throw new AxiError('--filter expects an expression', 'VALIDATION_ERROR');
93
+ flags.filters.push(next);
45
94
  i++;
46
95
  break;
47
- }
48
96
  case '--fields':
49
- if (!next) {
97
+ if (!next)
50
98
  throw new AxiError('--fields expects a comma-separated list', 'VALIDATION_ERROR');
51
- }
52
99
  flags.extras = next.split(',').map((s) => s.trim()).filter(Boolean);
53
100
  i++;
54
101
  break;
102
+ case '--sort':
103
+ if (!next)
104
+ throw new AxiError('--sort expects a field name', 'VALIDATION_ERROR');
105
+ flags.sort = next;
106
+ i++;
107
+ break;
108
+ case '--desc':
109
+ flags.desc = true;
110
+ break;
111
+ case '--group-by':
112
+ if (!next)
113
+ throw new AxiError('--group-by expects a field name', 'VALIDATION_ERROR');
114
+ flags.groupBy = next;
115
+ i++;
116
+ break;
55
117
  case '--limit':
56
- if (!next) {
118
+ if (!next)
57
119
  throw new AxiError('--limit expects an integer', 'VALIDATION_ERROR');
58
- }
59
120
  flags.limit = Math.min(10_000, Math.max(1, parseInt(next, 10) || 100));
60
121
  i++;
61
122
  break;
62
123
  case '--prefix':
63
- if (!next) {
124
+ if (!next)
64
125
  throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
65
- }
66
126
  flags.prefix = next;
67
127
  i++;
68
128
  break;
@@ -80,62 +140,73 @@ export async function queryCommand(args, ctx) {
80
140
  }
81
141
  const { sheetName, flags } = parseQueryFlags(args);
82
142
  const repo = await ctx.repo();
83
- let sheet;
84
- try {
85
- sheet = await repo.openSheet(sheetName, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
86
- }
87
- catch (error) {
88
- throw translateError(error);
89
- }
143
+ const sheet = await openSheetForCommand(repo, sheetName, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
90
144
  const config = await sheet.readConfig();
91
- const filter = {};
92
- for (const [k, v] of flags.filters) {
93
- filter[k] = v;
94
- }
95
- // Load bodies for content-typed sheets so the body_size column renders
96
- // correctly. We never put body content itself into the default schema —
97
- // per AXI's "long-form content belongs in detail views, not lists" — but
98
- // the size is the cheap, agent-actionable summary.
99
145
  const withBody = config.format.body !== undefined;
100
- let records;
146
+ let all;
101
147
  try {
102
- records = await sheet.queryAll(filter, { withBody });
148
+ all = await sheet.queryAll({}, { withBody });
103
149
  }
104
150
  catch (error) {
105
151
  throw translateError(error);
106
152
  }
107
- const total = records.length;
108
- const limited = records.slice(0, flags.limit);
153
+ const predicate = buildPredicate(flags.filters);
154
+ const matched = all.filter(predicate);
155
+ // --group-by: faceted counts over the filtered set (not capped by --limit).
156
+ if (flags.groupBy) {
157
+ const facets = facetCounts(matched, flags.groupBy);
158
+ const groupBlock = renderListResponse({
159
+ summary: { groups: `${facets.length} distinct ${flags.groupBy}`, matched: matched.length },
160
+ name: 'groups',
161
+ items: facets,
162
+ schema: [field('value'), field('count')],
163
+ emptyMessage: `no records match in ${sheetName}`,
164
+ });
165
+ return maybeExport(groupBlock, matched, flags, sheetName);
166
+ }
167
+ const ordered = flags.sort ? sortRecords(matched, flags.sort, flags.desc) : matched;
168
+ const limited = ordered.slice(0, flags.limit);
109
169
  const baseSchema = defaultSheetSchema(config);
110
170
  const schema = fieldsWithExtras(baseSchema, flags.extras);
111
171
  const suggestions = [];
112
172
  if (limited.length === 0 && flags.filters.length > 0) {
113
- suggestions.push('No records match the filter — try `gitsheets-axi query ' +
114
- sheetName +
115
- '` without filters');
173
+ suggestions.push(`No records match the filter — try \`gitsheets-axi query ${sheetName}\` without filters`);
116
174
  }
117
175
  else if (limited.length > 0) {
118
176
  suggestions.push(`Run \`gitsheets-axi read ${sheetName} <path>\` to view a single record`);
119
- if (config.format.body) {
120
- suggestions.push(`Add \`--full\` on \`read\` to see untruncated body content`);
121
- }
177
+ if (config.format.body)
178
+ suggestions.push('Add `--full` on `read` to see untruncated body content');
122
179
  }
123
- if (total > limited.length) {
124
- suggestions.push(`${total - limited.length} records hidden by --limit ${flags.limit}; raise --limit to see more`);
180
+ if (matched.length > limited.length && !flags.exportFormat) {
181
+ suggestions.push(`${matched.length - limited.length} records hidden by --limit ${flags.limit}; raise --limit or use --json-out to capture all`);
125
182
  }
126
- return renderListResponse({
127
- summary: { count: `${limited.length} of ${total} total` },
183
+ const listResponse = renderListResponse({
184
+ summary: { count: `${limited.length} of ${matched.length} total` },
128
185
  name: 'records',
129
186
  items: limited.map((r) => ({
130
187
  ...r,
131
- // Surface the record's source path as a top-level "path" so default
132
- // schemas that include it work without callers needing to know the
133
- // RECORD_PATH_KEY symbol.
134
188
  path: r[Symbol.for('gitsheets-path')] ?? '',
135
189
  })),
136
190
  schema: [...schema, field('path')],
137
191
  suggestions,
138
192
  emptyMessage: `no records in ${sheetName}`,
139
193
  });
194
+ return maybeExport(listResponse, ordered, flags, sheetName);
195
+ }
196
+ /**
197
+ * Append the side-channel export block when an export flag was passed. The file
198
+ * carries the full matched (and, for the record path, sorted) set, verbatim.
199
+ */
200
+ function maybeExport(stdoutBlock, records, flags, sheetName) {
201
+ if (!flags.exportFormat)
202
+ return stdoutBlock;
203
+ const exp = exportRecords(records, flags.exportFormat, flags.exportPath, sheetName);
204
+ const firstCol = exp.columns[0] ?? '';
205
+ const hint = flags.exportFormat === 'csv'
206
+ ? `Run \`column -s, -t ${exp.path} | less -S\` to inspect all ${exp.rows} rows`
207
+ : flags.exportFormat === 'ndjson'
208
+ ? `Run \`jq '.${firstCol}' ${exp.path}\` to process all ${exp.rows} rows`
209
+ : `Run \`jq '.[] | .${firstCol}' ${exp.path}\` to process all ${exp.rows} rows`;
210
+ return joinBlocks(stdoutBlock, renderObject({ wrote: exp.path, rows: exp.rows, cols: exp.cols }), renderObject({ columns: exp.columns }), renderHelp([hint]));
140
211
  }
141
212
  //# sourceMappingURL=query.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/commands/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/commands/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GitsheetsContext } from '../context.js';
2
+ export declare const RENAME_HELP = "usage: gitsheets-axi rename <sheet> <old-path> <new-path> [--prefix p] [--message m]\nflags[2]:\n --prefix <p> Tenant sub-tree scope\n --message <m> Commit message (default: \"<sheet> rename <old> -> <new>\")\nexamples:\n gitsheets-axi rename teams kevin-clough kingofthepark\n gitsheets-axi rename repos old-name new-name --message \"slug rename\"\nnote:\n Reads the record at <old-path>, re-keys it to <new-path>, and deletes the old\n one \u2014 atomically in ONE commit. Supported for a bare single-field path\n template; for decorated or multi-field templates, use `patch` to change the\n path fields, or `upsert --delete-missing`.\n";
3
+ export declare function renameCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
4
+ //# sourceMappingURL=rename.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.d.ts","sourceRoot":"","sources":["../../../src/commands/rename.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMtD,eAAO,MAAM,WAAW,0pBAYvB,CAAC;AAqDF,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CA6DjB"}
@@ -0,0 +1,131 @@
1
+ import { AxiError } from 'axi-sdk-js';
2
+ import { Template } from 'gitsheets';
3
+ import { translateError } from '../errors.js';
4
+ import { joinBlocks, renderHelp, renderObject } from '../output/render.js';
5
+ import { openSheetForCommand } from '../util/open-sheet.js';
6
+ import { MATERIALIZE_HINT } from '../util/hints.js';
7
+ export const RENAME_HELP = `usage: gitsheets-axi rename <sheet> <old-path> <new-path> [--prefix p] [--message m]
8
+ flags[2]:
9
+ --prefix <p> Tenant sub-tree scope
10
+ --message <m> Commit message (default: "<sheet> rename <old> -> <new>")
11
+ examples:
12
+ gitsheets-axi rename teams kevin-clough kingofthepark
13
+ gitsheets-axi rename repos old-name new-name --message "slug rename"
14
+ note:
15
+ Reads the record at <old-path>, re-keys it to <new-path>, and deletes the old
16
+ one — atomically in ONE commit. Supported for a bare single-field path
17
+ template; for decorated or multi-field templates, use \`patch\` to change the
18
+ path fields, or \`upsert --delete-missing\`.
19
+ `;
20
+ function parseRenameFlags(args) {
21
+ const flags = { sheet: '', oldPath: '', newPath: '', prefix: undefined, message: undefined };
22
+ const positional = [];
23
+ for (let i = 0; i < args.length; i++) {
24
+ const arg = args[i];
25
+ if (arg === undefined)
26
+ continue;
27
+ const next = args[i + 1];
28
+ switch (arg) {
29
+ case '--prefix':
30
+ if (!next)
31
+ throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
32
+ flags.prefix = next;
33
+ i++;
34
+ break;
35
+ case '--message':
36
+ if (!next)
37
+ throw new AxiError('--message expects a string', 'VALIDATION_ERROR');
38
+ flags.message = next;
39
+ i++;
40
+ break;
41
+ default:
42
+ if (arg.startsWith('-')) {
43
+ throw new AxiError(`Unknown flag: ${arg}`, 'VALIDATION_ERROR', [
44
+ 'Run `gitsheets-axi rename --help`',
45
+ ]);
46
+ }
47
+ positional.push(arg);
48
+ }
49
+ }
50
+ if (positional.length !== 3) {
51
+ throw new AxiError('rename requires <sheet> <old-path> <new-path>', 'VALIDATION_ERROR', [
52
+ 'Example: gitsheets-axi rename teams kevin-clough kingofthepark',
53
+ ]);
54
+ }
55
+ flags.sheet = positional[0];
56
+ flags.oldPath = stripExtension(positional[1]);
57
+ flags.newPath = stripExtension(positional[2]);
58
+ return flags;
59
+ }
60
+ // A bare single-field template: the whole path is one field reference
61
+ // (`${{ field }}` or `${ field }`) with no literal decoration, so <new-path>
62
+ // maps directly onto the field's value.
63
+ const BARE_TEMPLATE = /^\$\{\{?\s*[A-Za-z_$][\w$]*\s*\}?\}$/;
64
+ export async function renameCommand(args, ctx) {
65
+ if (args.length === 0 || (args.length === 1 && args[0] === '--help')) {
66
+ return RENAME_HELP;
67
+ }
68
+ const flags = parseRenameFlags(args);
69
+ const prefixOpts = flags.prefix !== undefined ? { prefix: flags.prefix } : {};
70
+ const repo = await ctx.repo();
71
+ const sheet = await openSheetForCommand(repo, flags.sheet, prefixOpts);
72
+ const config = await sheet.readConfig();
73
+ const template = Template.fromString(config.path);
74
+ const fields = template.getFieldNames();
75
+ if (fields.length !== 1 || template.componentCount !== 1 || !BARE_TEMPLATE.test(config.path.trim())) {
76
+ throw new AxiError(`rename supports a bare single-field path template; '${config.path}' is not one`, 'VALIDATION_ERROR', ['Use `patch` to change the path fields, or `upsert --delete-missing` to re-key.']);
77
+ }
78
+ const field = fields[0];
79
+ let existing;
80
+ try {
81
+ existing = await sheet.queryFirst({ [field]: flags.oldPath });
82
+ }
83
+ catch (error) {
84
+ throw translateError(error);
85
+ }
86
+ if (!existing) {
87
+ throw new AxiError(`${flags.sheet}: no record at ${flags.oldPath}`, 'NOT_FOUND');
88
+ }
89
+ const collision = await sheet.queryFirst({ [field]: flags.newPath });
90
+ if (collision) {
91
+ throw new AxiError(`${flags.sheet}: ${flags.newPath} already exists — refusing to overwrite`, 'VALIDATION_ERROR', [
92
+ `Delete or rename the existing ${flags.newPath} first`,
93
+ ]);
94
+ }
95
+ const renamed = { ...stripSymbols(existing), [field]: flags.newPath };
96
+ const commitMessage = flags.message ?? `${flags.sheet} rename ${flags.oldPath} -> ${flags.newPath}`;
97
+ try {
98
+ const result = await repo.transact({ message: commitMessage }, async (tx) => {
99
+ const txSheet = tx.sheet(flags.sheet, prefixOpts);
100
+ await txSheet.upsert(renamed);
101
+ await txSheet.delete(flags.oldPath);
102
+ });
103
+ return joinBlocks(renderObject({
104
+ result: 'renamed',
105
+ sheet: flags.sheet,
106
+ from: flags.oldPath,
107
+ to: flags.newPath,
108
+ commit: result.commitHash,
109
+ }), renderHelp([MATERIALIZE_HINT]));
110
+ }
111
+ catch (error) {
112
+ throw translateError(error);
113
+ }
114
+ }
115
+ function stripSymbols(record) {
116
+ const out = {};
117
+ if (record && typeof record === 'object') {
118
+ for (const key of Object.keys(record)) {
119
+ out[key] = record[key];
120
+ }
121
+ }
122
+ return out;
123
+ }
124
+ function stripExtension(path) {
125
+ if (path.endsWith('.toml'))
126
+ return path.slice(0, -5);
127
+ if (path.endsWith('.md'))
128
+ return path.slice(0, -3);
129
+ return path;
130
+ }
131
+ //# sourceMappingURL=rename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.js","sourceRoot":"","sources":["../../../src/commands/rename.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { AxiError } from 'axi-sdk-js';
2
2
  import { translateError } from '../errors.js';
3
3
  import { renderListResponse, renderObject } from '../output/render.js';
4
- import { computed, display, field } from '../output/schema.js';
4
+ import { display, field } from '../output/schema.js';
5
5
  import { countRecords } from '../output/sheet-schema.js';
6
6
  import { Template } from 'gitsheets';
7
7
  export const SHEETS_HELP = `usage: gitsheets-axi sheets [<subcommand>] [flags]
@@ -65,7 +65,7 @@ async function sheetsList(ctx) {
65
65
  schema: [
66
66
  field('name'),
67
67
  display('format'),
68
- computed('records', (item) => `${item['records']}`),
68
+ field('records'),
69
69
  field('root'),
70
70
  ],
71
71
  suggestions: help,
@@ -112,7 +112,10 @@ async function sheetsView(args, ctx) {
112
112
  output['sheet']['body_field'] = config.format.body;
113
113
  }
114
114
  if (schemaProps.length > 0) {
115
- output['schema'] = renderSchemaProperties(schemaProps);
115
+ const schemaObj = config.schema;
116
+ const requiredList = schemaObj?.['required'];
117
+ const required = new Set(Array.isArray(requiredList) ? requiredList : []);
118
+ output['schema'] = renderSchemaProperties(schemaProps, required);
116
119
  }
117
120
  output['help'] = [
118
121
  `Run \`gitsheets-axi query ${name}\` to list records`,
@@ -129,13 +132,19 @@ function schemaPropertyList(config) {
129
132
  return [];
130
133
  return Object.entries(props);
131
134
  }
132
- function renderSchemaProperties(props) {
133
- // Flat name → "type [required]" map for token-efficient display.
135
+ function renderSchemaProperties(props, required) {
136
+ // Flat name → "type [required] enum: a|b|c" map for token-efficient display.
137
+ // Surfacing the enum options lets an agent see allowed values before it
138
+ // writes, instead of learning them from a rejected upsert.
134
139
  const out = {};
135
140
  for (const [name, schema] of props) {
136
141
  const type = String(schema['type'] ?? 'any');
137
142
  const format = schema['format'] ? ` (${String(schema['format'])})` : '';
138
- out[name] = `${type}${format}`;
143
+ const req = required.has(name) ? ' [required]' : '';
144
+ const enumVals = Array.isArray(schema['enum'])
145
+ ? ` enum: ${schema['enum'].map(String).join('|')}`
146
+ : '';
147
+ out[name] = `${type}${format}${req}${enumVals}`;
139
148
  }
140
149
  return out;
141
150
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sheets.js","sourceRoot":"","sources":["../../../src/commands/sheets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sheets.js","sourceRoot":"","sources":["../../../src/commands/sheets.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,12 @@
1
1
  import type { GitsheetsContext } from '../context.js';
2
- export declare const UPSERT_HELP = "usage: gitsheets-axi upsert <sheet> [--data <json>] [--allow-missing-body] [--prefix p] [--message m]\nflags[4]:\n --data <json> Record JSON inline. If omitted, reads stdin.\n --allow-missing-body Content-typed sheets only \u2014 permit upsert without body field\n --prefix <p> Tenant sub-tree scope\n --message <m> Commit message (default: \"<sheet> upsert <path>\")\nexamples:\n gitsheets-axi upsert users --data '{\"slug\":\"jane\",\"email\":\"jane@x.org\"}'\n echo '{\"slug\":\"jane\",\"email\":\"jane@x.org\"}' | gitsheets-axi upsert users\nidempotency:\n Compares the canonical bytes the upsert would write against the\n existing blob at the rendered path. If identical, exits 0 with\n result: \"no-op\" and no commit is produced.\n";
2
+ export declare const UPSERT_HELP = "usage: gitsheets-axi upsert <sheet> [--data <json>] [--delete-missing] [--dry-run] [--allow-missing-body] [--prefix p] [--message m]\nflags[6]:\n --data <json> Record JSON inline. If omitted, reads stdin.\n --delete-missing After upserting, delete existing records NOT in the input\n set (make the sheet exactly match the batch). One commit.\n --dry-run Preview {will-change, no-op, invalid, delete} \u2014 no commit.\n --allow-missing-body Content-typed sheets only \u2014 permit upsert without body field\n --prefix <p> Tenant sub-tree scope\n --message <m> Commit message (default: \"<sheet> upsert <path>\")\nbulk:\n Input may be a single JSON object, a JSON array of objects, or NDJSON (one\n compact object per line) \u2014 autodetected. A batch upserts in ONE commit.\nexamples:\n echo '{\"slug\":\"jane\",\"email\":\"jane@x.org\"}' | gitsheets-axi upsert users\n jq -c '.[]' repos.json | gitsheets-axi upsert repos # NDJSON, one commit\n gitsheets-axi upsert repos --data \"$(cat repos.json)\" --delete-missing # exact re-sync\n gitsheets-axi upsert repos --data \"$(cat repos.json)\" --dry-run # preview\nidempotency:\n Unchanged records are skipped; a batch where nothing changed is a no-op with\n no commit. A single invalid record aborts the batch (nothing committed) and\n names the row \u2014 run --dry-run to see all invalid rows at once.\nnote:\n gitsheets writes to the git ref, not your working tree. After a commit run\n `git checkout HEAD -- .` to materialize the record files on disk.\n";
3
3
  export declare function upsertCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
4
+ export interface InvalidRow {
5
+ row: number;
6
+ id: string;
7
+ reason: string;
8
+ code: string;
9
+ }
10
+ /** Shared dry-run renderer: a `dry-run` summary of counts + an invalid-rows table. */
11
+ export declare function renderDryRun(sheet: string, counts: Record<string, number>, invalid: InvalidRow[]): string;
4
12
  //# sourceMappingURL=upsert.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upsert.d.ts","sourceRoot":"","sources":["../../../src/commands/upsert.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKtD,eAAO,MAAM,WAAW,swBAavB,CAAC;AA4DF,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAqFjB"}
1
+ {"version":3,"file":"upsert.d.ts","sourceRoot":"","sources":["../../../src/commands/upsert.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAWtD,eAAO,MAAM,WAAW,ilDAwBvB,CAAC;AAsEF,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAoBjB;AA+CD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AA+FD,sFAAsF;AACtF,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,UAAU,EAAE,GACpB,MAAM,CAYR"}