@polardbx/pxbaas 0.0.0-stage → 0.1.0-beta.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 (264) hide show
  1. package/bin/pxbaas.js +13 -0
  2. package/dist/app/preflight.d.ts +38 -0
  3. package/dist/app/preflight.d.ts.map +1 -0
  4. package/dist/app/preflight.js +79 -0
  5. package/dist/app/preflight.js.map +1 -0
  6. package/dist/app/spec-lint.d.ts +45 -0
  7. package/dist/app/spec-lint.d.ts.map +1 -0
  8. package/dist/app/spec-lint.js +407 -0
  9. package/dist/app/spec-lint.js.map +1 -0
  10. package/dist/app/templates.d.ts +143 -0
  11. package/dist/app/templates.d.ts.map +1 -0
  12. package/dist/app/templates.js +151 -0
  13. package/dist/app/templates.js.map +1 -0
  14. package/dist/cli/root.d.ts +3 -0
  15. package/dist/cli/root.d.ts.map +1 -0
  16. package/dist/cli/root.js +69 -0
  17. package/dist/cli/root.js.map +1 -0
  18. package/dist/commands/app/index.d.ts +8 -0
  19. package/dist/commands/app/index.d.ts.map +1 -0
  20. package/dist/commands/app/index.js +1267 -0
  21. package/dist/commands/app/index.js.map +1 -0
  22. package/dist/commands/auth/index.d.ts +3 -0
  23. package/dist/commands/auth/index.d.ts.map +1 -0
  24. package/dist/commands/auth/index.js +198 -0
  25. package/dist/commands/auth/index.js.map +1 -0
  26. package/dist/commands/completion/index.d.ts +3 -0
  27. package/dist/commands/completion/index.d.ts.map +1 -0
  28. package/dist/commands/completion/index.js +10 -0
  29. package/dist/commands/completion/index.js.map +1 -0
  30. package/dist/commands/data/index.d.ts +3 -0
  31. package/dist/commands/data/index.d.ts.map +1 -0
  32. package/dist/commands/data/index.js +245 -0
  33. package/dist/commands/data/index.js.map +1 -0
  34. package/dist/commands/db/index.d.ts +14 -0
  35. package/dist/commands/db/index.d.ts.map +1 -0
  36. package/dist/commands/db/index.js +355 -0
  37. package/dist/commands/db/index.js.map +1 -0
  38. package/dist/commands/doctor/index.d.ts +3 -0
  39. package/dist/commands/doctor/index.d.ts.map +1 -0
  40. package/dist/commands/doctor/index.js +305 -0
  41. package/dist/commands/doctor/index.js.map +1 -0
  42. package/dist/commands/functions/delete.d.ts +3 -0
  43. package/dist/commands/functions/delete.d.ts.map +1 -0
  44. package/dist/commands/functions/delete.js +55 -0
  45. package/dist/commands/functions/delete.js.map +1 -0
  46. package/dist/commands/functions/deploy.d.ts +3 -0
  47. package/dist/commands/functions/deploy.d.ts.map +1 -0
  48. package/dist/commands/functions/deploy.js +118 -0
  49. package/dist/commands/functions/deploy.js.map +1 -0
  50. package/dist/commands/functions/index.d.ts +3 -0
  51. package/dist/commands/functions/index.d.ts.map +1 -0
  52. package/dist/commands/functions/index.js +15 -0
  53. package/dist/commands/functions/index.js.map +1 -0
  54. package/dist/commands/functions/list.d.ts +6 -0
  55. package/dist/commands/functions/list.d.ts.map +1 -0
  56. package/dist/commands/functions/list.js +63 -0
  57. package/dist/commands/functions/list.js.map +1 -0
  58. package/dist/commands/functions/new.d.ts +3 -0
  59. package/dist/commands/functions/new.d.ts.map +1 -0
  60. package/dist/commands/functions/new.js +57 -0
  61. package/dist/commands/functions/new.js.map +1 -0
  62. package/dist/commands/gen/index.d.ts +3 -0
  63. package/dist/commands/gen/index.d.ts.map +1 -0
  64. package/dist/commands/gen/index.js +320 -0
  65. package/dist/commands/gen/index.js.map +1 -0
  66. package/dist/commands/instance/index.d.ts +8 -0
  67. package/dist/commands/instance/index.d.ts.map +1 -0
  68. package/dist/commands/instance/index.js +361 -0
  69. package/dist/commands/instance/index.js.map +1 -0
  70. package/dist/commands/login/index.d.ts +3 -0
  71. package/dist/commands/login/index.d.ts.map +1 -0
  72. package/dist/commands/login/index.js +185 -0
  73. package/dist/commands/login/index.js.map +1 -0
  74. package/dist/commands/login/login.d.ts +3 -0
  75. package/dist/commands/login/login.d.ts.map +1 -0
  76. package/dist/commands/login/login.js +185 -0
  77. package/dist/commands/login/login.js.map +1 -0
  78. package/dist/commands/logout/index.d.ts +3 -0
  79. package/dist/commands/logout/index.d.ts.map +1 -0
  80. package/dist/commands/logout/index.js +41 -0
  81. package/dist/commands/logout/index.js.map +1 -0
  82. package/dist/commands/profile/import-env.d.ts +13 -0
  83. package/dist/commands/profile/import-env.d.ts.map +1 -0
  84. package/dist/commands/profile/import-env.js +81 -0
  85. package/dist/commands/profile/import-env.js.map +1 -0
  86. package/dist/commands/profile/index.d.ts +3 -0
  87. package/dist/commands/profile/index.d.ts.map +1 -0
  88. package/dist/commands/profile/index.js +109 -0
  89. package/dist/commands/profile/index.js.map +1 -0
  90. package/dist/commands/rest/index.d.ts +3 -0
  91. package/dist/commands/rest/index.d.ts.map +1 -0
  92. package/dist/commands/rest/index.js +102 -0
  93. package/dist/commands/rest/index.js.map +1 -0
  94. package/dist/commands/skill/index.d.ts +11 -0
  95. package/dist/commands/skill/index.d.ts.map +1 -0
  96. package/dist/commands/skill/index.js +153 -0
  97. package/dist/commands/skill/index.js.map +1 -0
  98. package/dist/commands/status/index.d.ts +3 -0
  99. package/dist/commands/status/index.d.ts.map +1 -0
  100. package/dist/commands/status/index.js +59 -0
  101. package/dist/commands/status/index.js.map +1 -0
  102. package/dist/commands/storage/index.d.ts +3 -0
  103. package/dist/commands/storage/index.d.ts.map +1 -0
  104. package/dist/commands/storage/index.js +198 -0
  105. package/dist/commands/storage/index.js.map +1 -0
  106. package/dist/commands/whoami/index.d.ts +3 -0
  107. package/dist/commands/whoami/index.d.ts.map +1 -0
  108. package/dist/commands/whoami/index.js +82 -0
  109. package/dist/commands/whoami/index.js.map +1 -0
  110. package/dist/credentials/commit.d.ts +38 -0
  111. package/dist/credentials/commit.d.ts.map +1 -0
  112. package/dist/credentials/commit.js +57 -0
  113. package/dist/credentials/commit.js.map +1 -0
  114. package/dist/credentials/credential-store.d.ts +57 -0
  115. package/dist/credentials/credential-store.d.ts.map +1 -0
  116. package/dist/credentials/credential-store.js +180 -0
  117. package/dist/credentials/credential-store.js.map +1 -0
  118. package/dist/credentials/env-file.d.ts +44 -0
  119. package/dist/credentials/env-file.d.ts.map +1 -0
  120. package/dist/credentials/env-file.js +118 -0
  121. package/dist/credentials/env-file.js.map +1 -0
  122. package/dist/credentials/formatter.d.ts +39 -0
  123. package/dist/credentials/formatter.d.ts.map +1 -0
  124. package/dist/credentials/formatter.js +79 -0
  125. package/dist/credentials/formatter.js.map +1 -0
  126. package/dist/credentials/index.d.ts +11 -0
  127. package/dist/credentials/index.d.ts.map +1 -0
  128. package/dist/credentials/index.js +11 -0
  129. package/dist/credentials/index.js.map +1 -0
  130. package/dist/credentials/jwt-introspect.d.ts +32 -0
  131. package/dist/credentials/jwt-introspect.d.ts.map +1 -0
  132. package/dist/credentials/jwt-introspect.js +64 -0
  133. package/dist/credentials/jwt-introspect.js.map +1 -0
  134. package/dist/credentials/masker.d.ts +20 -0
  135. package/dist/credentials/masker.d.ts.map +1 -0
  136. package/dist/credentials/masker.js +37 -0
  137. package/dist/credentials/masker.js.map +1 -0
  138. package/dist/credentials/profile.d.ts +83 -0
  139. package/dist/credentials/profile.d.ts.map +1 -0
  140. package/dist/credentials/profile.js +184 -0
  141. package/dist/credentials/profile.js.map +1 -0
  142. package/dist/credentials/tenant-guard.d.ts +16 -0
  143. package/dist/credentials/tenant-guard.d.ts.map +1 -0
  144. package/dist/credentials/tenant-guard.js +53 -0
  145. package/dist/credentials/tenant-guard.js.map +1 -0
  146. package/dist/credentials/tty-guard.d.ts +19 -0
  147. package/dist/credentials/tty-guard.d.ts.map +1 -0
  148. package/dist/credentials/tty-guard.js +47 -0
  149. package/dist/credentials/tty-guard.js.map +1 -0
  150. package/dist/db/apply-schema.d.ts +57 -0
  151. package/dist/db/apply-schema.d.ts.map +1 -0
  152. package/dist/db/apply-schema.js +192 -0
  153. package/dist/db/apply-schema.js.map +1 -0
  154. package/dist/db/sql-file.d.ts +49 -0
  155. package/dist/db/sql-file.d.ts.map +1 -0
  156. package/dist/db/sql-file.js +167 -0
  157. package/dist/db/sql-file.js.map +1 -0
  158. package/dist/instance/provision.d.ts +89 -0
  159. package/dist/instance/provision.d.ts.map +1 -0
  160. package/dist/instance/provision.js +139 -0
  161. package/dist/instance/provision.js.map +1 -0
  162. package/dist/instance/zero-store.d.ts +47 -0
  163. package/dist/instance/zero-store.d.ts.map +1 -0
  164. package/dist/instance/zero-store.js +91 -0
  165. package/dist/instance/zero-store.js.map +1 -0
  166. package/dist/main.d.ts +3 -0
  167. package/dist/main.d.ts.map +1 -0
  168. package/dist/main.js +46 -0
  169. package/dist/main.js.map +1 -0
  170. package/dist/skill/assets.d.ts +38 -0
  171. package/dist/skill/assets.d.ts.map +1 -0
  172. package/dist/skill/assets.js +111 -0
  173. package/dist/skill/assets.js.map +1 -0
  174. package/dist/skill/hint.d.ts +39 -0
  175. package/dist/skill/hint.d.ts.map +1 -0
  176. package/dist/skill/hint.js +109 -0
  177. package/dist/skill/hint.js.map +1 -0
  178. package/dist/skill/hosts.d.ts +21 -0
  179. package/dist/skill/hosts.d.ts.map +1 -0
  180. package/dist/skill/hosts.js +38 -0
  181. package/dist/skill/hosts.js.map +1 -0
  182. package/dist/skill/installer.d.ts +88 -0
  183. package/dist/skill/installer.d.ts.map +1 -0
  184. package/dist/skill/installer.js +203 -0
  185. package/dist/skill/installer.js.map +1 -0
  186. package/dist/skill/ownership.d.ts +35 -0
  187. package/dist/skill/ownership.d.ts.map +1 -0
  188. package/dist/skill/ownership.js +52 -0
  189. package/dist/skill/ownership.js.map +1 -0
  190. package/package.json +63 -3
  191. package/skills/pxbaas-app-spec/SKILL.md +163 -0
  192. package/skills/pxbaas-app-spec/references/deploy-options.md +157 -0
  193. package/skills/pxbaas-app-spec/references/guardrails-pitfalls.md +89 -0
  194. package/skills/pxbaas-app-spec/references/runtime-contract.md +151 -0
  195. package/skills/pxbaas-app-spec/references/ssr-session.md +121 -0
  196. package/skills/pxbaas-app-spec/references/templates-examples.md +308 -0
  197. package/skills/pxbaas-cli/SKILL.md +168 -0
  198. package/skills/pxbaas-cli/references/api-reference.md +68 -0
  199. package/skills/pxbaas-cli/references/app-deploy.md +143 -0
  200. package/skills/pxbaas-cli/references/auth-and-credentials.md +88 -0
  201. package/skills/pxbaas-cli/references/data-postgrest.md +85 -0
  202. package/skills/pxbaas-cli/references/db-and-meta.md +85 -0
  203. package/skills/pxbaas-cli/references/edge-functions.md +71 -0
  204. package/skills/pxbaas-cli/references/multi-tenant-apps.md +107 -0
  205. package/skills/pxbaas-cli/references/provision.md +86 -0
  206. package/skills/pxbaas-cli/references/safety-and-two-phase.md +49 -0
  207. package/skills/pxbaas-cli/references/storage.md +61 -0
  208. package/skills/pxbaas-cli/references/troubleshooting.md +73 -0
  209. package/templates/webapp/api/index.ts +55 -0
  210. package/templates/webapp/csr-bff/README.md +81 -0
  211. package/templates/webapp/csr-bff/backend/index.ts +168 -0
  212. package/templates/webapp/csr-bff/db/schema.sql +69 -0
  213. package/templates/webapp/csr-bff/frontend/dist/admin.html +101 -0
  214. package/templates/webapp/csr-bff/frontend/dist/article.html +44 -0
  215. package/templates/webapp/csr-bff/frontend/dist/blog.js +206 -0
  216. package/templates/webapp/csr-bff/frontend/dist/blogger.html +53 -0
  217. package/templates/webapp/csr-bff/frontend/dist/index.html +70 -0
  218. package/templates/webapp/csr-bff/frontend/dist/login.html +56 -0
  219. package/templates/webapp/csr-bff/frontend/dist/profile.html +59 -0
  220. package/templates/webapp/csr-bff/frontend/dist/signup.html +78 -0
  221. package/templates/webapp/csr-bff/frontend/dist/style.css +27 -0
  222. package/templates/webapp/manifest.json +296 -0
  223. package/templates/webapp/mpa/about.html +29 -0
  224. package/templates/webapp/mpa/app.js +42 -0
  225. package/templates/webapp/mpa/index.html +42 -0
  226. package/templates/webapp/mpa/index.ts +60 -0
  227. package/templates/webapp/mpa/style.css +42 -0
  228. package/templates/webapp/react-vite/frontend/index.html +12 -0
  229. package/templates/webapp/react-vite/frontend/package-lock.json +1826 -0
  230. package/templates/webapp/react-vite/frontend/package.json +23 -0
  231. package/templates/webapp/react-vite/frontend/src/App.tsx +34 -0
  232. package/templates/webapp/react-vite/frontend/src/main.tsx +13 -0
  233. package/templates/webapp/react-vite/frontend/src/style.css +46 -0
  234. package/templates/webapp/react-vite/frontend/tsconfig.json +20 -0
  235. package/templates/webapp/react-vite/frontend/vite.config.ts +10 -0
  236. package/templates/webapp/react-vite-hono/backend/index.ts +21 -0
  237. package/templates/webapp/react-vite-hono/frontend/index.html +12 -0
  238. package/templates/webapp/react-vite-hono/frontend/package-lock.json +1826 -0
  239. package/templates/webapp/react-vite-hono/frontend/package.json +23 -0
  240. package/templates/webapp/react-vite-hono/frontend/src/App.tsx +47 -0
  241. package/templates/webapp/react-vite-hono/frontend/src/main.tsx +13 -0
  242. package/templates/webapp/react-vite-hono/frontend/src/style.css +66 -0
  243. package/templates/webapp/react-vite-hono/frontend/tsconfig.json +20 -0
  244. package/templates/webapp/react-vite-hono/frontend/vite.config.ts +10 -0
  245. package/templates/webapp/spa/index.ts +119 -0
  246. package/templates/webapp/ssr-auth/backend/index.ts +133 -0
  247. package/templates/webapp/ssr-auth/frontend/dist/index.html +15 -0
  248. package/templates/webapp/ssr-blog/README.md +111 -0
  249. package/templates/webapp/ssr-blog/backend/index.ts +764 -0
  250. package/templates/webapp/ssr-blog/db/schema.sql +71 -0
  251. package/templates/webapp/ssr-blog/frontend/dist/index.html +39 -0
  252. package/templates/webapp/ssr-frameworks/README.md +64 -0
  253. package/templates/webapp/ssr-frameworks/backend/index.ts +241 -0
  254. package/templates/webapp/ssr-frameworks/frontend/dist/index.html +31 -0
  255. package/templates/webapp/ssr-hono/backend/index.ts +92 -0
  256. package/templates/webapp/ssr-hono/frontend/dist/index.html +12 -0
  257. package/templates/webapp/ssr-shop/README.md +80 -0
  258. package/templates/webapp/ssr-shop/backend/index.ts +491 -0
  259. package/templates/webapp/ssr-shop/db/schema.sql +120 -0
  260. package/templates/webapp/ssr-shop/frontend/dist/index.html +12 -0
  261. package/templates/webapp/vanilla-static/frontend/app.js +6 -0
  262. package/templates/webapp/vanilla-static/frontend/index.html +19 -0
  263. package/templates/webapp/vanilla-static/frontend/style.css +43 -0
  264. package/README.md +0 -3
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Provisioning core logic — claim a Zero PXBaas instance and bind it to a baas
3
+ * profile. Kept separate from the commander wiring and driven by narrow
4
+ * interfaces so it is unit-testable with fakes (no keytar / no network).
5
+ *
6
+ * Security model: Zero returns plaintext keys over TLS; this module ingests them
7
+ * into the credential sink (keyring) and NEVER returns plaintext — only
8
+ * fingerprints. Agents can run this without a human TTY login.
9
+ */
10
+ import { computeFingerprint } from '../credentials/masker.js';
11
+ import { ZeroDriver } from '@polardbx/pxbaas-client';
12
+ function profileNameFor(id, explicit) {
13
+ if (explicit)
14
+ return explicit;
15
+ const suffix = id.replace(/[^a-zA-Z0-9]/g, '').slice(-6) || id.slice(-6);
16
+ return `zero-${suffix}`;
17
+ }
18
+ /** Claim (or reuse) a Zero instance and bind it to a profile + credentials. */
19
+ export async function provisionInstance(deps, options = {}) {
20
+ const switchProfile = options.switchProfile !== false;
21
+ // Reuse path: bind the most recent active local instance instead of claiming.
22
+ if (options.reuse) {
23
+ const active = await deps.store.listActive();
24
+ const recent = active[active.length - 1];
25
+ if (recent) {
26
+ const existing = await deps.creds.getCredentials(recent.profileName);
27
+ if (existing) {
28
+ const switchedFrom = switchProfile ? (await deps.profiles.getCurrentProfile())?.name ?? null : null;
29
+ if (switchProfile)
30
+ await deps.profiles.useProfile(recent.profileName);
31
+ return {
32
+ reused: true,
33
+ profileName: recent.profileName,
34
+ switchedFrom,
35
+ instance: {
36
+ id: recent.id,
37
+ endpoint: recent.endpoint,
38
+ appEndpoint: recent.appEndpoint,
39
+ dashboardUrl: recent.dashboardUrl,
40
+ whitelistIp: recent.whitelistIp,
41
+ expiresAt: recent.expiresAt,
42
+ mode: 'single-tenant',
43
+ },
44
+ keys: {
45
+ anon: { fingerprint: computeFingerprint(existing.anonKey), role: 'anon' },
46
+ serviceRole: { fingerprint: computeFingerprint(existing.serviceRoleKey), role: 'service_role' },
47
+ },
48
+ dashboard: { username: 'supabase', passwordRevealed: false },
49
+ };
50
+ }
51
+ }
52
+ // no reusable instance → fall through to claim
53
+ }
54
+ const claimed = await deps.zero.claim(options.whitelistIp);
55
+ const inst = claimed.instance;
56
+ const endpoint = ZeroDriver.toEndpoint(inst);
57
+ const name = profileNameFor(inst.id, options.name);
58
+ // Fail-closed on name collision unless forced.
59
+ const existingProfile = await deps.profiles.getProfile(name);
60
+ if (existingProfile && !options.force) {
61
+ throw new Error(`Profile '${name}' already exists. Choose another with --name, or pass --force to overwrite.`);
62
+ }
63
+ const switchedFrom = switchProfile ? (await deps.profiles.getCurrentProfile())?.name ?? null : null;
64
+ const now = new Date().toISOString();
65
+ const profile = {
66
+ name,
67
+ endpoint,
68
+ appEndpoint: inst.appEndpoint,
69
+ mode: 'single-tenant',
70
+ source: 'zero',
71
+ zeroInstanceId: inst.id,
72
+ expiresAt: inst.expiresAt,
73
+ createdAt: existingProfile?.createdAt ?? now,
74
+ updatedAt: now,
75
+ };
76
+ await deps.profiles.setProfile(profile);
77
+ await deps.creds.setCredentials(name, {
78
+ anonKey: inst.apiKey,
79
+ serviceRoleKey: inst.serviceRoleKey,
80
+ storedAt: now,
81
+ });
82
+ const record = {
83
+ id: inst.id,
84
+ endpoint,
85
+ appEndpoint: inst.appEndpoint,
86
+ profileName: name,
87
+ token: claimed.token,
88
+ expiresAt: inst.expiresAt,
89
+ dashboardUrl: inst.dashboardUrl,
90
+ whitelistIp: inst.whitelistIp,
91
+ dashboardPassword: inst.dashboardPassword,
92
+ dbPassword: inst.dbPassword,
93
+ claimedAt: now,
94
+ };
95
+ await deps.store.addInstance(record);
96
+ if (switchProfile)
97
+ await deps.profiles.useProfile(name);
98
+ return {
99
+ reused: false,
100
+ profileName: name,
101
+ switchedFrom,
102
+ instance: {
103
+ id: inst.id,
104
+ endpoint,
105
+ dashboardUrl: inst.dashboardUrl,
106
+ region: inst.region,
107
+ whitelistIp: inst.whitelistIp,
108
+ expiresAt: inst.expiresAt,
109
+ mode: 'single-tenant',
110
+ },
111
+ keys: {
112
+ anon: { fingerprint: computeFingerprint(inst.apiKey), role: 'anon' },
113
+ serviceRole: { fingerprint: computeFingerprint(inst.serviceRoleKey), role: 'service_role' },
114
+ },
115
+ dashboard: { username: 'supabase', passwordRevealed: false },
116
+ };
117
+ }
118
+ /** Release a Zero instance and unbind/remove its local profile. */
119
+ export async function releaseInstance(deps, id, opts = {}) {
120
+ const removeProfile = opts.removeProfile !== false;
121
+ const rec = await deps.store.getInstance(id);
122
+ const token = rec?.token ?? (await deps.store.getToken());
123
+ if (!token) {
124
+ throw new Error('No Zero ownership token found locally; cannot release. Did you provision from this machine?');
125
+ }
126
+ await deps.zero.release(id, token);
127
+ await deps.store.removeInstance(id);
128
+ let profileRemoved = null;
129
+ let wasCurrent = false;
130
+ if (rec && removeProfile) {
131
+ const current = await deps.profiles.getCurrentProfile();
132
+ wasCurrent = current?.name === rec.profileName;
133
+ await deps.creds.deleteCredentials(rec.profileName);
134
+ await deps.profiles.removeProfile(rec.profileName);
135
+ profileRemoved = rec.profileName;
136
+ }
137
+ return { id, released: true, profileRemoved, wasCurrent };
138
+ }
139
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/instance/provision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Zero store — persists PolarDB-X Zero ownership token and claimed-instance
3
+ * bindings under `~/.baas/zero.json` (mode 0600).
4
+ *
5
+ * Because PXBaas has NO credentials re-read endpoint (unlike PXFuse), the keys
6
+ * returned at claim time must be durably stored here (and in the keyring via
7
+ * CredentialStore). `instance list` cannot fetch keys back from Zero.
8
+ */
9
+ export interface ZeroInstanceRecord {
10
+ id: string;
11
+ endpoint: string;
12
+ appEndpoint?: string;
13
+ profileName: string;
14
+ token: string;
15
+ expiresAt?: string;
16
+ dashboardUrl?: string;
17
+ whitelistIp?: string;
18
+ /** Sensitive; stored 0600, never printed except via `instance credentials --reveal`. */
19
+ dashboardPassword?: string;
20
+ dbPassword?: string;
21
+ claimedAt: string;
22
+ }
23
+ interface ZeroStoreFile {
24
+ version: 1;
25
+ token: string;
26
+ instances: ZeroInstanceRecord[];
27
+ }
28
+ export declare class ZeroStore {
29
+ private homeDir;
30
+ private cache;
31
+ constructor(homeDir?: string);
32
+ private filePath;
33
+ load(): Promise<ZeroStoreFile>;
34
+ private save;
35
+ /** Latest ownership token (empty string when never provisioned). */
36
+ getToken(): Promise<string>;
37
+ /** Upsert an instance record by id and refresh the top-level token. */
38
+ addInstance(record: ZeroInstanceRecord): Promise<void>;
39
+ getInstance(id: string): Promise<ZeroInstanceRecord | null>;
40
+ findInstanceByProfile(profileName: string): Promise<ZeroInstanceRecord | null>;
41
+ listInstances(): Promise<ZeroInstanceRecord[]>;
42
+ /** Instances whose expiresAt is in the future (or unknown). */
43
+ listActive(now?: Date): Promise<ZeroInstanceRecord[]>;
44
+ removeInstance(id: string): Promise<boolean>;
45
+ }
46
+ export {};
47
+ //# sourceMappingURL=zero-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zero-store.d.ts","sourceRoot":"","sources":["../../src/instance/zero-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAA8B;gBAE/B,OAAO,CAAC,EAAE,MAAM;IAI5B,OAAO,CAAC,QAAQ;IAIV,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;YAiBtB,IAAI;IAQlB,oEAAoE;IAC9D,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAKjC,uEAAuE;IACjE,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAK3D,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAK9E,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAKpD,+DAA+D;IACzD,UAAU,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAKjE,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQnD"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Zero store — persists PolarDB-X Zero ownership token and claimed-instance
3
+ * bindings under `~/.baas/zero.json` (mode 0600).
4
+ *
5
+ * Because PXBaas has NO credentials re-read endpoint (unlike PXFuse), the keys
6
+ * returned at claim time must be durably stored here (and in the keyring via
7
+ * CredentialStore). `instance list` cannot fetch keys back from Zero.
8
+ */
9
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
10
+ import { existsSync } from 'node:fs';
11
+ import { homedir } from 'node:os';
12
+ import { join } from 'node:path';
13
+ export class ZeroStore {
14
+ homeDir;
15
+ cache = null;
16
+ constructor(homeDir) {
17
+ this.homeDir = homeDir ?? join(homedir(), '.baas');
18
+ }
19
+ filePath() {
20
+ return join(this.homeDir, 'zero.json');
21
+ }
22
+ async load() {
23
+ if (this.cache)
24
+ return this.cache;
25
+ const p = this.filePath();
26
+ if (!existsSync(p)) {
27
+ this.cache = { version: 1, token: '', instances: [] };
28
+ return this.cache;
29
+ }
30
+ try {
31
+ const data = JSON.parse(await readFile(p, 'utf-8'));
32
+ if (data.version !== 1)
33
+ throw new Error(`Unsupported zero.json version: ${data.version}`);
34
+ this.cache = { version: 1, token: data.token ?? '', instances: data.instances ?? [] };
35
+ return this.cache;
36
+ }
37
+ catch (err) {
38
+ throw new Error(`Failed to read zero.json: ${err instanceof Error ? err.message : String(err)}`);
39
+ }
40
+ }
41
+ async save(state) {
42
+ if (!existsSync(this.homeDir)) {
43
+ await mkdir(this.homeDir, { mode: 0o700, recursive: true });
44
+ }
45
+ await writeFile(this.filePath(), JSON.stringify(state, null, 2) + '\n', { mode: 0o600 });
46
+ this.cache = state;
47
+ }
48
+ /** Latest ownership token (empty string when never provisioned). */
49
+ async getToken() {
50
+ const s = await this.load();
51
+ return s.token;
52
+ }
53
+ /** Upsert an instance record by id and refresh the top-level token. */
54
+ async addInstance(record) {
55
+ const s = await this.load();
56
+ const idx = s.instances.findIndex((i) => i.id === record.id);
57
+ if (idx >= 0)
58
+ s.instances[idx] = record;
59
+ else
60
+ s.instances.push(record);
61
+ s.token = record.token || s.token;
62
+ await this.save(s);
63
+ }
64
+ async getInstance(id) {
65
+ const s = await this.load();
66
+ return s.instances.find((i) => i.id === id) ?? null;
67
+ }
68
+ async findInstanceByProfile(profileName) {
69
+ const s = await this.load();
70
+ return s.instances.find((i) => i.profileName === profileName) ?? null;
71
+ }
72
+ async listInstances() {
73
+ const s = await this.load();
74
+ return [...s.instances];
75
+ }
76
+ /** Instances whose expiresAt is in the future (or unknown). */
77
+ async listActive(now = new Date()) {
78
+ const s = await this.load();
79
+ return s.instances.filter((i) => !i.expiresAt || new Date(i.expiresAt).getTime() > now.getTime());
80
+ }
81
+ async removeInstance(id) {
82
+ const s = await this.load();
83
+ const before = s.instances.length;
84
+ s.instances = s.instances.filter((i) => i.id !== id);
85
+ if (s.instances.length === before)
86
+ return false;
87
+ await this.save(s);
88
+ return true;
89
+ }
90
+ }
91
+ //# sourceMappingURL=zero-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zero-store.js","sourceRoot":"","sources":["../../src/instance/zero-store.ts"],"names":[],"mappings":"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"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
package/dist/main.js ADDED
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ import { program } from 'commander';
3
+ import { registerCommands } from './cli/root.js';
4
+ import { ProfileManager, setCliProfileOverrideGlobal } from './credentials/profile.js';
5
+ // Global options
6
+ program
7
+ .name('pxbaas')
8
+ .description('PolarDB-X BaaS CLI')
9
+ .version('0.0.0-dev')
10
+ .option('--json', 'Output in JSON format')
11
+ .option('--profile <name>', 'Use specific profile')
12
+ .option('--debug', 'Enable debug output');
13
+ // Register all commands
14
+ registerCommands(program);
15
+ // `--profile` is a program-level option, so commander only parses it when given
16
+ // BEFORE the subcommand (`pxbaas --profile x app list`). Every command resolves
17
+ // credentials through ProfileManager.getCurrentProfile(), which used to make a
18
+ // trailing `--profile` a silent no-op — the command then ran against whatever
19
+ // profile happened to be current, i.e. a cross-instance write hazard.
20
+ // Declare it on every (sub)command as well so both positions work.
21
+ const declareProfileOption = (cmd) => {
22
+ if (!cmd.options.some((o) => o.long === '--profile')) {
23
+ cmd.option('--profile <name>', 'Use specific profile');
24
+ }
25
+ cmd.commands.forEach(declareProfileOption);
26
+ };
27
+ declareProfileOption(program);
28
+ // Resolve --profile once, before any command runs: validate it exists (fail loudly
29
+ // instead of silently falling back to the current profile) and publish it as a
30
+ // process-wide override. Never persisted — `profile ls` current marker is untouched.
31
+ program.hook('preAction', async (_thisCommand, actionCommand) => {
32
+ const requested = (actionCommand.opts().profile ?? program.opts().profile);
33
+ if (!requested)
34
+ return;
35
+ const manager = new ProfileManager();
36
+ const known = await manager.listProfiles();
37
+ if (!known.some((p) => p.name === requested)) {
38
+ const names = known.map((p) => p.name).join(', ') || '(none)';
39
+ console.error(`✗ Unknown profile: '${requested}'. Available profiles: ${names}`);
40
+ process.exit(1);
41
+ }
42
+ setCliProfileOverrideGlobal(requested);
43
+ });
44
+ // Parse arguments
45
+ program.parse();
46
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAW,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEvF,iBAAiB;AACjB,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,oBAAoB,CAAC;KACjC,OAAO,CAAC,WAAW,CAAC;KACpB,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KACzC,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;KAClD,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;AAE5C,wBAAwB;AACxB,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAE1B,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,sEAAsE;AACtE,mEAAmE;AACnE,MAAM,oBAAoB,GAAG,CAAC,GAAY,EAAQ,EAAE;IAClD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;IACzD,CAAC;IACD,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAC7C,CAAC,CAAC;AACF,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE9B,mFAAmF;AACnF,+EAA+E;AAC/E,qFAAqF;AACrF,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE;IAC9D,MAAM,SAAS,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAE5D,CAAC;IACd,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;QAC9D,OAAO,CAAC,KAAK,CACX,uBAAuB,SAAS,0BAA0B,KAAK,EAAE,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,2BAA2B,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Locate the bundled Agent Skills at runtime.
3
+ *
4
+ * Distribution route A (ctxdb0-style): skills ship as package files under
5
+ * `apps/baas/skills/<skill>/` and `package.json#files` includes `skills`.
6
+ * We resolve the package root by walking up from this module until we find a
7
+ * `skills/` directory containing at least one `<skill>/SKILL.md`. This works for
8
+ * the compiled layout (`dist/skill/assets.js`) and for direct source execution.
9
+ *
10
+ * There can be MULTIPLE bundled skills (e.g. `pxbaas-cli`, `pxbaas-app-spec`);
11
+ * `pxbaas skill install` installs all of them by default.
12
+ *
13
+ * NOTE: the standalone single-file binary (`bun build --compile`) does not carry
14
+ * these files on disk; resolution then fails and callers surface a clear
15
+ * "requires the npm/source install" error.
16
+ */
17
+ /** Thrown when the bundled skills cannot be located (e.g. single-binary mode). */
18
+ export declare class SkillAssetsNotFoundError extends Error {
19
+ constructor(message: string);
20
+ }
21
+ /** Walk up from the current module to find the app package root (holds `skills/`). */
22
+ export declare function resolvePackageRoot(startDir?: string): string | null;
23
+ /** Absolute path to the bundled `skills/` directory. */
24
+ export declare function resolveSkillsRoot(startDir?: string): string;
25
+ /** Names of all bundled skills under a given `skills/` root (subdirs with a SKILL.md). */
26
+ export declare function listBundledSkillsIn(skillsRoot: string): Promise<string[]>;
27
+ /** Names of all bundled skills (subdirs of the resolved `skills/` that contain a SKILL.md). */
28
+ export declare function listBundledSkills(startDir?: string): Promise<string[]>;
29
+ /** Absolute path to one bundled skill directory. */
30
+ export declare function resolveSkillAssetDir(skillName: string, startDir?: string): string;
31
+ /** Read the CLI version from the resolved package.json (best-effort). */
32
+ export declare function readCliVersion(startDir?: string): Promise<string>;
33
+ /**
34
+ * Recursively list a skill's files as POSIX-style relative paths (e.g. `SKILL.md`,
35
+ * `references/db-and-meta.md`). Skips hidden files/dirs and `node_modules`.
36
+ */
37
+ export declare function listSkillFiles(assetDir: string): Promise<string[]>;
38
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/skill/assets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,kFAAkF;AAClF,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAUD,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,MAAoB,GAAG,MAAM,GAAG,IAAI,CAShF;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAoB,GAAG,MAAM,CAQxE;AAED,0FAA0F;AAC1F,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ/E;AAED,+FAA+F;AAC/F,wBAAsB,iBAAiB,CAAC,QAAQ,GAAE,MAAoB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEzF;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAoB,GAAG,MAAM,CAE9F;AAED,yEAAyE;AACzE,wBAAsB,cAAc,CAAC,QAAQ,GAAE,MAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CASpF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBxE"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Locate the bundled Agent Skills at runtime.
3
+ *
4
+ * Distribution route A (ctxdb0-style): skills ship as package files under
5
+ * `apps/baas/skills/<skill>/` and `package.json#files` includes `skills`.
6
+ * We resolve the package root by walking up from this module until we find a
7
+ * `skills/` directory containing at least one `<skill>/SKILL.md`. This works for
8
+ * the compiled layout (`dist/skill/assets.js`) and for direct source execution.
9
+ *
10
+ * There can be MULTIPLE bundled skills (e.g. `pxbaas-cli`, `pxbaas-app-spec`);
11
+ * `pxbaas skill install` installs all of them by default.
12
+ *
13
+ * NOTE: the standalone single-file binary (`bun build --compile`) does not carry
14
+ * these files on disk; resolution then fails and callers surface a clear
15
+ * "requires the npm/source install" error.
16
+ */
17
+ import { existsSync } from 'node:fs';
18
+ import { readFile, readdir } from 'node:fs/promises';
19
+ import { dirname, join, relative, sep } from 'node:path';
20
+ import { fileURLToPath } from 'node:url';
21
+ /** Thrown when the bundled skills cannot be located (e.g. single-binary mode). */
22
+ export class SkillAssetsNotFoundError extends Error {
23
+ constructor(message) {
24
+ super(message);
25
+ this.name = 'SkillAssetsNotFoundError';
26
+ }
27
+ }
28
+ function moduleDir() {
29
+ return dirname(fileURLToPath(import.meta.url));
30
+ }
31
+ function isSkillsRoot(dir) {
32
+ return existsSync(join(dir, 'skills')) && existsSync(join(dir, 'package.json'));
33
+ }
34
+ /** Walk up from the current module to find the app package root (holds `skills/`). */
35
+ export function resolvePackageRoot(startDir = moduleDir()) {
36
+ let dir = startDir;
37
+ for (let i = 0; i < 8; i++) {
38
+ if (isSkillsRoot(dir))
39
+ return dir;
40
+ const parent = dirname(dir);
41
+ if (parent === dir)
42
+ break;
43
+ dir = parent;
44
+ }
45
+ return null;
46
+ }
47
+ /** Absolute path to the bundled `skills/` directory. */
48
+ export function resolveSkillsRoot(startDir = moduleDir()) {
49
+ const root = resolvePackageRoot(startDir);
50
+ if (!root) {
51
+ throw new SkillAssetsNotFoundError('Bundled skills not found. `pxbaas skill install` requires the npm or source install (the standalone single-file binary does not bundle skill assets).');
52
+ }
53
+ return join(root, 'skills');
54
+ }
55
+ /** Names of all bundled skills under a given `skills/` root (subdirs with a SKILL.md). */
56
+ export async function listBundledSkillsIn(skillsRoot) {
57
+ const entries = await readdir(skillsRoot, { withFileTypes: true });
58
+ const names = [];
59
+ for (const e of entries) {
60
+ if (!e.isDirectory() || e.name.startsWith('.'))
61
+ continue;
62
+ if (existsSync(join(skillsRoot, e.name, 'SKILL.md')))
63
+ names.push(e.name);
64
+ }
65
+ return names.sort();
66
+ }
67
+ /** Names of all bundled skills (subdirs of the resolved `skills/` that contain a SKILL.md). */
68
+ export async function listBundledSkills(startDir = moduleDir()) {
69
+ return listBundledSkillsIn(resolveSkillsRoot(startDir));
70
+ }
71
+ /** Absolute path to one bundled skill directory. */
72
+ export function resolveSkillAssetDir(skillName, startDir = moduleDir()) {
73
+ return join(resolveSkillsRoot(startDir), skillName);
74
+ }
75
+ /** Read the CLI version from the resolved package.json (best-effort). */
76
+ export async function readCliVersion(startDir = moduleDir()) {
77
+ const root = resolvePackageRoot(startDir);
78
+ if (!root)
79
+ return 'unknown';
80
+ try {
81
+ const pkg = JSON.parse(await readFile(join(root, 'package.json'), 'utf8'));
82
+ return pkg.version ?? 'unknown';
83
+ }
84
+ catch {
85
+ return 'unknown';
86
+ }
87
+ }
88
+ /**
89
+ * Recursively list a skill's files as POSIX-style relative paths (e.g. `SKILL.md`,
90
+ * `references/db-and-meta.md`). Skips hidden files/dirs and `node_modules`.
91
+ */
92
+ export async function listSkillFiles(assetDir) {
93
+ const out = [];
94
+ async function walk(dir) {
95
+ const entries = await readdir(dir, { withFileTypes: true });
96
+ for (const entry of entries) {
97
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
98
+ continue;
99
+ const full = join(dir, entry.name);
100
+ if (entry.isDirectory()) {
101
+ await walk(full);
102
+ }
103
+ else if (entry.isFile()) {
104
+ out.push(relative(assetDir, full).split(sep).join('/'));
105
+ }
106
+ }
107
+ }
108
+ await walk(assetDir);
109
+ return out.sort();
110
+ }
111
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/skill/assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * First-run skill hint (option A).
3
+ *
4
+ * Nudges the user once — on any `pxbaas` command — that a bundled Agent Skill can
5
+ * be installed into a detected Agent host, so they discover `pxbaas skill install`
6
+ * without us silently writing into their agent config on npm install.
7
+ *
8
+ * Deliberately non-intrusive:
9
+ * - prints to **stderr** (never pollutes `--json` stdout that agents parse)
10
+ * - skipped when `--json`, when running any `skill` subcommand, when no host is
11
+ * detected, when the skill is already installed in a detected host, when the
12
+ * hint was shown before (state under ~/.baas), or when BAAS_NO_SKILL_HINT is set
13
+ * - never throws: a hint failure must not break the actual command
14
+ */
15
+ export interface SkillHintOptions {
16
+ /** Global --json flag; when true the hint is suppressed. */
17
+ json?: boolean;
18
+ /** $HOME override (defaults to os.homedir()). Injectable for tests. */
19
+ homeDir?: string;
20
+ /** Invoked command path, e.g. "db query" or "skill install". */
21
+ commandPath?: string;
22
+ /** Environment override (defaults to process.env). Injectable for tests. */
23
+ env?: NodeJS.ProcessEnv;
24
+ /** stderr writer override. Injectable for tests. */
25
+ stderr?: (line: string) => void;
26
+ }
27
+ /**
28
+ * Print the one-time skill hint when appropriate. Safe to call before any
29
+ * command action; resolves without side effects when suppressed.
30
+ */
31
+ export declare function maybePrintSkillHint(options?: SkillHintOptions): Promise<void>;
32
+ /**
33
+ * First-run hint shown when NO profile is configured yet: point the user to
34
+ * `pxbaas provision` (free 15-day Zero instance) or `pxbaas login` (own instance).
35
+ * Non-intrusive: stderr, once, skipped under --json / on onboarding commands /
36
+ * when a profile already exists / when BAAS_NO_PROVISION_HINT is set.
37
+ */
38
+ export declare function maybePrintProvisionHint(options?: SkillHintOptions): Promise<void>;
39
+ //# sourceMappingURL=hint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hint.d.ts","sourceRoot":"","sources":["../../src/skill/hint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,oDAAoD;IACpD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAQD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCvF;AAKD;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC3F"}