gitsheets-axi 0.0.1

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 (99) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +116 -0
  3. package/dist/bin/gitsheets-axi.d.ts +3 -0
  4. package/dist/bin/gitsheets-axi.d.ts.map +1 -0
  5. package/dist/bin/gitsheets-axi.js +4 -0
  6. package/dist/bin/gitsheets-axi.js.map +1 -0
  7. package/dist/src/cli.d.ts +3 -0
  8. package/dist/src/cli.d.ts.map +1 -0
  9. package/dist/src/cli.js +105 -0
  10. package/dist/src/cli.js.map +1 -0
  11. package/dist/src/commands/attachment.d.ts +4 -0
  12. package/dist/src/commands/attachment.d.ts.map +1 -0
  13. package/dist/src/commands/attachment.js +356 -0
  14. package/dist/src/commands/attachment.js.map +1 -0
  15. package/dist/src/commands/check.d.ts +4 -0
  16. package/dist/src/commands/check.d.ts.map +1 -0
  17. package/dist/src/commands/check.js +136 -0
  18. package/dist/src/commands/check.js.map +1 -0
  19. package/dist/src/commands/delete.d.ts +4 -0
  20. package/dist/src/commands/delete.d.ts.map +1 -0
  21. package/dist/src/commands/delete.js +132 -0
  22. package/dist/src/commands/delete.js.map +1 -0
  23. package/dist/src/commands/diff.d.ts +4 -0
  24. package/dist/src/commands/diff.d.ts.map +1 -0
  25. package/dist/src/commands/diff.js +139 -0
  26. package/dist/src/commands/diff.js.map +1 -0
  27. package/dist/src/commands/home.d.ts +3 -0
  28. package/dist/src/commands/home.d.ts.map +1 -0
  29. package/dist/src/commands/home.js +71 -0
  30. package/dist/src/commands/home.js.map +1 -0
  31. package/dist/src/commands/infer.d.ts +4 -0
  32. package/dist/src/commands/infer.d.ts.map +1 -0
  33. package/dist/src/commands/infer.js +214 -0
  34. package/dist/src/commands/infer.js.map +1 -0
  35. package/dist/src/commands/init.d.ts +4 -0
  36. package/dist/src/commands/init.d.ts.map +1 -0
  37. package/dist/src/commands/init.js +172 -0
  38. package/dist/src/commands/init.js.map +1 -0
  39. package/dist/src/commands/migrate-config.d.ts +4 -0
  40. package/dist/src/commands/migrate-config.d.ts.map +1 -0
  41. package/dist/src/commands/migrate-config.js +161 -0
  42. package/dist/src/commands/migrate-config.js.map +1 -0
  43. package/dist/src/commands/normalize.d.ts +4 -0
  44. package/dist/src/commands/normalize.d.ts.map +1 -0
  45. package/dist/src/commands/normalize.js +142 -0
  46. package/dist/src/commands/normalize.js.map +1 -0
  47. package/dist/src/commands/patch.d.ts +4 -0
  48. package/dist/src/commands/patch.d.ts.map +1 -0
  49. package/dist/src/commands/patch.js +172 -0
  50. package/dist/src/commands/patch.js.map +1 -0
  51. package/dist/src/commands/push.d.ts +4 -0
  52. package/dist/src/commands/push.d.ts.map +1 -0
  53. package/dist/src/commands/push.js +112 -0
  54. package/dist/src/commands/push.js.map +1 -0
  55. package/dist/src/commands/query.d.ts +4 -0
  56. package/dist/src/commands/query.d.ts.map +1 -0
  57. package/dist/src/commands/query.js +141 -0
  58. package/dist/src/commands/query.js.map +1 -0
  59. package/dist/src/commands/read.d.ts +4 -0
  60. package/dist/src/commands/read.d.ts.map +1 -0
  61. package/dist/src/commands/read.js +149 -0
  62. package/dist/src/commands/read.js.map +1 -0
  63. package/dist/src/commands/sheets.d.ts +4 -0
  64. package/dist/src/commands/sheets.d.ts.map +1 -0
  65. package/dist/src/commands/sheets.js +142 -0
  66. package/dist/src/commands/sheets.js.map +1 -0
  67. package/dist/src/commands/upsert.d.ts +4 -0
  68. package/dist/src/commands/upsert.d.ts.map +1 -0
  69. package/dist/src/commands/upsert.js +137 -0
  70. package/dist/src/commands/upsert.js.map +1 -0
  71. package/dist/src/context.d.ts +17 -0
  72. package/dist/src/context.d.ts.map +1 -0
  73. package/dist/src/context.js +47 -0
  74. package/dist/src/context.js.map +1 -0
  75. package/dist/src/errors.d.ts +13 -0
  76. package/dist/src/errors.d.ts.map +1 -0
  77. package/dist/src/errors.js +58 -0
  78. package/dist/src/errors.js.map +1 -0
  79. package/dist/src/output/index.d.ts +3 -0
  80. package/dist/src/output/index.d.ts.map +1 -0
  81. package/dist/src/output/index.js +3 -0
  82. package/dist/src/output/index.js.map +1 -0
  83. package/dist/src/output/render.d.ts +28 -0
  84. package/dist/src/output/render.d.ts.map +1 -0
  85. package/dist/src/output/render.js +49 -0
  86. package/dist/src/output/render.js.map +1 -0
  87. package/dist/src/output/schema.d.ts +29 -0
  88. package/dist/src/output/schema.d.ts.map +1 -0
  89. package/dist/src/output/schema.js +51 -0
  90. package/dist/src/output/schema.js.map +1 -0
  91. package/dist/src/output/sheet-schema.d.ts +27 -0
  92. package/dist/src/output/sheet-schema.d.ts.map +1 -0
  93. package/dist/src/output/sheet-schema.js +114 -0
  94. package/dist/src/output/sheet-schema.js.map +1 -0
  95. package/dist/src/util/stdin.d.ts +7 -0
  96. package/dist/src/util/stdin.d.ts.map +1 -0
  97. package/dist/src/util/stdin.js +19 -0
  98. package/dist/src/util/stdin.js.map +1 -0
  99. package/package.json +55 -0
@@ -0,0 +1,172 @@
1
+ import { AxiError } from 'axi-sdk-js';
2
+ import { mergePatch } from 'gitsheets';
3
+ import { translateError } from '../errors.js';
4
+ import { renderObject } from '../output/render.js';
5
+ import { readStdin } from '../util/stdin.js';
6
+ export const PATCH_HELP = `usage: gitsheets-axi patch <sheet> <query-json> [--patch <json>] [--prefix p] [--message m]
7
+ flags[3]:
8
+ --patch <json> RFC 7396 partial. If omitted, reads stdin.
9
+ --prefix <p> Tenant sub-tree scope
10
+ --message <m> Commit message (default: "<sheet> patch <path>")
11
+ examples:
12
+ gitsheets-axi patch users '{"slug":"jane"}' --patch '{"name":"Jane O. Doe"}'
13
+ echo '{"name":"Jane O. Doe"}' | gitsheets-axi patch users '{"slug":"jane"}'
14
+ semantics:
15
+ RFC 7396 JSON Merge Patch. \`null\` deletes a field, arrays replace
16
+ in full, objects merge recursively. Same as gitsheets's library patch.
17
+ idempotency:
18
+ Reads the existing record, applies the merge, runs the result through
19
+ willChange. If the canonical bytes are unchanged, exits 0 with
20
+ result: "no-op" and no commit is produced.
21
+ `;
22
+ function parsePatchFlags(args) {
23
+ const flags = {
24
+ sheet: '',
25
+ queryJson: '',
26
+ patchJson: undefined,
27
+ prefix: undefined,
28
+ message: undefined,
29
+ };
30
+ const positional = [];
31
+ for (let i = 0; i < args.length; i++) {
32
+ const arg = args[i];
33
+ if (arg === undefined)
34
+ continue;
35
+ const next = args[i + 1];
36
+ switch (arg) {
37
+ case '--patch':
38
+ if (!next)
39
+ throw new AxiError('--patch expects JSON', 'VALIDATION_ERROR');
40
+ flags.patchJson = next;
41
+ i++;
42
+ break;
43
+ case '--prefix':
44
+ if (!next)
45
+ throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
46
+ flags.prefix = next;
47
+ i++;
48
+ break;
49
+ case '--message':
50
+ if (!next)
51
+ throw new AxiError('--message expects a string', 'VALIDATION_ERROR');
52
+ flags.message = next;
53
+ i++;
54
+ break;
55
+ default:
56
+ if (arg.startsWith('-')) {
57
+ throw new AxiError(`Unknown flag: ${arg}`, 'VALIDATION_ERROR', [
58
+ 'Run `gitsheets-axi patch --help`',
59
+ ]);
60
+ }
61
+ positional.push(arg);
62
+ }
63
+ }
64
+ if (positional.length !== 2) {
65
+ throw new AxiError('patch requires <sheet> <query-json>', 'VALIDATION_ERROR', [
66
+ "Example: gitsheets-axi patch users '{\"slug\":\"jane\"}' --patch '{...}'",
67
+ ]);
68
+ }
69
+ flags.sheet = positional[0];
70
+ flags.queryJson = positional[1];
71
+ return flags;
72
+ }
73
+ export async function patchCommand(args, ctx) {
74
+ if (args.length === 0 || (args.length === 1 && args[0] === '--help')) {
75
+ return PATCH_HELP;
76
+ }
77
+ const flags = parsePatchFlags(args);
78
+ let query;
79
+ try {
80
+ query = JSON.parse(flags.queryJson);
81
+ }
82
+ catch (error) {
83
+ throw new AxiError(`Could not parse query JSON: ${error instanceof Error ? error.message : String(error)}`, 'INVALID_JSON');
84
+ }
85
+ const patchJson = flags.patchJson ?? (await readStdin());
86
+ if (!patchJson.trim()) {
87
+ throw new AxiError('patch needs a partial — pass --patch <json> or pipe JSON on stdin', 'VALIDATION_ERROR');
88
+ }
89
+ let partial;
90
+ try {
91
+ partial = JSON.parse(patchJson);
92
+ }
93
+ catch (error) {
94
+ throw new AxiError(`Could not parse patch JSON: ${error instanceof Error ? error.message : String(error)}`, 'INVALID_JSON');
95
+ }
96
+ if (!partial || typeof partial !== 'object' || Array.isArray(partial)) {
97
+ throw new AxiError('Patch must be a JSON object', 'VALIDATION_ERROR');
98
+ }
99
+ const repo = await ctx.repo();
100
+ let sheet;
101
+ try {
102
+ sheet = await repo.openSheet(flags.sheet, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
103
+ }
104
+ catch (error) {
105
+ throw translateError(error);
106
+ }
107
+ let existing;
108
+ try {
109
+ existing = await sheet.queryFirst(query);
110
+ }
111
+ catch (error) {
112
+ throw translateError(error);
113
+ }
114
+ if (!existing) {
115
+ throw new AxiError(`${flags.sheet}: no record matches the query`, 'NOT_FOUND');
116
+ }
117
+ // Apply RFC 7396 merge in-axi so we can run willChange against the result.
118
+ const merged = mergePatch(stripSymbols(existing), partial);
119
+ // Preserve the record's path annotation so willChange uses the rename path
120
+ // logic if any path-template field changed (matches Sheet.patch behavior).
121
+ const pathSym = existing[Symbol.for('gitsheets-path')];
122
+ if (typeof pathSym === 'string') {
123
+ merged[Symbol.for('gitsheets-path')] = pathSym;
124
+ }
125
+ // Body-presence on content-typed sheets: patch is body-preserving — the
126
+ // merged record carries the existing body forward unless the partial
127
+ // explicitly replaced it. Use allowMissingBody to defer the upsert guard
128
+ // since the merge produces the canonical record either way.
129
+ const upsertOpts = { allowMissingBody: true };
130
+ let willResult;
131
+ try {
132
+ willResult = await sheet.willChange(merged, upsertOpts);
133
+ }
134
+ catch (error) {
135
+ throw translateError(error);
136
+ }
137
+ if (!willResult.changed) {
138
+ return renderObject({
139
+ result: 'no-op',
140
+ sheet: flags.sheet,
141
+ path: willResult.path,
142
+ hash: willResult.currentBlobHash ?? '',
143
+ });
144
+ }
145
+ const commitMessage = flags.message ?? `${flags.sheet} patch ${willResult.path}`;
146
+ try {
147
+ const result = await repo.transact({ message: commitMessage }, async (tx) => {
148
+ const txSheet = tx.sheet(flags.sheet, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
149
+ return txSheet.patch(query, partial);
150
+ });
151
+ return renderObject({
152
+ result: 'committed',
153
+ sheet: flags.sheet,
154
+ path: result.value.path,
155
+ hash: result.value.blob.hash,
156
+ commit: result.commitHash,
157
+ });
158
+ }
159
+ catch (error) {
160
+ throw translateError(error);
161
+ }
162
+ }
163
+ function stripSymbols(record) {
164
+ if (!record || typeof record !== 'object')
165
+ return record;
166
+ const out = {};
167
+ for (const key of Object.keys(record)) {
168
+ out[key] = record[key];
169
+ }
170
+ return out;
171
+ }
172
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../../src/commands/patch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GitsheetsContext } from '../context.js';
2
+ export declare const PUSH_HELP = "usage: gitsheets-axi push [--remote r] [--branch b]\nflags[2]:\n --remote <r> Git remote to push to (default: origin)\n --branch <b> Branch to push (default: the repo's current HEAD branch)\nexamples:\n gitsheets-axi push\n gitsheets-axi push --remote upstream --branch main\nbehavior:\n One-shot push via `git push <remote> <branch>`. For agent workflows\n that want to publish after a mutation without spinning up a background\n daemon. This is NOT a daemon lifecycle command \u2014 for retry-with-backoff\n semantics, use Repository.startPushDaemon from a long-running consumer.\nidempotency:\n When the remote is already up to date, exits 0 with\n result: \"no-op\" \u2014 git's natural \"Everything up-to-date\" path.\nerrors:\n NON_FAST_FORWARD Remote has work the local doesn't \u2014 never force-pushed.\n Reconcile externally (pull or rebase), then re-run.\n PUSH_FAILED Network / auth / other transient failure. Re-run later.\n";
3
+ export declare function pushCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
4
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/commands/push.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKtD,eAAO,MAAM,SAAS,6+BAmBrB,CAAC;AAyDF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAqDjB"}
@@ -0,0 +1,112 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { AxiError } from 'axi-sdk-js';
4
+ import { renderObject } from '../output/render.js';
5
+ const exec = promisify(execFile);
6
+ export const PUSH_HELP = `usage: gitsheets-axi push [--remote r] [--branch b]
7
+ flags[2]:
8
+ --remote <r> Git remote to push to (default: origin)
9
+ --branch <b> Branch to push (default: the repo's current HEAD branch)
10
+ examples:
11
+ gitsheets-axi push
12
+ gitsheets-axi push --remote upstream --branch main
13
+ behavior:
14
+ One-shot push via \`git push <remote> <branch>\`. For agent workflows
15
+ that want to publish after a mutation without spinning up a background
16
+ daemon. This is NOT a daemon lifecycle command — for retry-with-backoff
17
+ semantics, use Repository.startPushDaemon from a long-running consumer.
18
+ idempotency:
19
+ When the remote is already up to date, exits 0 with
20
+ result: "no-op" — git's natural "Everything up-to-date" path.
21
+ errors:
22
+ NON_FAST_FORWARD Remote has work the local doesn't — never force-pushed.
23
+ Reconcile externally (pull or rebase), then re-run.
24
+ PUSH_FAILED Network / auth / other transient failure. Re-run later.
25
+ `;
26
+ function parsePushFlags(args) {
27
+ const flags = { remote: 'origin', branch: undefined };
28
+ for (let i = 0; i < args.length; i++) {
29
+ const arg = args[i];
30
+ if (arg === undefined)
31
+ continue;
32
+ const next = args[i + 1];
33
+ if (arg === '--remote') {
34
+ if (!next)
35
+ throw new AxiError('--remote expects a name', 'VALIDATION_ERROR');
36
+ flags.remote = next;
37
+ i++;
38
+ continue;
39
+ }
40
+ if (arg === '--branch') {
41
+ if (!next)
42
+ throw new AxiError('--branch expects a name', 'VALIDATION_ERROR');
43
+ flags.branch = next;
44
+ i++;
45
+ continue;
46
+ }
47
+ if (arg === '--help')
48
+ continue;
49
+ throw new AxiError(`Unknown flag: ${arg}`, 'VALIDATION_ERROR', [
50
+ 'Run `gitsheets-axi push --help`',
51
+ ]);
52
+ }
53
+ return flags;
54
+ }
55
+ async function resolveBranch(gitDir) {
56
+ const { stdout } = await exec('git', ['symbolic-ref', '--short', 'HEAD'], { cwd: gitDir });
57
+ const branch = stdout.trim();
58
+ if (!branch) {
59
+ throw new AxiError("Couldn't determine current branch (detached HEAD?)", 'REF_ERROR', ['Pass --branch explicitly, e.g. `gitsheets-axi push --branch main`']);
60
+ }
61
+ return branch;
62
+ }
63
+ function classifyPushError(message) {
64
+ if (/!\s*\[rejected\]/.test(message) && /(non-fast-forward|fetch first)/i.test(message)) {
65
+ return 'NON_FAST_FORWARD';
66
+ }
67
+ return 'PUSH_FAILED';
68
+ }
69
+ export async function pushCommand(args, ctx) {
70
+ if (args.length === 1 && args[0] === '--help')
71
+ return PUSH_HELP;
72
+ const flags = parsePushFlags(args);
73
+ const repo = await ctx.repo();
74
+ const gitDir = repo.gitDir;
75
+ const branch = flags.branch ?? (await resolveBranch(gitDir));
76
+ let stderr = '';
77
+ try {
78
+ const result = await exec('git', ['push', flags.remote, branch], { cwd: gitDir, maxBuffer: 10 * 1024 * 1024 });
79
+ stderr = result.stderr;
80
+ }
81
+ catch (error) {
82
+ const err = error;
83
+ const combined = `${err.stderr ?? ''}\n${err.stdout ?? ''}\n${err.message ?? ''}`;
84
+ const code = classifyPushError(combined);
85
+ const suggestions = code === 'NON_FAST_FORWARD'
86
+ ? [
87
+ "Remote has commits the local doesn't — reconcile externally before retrying",
88
+ 'Stop the writer, fetch + rebase or pull, then restart',
89
+ ]
90
+ : ['Network or auth failure — retry, or check the remote configuration'];
91
+ throw new AxiError(`git push to ${flags.remote} ${branch} failed: ${(err.message ?? '').split('\n')[0] ?? 'unknown error'}`, code, suggestions);
92
+ }
93
+ // git's "Everything up-to-date" lands in stderr without an error code.
94
+ // Treat as no-op.
95
+ const upToDate = /everything up.to.date/i.test(stderr);
96
+ if (upToDate) {
97
+ return renderObject({
98
+ result: 'no-op',
99
+ remote: flags.remote,
100
+ branch,
101
+ reason: 'remote already up-to-date',
102
+ });
103
+ }
104
+ return renderObject({
105
+ result: 'pushed',
106
+ remote: flags.remote,
107
+ branch,
108
+ // Strip git's noisy "To <url>" / hash lines into a compact summary.
109
+ detail: stderr.split('\n').filter((l) => l.trim()).slice(0, 3).join('\n'),
110
+ });
111
+ }
112
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/commands/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GitsheetsContext } from '../context.js';
2
+ export declare const QUERY_HELP = "usage: gitsheets-axi query <sheet> [--filter k=v ...] [--fields a,b,c] [--limit n]\nflags[4]:\n --filter <k>=<v> Equality match against record field (repeatable)\n --fields <list> Extra columns beyond the default schema (comma-separated)\n --limit <n> Cap results (default: 100, max: 10000)\n --prefix <p> Tenant sub-tree scope (see gitsheets --prefix)\nexamples:\n gitsheets-axi query users\n gitsheets-axi query users --filter status=active --limit 50\n gitsheets-axi query posts --fields title,published\noutput:\n Default schema is format-aware:\n TOML sheets \u2014 path-template fields + first scalar properties (cap 4)\n Markdown/MDX \u2014 path-template fields + title + body_size (never body content)\n --fields appends additional columns.\n";
3
+ export declare function queryCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
4
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/commands/query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAStD,eAAO,MAAM,UAAU,iyBAetB,CAAC;AAwEF,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAgFjB"}
@@ -0,0 +1,141 @@
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 { 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)
9
+ --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)
12
+ examples:
13
+ gitsheets-axi query users
14
+ gitsheets-axi query users --filter status=active --limit 50
15
+ gitsheets-axi query posts --fields title,published
16
+ 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.
21
+ `;
22
+ function parseQueryFlags(args) {
23
+ const sheetName = args[0];
24
+ if (!sheetName || sheetName.startsWith('-')) {
25
+ throw new AxiError('query requires a sheet name', 'VALIDATION_ERROR', [
26
+ 'Run `gitsheets-axi query <sheet>`',
27
+ ]);
28
+ }
29
+ const flags = {
30
+ filters: [],
31
+ extras: [],
32
+ limit: 100,
33
+ prefix: undefined,
34
+ };
35
+ for (let i = 1; i < args.length; i++) {
36
+ const arg = args[i];
37
+ const next = args[i + 1];
38
+ 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)]);
45
+ i++;
46
+ break;
47
+ }
48
+ case '--fields':
49
+ if (!next) {
50
+ throw new AxiError('--fields expects a comma-separated list', 'VALIDATION_ERROR');
51
+ }
52
+ flags.extras = next.split(',').map((s) => s.trim()).filter(Boolean);
53
+ i++;
54
+ break;
55
+ case '--limit':
56
+ if (!next) {
57
+ throw new AxiError('--limit expects an integer', 'VALIDATION_ERROR');
58
+ }
59
+ flags.limit = Math.min(10_000, Math.max(1, parseInt(next, 10) || 100));
60
+ i++;
61
+ break;
62
+ case '--prefix':
63
+ if (!next) {
64
+ throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
65
+ }
66
+ flags.prefix = next;
67
+ i++;
68
+ break;
69
+ default:
70
+ throw new AxiError(`Unknown flag: ${arg}`, 'VALIDATION_ERROR', [
71
+ 'Run `gitsheets-axi query --help` to see supported flags',
72
+ ]);
73
+ }
74
+ }
75
+ return { sheetName, flags };
76
+ }
77
+ export async function queryCommand(args, ctx) {
78
+ if (args.length === 0 || (args.length === 1 && args[0] === '--help')) {
79
+ return QUERY_HELP;
80
+ }
81
+ const { sheetName, flags } = parseQueryFlags(args);
82
+ 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
+ }
90
+ 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
+ const withBody = config.format.body !== undefined;
100
+ let records;
101
+ try {
102
+ records = await sheet.queryAll(filter, { withBody });
103
+ }
104
+ catch (error) {
105
+ throw translateError(error);
106
+ }
107
+ const total = records.length;
108
+ const limited = records.slice(0, flags.limit);
109
+ const baseSchema = defaultSheetSchema(config);
110
+ const schema = fieldsWithExtras(baseSchema, flags.extras);
111
+ const suggestions = [];
112
+ 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');
116
+ }
117
+ else if (limited.length > 0) {
118
+ 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
+ }
122
+ }
123
+ if (total > limited.length) {
124
+ suggestions.push(`${total - limited.length} records hidden by --limit ${flags.limit}; raise --limit to see more`);
125
+ }
126
+ return renderListResponse({
127
+ summary: { count: `${limited.length} of ${total} total` },
128
+ name: 'records',
129
+ items: limited.map((r) => ({
130
+ ...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
+ path: r[Symbol.for('gitsheets-path')] ?? '',
135
+ })),
136
+ schema: [...schema, field('path')],
137
+ suggestions,
138
+ emptyMessage: `no records in ${sheetName}`,
139
+ });
140
+ }
141
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
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 READ_HELP = "usage: gitsheets-axi read <sheet> <path> [--full] [--prefix p]\nflags[2]:\n --full Don't truncate the body field on content-typed sheets\n --prefix <p> Tenant sub-tree scope (see gitsheets --prefix)\nexamples:\n gitsheets-axi read users jane\n gitsheets-axi read posts hello --full\noutput:\n TOML sheet \u2014 all fields, one per line\n Markdown/MDX sheet \u2014 frontmatter fields + body truncated to ~500 chars\n (with \"(truncated, N chars total)\" + --full hint)\n";
3
+ export declare function readCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
4
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/commands/read.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItD,eAAO,MAAM,SAAS,0hBAWrB,CAAC;AAoDF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAiEjB"}
@@ -0,0 +1,149 @@
1
+ import { AxiError } from 'axi-sdk-js';
2
+ import { NotFoundError, RECORD_PATH_KEY, RECORD_SHEET_KEY } from 'gitsheets';
3
+ import { translateError } from '../errors.js';
4
+ import { renderObject } from '../output/render.js';
5
+ export const READ_HELP = `usage: gitsheets-axi read <sheet> <path> [--full] [--prefix p]
6
+ flags[2]:
7
+ --full Don't truncate the body field on content-typed sheets
8
+ --prefix <p> Tenant sub-tree scope (see gitsheets --prefix)
9
+ examples:
10
+ gitsheets-axi read users jane
11
+ gitsheets-axi read posts hello --full
12
+ output:
13
+ TOML sheet — all fields, one per line
14
+ Markdown/MDX sheet — frontmatter fields + body truncated to ~500 chars
15
+ (with "(truncated, N chars total)" + --full hint)
16
+ `;
17
+ const BODY_PREVIEW_CHARS = 500;
18
+ function parseReadFlags(args) {
19
+ const positional = [];
20
+ const flags = {
21
+ sheet: '',
22
+ path: '',
23
+ full: false,
24
+ prefix: undefined,
25
+ };
26
+ for (let i = 0; i < args.length; i++) {
27
+ const arg = args[i];
28
+ if (arg === undefined)
29
+ continue;
30
+ const next = args[i + 1];
31
+ if (arg === '--full') {
32
+ flags.full = true;
33
+ continue;
34
+ }
35
+ if (arg === '--prefix') {
36
+ if (!next) {
37
+ throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
38
+ }
39
+ flags.prefix = next;
40
+ i++;
41
+ continue;
42
+ }
43
+ if (arg.startsWith('-')) {
44
+ throw new AxiError(`Unknown flag: ${arg}`, 'VALIDATION_ERROR', [
45
+ 'Run `gitsheets-axi read --help`',
46
+ ]);
47
+ }
48
+ positional.push(arg);
49
+ }
50
+ if (positional.length !== 2) {
51
+ throw new AxiError('read requires <sheet> <path>', 'VALIDATION_ERROR', [
52
+ 'Example: gitsheets-axi read users jane',
53
+ ]);
54
+ }
55
+ flags.sheet = positional[0];
56
+ flags.path = positional[1];
57
+ return flags;
58
+ }
59
+ export async function readCommand(args, ctx) {
60
+ if (args.length === 0 || (args.length === 1 && args[0] === '--help')) {
61
+ return READ_HELP;
62
+ }
63
+ const flags = parseReadFlags(args);
64
+ const repo = await ctx.repo();
65
+ let sheet;
66
+ try {
67
+ sheet = await repo.openSheet(flags.sheet, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
68
+ }
69
+ catch (error) {
70
+ throw translateError(error);
71
+ }
72
+ // The path is the rendered template result; drop a trailing `.toml`/`.md`
73
+ // extension if the caller included one.
74
+ const target = stripExtension(flags.path);
75
+ let found;
76
+ try {
77
+ for await (const record of sheet.query()) {
78
+ const pathSym = record[RECORD_PATH_KEY];
79
+ if (pathSym === target) {
80
+ found = record;
81
+ break;
82
+ }
83
+ }
84
+ }
85
+ catch (error) {
86
+ throw translateError(error);
87
+ }
88
+ if (!found) {
89
+ throw translateError(new NotFoundError('record_not_found', `${flags.sheet}: no record at ${target}`));
90
+ }
91
+ // Hydrate body for content-typed sheets — query() returns body-less records.
92
+ const config = await sheet.readConfig();
93
+ const bodyField = config.format.body;
94
+ if (bodyField && found[bodyField] === undefined) {
95
+ try {
96
+ found = (await sheet.loadBody(found));
97
+ }
98
+ catch {
99
+ // Body load failure is non-fatal — agent can still see frontmatter.
100
+ }
101
+ }
102
+ const out = {};
103
+ out['record'] = projectRecord(found, bodyField, flags.full);
104
+ const help = [];
105
+ if (bodyField && !flags.full) {
106
+ const bodyValue = found[bodyField];
107
+ if (typeof bodyValue === 'string' && bodyValue.length > BODY_PREVIEW_CHARS) {
108
+ help.push(`Run \`gitsheets-axi read ${flags.sheet} ${target} --full\` to see complete body`);
109
+ }
110
+ }
111
+ if (help.length > 0)
112
+ out['help'] = help;
113
+ return renderObject(out);
114
+ }
115
+ function stripExtension(path) {
116
+ if (path.endsWith('.toml'))
117
+ return path.slice(0, -5);
118
+ if (path.endsWith('.md'))
119
+ return path.slice(0, -3);
120
+ if (path.endsWith('.mdx'))
121
+ return path.slice(0, -4);
122
+ return path;
123
+ }
124
+ function projectRecord(record, bodyField, full) {
125
+ const cleaned = {};
126
+ for (const [key, value] of Object.entries(record)) {
127
+ if (key === bodyField && !full && typeof value === 'string') {
128
+ if (value.length > BODY_PREVIEW_CHARS) {
129
+ cleaned[key] = `${value.slice(0, BODY_PREVIEW_CHARS)}… (truncated, ${value.length} chars total)`;
130
+ }
131
+ else {
132
+ cleaned[key] = value;
133
+ }
134
+ continue;
135
+ }
136
+ cleaned[key] = value;
137
+ }
138
+ // Symbol annotations: surface path as a plain field for visibility.
139
+ const pathSym = record[RECORD_PATH_KEY];
140
+ if (typeof pathSym === 'string') {
141
+ cleaned['_path'] = pathSym;
142
+ }
143
+ const sheetSym = record[RECORD_SHEET_KEY];
144
+ if (typeof sheetSym === 'string') {
145
+ cleaned['_sheet'] = sheetSym;
146
+ }
147
+ return cleaned;
148
+ }
149
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/commands/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GitsheetsContext } from '../context.js';
2
+ export declare const SHEETS_HELP = "usage: gitsheets-axi sheets [<subcommand>] [flags]\nsubcommands[2]:\n list List sheets configured in this repository (default)\n view <name> Show a single sheet's config + summary\nexamples:\n gitsheets-axi sheets\n gitsheets-axi sheets list\n gitsheets-axi sheets view users\n";
3
+ export declare function sheetsCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
4
+ //# sourceMappingURL=sheets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheets.d.ts","sourceRoot":"","sources":["../../../src/commands/sheets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOtD,eAAO,MAAM,WAAW,0TAQvB,CAAC;AAEF,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAWjB"}