gitsheets-axi 2.1.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/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 +13 -4
- 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/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
package/dist/src/cli.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const TOP_HELP = "usage: gitsheets-axi [command] [args] [flags]\ncommands[
|
|
1
|
+
export declare const TOP_HELP = "usage: gitsheets-axi [command] [args] [flags]\ncommands[19]:\n (none)=home, sheets, query, count,\n distinct, read, upsert, patch, rename,\n delete, check, diff, normalize,\n init, infer, migrate-config,\n attachment, push, setup\nflags[2]:\n --help, -v/-V/--version\nexamples:\n gitsheets-axi\n gitsheets-axi query repos --filter status=unclassified --sort pushed_at\n gitsheets-axi count repos --filter archived=true\n gitsheets-axi query repos --group-by target_team\n gitsheets-axi distinct repos disposition\n gitsheets-axi upsert users --data '{\"slug\":\"jane\",\"email\":\"jane@x.org\"}'\n gitsheets-axi patch users '{\"slug\":\"jane\"}' --patch '{\"name\":\"Jane\"}'\n gitsheets-axi check users users/jane.toml --fix\n gitsheets-axi diff posts HEAD~10\n gitsheets-axi attachment list users jane\n gitsheets-axi setup hooks\n";
|
|
2
2
|
export declare function main(): Promise<void>;
|
|
3
3
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/src/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAgCA,eAAO,MAAM,QAAQ,u1BAqBpB,CAAC;AA8CF,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAa1C"}
|
package/dist/src/cli.js
CHANGED
|
@@ -6,9 +6,12 @@ import { createContext } from './context.js';
|
|
|
6
6
|
import { homeCommand } from './commands/home.js';
|
|
7
7
|
import { sheetsCommand, SHEETS_HELP } from './commands/sheets.js';
|
|
8
8
|
import { queryCommand, QUERY_HELP } from './commands/query.js';
|
|
9
|
+
import { countCommand, COUNT_HELP } from './commands/count.js';
|
|
10
|
+
import { distinctCommand, DISTINCT_HELP } from './commands/distinct.js';
|
|
9
11
|
import { readCommand, READ_HELP } from './commands/read.js';
|
|
10
12
|
import { upsertCommand, UPSERT_HELP } from './commands/upsert.js';
|
|
11
13
|
import { patchCommand, PATCH_HELP } from './commands/patch.js';
|
|
14
|
+
import { renameCommand, RENAME_HELP } from './commands/rename.js';
|
|
12
15
|
import { deleteCommand, DELETE_HELP } from './commands/delete.js';
|
|
13
16
|
import { checkCommand, CHECK_HELP } from './commands/check.js';
|
|
14
17
|
import { diffCommand, DIFF_HELP } from './commands/diff.js';
|
|
@@ -23,34 +26,36 @@ const DESCRIPTION = 'gitsheets — agent-facing interface for the git-backed doc
|
|
|
23
26
|
'Token-efficient TOON output, idempotent mutations, format-aware schemas.';
|
|
24
27
|
const VERSION = readPackageVersion();
|
|
25
28
|
export const TOP_HELP = `usage: gitsheets-axi [command] [args] [flags]
|
|
26
|
-
commands[
|
|
27
|
-
(none)=home, sheets, query,
|
|
28
|
-
upsert, patch,
|
|
29
|
-
check, diff, normalize,
|
|
29
|
+
commands[19]:
|
|
30
|
+
(none)=home, sheets, query, count,
|
|
31
|
+
distinct, read, upsert, patch, rename,
|
|
32
|
+
delete, check, diff, normalize,
|
|
30
33
|
init, infer, migrate-config,
|
|
31
34
|
attachment, push, setup
|
|
32
35
|
flags[2]:
|
|
33
36
|
--help, -v/-V/--version
|
|
34
37
|
examples:
|
|
35
38
|
gitsheets-axi
|
|
36
|
-
gitsheets-axi query
|
|
39
|
+
gitsheets-axi query repos --filter status=unclassified --sort pushed_at
|
|
40
|
+
gitsheets-axi count repos --filter archived=true
|
|
41
|
+
gitsheets-axi query repos --group-by target_team
|
|
42
|
+
gitsheets-axi distinct repos disposition
|
|
37
43
|
gitsheets-axi upsert users --data '{"slug":"jane","email":"jane@x.org"}'
|
|
38
44
|
gitsheets-axi patch users '{"slug":"jane"}' --patch '{"name":"Jane"}'
|
|
39
45
|
gitsheets-axi check users users/jane.toml --fix
|
|
40
46
|
gitsheets-axi diff posts HEAD~10
|
|
41
|
-
gitsheets-axi normalize users
|
|
42
|
-
gitsheets-axi init users
|
|
43
|
-
gitsheets-axi infer users
|
|
44
47
|
gitsheets-axi attachment list users jane
|
|
45
|
-
gitsheets-axi push
|
|
46
48
|
gitsheets-axi setup hooks
|
|
47
49
|
`;
|
|
48
50
|
const COMMAND_HELP = {
|
|
49
51
|
sheets: SHEETS_HELP,
|
|
50
52
|
query: QUERY_HELP,
|
|
53
|
+
count: COUNT_HELP,
|
|
54
|
+
distinct: DISTINCT_HELP,
|
|
51
55
|
read: READ_HELP,
|
|
52
56
|
upsert: UPSERT_HELP,
|
|
53
57
|
patch: PATCH_HELP,
|
|
58
|
+
rename: RENAME_HELP,
|
|
54
59
|
delete: DELETE_HELP,
|
|
55
60
|
check: CHECK_HELP,
|
|
56
61
|
diff: DIFF_HELP,
|
|
@@ -65,9 +70,12 @@ const COMMAND_HELP = {
|
|
|
65
70
|
const COMMANDS = {
|
|
66
71
|
sheets: sheetsCommand,
|
|
67
72
|
query: queryCommand,
|
|
73
|
+
count: countCommand,
|
|
74
|
+
distinct: distinctCommand,
|
|
68
75
|
read: readCommand,
|
|
69
76
|
upsert: upsertCommand,
|
|
70
77
|
patch: patchCommand,
|
|
78
|
+
rename: renameCommand,
|
|
71
79
|
delete: deleteCommand,
|
|
72
80
|
check: checkCommand,
|
|
73
81
|
diff: diffCommand,
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAyB,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,GACf,wEAAwE;IACxE,0EAA0E,CAAC;AAE7E,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;AAErC,MAAM,CAAC,MAAM,QAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GitsheetsContext } from '../context.js';
|
|
2
|
+
export declare const COUNT_HELP = "usage: gitsheets-axi count <sheet> [--filter k=v ...] [--prefix p]\nflags[2]:\n --filter <expr> Filter clause (repeatable). k=v \u00B7 k!=v \u00B7 k<v \u00B7 k>v \u00B7\n k<=v \u00B7 k>=v \u00B7 k~regex \u00B7 \"k in (a,b)\" \u00B7 k:present \u00B7 k:empty\n --prefix <p> Tenant sub-tree scope\nexamples:\n gitsheets-axi count repos\n gitsheets-axi count repos --filter status=unclassified\n gitsheets-axi count repos --filter 'pushed_at<2022-01-01' --filter archived=false\nnote:\n With no --filter, counts candidate record paths without parsing (cheap).\n A filter scans body-less records and counts matches.\n";
|
|
3
|
+
export declare function countCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=count.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count.d.ts","sourceRoot":"","sources":["../../../src/commands/count.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMtD,eAAO,MAAM,UAAU,mpBAYtB,CAAC;AAuCF,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAoCjB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { AxiError } from 'axi-sdk-js';
|
|
2
|
+
import { translateError } from '../errors.js';
|
|
3
|
+
import { renderObject } from '../output/render.js';
|
|
4
|
+
import { openSheetForCommand } from '../util/open-sheet.js';
|
|
5
|
+
import { buildPredicate } from '../util/filter.js';
|
|
6
|
+
export const COUNT_HELP = `usage: gitsheets-axi count <sheet> [--filter k=v ...] [--prefix p]
|
|
7
|
+
flags[2]:
|
|
8
|
+
--filter <expr> Filter clause (repeatable). k=v · k!=v · k<v · k>v ·
|
|
9
|
+
k<=v · k>=v · k~regex · "k in (a,b)" · k:present · k:empty
|
|
10
|
+
--prefix <p> Tenant sub-tree scope
|
|
11
|
+
examples:
|
|
12
|
+
gitsheets-axi count repos
|
|
13
|
+
gitsheets-axi count repos --filter status=unclassified
|
|
14
|
+
gitsheets-axi count repos --filter 'pushed_at<2022-01-01' --filter archived=false
|
|
15
|
+
note:
|
|
16
|
+
With no --filter, counts candidate record paths without parsing (cheap).
|
|
17
|
+
A filter scans body-less records and counts matches.
|
|
18
|
+
`;
|
|
19
|
+
function parseCountFlags(args) {
|
|
20
|
+
const sheet = args[0];
|
|
21
|
+
if (!sheet || sheet.startsWith('-')) {
|
|
22
|
+
throw new AxiError('count requires a sheet name', 'VALIDATION_ERROR', [
|
|
23
|
+
'Run `gitsheets-axi count <sheet>`',
|
|
24
|
+
]);
|
|
25
|
+
}
|
|
26
|
+
const flags = { sheet, filters: [], prefix: undefined };
|
|
27
|
+
for (let i = 1; i < args.length; i++) {
|
|
28
|
+
const arg = args[i];
|
|
29
|
+
const next = args[i + 1];
|
|
30
|
+
switch (arg) {
|
|
31
|
+
case '--filter':
|
|
32
|
+
if (!next)
|
|
33
|
+
throw new AxiError('--filter expects an expression', 'VALIDATION_ERROR');
|
|
34
|
+
flags.filters.push(next);
|
|
35
|
+
i++;
|
|
36
|
+
break;
|
|
37
|
+
case '--prefix':
|
|
38
|
+
if (!next)
|
|
39
|
+
throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
|
|
40
|
+
flags.prefix = next;
|
|
41
|
+
i++;
|
|
42
|
+
break;
|
|
43
|
+
default:
|
|
44
|
+
throw new AxiError(`Unknown flag: ${arg}`, 'VALIDATION_ERROR', [
|
|
45
|
+
'Run `gitsheets-axi count --help`',
|
|
46
|
+
]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return flags;
|
|
50
|
+
}
|
|
51
|
+
export async function countCommand(args, ctx) {
|
|
52
|
+
if (args.length === 0 || (args.length === 1 && args[0] === '--help')) {
|
|
53
|
+
return COUNT_HELP;
|
|
54
|
+
}
|
|
55
|
+
const flags = parseCountFlags(args);
|
|
56
|
+
const repo = await ctx.repo();
|
|
57
|
+
const sheet = await openSheetForCommand(repo, flags.sheet, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
|
|
58
|
+
// No filter → the cheap candidate-path count.
|
|
59
|
+
if (flags.filters.length === 0) {
|
|
60
|
+
try {
|
|
61
|
+
return renderObject({ sheet: flags.sheet, count: await sheet.count() });
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw translateError(error);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Filtered → scan body-less and count matches, reporting the total too.
|
|
68
|
+
const predicate = buildPredicate(flags.filters);
|
|
69
|
+
let matched = 0;
|
|
70
|
+
let total = 0;
|
|
71
|
+
try {
|
|
72
|
+
const records = await sheet.queryAll({}, { withBody: false });
|
|
73
|
+
total = records.length;
|
|
74
|
+
for (const r of records) {
|
|
75
|
+
if (predicate(r))
|
|
76
|
+
matched++;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
throw translateError(error);
|
|
81
|
+
}
|
|
82
|
+
return renderObject({ sheet: flags.sheet, count: matched, of: total });
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=count.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count.js","sourceRoot":"","sources":["../../../src/commands/count.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { GitsheetsContext } from '../context.js';
|
|
2
|
-
export declare const DELETE_HELP = "usage: gitsheets-axi delete <sheet> <path> [--prefix p] [--message m]\nflags[
|
|
2
|
+
export declare const DELETE_HELP = "usage: gitsheets-axi delete <sheet> <path> [--prefix p] [--message m]\n gitsheets-axi delete <sheet> --filter expr ... [--dry-run] # bulk by query\n gitsheets-axi delete <sheet> --stdin [--dry-run] # bulk by id/path list\nflags[5]:\n --filter <expr> Bulk: delete every record matching the filter DSL (repeatable)\n --stdin Bulk: delete records named one-per-line on stdin\n --dry-run Bulk: report how many would be deleted \u2014 no commit\n --prefix <p> Tenant sub-tree scope\n --message <m> Commit message (default: \"<sheet> delete <path>\")\nexamples:\n gitsheets-axi delete users jane\n gitsheets-axi delete repos --filter disposition=delete-candidate --dry-run\n gitsheets-axi delete repos --filter disposition=delete-candidate\n cat paths.txt | gitsheets-axi delete repos --stdin\nidempotency:\n Already-missing records exit 0 with result: \"no-op\" \u2014 no commit, no error.\n Bulk delete removes every matching record in ONE commit.\n";
|
|
3
3
|
export declare function deleteCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
|
|
4
4
|
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/delete.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/delete.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAQtD,eAAO,MAAM,WAAW,ugCAiBvB,CAAC;AAiFF,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAejB"}
|
|
@@ -1,23 +1,36 @@
|
|
|
1
1
|
import { AxiError } from 'axi-sdk-js';
|
|
2
2
|
import { NotFoundError, RECORD_PATH_KEY } from 'gitsheets';
|
|
3
3
|
import { translateError } from '../errors.js';
|
|
4
|
-
import { renderObject } from '../output/render.js';
|
|
4
|
+
import { joinBlocks, renderHelp, renderObject } from '../output/render.js';
|
|
5
|
+
import { openSheetForCommand } from '../util/open-sheet.js';
|
|
6
|
+
import { buildPredicate } from '../util/filter.js';
|
|
7
|
+
import { readStdin } from '../util/stdin.js';
|
|
8
|
+
import { MATERIALIZE_HINT } from '../util/hints.js';
|
|
5
9
|
export const DELETE_HELP = `usage: gitsheets-axi delete <sheet> <path> [--prefix p] [--message m]
|
|
6
|
-
|
|
10
|
+
gitsheets-axi delete <sheet> --filter expr ... [--dry-run] # bulk by query
|
|
11
|
+
gitsheets-axi delete <sheet> --stdin [--dry-run] # bulk by id/path list
|
|
12
|
+
flags[5]:
|
|
13
|
+
--filter <expr> Bulk: delete every record matching the filter DSL (repeatable)
|
|
14
|
+
--stdin Bulk: delete records named one-per-line on stdin
|
|
15
|
+
--dry-run Bulk: report how many would be deleted — no commit
|
|
7
16
|
--prefix <p> Tenant sub-tree scope
|
|
8
17
|
--message <m> Commit message (default: "<sheet> delete <path>")
|
|
9
18
|
examples:
|
|
10
19
|
gitsheets-axi delete users jane
|
|
11
|
-
gitsheets-axi delete
|
|
20
|
+
gitsheets-axi delete repos --filter disposition=delete-candidate --dry-run
|
|
21
|
+
gitsheets-axi delete repos --filter disposition=delete-candidate
|
|
22
|
+
cat paths.txt | gitsheets-axi delete repos --stdin
|
|
12
23
|
idempotency:
|
|
13
|
-
Already-missing records exit 0 with result: "no-op" — no commit, no
|
|
14
|
-
|
|
15
|
-
without checking existence first.
|
|
24
|
+
Already-missing records exit 0 with result: "no-op" — no commit, no error.
|
|
25
|
+
Bulk delete removes every matching record in ONE commit.
|
|
16
26
|
`;
|
|
17
27
|
function parseDeleteFlags(args) {
|
|
18
28
|
const flags = {
|
|
19
29
|
sheet: '',
|
|
20
|
-
path:
|
|
30
|
+
path: undefined,
|
|
31
|
+
filters: [],
|
|
32
|
+
stdin: false,
|
|
33
|
+
dryRun: false,
|
|
21
34
|
prefix: undefined,
|
|
22
35
|
message: undefined,
|
|
23
36
|
};
|
|
@@ -27,34 +40,59 @@ function parseDeleteFlags(args) {
|
|
|
27
40
|
if (arg === undefined)
|
|
28
41
|
continue;
|
|
29
42
|
const next = args[i + 1];
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
switch (arg) {
|
|
44
|
+
case '--filter':
|
|
45
|
+
if (!next)
|
|
46
|
+
throw new AxiError('--filter expects an expression', 'VALIDATION_ERROR');
|
|
47
|
+
flags.filters.push(next);
|
|
48
|
+
i++;
|
|
49
|
+
break;
|
|
50
|
+
case '--stdin':
|
|
51
|
+
flags.stdin = true;
|
|
52
|
+
break;
|
|
53
|
+
case '--dry-run':
|
|
54
|
+
flags.dryRun = true;
|
|
55
|
+
break;
|
|
56
|
+
case '--prefix':
|
|
57
|
+
if (!next)
|
|
58
|
+
throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
|
|
59
|
+
flags.prefix = next;
|
|
60
|
+
i++;
|
|
61
|
+
break;
|
|
62
|
+
case '--message':
|
|
63
|
+
if (!next)
|
|
64
|
+
throw new AxiError('--message expects a string', 'VALIDATION_ERROR');
|
|
65
|
+
flags.message = next;
|
|
66
|
+
i++;
|
|
67
|
+
break;
|
|
68
|
+
default:
|
|
69
|
+
if (arg.startsWith('-')) {
|
|
70
|
+
throw new AxiError(`Unknown flag: ${arg}`, 'VALIDATION_ERROR', [
|
|
71
|
+
'Run `gitsheets-axi delete --help`',
|
|
72
|
+
]);
|
|
73
|
+
}
|
|
74
|
+
positional.push(arg);
|
|
48
75
|
}
|
|
49
|
-
positional.push(arg);
|
|
50
76
|
}
|
|
51
|
-
|
|
52
|
-
|
|
77
|
+
flags.sheet = positional[0] ?? '';
|
|
78
|
+
flags.path = positional[1];
|
|
79
|
+
const bulk = flags.filters.length > 0 || flags.stdin;
|
|
80
|
+
if (!flags.sheet) {
|
|
81
|
+
throw new AxiError('delete requires <sheet>', 'VALIDATION_ERROR', [
|
|
82
|
+
'Example: gitsheets-axi delete users jane',
|
|
83
|
+
]);
|
|
84
|
+
}
|
|
85
|
+
if (flags.filters.length > 0 && flags.stdin) {
|
|
86
|
+
throw new AxiError('Use either --filter or --stdin, not both', 'VALIDATION_ERROR');
|
|
87
|
+
}
|
|
88
|
+
if (bulk && flags.path !== undefined) {
|
|
89
|
+
throw new AxiError('Drop the <path> positional in bulk mode (--filter / --stdin)', 'VALIDATION_ERROR');
|
|
90
|
+
}
|
|
91
|
+
if (!bulk && flags.path === undefined) {
|
|
92
|
+
throw new AxiError('delete requires <sheet> <path> (or --filter / --stdin for bulk)', 'VALIDATION_ERROR', [
|
|
53
93
|
'Example: gitsheets-axi delete users jane',
|
|
54
94
|
]);
|
|
55
95
|
}
|
|
56
|
-
flags.sheet = positional[0];
|
|
57
|
-
flags.path = positional[1];
|
|
58
96
|
return flags;
|
|
59
97
|
}
|
|
60
98
|
export async function deleteCommand(args, ctx) {
|
|
@@ -62,16 +100,16 @@ export async function deleteCommand(args, ctx) {
|
|
|
62
100
|
return DELETE_HELP;
|
|
63
101
|
}
|
|
64
102
|
const flags = parseDeleteFlags(args);
|
|
65
|
-
const
|
|
103
|
+
const prefixOpts = flags.prefix !== undefined ? { prefix: flags.prefix } : {};
|
|
66
104
|
const repo = await ctx.repo();
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
throw translateError(error);
|
|
105
|
+
const sheet = await openSheetForCommand(repo, flags.sheet, prefixOpts);
|
|
106
|
+
if (flags.filters.length > 0 || flags.stdin) {
|
|
107
|
+
return bulkDelete(repo, sheet, flags, prefixOpts);
|
|
73
108
|
}
|
|
74
|
-
|
|
109
|
+
return singleDelete(repo, sheet, flags, prefixOpts);
|
|
110
|
+
}
|
|
111
|
+
async function singleDelete(repo, sheet, flags, prefixOpts) {
|
|
112
|
+
const target = stripExtension(flags.path);
|
|
75
113
|
let exists = false;
|
|
76
114
|
try {
|
|
77
115
|
for await (const record of sheet.query()) {
|
|
@@ -96,7 +134,7 @@ export async function deleteCommand(args, ctx) {
|
|
|
96
134
|
const commitMessage = flags.message ?? `${flags.sheet} delete ${target}`;
|
|
97
135
|
try {
|
|
98
136
|
const result = await repo.transact({ message: commitMessage }, async (tx) => {
|
|
99
|
-
const txSheet = tx.sheet(flags.sheet,
|
|
137
|
+
const txSheet = tx.sheet(flags.sheet, prefixOpts);
|
|
100
138
|
await txSheet.delete(target);
|
|
101
139
|
});
|
|
102
140
|
return renderObject({
|
|
@@ -107,8 +145,6 @@ export async function deleteCommand(args, ctx) {
|
|
|
107
145
|
});
|
|
108
146
|
}
|
|
109
147
|
catch (error) {
|
|
110
|
-
// Edge: race where the record vanished between the existence check
|
|
111
|
-
// and the delete. Treat as no-op rather than failing.
|
|
112
148
|
if (error instanceof NotFoundError) {
|
|
113
149
|
return renderObject({
|
|
114
150
|
result: 'no-op',
|
|
@@ -120,13 +156,66 @@ export async function deleteCommand(args, ctx) {
|
|
|
120
156
|
throw translateError(error);
|
|
121
157
|
}
|
|
122
158
|
}
|
|
159
|
+
async function bulkDelete(repo, sheet, flags, prefixOpts) {
|
|
160
|
+
// Resolve the delete set against records that actually exist, so the result
|
|
161
|
+
// is idempotent (absent ids are skipped, not errors).
|
|
162
|
+
const existing = await sheet.queryAll({}, { withBody: false });
|
|
163
|
+
const existingPaths = new Set();
|
|
164
|
+
for (const r of existing) {
|
|
165
|
+
const p = r[RECORD_PATH_KEY];
|
|
166
|
+
if (typeof p === 'string')
|
|
167
|
+
existingPaths.add(p);
|
|
168
|
+
}
|
|
169
|
+
let targets;
|
|
170
|
+
if (flags.stdin) {
|
|
171
|
+
const raw = await readStdin();
|
|
172
|
+
const requested = raw
|
|
173
|
+
.split('\n')
|
|
174
|
+
.map((s) => stripExtension(s.trim()))
|
|
175
|
+
.filter((s) => s.length > 0);
|
|
176
|
+
targets = requested.filter((p) => existingPaths.has(p));
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
const predicate = buildPredicate(flags.filters);
|
|
180
|
+
targets = existing
|
|
181
|
+
.filter(predicate)
|
|
182
|
+
.map((r) => r[RECORD_PATH_KEY])
|
|
183
|
+
.filter((p) => typeof p === 'string');
|
|
184
|
+
}
|
|
185
|
+
if (flags.dryRun) {
|
|
186
|
+
return renderObject({
|
|
187
|
+
result: 'dry-run',
|
|
188
|
+
sheet: flags.sheet,
|
|
189
|
+
willDelete: targets.length,
|
|
190
|
+
of: existingPaths.size,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
if (targets.length === 0) {
|
|
194
|
+
return renderObject({ result: 'no-op', sheet: flags.sheet, deleted: 0 });
|
|
195
|
+
}
|
|
196
|
+
const commitMessage = flags.message ?? `${flags.sheet} delete (${targets.length})`;
|
|
197
|
+
try {
|
|
198
|
+
const result = await repo.transact({ message: commitMessage }, async (tx) => {
|
|
199
|
+
const txSheet = tx.sheet(flags.sheet, prefixOpts);
|
|
200
|
+
for (const path of targets)
|
|
201
|
+
await txSheet.delete(path);
|
|
202
|
+
});
|
|
203
|
+
return joinBlocks(renderObject({
|
|
204
|
+
result: 'committed',
|
|
205
|
+
sheet: flags.sheet,
|
|
206
|
+
deleted: targets.length,
|
|
207
|
+
commit: result.commitHash,
|
|
208
|
+
}), renderHelp([MATERIALIZE_HINT]));
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
throw translateError(error);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
123
214
|
function stripExtension(path) {
|
|
124
215
|
if (path.endsWith('.toml'))
|
|
125
216
|
return path.slice(0, -5);
|
|
126
217
|
if (path.endsWith('.md'))
|
|
127
218
|
return path.slice(0, -3);
|
|
128
|
-
if (path.endsWith('.mdx'))
|
|
129
|
-
return path.slice(0, -4);
|
|
130
219
|
return path;
|
|
131
220
|
}
|
|
132
221
|
//# sourceMappingURL=delete.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GitsheetsContext } from '../context.js';
|
|
2
|
+
export declare const DISTINCT_HELP = "usage: gitsheets-axi distinct <sheet> <field> [--filter expr ...] [--prefix p]\nflags[2]:\n --filter <expr> Filter clause (repeatable), same DSL as query\n --prefix <p> Tenant sub-tree scope\nexamples:\n gitsheets-axi distinct repos target_team\n gitsheets-axi distinct repos disposition --filter status=classified\nnote:\n Lists each unique value of <field> (with its count), sorted alphabetically.\n Use `query --group-by <field>` for the same facets ordered by count.\n";
|
|
3
|
+
export declare function distinctCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=distinct.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distinct.d.ts","sourceRoot":"","sources":["../../../src/commands/distinct.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAQtD,eAAO,MAAM,aAAa,gfAUzB,CAAC;AA6CF,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAiCjB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { AxiError } from 'axi-sdk-js';
|
|
2
|
+
import { translateError } from '../errors.js';
|
|
3
|
+
import { renderListResponse } from '../output/render.js';
|
|
4
|
+
import { field } from '../output/schema.js';
|
|
5
|
+
import { openSheetForCommand } from '../util/open-sheet.js';
|
|
6
|
+
import { buildPredicate } from '../util/filter.js';
|
|
7
|
+
import { facetCounts } from '../util/aggregate.js';
|
|
8
|
+
export const DISTINCT_HELP = `usage: gitsheets-axi distinct <sheet> <field> [--filter expr ...] [--prefix p]
|
|
9
|
+
flags[2]:
|
|
10
|
+
--filter <expr> Filter clause (repeatable), same DSL as query
|
|
11
|
+
--prefix <p> Tenant sub-tree scope
|
|
12
|
+
examples:
|
|
13
|
+
gitsheets-axi distinct repos target_team
|
|
14
|
+
gitsheets-axi distinct repos disposition --filter status=classified
|
|
15
|
+
note:
|
|
16
|
+
Lists each unique value of <field> (with its count), sorted alphabetically.
|
|
17
|
+
Use \`query --group-by <field>\` for the same facets ordered by count.
|
|
18
|
+
`;
|
|
19
|
+
function parseDistinctFlags(args) {
|
|
20
|
+
const positional = [];
|
|
21
|
+
const flags = { sheet: '', field: '', filters: [], prefix: undefined };
|
|
22
|
+
for (let i = 0; i < args.length; i++) {
|
|
23
|
+
const arg = args[i];
|
|
24
|
+
const next = args[i + 1];
|
|
25
|
+
switch (arg) {
|
|
26
|
+
case '--filter':
|
|
27
|
+
if (!next)
|
|
28
|
+
throw new AxiError('--filter expects an expression', 'VALIDATION_ERROR');
|
|
29
|
+
flags.filters.push(next);
|
|
30
|
+
i++;
|
|
31
|
+
break;
|
|
32
|
+
case '--prefix':
|
|
33
|
+
if (!next)
|
|
34
|
+
throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
|
|
35
|
+
flags.prefix = next;
|
|
36
|
+
i++;
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
if (arg.startsWith('-')) {
|
|
40
|
+
throw new AxiError(`Unknown flag: ${arg}`, 'VALIDATION_ERROR', [
|
|
41
|
+
'Run `gitsheets-axi distinct --help`',
|
|
42
|
+
]);
|
|
43
|
+
}
|
|
44
|
+
positional.push(arg);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (positional.length !== 2) {
|
|
48
|
+
throw new AxiError('distinct requires <sheet> <field>', 'VALIDATION_ERROR', [
|
|
49
|
+
'Example: gitsheets-axi distinct repos target_team',
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
flags.sheet = positional[0];
|
|
53
|
+
flags.field = positional[1];
|
|
54
|
+
return flags;
|
|
55
|
+
}
|
|
56
|
+
export async function distinctCommand(args, ctx) {
|
|
57
|
+
if (args.length === 0 || (args.length === 1 && args[0] === '--help')) {
|
|
58
|
+
return DISTINCT_HELP;
|
|
59
|
+
}
|
|
60
|
+
const flags = parseDistinctFlags(args);
|
|
61
|
+
const repo = await ctx.repo();
|
|
62
|
+
const sheet = await openSheetForCommand(repo, flags.sheet, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
|
|
63
|
+
let records;
|
|
64
|
+
try {
|
|
65
|
+
records = await sheet.queryAll({}, { withBody: false });
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw translateError(error);
|
|
69
|
+
}
|
|
70
|
+
const predicate = buildPredicate(flags.filters);
|
|
71
|
+
const matched = records.filter(predicate);
|
|
72
|
+
const facets = facetCounts(matched, flags.field).sort((a, b) => a.value < b.value ? -1 : a.value > b.value ? 1 : 0);
|
|
73
|
+
return renderListResponse({
|
|
74
|
+
summary: { distinct: `${facets.length} values of ${flags.field}` },
|
|
75
|
+
name: 'values',
|
|
76
|
+
items: facets,
|
|
77
|
+
schema: [field('value'), field('count')],
|
|
78
|
+
emptyMessage: `no records in ${flags.sheet}`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=distinct.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distinct.js","sourceRoot":"","sources":["../../../src/commands/distinct.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { GitsheetsContext } from '../context.js';
|
|
2
|
-
export declare const PATCH_HELP = "usage: gitsheets-axi patch <sheet> <query-json> [--patch <json>] [--prefix p] [--message m]\nflags[
|
|
2
|
+
export declare const PATCH_HELP = "usage: gitsheets-axi patch <sheet> <query-json> [--patch <json>] [--prefix p] [--message m]\n gitsheets-axi patch <sheet> [--data <json>] [--on-missing m] [--delete-missing] [--dry-run] # bulk\nflags[7]:\n --patch <json> Single mode: RFC 7396 partial. If omitted, reads stdin.\n --data <json> Bulk mode: JSON array / NDJSON of combined records.\n --on-missing <m> Bulk: what to do when a record's query matches nothing \u2014\n abort (default) | skip | insert (upsert it as new).\n --delete-missing Bulk: delete existing records NOT targeted by the batch\n (exact re-sync). One commit.\n --dry-run Bulk: preview {will-change, no-op, missing, invalid,\n delete} \u2014 no commit.\n --prefix <p> Tenant sub-tree scope\n --message <m> Commit message (default: \"<sheet> patch <path>\")\nexamples:\n gitsheets-axi patch users '{\"slug\":\"jane\"}' --patch '{\"name\":\"Jane O. Doe\"}'\n jq -c '.[]' classify.json | gitsheets-axi patch repos # bulk, one commit\n jq -c '.[]' classify.json | gitsheets-axi patch repos --on-missing skip # tolerate stale rows\n gitsheets-axi patch repos --data \"$(cat sync.json)\" --on-missing insert --delete-missing\nbulk:\n With no <query-json>, input is a JSON array or NDJSON of records. In each\n record the sheet's path-template fields form the query (which record to\n patch); the remaining fields are the merge patch. Every patch runs in a\n SINGLE transaction \u2192 ONE commit. This is the tool for incremental\n classification: emit {<path-fields>, <fields-to-set>} per record.\nsemantics:\n RFC 7396 JSON Merge Patch. `null` deletes a field, arrays replace\n in full, objects merge recursively. Same as gitsheets's library patch.\nidempotency:\n Unchanged records are skipped; a batch where nothing changed exits 0 with\n result: \"no-op\" and no commit. With --on-missing abort (default), a record\n matching nothing aborts the batch (nothing committed); --dry-run reports all\n missing/invalid rows at once.\n";
|
|
3
3
|
export declare function patchCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
|
|
4
4
|
//# sourceMappingURL=patch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../../src/commands/patch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../../src/commands/patch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAYtD,eAAO,MAAM,UAAU,qkEAgCtB,CAAC;AAyFF,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAoCjB"}
|