@axtrabase/cli 0.1.2 → 0.1.4
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/README.md +39 -4
- package/dist/api-types.d.ts +39 -0
- package/dist/api-types.d.ts.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +71 -20
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/context.d.ts +62 -0
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +82 -6
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/keys.js +16 -0
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/login.js +14 -0
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/permissions.js +13 -3
- package/dist/commands/permissions.js.map +1 -1
- package/dist/commands/status.js +22 -3
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tables.js +69 -12
- package/dist/commands/tables.js.map +1 -1
- package/dist/config/environments.d.ts +43 -0
- package/dist/config/environments.d.ts.map +1 -0
- package/dist/config/environments.js +43 -0
- package/dist/config/environments.js.map +1 -0
- package/dist/config/resolve.d.ts +25 -4
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +59 -11
- package/dist/config/resolve.js.map +1 -1
- package/dist/config/store.d.ts +4 -2
- package/dist/config/store.d.ts.map +1 -1
- package/dist/config/store.js +1 -0
- package/dist/config/store.js.map +1 -1
- package/dist/exit-codes.d.ts.map +1 -1
- package/dist/exit-codes.js +8 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/generators/typescript.d.ts +15 -0
- package/dist/generators/typescript.d.ts.map +1 -1
- package/dist/generators/typescript.js +126 -11
- package/dist/generators/typescript.js.map +1 -1
- package/dist/prompt-masked.d.ts +3 -1
- package/dist/prompt-masked.d.ts.map +1 -1
- package/dist/prompt-masked.js +23 -2
- package/dist/prompt-masked.js.map +1 -1
- package/dist/report-error.d.ts +16 -1
- package/dist/report-error.d.ts.map +1 -1
- package/dist/report-error.js +45 -2
- package/dist/report-error.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +11 -11
package/README.md
CHANGED
|
@@ -25,6 +25,29 @@ source ~/.zshrc
|
|
|
25
25
|
npm install -g @axtrabase/cli
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
## Which environment am I talking to?
|
|
29
|
+
|
|
30
|
+
AxtraBase is currently live on **staging only** — production is not deployed
|
|
31
|
+
yet. A fresh install therefore talks to staging by default, and the API and
|
|
32
|
+
dashboard origins are always paired as a unit, so `login` reaches the same
|
|
33
|
+
environment your commands run against.
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
axtrabase config get environment # staging
|
|
37
|
+
axtrabase status # shows the active API and dashboard origins
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
To move a whole environment at once (rather than setting origins by hand):
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
axtrabase config set environment staging
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Setting `apiUrl` on its own still works and pairs the dashboard to it
|
|
47
|
+
automatically. An `apiUrl`/`dashboardUrl` pair belonging to two different
|
|
48
|
+
environments is rejected rather than silently used — that combination cannot
|
|
49
|
+
produce a working login.
|
|
50
|
+
|
|
28
51
|
## Authenticate
|
|
29
52
|
|
|
30
53
|
```bash
|
|
@@ -111,6 +134,8 @@ Every command supports `-h`/`--help`.
|
|
|
111
134
|
|
|
112
135
|
## `context` — the one command to start with
|
|
113
136
|
|
|
137
|
+
It runs against the **active project**, so select one first — `axtrabase projects list`, then `axtrabase projects use <project>` (or pass `--project <project>` to any command). Until then it stops with `AXTRA_CLI_NO_ACTIVE_PROJECT`.
|
|
138
|
+
|
|
114
139
|
```bash
|
|
115
140
|
axtrabase context
|
|
116
141
|
axtrabase context --json # the full payload, machine-readable
|
|
@@ -151,10 +176,20 @@ failure and never mixes a printed error with exit code 0.
|
|
|
151
176
|
| `AXTRABASE_API_KEY` | A project API key for data-plane commands (`events`). Never persisted or logged. |
|
|
152
177
|
|
|
153
178
|
Precedence everywhere it applies: **explicit flag > environment variable >
|
|
154
|
-
saved config >
|
|
179
|
+
saved config > the active environment's default.**
|
|
155
180
|
|
|
156
181
|
## Full documentation
|
|
157
182
|
|
|
158
|
-
The complete command reference, agent integration guide, and error model
|
|
159
|
-
|
|
160
|
-
|
|
183
|
+
The complete command reference, agent integration guide, and error model are
|
|
184
|
+
public — no source-repository access required:
|
|
185
|
+
|
|
186
|
+
- [CLI reference](https://docs-stg.axtraxia.com/docs/cli/overview)
|
|
187
|
+
- [Installation](https://docs-stg.axtraxia.com/docs/cli/installation) ·
|
|
188
|
+
[Login](https://docs-stg.axtraxia.com/docs/cli/login) ·
|
|
189
|
+
[Exit codes](https://docs-stg.axtraxia.com/docs/cli/exit-codes) ·
|
|
190
|
+
[Environment variables](https://docs-stg.axtraxia.com/docs/cli/environment-variables)
|
|
191
|
+
- [Agent integration guide](https://docs-stg.axtraxia.com/docs/agents/overview), including
|
|
192
|
+
[`context --agent`](https://docs-stg.axtraxia.com/docs/agents/context-agent), the
|
|
193
|
+
[security/trust boundary](https://docs-stg.axtraxia.com/docs/agents/security-trust-boundary)
|
|
194
|
+
and [handing an agent a data key](https://docs-stg.axtraxia.com/docs/agents/data-plane-handoff)
|
|
195
|
+
- [SDK reference](https://docs-stg.axtraxia.com/docs/sdk/overview)
|
package/dist/api-types.d.ts
CHANGED
|
@@ -57,6 +57,27 @@ export interface TableCatalogEntry {
|
|
|
57
57
|
};
|
|
58
58
|
pendingDataverseSync: boolean;
|
|
59
59
|
}
|
|
60
|
+
/** One selectable value on a choice column. */
|
|
61
|
+
export interface ChoiceOption {
|
|
62
|
+
value: number;
|
|
63
|
+
label?: string;
|
|
64
|
+
languageCode?: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* One relationship involving a table. `kind` names the direction, so all
|
|
68
|
+
* three (many-to-one, one-to-many, many-to-many) share one shape.
|
|
69
|
+
*/
|
|
70
|
+
export interface TableRelationship {
|
|
71
|
+
kind: "many-to-one" | "one-to-many" | "many-to-many";
|
|
72
|
+
name: string;
|
|
73
|
+
referencingTable?: string;
|
|
74
|
+
referencingColumn?: string;
|
|
75
|
+
referencedTable?: string;
|
|
76
|
+
referencedColumn?: string;
|
|
77
|
+
relatedTable?: string;
|
|
78
|
+
intersectEntity?: string;
|
|
79
|
+
navigationName?: string;
|
|
80
|
+
}
|
|
60
81
|
export interface TableColumn {
|
|
61
82
|
logicalName: string;
|
|
62
83
|
schemaName: string | null;
|
|
@@ -67,6 +88,13 @@ export interface TableColumn {
|
|
|
67
88
|
isPrimaryName: boolean;
|
|
68
89
|
isRequired: boolean;
|
|
69
90
|
lookupTargets: string[] | null;
|
|
91
|
+
/** null = not resolved; [] = this choice genuinely has no options. Never conflate them. */
|
|
92
|
+
options?: ChoiceOption[] | null;
|
|
93
|
+
isMultiSelect?: boolean;
|
|
94
|
+
/** "stored" | "calculated" | "rollup" | "unknown"; null when Dataverse did not report it. */
|
|
95
|
+
source?: string | null;
|
|
96
|
+
/** False for calculated/rollup and other derived columns; null when unknown. */
|
|
97
|
+
isWritable?: boolean | null;
|
|
70
98
|
}
|
|
71
99
|
export interface TablePermissionRow {
|
|
72
100
|
apiKeyId: string;
|
|
@@ -85,7 +113,13 @@ export interface TableMetadataResponse {
|
|
|
85
113
|
primaryIdAttribute: string;
|
|
86
114
|
primaryNameAttribute: string | null;
|
|
87
115
|
isCustomEntity: boolean;
|
|
116
|
+
/** Normalised Dataverse ownership model; null when not reported. */
|
|
117
|
+
ownershipType?: string | null;
|
|
118
|
+
/** Dataverse's exact OwnershipType string, preserving UserOwned vs TeamOwned. */
|
|
119
|
+
rawOwnershipType?: string | null;
|
|
88
120
|
columns: TableColumn[];
|
|
121
|
+
/** null = not fetched; [] = this table has no relationships. */
|
|
122
|
+
relationships?: TableRelationship[] | null;
|
|
89
123
|
permissions: TablePermissionRow[];
|
|
90
124
|
}
|
|
91
125
|
export type MetadataResolution = "resolved" | "partial" | "unresolved";
|
|
@@ -106,6 +140,11 @@ export interface TablePermissionRowFlat {
|
|
|
106
140
|
table: string;
|
|
107
141
|
isEnabled: boolean;
|
|
108
142
|
apiKeyId: string;
|
|
143
|
+
apiKeyName?: string;
|
|
144
|
+
/** ISO timestamp when the owning key was revoked, or null if it is live. */
|
|
145
|
+
keyRevokedAt?: string | null;
|
|
146
|
+
/** False when the owning key is revoked — the grant row exists but confers nothing. */
|
|
147
|
+
isEffective?: boolean;
|
|
109
148
|
canRead: boolean;
|
|
110
149
|
canCreate: boolean;
|
|
111
150
|
canUpdate: boolean;
|
package/dist/api-types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-types.d.ts","sourceRoot":"","sources":["../src/api-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;IACjD,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,CAAC;IAC3F,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAClF,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"api-types.d.ts","sourceRoot":"","sources":["../src/api-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;IACjD,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,CAAC;IAC3F,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAClF,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,2FAA2F;IAC3F,OAAO,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;IACxB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,gEAAgE;IAChE,aAAa,CAAC,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC;IAC3C,WAAW,EAAE,kBAAkB,EAAE,CAAC;CACnC;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClD,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,GAAG,IAAI,CAAC;IACT;;;;;;;;;OASG;IACH,MAAM,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACnF,WAAW,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,oBAAoB,EAAE;QACpB,OAAO,EAAE,kBAAkB,CAAC;QAC5B,aAAa,EAAE,kBAAkB,CAAC;QAClC,iBAAiB,EAAE,kBAAkB,CAAC;QACtC,YAAY,EAAE,kBAAkB,CAAC;KAClC,CAAC;IACF,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,GAAG,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8H5D"}
|
package/dist/commands/config.js
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { ConfigStore } from "../config/store.js";
|
|
2
2
|
import { CliError } from "../http/errors.js";
|
|
3
|
+
import { ENVIRONMENT_NAMES, isEnvironmentName } from "../config/environments.js";
|
|
4
|
+
import { resolveApiUrl, resolveDashboardUrl, resolveEnvironmentName } from "../config/resolve.js";
|
|
3
5
|
import { printJson, printLine } from "../output/print.js";
|
|
4
6
|
import { runWithErrorHandling } from "../report-error.js";
|
|
5
7
|
/** kebab-case (what a user types) <-> the CliConfig field it maps to. Deliberately a closed list — config set never accepts an arbitrary key (build brief §25: "do not allow arbitrary secret storage through generic config"). */
|
|
6
8
|
const KEY_ALIASES = {
|
|
9
|
+
// Selects a whole environment (api + dashboard + docs together) — the
|
|
10
|
+
// preferred way to move between staging and production, rather than
|
|
11
|
+
// setting origins individually and risking a mismatched pair.
|
|
12
|
+
environment: "environment",
|
|
13
|
+
env: "environment",
|
|
7
14
|
"api-url": "apiUrl",
|
|
8
15
|
"dashboard-url": "dashboardUrl",
|
|
9
16
|
organisation: "organisationId",
|
|
@@ -17,51 +24,90 @@ function resolveKey(input) {
|
|
|
17
24
|
}
|
|
18
25
|
return key;
|
|
19
26
|
}
|
|
27
|
+
/** The value a key resolves to today when nothing is written to config. Undefined for keys with no meaningful default (org/project selection). */
|
|
28
|
+
function effectiveValueFor(field) {
|
|
29
|
+
switch (field) {
|
|
30
|
+
case "environment":
|
|
31
|
+
return resolveEnvironmentName();
|
|
32
|
+
case "apiUrl":
|
|
33
|
+
return resolveApiUrl();
|
|
34
|
+
case "dashboardUrl":
|
|
35
|
+
return resolveDashboardUrl();
|
|
36
|
+
default:
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
20
40
|
export function registerConfigCommand(program) {
|
|
21
41
|
const config = program.command("config").description("Inspect or change local CLI configuration");
|
|
22
42
|
config
|
|
23
43
|
.command("list")
|
|
24
|
-
.description("Show every
|
|
44
|
+
.description("Show every setting in effect, marking defaults")
|
|
25
45
|
.action(async function () {
|
|
26
46
|
const options = this.optsWithGlobals();
|
|
27
47
|
await runWithErrorHandling(async () => {
|
|
28
48
|
const values = new ConfigStore().read();
|
|
49
|
+
// "No config set." was true of the file and useless to the reader:
|
|
50
|
+
// the CLI is always on SOME environment talking to SOME origins, and
|
|
51
|
+
// a clean-room tester could not confirm which without making an
|
|
52
|
+
// authenticated call. Show what is in effect, marking defaults, so
|
|
53
|
+
// this answers "where am I pointed?" before any login.
|
|
54
|
+
const effective = {
|
|
55
|
+
environment: {
|
|
56
|
+
value: effectiveValueFor("environment"),
|
|
57
|
+
explicit: values.environment !== undefined
|
|
58
|
+
},
|
|
59
|
+
apiUrl: {
|
|
60
|
+
value: values.apiUrl ?? effectiveValueFor("apiUrl"),
|
|
61
|
+
explicit: values.apiUrl !== undefined
|
|
62
|
+
},
|
|
63
|
+
dashboardUrl: {
|
|
64
|
+
value: values.dashboardUrl ?? effectiveValueFor("dashboardUrl"),
|
|
65
|
+
explicit: values.dashboardUrl !== undefined
|
|
66
|
+
}
|
|
67
|
+
};
|
|
29
68
|
if (options.json) {
|
|
30
|
-
printJson(values);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
const lines = [];
|
|
34
|
-
if (values.apiUrl)
|
|
35
|
-
lines.push(`api-url: ${values.apiUrl}`);
|
|
36
|
-
if (values.dashboardUrl)
|
|
37
|
-
lines.push(`dashboard-url: ${values.dashboardUrl}`);
|
|
38
|
-
if (values.organisationId) {
|
|
39
|
-
lines.push(`organisation: ${values.organisationSlug ?? values.organisationId} (${values.organisationId})`);
|
|
40
|
-
}
|
|
41
|
-
if (values.projectId) {
|
|
42
|
-
lines.push(`project: ${values.projectSlug ?? values.projectId} (${values.projectId})`);
|
|
43
|
-
}
|
|
44
|
-
if (lines.length === 0) {
|
|
45
|
-
printLine("No config set.");
|
|
69
|
+
printJson({ ...values, effective });
|
|
46
70
|
return;
|
|
47
71
|
}
|
|
72
|
+
const mark = (explicit) => (explicit ? "" : " (default)");
|
|
73
|
+
const lines = [
|
|
74
|
+
`environment: ${values.environment ?? effective.environment.value}${mark(effective.environment.explicit)}`,
|
|
75
|
+
`api-url: ${effective.apiUrl.value}${mark(effective.apiUrl.explicit)}`,
|
|
76
|
+
`dashboard-url: ${effective.dashboardUrl.value}${mark(effective.dashboardUrl.explicit)}`
|
|
77
|
+
];
|
|
78
|
+
lines.push(values.organisationId
|
|
79
|
+
? `organisation: ${values.organisationSlug ?? values.organisationId} (${values.organisationId})`
|
|
80
|
+
: "organisation: (none selected — axtrabase orgs use <org>)");
|
|
81
|
+
lines.push(values.projectId
|
|
82
|
+
? `project: ${values.projectSlug ?? values.projectId} (${values.projectId})`
|
|
83
|
+
: "project: (none selected — axtrabase projects use <project>)");
|
|
48
84
|
for (const line of lines)
|
|
49
85
|
printLine(line);
|
|
50
86
|
}, options);
|
|
51
87
|
});
|
|
52
88
|
config
|
|
53
89
|
.command("get <key>")
|
|
54
|
-
.description("Show one config value (api-url, dashboard-url, organisation, project)")
|
|
90
|
+
.description("Show one config value (environment, api-url, dashboard-url, organisation, project)")
|
|
55
91
|
.action(async function (key, _opts, command) {
|
|
56
92
|
const options = command.optsWithGlobals();
|
|
57
93
|
await runWithErrorHandling(async () => {
|
|
58
94
|
const field = resolveKey(key);
|
|
59
95
|
const value = new ConfigStore().read()[field];
|
|
96
|
+
// "(not set)" is a misleading answer for the keys that always have an
|
|
97
|
+
// effective value: the CLI is on SOME environment with SOME pair of
|
|
98
|
+
// origins whether or not they were written to config. Reporting the
|
|
99
|
+
// effective value (marked as a default) is what makes "which
|
|
100
|
+
// environment am I on" answerable — Sprint #11 P0-2/P1-14.
|
|
101
|
+
const effective = value ?? effectiveValueFor(field);
|
|
60
102
|
if (options.json) {
|
|
61
|
-
printJson({ [key]:
|
|
103
|
+
printJson({ [key]: effective ?? null, explicit: value !== undefined });
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (effective === undefined) {
|
|
107
|
+
printLine("(not set)");
|
|
62
108
|
return;
|
|
63
109
|
}
|
|
64
|
-
printLine(value
|
|
110
|
+
printLine(value !== undefined ? effective : `${effective} (default)`);
|
|
65
111
|
}, options);
|
|
66
112
|
});
|
|
67
113
|
config
|
|
@@ -71,6 +117,11 @@ export function registerConfigCommand(program) {
|
|
|
71
117
|
const options = command.optsWithGlobals();
|
|
72
118
|
await runWithErrorHandling(async () => {
|
|
73
119
|
const field = resolveKey(key);
|
|
120
|
+
// A bad environment name must fail here, not later as a confusing
|
|
121
|
+
// origin-resolution error (Sprint #11 P0-2).
|
|
122
|
+
if (field === "environment" && !isEnvironmentName(value.trim().toLowerCase())) {
|
|
123
|
+
throw new CliError("AXTRA_CLI_VALIDATION_ERROR", `Unknown AxtraBase environment "${value}". Valid environments: ${ENVIRONMENT_NAMES.join(", ")}.`, { status: 0 });
|
|
124
|
+
}
|
|
74
125
|
new ConfigStore().update({ [field]: value });
|
|
75
126
|
if (options.json) {
|
|
76
127
|
printJson({ [key]: value });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAkB,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAO1D,mOAAmO;AACnO,MAAM,WAAW,GAAoC;IACnD,SAAS,EAAE,QAAQ;IACnB,eAAe,EAAE,cAAc;IAC/B,YAAY,EAAE,gBAAgB;IAC9B,GAAG,EAAE,gBAAgB;IACrB,OAAO,EAAE,WAAW;CACrB,CAAC;AAEF,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,QAAQ,CAChB,4BAA4B,EAC5B,uBAAuB,KAAK,kBAAkB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACpF,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,2CAA2C,CAAC,CAAC;IAElG,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,40 @@ import type { Command } from "commander";
|
|
|
6
6
|
* rather than assuming a model infers them from field names alone.
|
|
7
7
|
*/
|
|
8
8
|
export declare const AGENT_RULES: string[];
|
|
9
|
+
/**
|
|
10
|
+
* How an agent actually reads records once a human has handed it a project
|
|
11
|
+
* API key (Sprint #11 P1-12 / Gate 8).
|
|
12
|
+
*
|
|
13
|
+
* The clean-room test could discover the whole schema but could not sample a
|
|
14
|
+
* single record, and the tempting fix — letting the CLI's control-plane
|
|
15
|
+
* token read records — would have collapsed the two credentials into one.
|
|
16
|
+
* That boundary is deliberate and stays: this block instead makes the
|
|
17
|
+
* intended handoff explicit enough to follow without guessing.
|
|
18
|
+
*
|
|
19
|
+
* Purely descriptive, like EVENTS_AGENT_INFO — no server round-trip.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DATA_PLANE_AGENT_INFO: {
|
|
22
|
+
readonly credential: {
|
|
23
|
+
readonly envVar: "AXTRABASE_API_KEY";
|
|
24
|
+
readonly kind: "project API key — data plane only (records and events)";
|
|
25
|
+
readonly notTheSameAs: "the CLI token (axcli_...), which is control plane only and can never read records";
|
|
26
|
+
readonly howToObtain: "Ask the human operator. They run `axtrabase keys create --name <name>`, grant it read access to the tables you need in the dashboard, and hand you the raw key.";
|
|
27
|
+
readonly howToRevoke: "The human runs `axtrabase keys revoke <id>` when you are done with it.";
|
|
28
|
+
readonly handling: "Never print, log, echo, write to a file, or commit this key.";
|
|
29
|
+
};
|
|
30
|
+
readonly reading: {
|
|
31
|
+
readonly sdk: "npm install @axtrabase/sdk";
|
|
32
|
+
readonly example: string;
|
|
33
|
+
readonly rest: "GET {apiBaseUrl}/<logicalName>?limit=3 with header: Authorization: Bearer $AXTRABASE_API_KEY";
|
|
34
|
+
readonly note: "Use the table's logicalName (e.g. adp_expenseitem). That is what GET /api/v1/tables returns as each table's `name`, and what table permissions are granted against. Entity-set names also resolve, but logicalName is the identifier to build on.";
|
|
35
|
+
};
|
|
36
|
+
readonly ifDenied: {
|
|
37
|
+
readonly code: "AXTRA_TABLE_PERMISSION_DENIED";
|
|
38
|
+
readonly meaning: "The key is valid but has not been granted this action on this table. This is the platform working as designed — do not route around it.";
|
|
39
|
+
readonly fix: "Ask the human to grant the key read access to that table in the dashboard, then retry.";
|
|
40
|
+
};
|
|
41
|
+
readonly sampling: "When exploring an unfamiliar schema, read the smallest sample that answers your question (limit 3-5). Never bulk-export a customer table to inspect it.";
|
|
42
|
+
};
|
|
9
43
|
/**
|
|
10
44
|
* The Change Feed (Events) capability's agent-context payload (Events
|
|
11
45
|
* Sprint Item #10 §14) — additive and purely descriptive. Deliberately not
|
|
@@ -28,5 +62,33 @@ export declare const EVENTS_AGENT_INFO: {
|
|
|
28
62
|
eventTypes: readonly ["record.created", "record.updated", "record.deleted"];
|
|
29
63
|
notes: string[];
|
|
30
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* Why a table's access is what it is, as a machine-readable state.
|
|
67
|
+
*
|
|
68
|
+
* `access: null` alone is ambiguous — it could mean no credential was
|
|
69
|
+
* supplied, none exists to supply, or the server could not evaluate one —
|
|
70
|
+
* and the human output additionally bucketed an explicit denial ("----")
|
|
71
|
+
* together with "not evaluated" under one "No access" heading. An agent
|
|
72
|
+
* could not tell "you gave me no credential" from "you are denied", which
|
|
73
|
+
* are opposite problems with opposite fixes (Sprint #11 P1-11).
|
|
74
|
+
*/
|
|
75
|
+
export type TableAccessState =
|
|
76
|
+
/** No API key was passed, and the project has none to pass. Create one explicitly. */
|
|
77
|
+
"no-api-key-exists"
|
|
78
|
+
/** The project has API keys, but none was supplied to this command. Re-run with --api-key. */
|
|
79
|
+
| "no-api-key-supplied"
|
|
80
|
+
/** A key was supplied but the server returned no verdict. Unexpected — see api-types.ts. */
|
|
81
|
+
| "unresolved"
|
|
82
|
+
/** Evaluated, and this credential may do nothing with this table. */
|
|
83
|
+
| "denied"
|
|
84
|
+
/** Evaluated, and at least one of read/create/update/delete is permitted. */
|
|
85
|
+
| "granted";
|
|
86
|
+
export interface TableAccessInput {
|
|
87
|
+
access: string | null;
|
|
88
|
+
apiKeyGiven: boolean;
|
|
89
|
+
/** Whether the project has any API keys at all; omitted means unknown. */
|
|
90
|
+
keysExist?: boolean;
|
|
91
|
+
}
|
|
92
|
+
export declare function classifyTableAccess({ access, apiKeyGiven, keysExist }: TableAccessInput): TableAccessState;
|
|
31
93
|
export declare function registerContextCommand(program: Command): void;
|
|
32
94
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC;;;;;GAKG;AACH,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC;;;;;GAKG;AACH,eAAO,MAAM,WAAW,UAYvB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;CA4BxB,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;CAoB7B,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB;AAC1B,sFAAsF;AACpF,mBAAmB;AACrB,8FAA8F;GAC5F,qBAAqB;AACvB,4FAA4F;GAC1F,YAAY;AACd,qEAAqE;GACnE,QAAQ;AACV,6EAA6E;GAC3E,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,WAAW,EACX,SAAS,EACV,EAAE,gBAAgB,GAAG,gBAAgB,CAOrC;AAWD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAW7D"}
|
package/dist/commands/context.js
CHANGED
|
@@ -17,10 +17,48 @@ export const AGENT_RULES = [
|
|
|
17
17
|
"Keep API keys server-side (Next.js Server Components/Route Handlers/Actions, or your own backend) — never in browser/client code.",
|
|
18
18
|
"The access field on each table (R/C/U/D shorthand) is what this credential can actually do — never assume broader access than shown, and re-run this command after permissions change.",
|
|
19
19
|
"metadataCapabilities tells you what's actually known: 'unresolved' means AxtraBase does not have that information yet — never fabricate a relationship or a choice field's option values.",
|
|
20
|
-
"
|
|
20
|
+
"Two separate credentials, never interchangeable. The CLI token (axcli_...) is CONTROL PLANE only: projects, schema, permissions, metadata. It can never read or write records. A project API key (AXTRABASE_API_KEY) is DATA PLANE only: records and events. Never attempt to read records with the CLI token, and never ask for Dataverse or Microsoft credentials — AxtraBase does not expose them and does not need them.",
|
|
21
|
+
"If you have no API key, ask the human operator for one rather than creating it yourself. Creating a key is a deliberate human action (axtrabase keys create --name <name>), and a new key starts with NO table access until the human grants it in the dashboard. Say which tables you need to read and why; the human can then hand you a disposable key and revoke it afterwards with axtrabase keys revoke <id>.",
|
|
22
|
+
"Once given a key, set AXTRABASE_API_KEY and read through the SDK or REST API only — see the dataPlane field in this payload for the exact shape. Treat the key as a secret: never print it, never write it to a file, never commit it.",
|
|
21
23
|
"Use request IDs for debugging: axtrabase requests get <request-id> --json.",
|
|
22
24
|
'Events (the public Change Feed) are also available: axtrabase events list/get/tail, GET /api/v1/events(/:eventId|/stream), or axtra.events.* in the SDK — see this payload\'s events field. changedFields may be null, meaning the exact changed-field set is unknown, never "nothing changed." The stream is at-least-once, so deduplicate on event.id. Retention is finite — do not assume a full historical log exists.'
|
|
23
25
|
];
|
|
26
|
+
/**
|
|
27
|
+
* How an agent actually reads records once a human has handed it a project
|
|
28
|
+
* API key (Sprint #11 P1-12 / Gate 8).
|
|
29
|
+
*
|
|
30
|
+
* The clean-room test could discover the whole schema but could not sample a
|
|
31
|
+
* single record, and the tempting fix — letting the CLI's control-plane
|
|
32
|
+
* token read records — would have collapsed the two credentials into one.
|
|
33
|
+
* That boundary is deliberate and stays: this block instead makes the
|
|
34
|
+
* intended handoff explicit enough to follow without guessing.
|
|
35
|
+
*
|
|
36
|
+
* Purely descriptive, like EVENTS_AGENT_INFO — no server round-trip.
|
|
37
|
+
*/
|
|
38
|
+
export const DATA_PLANE_AGENT_INFO = {
|
|
39
|
+
credential: {
|
|
40
|
+
envVar: "AXTRABASE_API_KEY",
|
|
41
|
+
kind: "project API key — data plane only (records and events)",
|
|
42
|
+
notTheSameAs: "the CLI token (axcli_...), which is control plane only and can never read records",
|
|
43
|
+
howToObtain: "Ask the human operator. They run `axtrabase keys create --name <name>`, grant it read access to the tables you need in the dashboard, and hand you the raw key.",
|
|
44
|
+
howToRevoke: "The human runs `axtrabase keys revoke <id>` when you are done with it.",
|
|
45
|
+
handling: "Never print, log, echo, write to a file, or commit this key."
|
|
46
|
+
},
|
|
47
|
+
reading: {
|
|
48
|
+
sdk: "npm install @axtrabase/sdk",
|
|
49
|
+
example: 'import { AxtraBase } from "@axtrabase/sdk";\n' +
|
|
50
|
+
"const axtra = new AxtraBase({ apiKey: process.env.AXTRABASE_API_KEY });\n" +
|
|
51
|
+
'const { data } = await axtra.table("<logicalName>").list({ limit: 3 });',
|
|
52
|
+
rest: "GET {apiBaseUrl}/<logicalName>?limit=3 with header: Authorization: Bearer $AXTRABASE_API_KEY",
|
|
53
|
+
note: "Use the table's logicalName (e.g. adp_expenseitem). That is what GET /api/v1/tables returns as each table's `name`, and what table permissions are granted against. Entity-set names also resolve, but logicalName is the identifier to build on."
|
|
54
|
+
},
|
|
55
|
+
ifDenied: {
|
|
56
|
+
code: "AXTRA_TABLE_PERMISSION_DENIED",
|
|
57
|
+
meaning: "The key is valid but has not been granted this action on this table. This is the platform working as designed — do not route around it.",
|
|
58
|
+
fix: "Ask the human to grant the key read access to that table in the dashboard, then retry."
|
|
59
|
+
},
|
|
60
|
+
sampling: "When exploring an unfamiliar schema, read the smallest sample that answers your question (limit 3-5). Never bulk-export a customer table to inspect it."
|
|
61
|
+
};
|
|
24
62
|
/**
|
|
25
63
|
* The Change Feed (Events) capability's agent-context payload (Events
|
|
26
64
|
* Sprint Item #10 §14) — additive and purely descriptive. Deliberately not
|
|
@@ -49,6 +87,23 @@ export const EVENTS_AGENT_INFO = {
|
|
|
49
87
|
"axtrabase events tail starts from now by default; pass --after <cursor-or-event-id> to catch up from a previous list()/tail() position first, then it stays live."
|
|
50
88
|
]
|
|
51
89
|
};
|
|
90
|
+
export function classifyTableAccess({ access, apiKeyGiven, keysExist }) {
|
|
91
|
+
if (access === null || access === undefined) {
|
|
92
|
+
if (apiKeyGiven)
|
|
93
|
+
return "unresolved";
|
|
94
|
+
return keysExist === false ? "no-api-key-exists" : "no-api-key-supplied";
|
|
95
|
+
}
|
|
96
|
+
// "----" is an explicit, evaluated denial, not an absence of information.
|
|
97
|
+
return /[RCUD]/.test(access) ? "granted" : "denied";
|
|
98
|
+
}
|
|
99
|
+
/** One-line explanation of a state, for human output. */
|
|
100
|
+
const ACCESS_STATE_LABELS = {
|
|
101
|
+
"no-api-key-exists": "No API key exists — create one with: axtrabase keys create --name <name>",
|
|
102
|
+
"no-api-key-supplied": "Not evaluated — re-run with --api-key <id> to resolve access",
|
|
103
|
+
unresolved: "Could not be resolved by the server",
|
|
104
|
+
denied: "Denied for this API key",
|
|
105
|
+
granted: "Granted"
|
|
106
|
+
};
|
|
52
107
|
export function registerContextCommand(program) {
|
|
53
108
|
program
|
|
54
109
|
.command("context")
|
|
@@ -79,11 +134,22 @@ async function runContext(options) {
|
|
|
79
134
|
project: data.project,
|
|
80
135
|
organisation: data.organisation,
|
|
81
136
|
connection: data.connection,
|
|
82
|
-
|
|
137
|
+
// Each table carries an explicit accessState so `access: null` is never
|
|
138
|
+
// the only thing an agent has to reason from (Sprint #11 P1-11).
|
|
139
|
+
tables: data.tables.map((table) => ({
|
|
140
|
+
...table,
|
|
141
|
+
accessState: classifyTableAccess({
|
|
142
|
+
access: table.access,
|
|
143
|
+
apiKeyGiven: Boolean(options.apiKey),
|
|
144
|
+
keysExist: data.apiKeys.length > 0
|
|
145
|
+
})
|
|
146
|
+
})),
|
|
147
|
+
accessStates: ACCESS_STATE_LABELS,
|
|
83
148
|
tableCounts: data.tableCounts,
|
|
84
149
|
tablesUnavailableReason: data.tablesUnavailableReason,
|
|
85
150
|
apiKeys: data.apiKeys.map((key) => ({ id: key.id, name: key.name, prefix: key.prefix })),
|
|
86
151
|
metadataCapabilities: data.metadataCapabilities,
|
|
152
|
+
dataPlane: DATA_PLANE_AGENT_INFO,
|
|
87
153
|
events: EVENTS_AGENT_INFO
|
|
88
154
|
});
|
|
89
155
|
return;
|
|
@@ -111,9 +177,13 @@ function printHumanContext(data, apiUrl, apiKeyGiven) {
|
|
|
111
177
|
else if (data.tables.length > 0) {
|
|
112
178
|
printLine();
|
|
113
179
|
if (apiKeyGiven) {
|
|
180
|
+
const stateOf = (t) => classifyTableAccess({ access: t.access, apiKeyGiven: true, keysExist: true });
|
|
114
181
|
const writable = data.tables.filter((t) => t.access && /[CUD]/.test(t.access));
|
|
115
182
|
const readOnly = data.tables.filter((t) => t.access === "R---");
|
|
116
|
-
|
|
183
|
+
// Denied and not-evaluated are listed separately: one is a permissions
|
|
184
|
+
// problem, the other is a missing credential.
|
|
185
|
+
const denied = data.tables.filter((t) => stateOf(t) === "denied");
|
|
186
|
+
const unresolved = data.tables.filter((t) => stateOf(t) === "unresolved");
|
|
117
187
|
if (writable.length > 0) {
|
|
118
188
|
printLine("Writable tables:");
|
|
119
189
|
for (const t of writable)
|
|
@@ -125,10 +195,16 @@ function printHumanContext(data, apiUrl, apiKeyGiven) {
|
|
|
125
195
|
for (const t of readOnly)
|
|
126
196
|
printLine(`- ${t.displayName} ${t.access}`);
|
|
127
197
|
}
|
|
128
|
-
if (
|
|
198
|
+
if (denied.length > 0) {
|
|
199
|
+
printLine();
|
|
200
|
+
printLine("Access denied for this API key:");
|
|
201
|
+
for (const t of denied)
|
|
202
|
+
printLine(`- ${t.displayName}`);
|
|
203
|
+
}
|
|
204
|
+
if (unresolved.length > 0) {
|
|
129
205
|
printLine();
|
|
130
|
-
printLine("
|
|
131
|
-
for (const t of
|
|
206
|
+
printLine("Access could not be resolved:");
|
|
207
|
+
for (const t of unresolved)
|
|
132
208
|
printLine(`- ${t.displayName}`);
|
|
133
209
|
}
|
|
134
210
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAW1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,2aAA2a;IAC3a,wKAAwK;IACxK,gGAAgG;IAChG,mIAAmI;IACnI,wLAAwL;IACxL,2LAA2L;IAC3L,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/keys.js
CHANGED
|
@@ -79,6 +79,22 @@ async function runCreate(options) {
|
|
|
79
79
|
["Prefix", data.prefix],
|
|
80
80
|
["ID", data.id]
|
|
81
81
|
]);
|
|
82
|
+
// A new key can do nothing until table access is granted, and the point at
|
|
83
|
+
// which someone holds a raw key is exactly when they need to know what it
|
|
84
|
+
// is for and how to take it back. Saying so here is what makes the
|
|
85
|
+
// human-to-agent handoff followable without guessing (Sprint #11 P1-12).
|
|
86
|
+
printLine();
|
|
87
|
+
printLine("This key is DATA PLANE only — records and events. It cannot read or");
|
|
88
|
+
printLine("change projects, schema, or permissions, and it is not your CLI token.");
|
|
89
|
+
printLine();
|
|
90
|
+
printLine("It currently has NO table access. Grant it read access to the tables you");
|
|
91
|
+
printLine("want readable, in the dashboard, before handing it to anyone.");
|
|
92
|
+
printLine();
|
|
93
|
+
printLine("To hand it to a coding agent or CI job:");
|
|
94
|
+
printLine(` export AXTRABASE_API_KEY=${data.prefix}...`);
|
|
95
|
+
printLine();
|
|
96
|
+
printLine("When they are done with it:");
|
|
97
|
+
printLine(` axtrabase keys revoke ${data.id}`);
|
|
82
98
|
}
|
|
83
99
|
async function runRevoke(id, options) {
|
|
84
100
|
const client = requireControlPlaneClient({ apiUrl: options.apiUrl });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"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"}
|