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.
- package/dist/src/cli.d.ts +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +17 -9
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/count.d.ts +4 -0
- package/dist/src/commands/count.d.ts.map +1 -0
- package/dist/src/commands/count.js +84 -0
- package/dist/src/commands/count.js.map +1 -0
- package/dist/src/commands/delete.d.ts +1 -1
- package/dist/src/commands/delete.d.ts.map +1 -1
- package/dist/src/commands/delete.js +132 -43
- package/dist/src/commands/delete.js.map +1 -1
- package/dist/src/commands/distinct.d.ts +4 -0
- package/dist/src/commands/distinct.d.ts.map +1 -0
- package/dist/src/commands/distinct.js +81 -0
- package/dist/src/commands/distinct.js.map +1 -0
- package/dist/src/commands/home.js +2 -2
- package/dist/src/commands/home.js.map +1 -1
- package/dist/src/commands/patch.d.ts +1 -1
- package/dist/src/commands/patch.d.ts.map +1 -1
- package/dist/src/commands/patch.js +238 -49
- package/dist/src/commands/patch.js.map +1 -1
- package/dist/src/commands/query.d.ts +1 -1
- package/dist/src/commands/query.d.ts.map +1 -1
- package/dist/src/commands/query.js +129 -58
- package/dist/src/commands/query.js.map +1 -1
- package/dist/src/commands/rename.d.ts +4 -0
- package/dist/src/commands/rename.d.ts.map +1 -0
- package/dist/src/commands/rename.js +131 -0
- package/dist/src/commands/rename.js.map +1 -0
- package/dist/src/commands/sheets.js +15 -6
- package/dist/src/commands/sheets.js.map +1 -1
- package/dist/src/commands/upsert.d.ts +9 -1
- package/dist/src/commands/upsert.d.ts.map +1 -1
- package/dist/src/commands/upsert.js +134 -33
- package/dist/src/commands/upsert.js.map +1 -1
- package/dist/src/output/sheet-schema.d.ts +2 -3
- package/dist/src/output/sheet-schema.d.ts.map +1 -1
- package/dist/src/output/sheet-schema.js +3 -5
- package/dist/src/output/sheet-schema.js.map +1 -1
- package/dist/src/util/aggregate.d.ts +13 -0
- package/dist/src/util/aggregate.d.ts.map +1 -0
- package/dist/src/util/aggregate.js +44 -0
- package/dist/src/util/aggregate.js.map +1 -0
- package/dist/src/util/export-file.d.ts +22 -0
- package/dist/src/util/export-file.d.ts.map +1 -0
- package/dist/src/util/export-file.js +67 -0
- package/dist/src/util/export-file.js.map +1 -0
- package/dist/src/util/filter.d.ts +30 -0
- package/dist/src/util/filter.d.ts.map +1 -0
- package/dist/src/util/filter.js +138 -0
- package/dist/src/util/filter.js.map +1 -0
- package/dist/src/util/hints.d.ts +8 -0
- package/dist/src/util/hints.d.ts.map +1 -0
- package/dist/src/util/hints.js +8 -0
- package/dist/src/util/hints.js.map +1 -0
- package/dist/src/util/open-sheet.d.ts +13 -0
- package/dist/src/util/open-sheet.d.ts.map +1 -0
- package/dist/src/util/open-sheet.js +31 -0
- package/dist/src/util/open-sheet.js.map +1 -0
- package/dist/src/util/parse-records.d.ts +26 -0
- package/dist/src/util/parse-records.d.ts.map +1 -0
- package/dist/src/util/parse-records.js +76 -0
- package/dist/src/util/parse-records.js.map +1 -0
- 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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
--
|
|
11
|
-
--
|
|
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
|
|
14
|
-
gitsheets-axi query
|
|
15
|
-
gitsheets-axi query
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
41
|
-
throw new AxiError('--filter expects
|
|
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
|
-
|
|
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
|
|
146
|
+
let all;
|
|
101
147
|
try {
|
|
102
|
-
|
|
148
|
+
all = await sheet.queryAll({}, { withBody });
|
|
103
149
|
}
|
|
104
150
|
catch (error) {
|
|
105
151
|
throw translateError(error);
|
|
106
152
|
}
|
|
107
|
-
const
|
|
108
|
-
const
|
|
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(
|
|
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(
|
|
121
|
-
}
|
|
177
|
+
if (config.format.body)
|
|
178
|
+
suggestions.push('Add `--full` on `read` to see untruncated body content');
|
|
122
179
|
}
|
|
123
|
-
if (
|
|
124
|
-
suggestions.push(`${
|
|
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
|
-
|
|
127
|
-
summary: { count: `${limited.length} of ${
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,
|
|
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[
|
|
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":"
|
|
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"}
|