@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.
- package/bin/pxbaas.js +13 -0
- package/dist/app/preflight.d.ts +38 -0
- package/dist/app/preflight.d.ts.map +1 -0
- package/dist/app/preflight.js +79 -0
- package/dist/app/preflight.js.map +1 -0
- package/dist/app/spec-lint.d.ts +45 -0
- package/dist/app/spec-lint.d.ts.map +1 -0
- package/dist/app/spec-lint.js +407 -0
- package/dist/app/spec-lint.js.map +1 -0
- package/dist/app/templates.d.ts +143 -0
- package/dist/app/templates.d.ts.map +1 -0
- package/dist/app/templates.js +151 -0
- package/dist/app/templates.js.map +1 -0
- package/dist/cli/root.d.ts +3 -0
- package/dist/cli/root.d.ts.map +1 -0
- package/dist/cli/root.js +69 -0
- package/dist/cli/root.js.map +1 -0
- package/dist/commands/app/index.d.ts +8 -0
- package/dist/commands/app/index.d.ts.map +1 -0
- package/dist/commands/app/index.js +1267 -0
- package/dist/commands/app/index.js.map +1 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +198 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/completion/index.d.ts +3 -0
- package/dist/commands/completion/index.d.ts.map +1 -0
- package/dist/commands/completion/index.js +10 -0
- package/dist/commands/completion/index.js.map +1 -0
- package/dist/commands/data/index.d.ts +3 -0
- package/dist/commands/data/index.d.ts.map +1 -0
- package/dist/commands/data/index.js +245 -0
- package/dist/commands/data/index.js.map +1 -0
- package/dist/commands/db/index.d.ts +14 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +355 -0
- package/dist/commands/db/index.js.map +1 -0
- package/dist/commands/doctor/index.d.ts +3 -0
- package/dist/commands/doctor/index.d.ts.map +1 -0
- package/dist/commands/doctor/index.js +305 -0
- package/dist/commands/doctor/index.js.map +1 -0
- package/dist/commands/functions/delete.d.ts +3 -0
- package/dist/commands/functions/delete.d.ts.map +1 -0
- package/dist/commands/functions/delete.js +55 -0
- package/dist/commands/functions/delete.js.map +1 -0
- package/dist/commands/functions/deploy.d.ts +3 -0
- package/dist/commands/functions/deploy.d.ts.map +1 -0
- package/dist/commands/functions/deploy.js +118 -0
- package/dist/commands/functions/deploy.js.map +1 -0
- package/dist/commands/functions/index.d.ts +3 -0
- package/dist/commands/functions/index.d.ts.map +1 -0
- package/dist/commands/functions/index.js +15 -0
- package/dist/commands/functions/index.js.map +1 -0
- package/dist/commands/functions/list.d.ts +6 -0
- package/dist/commands/functions/list.d.ts.map +1 -0
- package/dist/commands/functions/list.js +63 -0
- package/dist/commands/functions/list.js.map +1 -0
- package/dist/commands/functions/new.d.ts +3 -0
- package/dist/commands/functions/new.d.ts.map +1 -0
- package/dist/commands/functions/new.js +57 -0
- package/dist/commands/functions/new.js.map +1 -0
- package/dist/commands/gen/index.d.ts +3 -0
- package/dist/commands/gen/index.d.ts.map +1 -0
- package/dist/commands/gen/index.js +320 -0
- package/dist/commands/gen/index.js.map +1 -0
- package/dist/commands/instance/index.d.ts +8 -0
- package/dist/commands/instance/index.d.ts.map +1 -0
- package/dist/commands/instance/index.js +361 -0
- package/dist/commands/instance/index.js.map +1 -0
- package/dist/commands/login/index.d.ts +3 -0
- package/dist/commands/login/index.d.ts.map +1 -0
- package/dist/commands/login/index.js +185 -0
- package/dist/commands/login/index.js.map +1 -0
- package/dist/commands/login/login.d.ts +3 -0
- package/dist/commands/login/login.d.ts.map +1 -0
- package/dist/commands/login/login.js +185 -0
- package/dist/commands/login/login.js.map +1 -0
- package/dist/commands/logout/index.d.ts +3 -0
- package/dist/commands/logout/index.d.ts.map +1 -0
- package/dist/commands/logout/index.js +41 -0
- package/dist/commands/logout/index.js.map +1 -0
- package/dist/commands/profile/import-env.d.ts +13 -0
- package/dist/commands/profile/import-env.d.ts.map +1 -0
- package/dist/commands/profile/import-env.js +81 -0
- package/dist/commands/profile/import-env.js.map +1 -0
- package/dist/commands/profile/index.d.ts +3 -0
- package/dist/commands/profile/index.d.ts.map +1 -0
- package/dist/commands/profile/index.js +109 -0
- package/dist/commands/profile/index.js.map +1 -0
- package/dist/commands/rest/index.d.ts +3 -0
- package/dist/commands/rest/index.d.ts.map +1 -0
- package/dist/commands/rest/index.js +102 -0
- package/dist/commands/rest/index.js.map +1 -0
- package/dist/commands/skill/index.d.ts +11 -0
- package/dist/commands/skill/index.d.ts.map +1 -0
- package/dist/commands/skill/index.js +153 -0
- package/dist/commands/skill/index.js.map +1 -0
- package/dist/commands/status/index.d.ts +3 -0
- package/dist/commands/status/index.d.ts.map +1 -0
- package/dist/commands/status/index.js +59 -0
- package/dist/commands/status/index.js.map +1 -0
- package/dist/commands/storage/index.d.ts +3 -0
- package/dist/commands/storage/index.d.ts.map +1 -0
- package/dist/commands/storage/index.js +198 -0
- package/dist/commands/storage/index.js.map +1 -0
- package/dist/commands/whoami/index.d.ts +3 -0
- package/dist/commands/whoami/index.d.ts.map +1 -0
- package/dist/commands/whoami/index.js +82 -0
- package/dist/commands/whoami/index.js.map +1 -0
- package/dist/credentials/commit.d.ts +38 -0
- package/dist/credentials/commit.d.ts.map +1 -0
- package/dist/credentials/commit.js +57 -0
- package/dist/credentials/commit.js.map +1 -0
- package/dist/credentials/credential-store.d.ts +57 -0
- package/dist/credentials/credential-store.d.ts.map +1 -0
- package/dist/credentials/credential-store.js +180 -0
- package/dist/credentials/credential-store.js.map +1 -0
- package/dist/credentials/env-file.d.ts +44 -0
- package/dist/credentials/env-file.d.ts.map +1 -0
- package/dist/credentials/env-file.js +118 -0
- package/dist/credentials/env-file.js.map +1 -0
- package/dist/credentials/formatter.d.ts +39 -0
- package/dist/credentials/formatter.d.ts.map +1 -0
- package/dist/credentials/formatter.js +79 -0
- package/dist/credentials/formatter.js.map +1 -0
- package/dist/credentials/index.d.ts +11 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +11 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/jwt-introspect.d.ts +32 -0
- package/dist/credentials/jwt-introspect.d.ts.map +1 -0
- package/dist/credentials/jwt-introspect.js +64 -0
- package/dist/credentials/jwt-introspect.js.map +1 -0
- package/dist/credentials/masker.d.ts +20 -0
- package/dist/credentials/masker.d.ts.map +1 -0
- package/dist/credentials/masker.js +37 -0
- package/dist/credentials/masker.js.map +1 -0
- package/dist/credentials/profile.d.ts +83 -0
- package/dist/credentials/profile.d.ts.map +1 -0
- package/dist/credentials/profile.js +184 -0
- package/dist/credentials/profile.js.map +1 -0
- package/dist/credentials/tenant-guard.d.ts +16 -0
- package/dist/credentials/tenant-guard.d.ts.map +1 -0
- package/dist/credentials/tenant-guard.js +53 -0
- package/dist/credentials/tenant-guard.js.map +1 -0
- package/dist/credentials/tty-guard.d.ts +19 -0
- package/dist/credentials/tty-guard.d.ts.map +1 -0
- package/dist/credentials/tty-guard.js +47 -0
- package/dist/credentials/tty-guard.js.map +1 -0
- package/dist/db/apply-schema.d.ts +57 -0
- package/dist/db/apply-schema.d.ts.map +1 -0
- package/dist/db/apply-schema.js +192 -0
- package/dist/db/apply-schema.js.map +1 -0
- package/dist/db/sql-file.d.ts +49 -0
- package/dist/db/sql-file.d.ts.map +1 -0
- package/dist/db/sql-file.js +167 -0
- package/dist/db/sql-file.js.map +1 -0
- package/dist/instance/provision.d.ts +89 -0
- package/dist/instance/provision.d.ts.map +1 -0
- package/dist/instance/provision.js +139 -0
- package/dist/instance/provision.js.map +1 -0
- package/dist/instance/zero-store.d.ts +47 -0
- package/dist/instance/zero-store.d.ts.map +1 -0
- package/dist/instance/zero-store.js +91 -0
- package/dist/instance/zero-store.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +46 -0
- package/dist/main.js.map +1 -0
- package/dist/skill/assets.d.ts +38 -0
- package/dist/skill/assets.d.ts.map +1 -0
- package/dist/skill/assets.js +111 -0
- package/dist/skill/assets.js.map +1 -0
- package/dist/skill/hint.d.ts +39 -0
- package/dist/skill/hint.d.ts.map +1 -0
- package/dist/skill/hint.js +109 -0
- package/dist/skill/hint.js.map +1 -0
- package/dist/skill/hosts.d.ts +21 -0
- package/dist/skill/hosts.d.ts.map +1 -0
- package/dist/skill/hosts.js +38 -0
- package/dist/skill/hosts.js.map +1 -0
- package/dist/skill/installer.d.ts +88 -0
- package/dist/skill/installer.d.ts.map +1 -0
- package/dist/skill/installer.js +203 -0
- package/dist/skill/installer.js.map +1 -0
- package/dist/skill/ownership.d.ts +35 -0
- package/dist/skill/ownership.d.ts.map +1 -0
- package/dist/skill/ownership.js +52 -0
- package/dist/skill/ownership.js.map +1 -0
- package/package.json +63 -3
- package/skills/pxbaas-app-spec/SKILL.md +163 -0
- package/skills/pxbaas-app-spec/references/deploy-options.md +157 -0
- package/skills/pxbaas-app-spec/references/guardrails-pitfalls.md +89 -0
- package/skills/pxbaas-app-spec/references/runtime-contract.md +151 -0
- package/skills/pxbaas-app-spec/references/ssr-session.md +121 -0
- package/skills/pxbaas-app-spec/references/templates-examples.md +308 -0
- package/skills/pxbaas-cli/SKILL.md +168 -0
- package/skills/pxbaas-cli/references/api-reference.md +68 -0
- package/skills/pxbaas-cli/references/app-deploy.md +143 -0
- package/skills/pxbaas-cli/references/auth-and-credentials.md +88 -0
- package/skills/pxbaas-cli/references/data-postgrest.md +85 -0
- package/skills/pxbaas-cli/references/db-and-meta.md +85 -0
- package/skills/pxbaas-cli/references/edge-functions.md +71 -0
- package/skills/pxbaas-cli/references/multi-tenant-apps.md +107 -0
- package/skills/pxbaas-cli/references/provision.md +86 -0
- package/skills/pxbaas-cli/references/safety-and-two-phase.md +49 -0
- package/skills/pxbaas-cli/references/storage.md +61 -0
- package/skills/pxbaas-cli/references/troubleshooting.md +73 -0
- package/templates/webapp/api/index.ts +55 -0
- package/templates/webapp/csr-bff/README.md +81 -0
- package/templates/webapp/csr-bff/backend/index.ts +168 -0
- package/templates/webapp/csr-bff/db/schema.sql +69 -0
- package/templates/webapp/csr-bff/frontend/dist/admin.html +101 -0
- package/templates/webapp/csr-bff/frontend/dist/article.html +44 -0
- package/templates/webapp/csr-bff/frontend/dist/blog.js +206 -0
- package/templates/webapp/csr-bff/frontend/dist/blogger.html +53 -0
- package/templates/webapp/csr-bff/frontend/dist/index.html +70 -0
- package/templates/webapp/csr-bff/frontend/dist/login.html +56 -0
- package/templates/webapp/csr-bff/frontend/dist/profile.html +59 -0
- package/templates/webapp/csr-bff/frontend/dist/signup.html +78 -0
- package/templates/webapp/csr-bff/frontend/dist/style.css +27 -0
- package/templates/webapp/manifest.json +296 -0
- package/templates/webapp/mpa/about.html +29 -0
- package/templates/webapp/mpa/app.js +42 -0
- package/templates/webapp/mpa/index.html +42 -0
- package/templates/webapp/mpa/index.ts +60 -0
- package/templates/webapp/mpa/style.css +42 -0
- package/templates/webapp/react-vite/frontend/index.html +12 -0
- package/templates/webapp/react-vite/frontend/package-lock.json +1826 -0
- package/templates/webapp/react-vite/frontend/package.json +23 -0
- package/templates/webapp/react-vite/frontend/src/App.tsx +34 -0
- package/templates/webapp/react-vite/frontend/src/main.tsx +13 -0
- package/templates/webapp/react-vite/frontend/src/style.css +46 -0
- package/templates/webapp/react-vite/frontend/tsconfig.json +20 -0
- package/templates/webapp/react-vite/frontend/vite.config.ts +10 -0
- package/templates/webapp/react-vite-hono/backend/index.ts +21 -0
- package/templates/webapp/react-vite-hono/frontend/index.html +12 -0
- package/templates/webapp/react-vite-hono/frontend/package-lock.json +1826 -0
- package/templates/webapp/react-vite-hono/frontend/package.json +23 -0
- package/templates/webapp/react-vite-hono/frontend/src/App.tsx +47 -0
- package/templates/webapp/react-vite-hono/frontend/src/main.tsx +13 -0
- package/templates/webapp/react-vite-hono/frontend/src/style.css +66 -0
- package/templates/webapp/react-vite-hono/frontend/tsconfig.json +20 -0
- package/templates/webapp/react-vite-hono/frontend/vite.config.ts +10 -0
- package/templates/webapp/spa/index.ts +119 -0
- package/templates/webapp/ssr-auth/backend/index.ts +133 -0
- package/templates/webapp/ssr-auth/frontend/dist/index.html +15 -0
- package/templates/webapp/ssr-blog/README.md +111 -0
- package/templates/webapp/ssr-blog/backend/index.ts +764 -0
- package/templates/webapp/ssr-blog/db/schema.sql +71 -0
- package/templates/webapp/ssr-blog/frontend/dist/index.html +39 -0
- package/templates/webapp/ssr-frameworks/README.md +64 -0
- package/templates/webapp/ssr-frameworks/backend/index.ts +241 -0
- package/templates/webapp/ssr-frameworks/frontend/dist/index.html +31 -0
- package/templates/webapp/ssr-hono/backend/index.ts +92 -0
- package/templates/webapp/ssr-hono/frontend/dist/index.html +12 -0
- package/templates/webapp/ssr-shop/README.md +80 -0
- package/templates/webapp/ssr-shop/backend/index.ts +491 -0
- package/templates/webapp/ssr-shop/db/schema.sql +120 -0
- package/templates/webapp/ssr-shop/frontend/dist/index.html +12 -0
- package/templates/webapp/vanilla-static/frontend/app.js +6 -0
- package/templates/webapp/vanilla-static/frontend/index.html +19 -0
- package/templates/webapp/vanilla-static/frontend/style.css +43 -0
- package/README.md +0 -3
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { formatError, formatSuccess, formatWarning } from '../../credentials/index.js';
|
|
2
|
+
import { SkillManager } from '../../skill/installer.js';
|
|
3
|
+
import { isHostName, SUPPORTED_HOSTS } from '../../skill/hosts.js';
|
|
4
|
+
/**
|
|
5
|
+
* `pxbaas skill` — install/list/remove ALL bundled Agent Skills (pxbaas-cli,
|
|
6
|
+
* pxbaas-app-spec, ...) into supported Agent hosts (~/.qoder, ~/.claude,
|
|
7
|
+
* ~/.cursor, ~/.qwen, ~/.hermes). Each skill lands in `<host>/skills/<skill>/`
|
|
8
|
+
* with its own fail-closed owner marker.
|
|
9
|
+
*
|
|
10
|
+
* Offline and credential-free: never requires `pxbaas login`.
|
|
11
|
+
*/
|
|
12
|
+
export function registerSkillCommands(program) {
|
|
13
|
+
const skillCmd = program
|
|
14
|
+
.command('skill')
|
|
15
|
+
.description('Install the bundled Agent Skills into supported Agent hosts');
|
|
16
|
+
// skill install
|
|
17
|
+
skillCmd
|
|
18
|
+
.command('install')
|
|
19
|
+
.description('Install/update all bundled skills into an Agent host skills directory')
|
|
20
|
+
.option('--host <host>', `Target host (${SUPPORTED_HOSTS.join('|')})`)
|
|
21
|
+
.option('--all', 'Install to every detected host')
|
|
22
|
+
.option('--dir <path>', 'Custom skills-root directory (each skill goes under <dir>/<skill>)')
|
|
23
|
+
.option('--skill <name>', 'Install only this bundled skill (default: all)')
|
|
24
|
+
.option('--dry-run', 'Show what would be written without touching disk')
|
|
25
|
+
.option('--force', 'Back up and overwrite a foreign (non-baas) directory')
|
|
26
|
+
.option('--json', 'Output in JSON format')
|
|
27
|
+
.action(async (options) => {
|
|
28
|
+
try {
|
|
29
|
+
await handleInstall(options, program);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
handleError(error, options.json);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
// skill list
|
|
36
|
+
skillCmd
|
|
37
|
+
.command('list')
|
|
38
|
+
.description('Show the bundled skills and which hosts they are installed on')
|
|
39
|
+
.option('--json', 'Output in JSON format')
|
|
40
|
+
.action(async (options) => {
|
|
41
|
+
try {
|
|
42
|
+
await handleList(options, program);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
handleError(error, options.json);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
// skill remove
|
|
49
|
+
skillCmd
|
|
50
|
+
.command('remove')
|
|
51
|
+
.description('Remove bundled skills from a host (only baas-managed dirs; two-phase)')
|
|
52
|
+
.option('--host <host>', `Target host (${SUPPORTED_HOSTS.join('|')})`)
|
|
53
|
+
.option('--all', 'Remove from every detected host')
|
|
54
|
+
.option('--dir <path>', 'Custom skills-root directory to remove from')
|
|
55
|
+
.option('--skill <name>', 'Remove only this bundled skill (default: all)')
|
|
56
|
+
.option('--dry-run', 'Preview what would be removed')
|
|
57
|
+
.option('--confirm', 'Actually perform the removal (required to delete)')
|
|
58
|
+
.option('--json', 'Output in JSON format')
|
|
59
|
+
.action(async (options) => {
|
|
60
|
+
try {
|
|
61
|
+
await handleRemove(options, program);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
handleError(error, options.json);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function handleError(error, json) {
|
|
69
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
70
|
+
if (json) {
|
|
71
|
+
console.log(JSON.stringify({ status: 'error', error: message }, null, 2));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.error(formatError(message));
|
|
75
|
+
}
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
function resolveHost(host) {
|
|
79
|
+
if (!host)
|
|
80
|
+
return undefined;
|
|
81
|
+
if (!isHostName(host)) {
|
|
82
|
+
throw new Error(`Unsupported host "${host}". Supported: ${SUPPORTED_HOSTS.join(', ')}.`);
|
|
83
|
+
}
|
|
84
|
+
return host;
|
|
85
|
+
}
|
|
86
|
+
function isJson(options, program) {
|
|
87
|
+
return Boolean(options.json || program.opts().json);
|
|
88
|
+
}
|
|
89
|
+
function skillFilter(skill) {
|
|
90
|
+
return skill ? [skill] : undefined;
|
|
91
|
+
}
|
|
92
|
+
function emit(results, json, output) {
|
|
93
|
+
if (json) {
|
|
94
|
+
console.log(JSON.stringify(output, null, 2));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
for (const r of results) {
|
|
98
|
+
const line = `${r.host}/${r.skill}: ${r.status} -> ${r.targetDir}`;
|
|
99
|
+
if (r.status === 'error' || r.status === 'skipped-foreign') {
|
|
100
|
+
console.log(formatWarning(line + (r.reason ? ` (${r.reason})` : '')));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.log(formatSuccess(line));
|
|
104
|
+
}
|
|
105
|
+
if (r.status === 'dry-run' && r.filesWritten) {
|
|
106
|
+
console.log(` would write ${r.filesWritten.length} file(s)`);
|
|
107
|
+
}
|
|
108
|
+
else if (r.filesWritten) {
|
|
109
|
+
console.log(` files: ${r.filesWritten.length}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function handleInstall(options, program) {
|
|
114
|
+
const json = isJson(options, program);
|
|
115
|
+
const manager = await SkillManager.create();
|
|
116
|
+
const targets = manager.resolveTargets({ host: resolveHost(options.host), all: options.all, dir: options.dir });
|
|
117
|
+
const results = await manager.install(targets, { dryRun: options.dryRun, force: options.force, skills: skillFilter(options.skill) });
|
|
118
|
+
emit(results, json, { action: 'install', dryRun: Boolean(options.dryRun), skills: await manager.bundledSkills(), results });
|
|
119
|
+
if (results.some((r) => r.status === 'error'))
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
async function handleList(options, program) {
|
|
123
|
+
const json = isJson(options, program);
|
|
124
|
+
const manager = await SkillManager.create();
|
|
125
|
+
const bundled = await manager.bundledSkills();
|
|
126
|
+
const results = await manager.list();
|
|
127
|
+
if (json) {
|
|
128
|
+
console.log(JSON.stringify({ action: 'list', skills: bundled, results }, null, 2));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
console.log(`Bundled skills: ${bundled.join(', ')}`);
|
|
132
|
+
if (results.length === 0) {
|
|
133
|
+
console.log(formatWarning('No supported host directories detected.'));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
for (const r of results) {
|
|
137
|
+
const detail = r.status === 'installed' ? ` (v${r.skillVersion}, ${r.installedAt})` : '';
|
|
138
|
+
console.log(`${r.host}/${r.skill}: ${r.status}${detail} -> ${r.targetDir}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function handleRemove(options, program) {
|
|
142
|
+
const json = isJson(options, program);
|
|
143
|
+
const manager = await SkillManager.create();
|
|
144
|
+
const targets = manager.resolveTargets({ host: resolveHost(options.host), all: options.all, dir: options.dir });
|
|
145
|
+
const results = await manager.remove(targets, { dryRun: options.dryRun, confirm: options.confirm, skills: skillFilter(options.skill) });
|
|
146
|
+
emit(results, json, { action: 'remove', dryRun: Boolean(options.dryRun), confirm: Boolean(options.confirm), results });
|
|
147
|
+
if (!options.confirm && !options.dryRun && results.some((r) => r.status === 'dry-run')) {
|
|
148
|
+
console.error(formatWarning('Preview only. Re-run with --confirm to remove.'));
|
|
149
|
+
}
|
|
150
|
+
if (results.some((r) => r.status === 'error'))
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/skill/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/status/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa5D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { CredentialStore, ProfileManager, formatError, } from '../../credentials/index.js';
|
|
2
|
+
export function registerStatusCommand(program) {
|
|
3
|
+
program
|
|
4
|
+
.command('status')
|
|
5
|
+
.description('Display current profile, endpoint, and capability URLs')
|
|
6
|
+
.action(async () => {
|
|
7
|
+
try {
|
|
8
|
+
await handleStatus(program);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
12
|
+
console.error(formatError(message));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async function handleStatus(program) {
|
|
18
|
+
const profileManager = new ProfileManager();
|
|
19
|
+
const currentProfile = await profileManager.getCurrentProfile();
|
|
20
|
+
if (!currentProfile) {
|
|
21
|
+
throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
|
|
22
|
+
}
|
|
23
|
+
const credentialStore = new CredentialStore();
|
|
24
|
+
const credentials = await credentialStore.getCredentials(currentProfile.name);
|
|
25
|
+
if (!credentials) {
|
|
26
|
+
throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
|
|
27
|
+
}
|
|
28
|
+
const endpoint = currentProfile.endpoint.replace(/\/$/, ''); // 去掉尾部斜杠
|
|
29
|
+
const output = {
|
|
30
|
+
profile: currentProfile.name,
|
|
31
|
+
endpoint: currentProfile.endpoint,
|
|
32
|
+
tenantId: currentProfile.tenantId || '(single-tenant)',
|
|
33
|
+
mode: currentProfile.mode,
|
|
34
|
+
capabilities: {
|
|
35
|
+
auth: `${endpoint}/auth/v1`,
|
|
36
|
+
rest: `${endpoint}/rest/v1`,
|
|
37
|
+
storage: `${endpoint}/storage/v1`,
|
|
38
|
+
functions: `${endpoint}/functions/v1`,
|
|
39
|
+
meta: `${endpoint}/pg`,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
if (program.opts().json) {
|
|
43
|
+
console.log(JSON.stringify(output, null, 2));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log(`Profile: ${output.profile}`);
|
|
47
|
+
console.log(`Endpoint: ${output.endpoint}`);
|
|
48
|
+
console.log(`Tenant ID: ${output.tenantId}`);
|
|
49
|
+
console.log(`Mode: ${output.mode}`);
|
|
50
|
+
console.log();
|
|
51
|
+
console.log(`Capability URLs:`);
|
|
52
|
+
console.log(` Auth: ${output.capabilities.auth}`);
|
|
53
|
+
console.log(` REST: ${output.capabilities.rest}`);
|
|
54
|
+
console.log(` Storage: ${output.capabilities.storage}`);
|
|
55
|
+
console.log(` Functions: ${output.capabilities.functions}`);
|
|
56
|
+
console.log(` Meta: ${output.capabilities.meta}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/status/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+D9D"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { StorageDriver } from '@polardbx/pxbaas-client';
|
|
2
|
+
import { CredentialStore, ProfileManager, formatSuccess, formatError, } from '../../credentials/index.js';
|
|
3
|
+
export function registerStorageCommands(program) {
|
|
4
|
+
const storageCmd = program
|
|
5
|
+
.command('storage')
|
|
6
|
+
.description('Storage management');
|
|
7
|
+
// storage ls [bucket/path]
|
|
8
|
+
storageCmd
|
|
9
|
+
.command('ls [path]')
|
|
10
|
+
.description('List buckets or objects in a bucket')
|
|
11
|
+
.option('--json', 'Output in JSON format')
|
|
12
|
+
.action(async (path, options) => {
|
|
13
|
+
try {
|
|
14
|
+
await handleStorageLs(path, { ...options, json: options.json || program.opts().json });
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
18
|
+
console.error(formatError(message));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
// storage cp <src> <dst>
|
|
23
|
+
storageCmd
|
|
24
|
+
.command('cp <src> <dst>')
|
|
25
|
+
.description('Copy objects (local<->remote or remote<->remote)')
|
|
26
|
+
.option('--recursive', 'Copy recursively')
|
|
27
|
+
.action(async (src, dst, options) => {
|
|
28
|
+
try {
|
|
29
|
+
await handleStorageCp(src, dst, options);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
33
|
+
console.error(formatError(message));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
// storage mv <src> <dst>
|
|
38
|
+
storageCmd
|
|
39
|
+
.command('mv <src> <dst>')
|
|
40
|
+
.description('Move/rename objects (remote only)')
|
|
41
|
+
.action(async (src, dst) => {
|
|
42
|
+
try {
|
|
43
|
+
await handleStorageMv(src, dst);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
47
|
+
console.error(formatError(message));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// storage rm <path>
|
|
52
|
+
storageCmd
|
|
53
|
+
.command('rm <path>')
|
|
54
|
+
.description('Delete objects from storage')
|
|
55
|
+
.option('--recursive', 'Delete recursively')
|
|
56
|
+
.action(async (path, options) => {
|
|
57
|
+
try {
|
|
58
|
+
await handleStorageRm(path, options);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
62
|
+
console.error(formatError(message));
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async function handleStorageLs(path, options) {
|
|
68
|
+
// Get current profile
|
|
69
|
+
const profileManager = new ProfileManager();
|
|
70
|
+
const currentProfile = await profileManager.getCurrentProfile();
|
|
71
|
+
if (!currentProfile) {
|
|
72
|
+
throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
|
|
73
|
+
}
|
|
74
|
+
// Get credentials
|
|
75
|
+
const credentialStore = new CredentialStore();
|
|
76
|
+
const credentials = await credentialStore.getCredentials(currentProfile.name);
|
|
77
|
+
if (!credentials) {
|
|
78
|
+
throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
|
|
79
|
+
}
|
|
80
|
+
// Create StorageDriver
|
|
81
|
+
const storageDriver = new StorageDriver({
|
|
82
|
+
endpoint: currentProfile.endpoint,
|
|
83
|
+
serviceRoleKey: credentials.serviceRoleKey,
|
|
84
|
+
tenantId: currentProfile.tenantId,
|
|
85
|
+
});
|
|
86
|
+
// Parse path
|
|
87
|
+
if (!path) {
|
|
88
|
+
// List buckets
|
|
89
|
+
const buckets = await storageDriver.listBuckets();
|
|
90
|
+
if (options.json) {
|
|
91
|
+
console.log(JSON.stringify({ count: buckets.length, buckets }, null, 2));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
if (buckets.length === 0) {
|
|
95
|
+
console.log('No buckets found.');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
console.log(formatSuccess(`Found ${buckets.length} bucket(s):`));
|
|
99
|
+
console.log('');
|
|
100
|
+
for (const bucket of buckets) {
|
|
101
|
+
console.log(` ${bucket.name}`);
|
|
102
|
+
console.log(` Public: ${bucket.public}`);
|
|
103
|
+
console.log(` Created: ${bucket.created_at}`);
|
|
104
|
+
console.log('');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// List objects in bucket
|
|
110
|
+
const parts = path.split('/');
|
|
111
|
+
const bucket = parts[0];
|
|
112
|
+
const prefix = parts.slice(1).join('/');
|
|
113
|
+
const objects = await storageDriver.listObjects(bucket, prefix || undefined);
|
|
114
|
+
if (options.json) {
|
|
115
|
+
console.log(JSON.stringify({ bucket, prefix, count: objects.length, objects }, null, 2));
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
if (objects.length === 0) {
|
|
119
|
+
console.log(`No objects found in ${path}`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
console.log(formatSuccess(`Found ${objects.length} object(s) in ${path}:`));
|
|
123
|
+
console.log('');
|
|
124
|
+
for (const obj of objects) {
|
|
125
|
+
console.log(` ${obj.name}`);
|
|
126
|
+
console.log(` Updated: ${obj.updated_at}`);
|
|
127
|
+
console.log('');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async function handleStorageCp(src, dst, options) {
|
|
133
|
+
throw new Error('storage cp not yet implemented');
|
|
134
|
+
}
|
|
135
|
+
async function handleStorageMv(src, dst) {
|
|
136
|
+
// Get current profile
|
|
137
|
+
const profileManager = new ProfileManager();
|
|
138
|
+
const currentProfile = await profileManager.getCurrentProfile();
|
|
139
|
+
if (!currentProfile) {
|
|
140
|
+
throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
|
|
141
|
+
}
|
|
142
|
+
// Get credentials
|
|
143
|
+
const credentialStore = new CredentialStore();
|
|
144
|
+
const credentials = await credentialStore.getCredentials(currentProfile.name);
|
|
145
|
+
if (!credentials) {
|
|
146
|
+
throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
|
|
147
|
+
}
|
|
148
|
+
// Parse paths
|
|
149
|
+
const srcParts = src.split('/');
|
|
150
|
+
const dstParts = dst.split('/');
|
|
151
|
+
if (srcParts.length < 2 || dstParts.length < 2) {
|
|
152
|
+
throw new Error('Both source and destination must include bucket and path (e.g., bucket/path/to/file)');
|
|
153
|
+
}
|
|
154
|
+
const srcBucket = srcParts[0];
|
|
155
|
+
const srcPath = srcParts.slice(1).join('/');
|
|
156
|
+
const dstBucket = dstParts[0];
|
|
157
|
+
const dstPath = dstParts.slice(1).join('/');
|
|
158
|
+
// Create StorageDriver
|
|
159
|
+
const storageDriver = new StorageDriver({
|
|
160
|
+
endpoint: currentProfile.endpoint,
|
|
161
|
+
serviceRoleKey: credentials.serviceRoleKey,
|
|
162
|
+
tenantId: currentProfile.tenantId,
|
|
163
|
+
});
|
|
164
|
+
// Move object
|
|
165
|
+
await storageDriver.move(srcBucket, srcPath, dstBucket, dstPath);
|
|
166
|
+
console.log(formatSuccess(`Moved ${src} -> ${dst}`));
|
|
167
|
+
}
|
|
168
|
+
async function handleStorageRm(path, options) {
|
|
169
|
+
// Get current profile
|
|
170
|
+
const profileManager = new ProfileManager();
|
|
171
|
+
const currentProfile = await profileManager.getCurrentProfile();
|
|
172
|
+
if (!currentProfile) {
|
|
173
|
+
throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
|
|
174
|
+
}
|
|
175
|
+
// Get credentials
|
|
176
|
+
const credentialStore = new CredentialStore();
|
|
177
|
+
const credentials = await credentialStore.getCredentials(currentProfile.name);
|
|
178
|
+
if (!credentials) {
|
|
179
|
+
throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
|
|
180
|
+
}
|
|
181
|
+
// Parse path
|
|
182
|
+
const parts = path.split('/');
|
|
183
|
+
if (parts.length < 2) {
|
|
184
|
+
throw new Error('Path must include bucket and object path (e.g., bucket/path/to/file)');
|
|
185
|
+
}
|
|
186
|
+
const bucket = parts[0];
|
|
187
|
+
const objectPath = parts.slice(1).join('/');
|
|
188
|
+
// Create StorageDriver
|
|
189
|
+
const storageDriver = new StorageDriver({
|
|
190
|
+
endpoint: currentProfile.endpoint,
|
|
191
|
+
serviceRoleKey: credentials.serviceRoleKey,
|
|
192
|
+
tenantId: currentProfile.tenantId,
|
|
193
|
+
});
|
|
194
|
+
// Delete object
|
|
195
|
+
await storageDriver.delete(bucket, objectPath);
|
|
196
|
+
console.log(formatSuccess(`Deleted ${path}`));
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/storage/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/whoami/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa5D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { CredentialStore, ProfileManager, introspectJwt, computeFingerprint, formatExpiry, formatError, } from '../../credentials/index.js';
|
|
2
|
+
export function registerWhoamiCommand(program) {
|
|
3
|
+
program
|
|
4
|
+
.command('whoami')
|
|
5
|
+
.description('Display current profile, endpoint, tenant, role, and key fingerprints')
|
|
6
|
+
.action(async () => {
|
|
7
|
+
try {
|
|
8
|
+
await handleWhoami(program);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
12
|
+
console.error(formatError(message));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async function handleWhoami(program) {
|
|
18
|
+
const profileManager = new ProfileManager();
|
|
19
|
+
const currentProfile = await profileManager.getCurrentProfile();
|
|
20
|
+
if (!currentProfile) {
|
|
21
|
+
throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
|
|
22
|
+
}
|
|
23
|
+
const credentialStore = new CredentialStore();
|
|
24
|
+
const credentials = await credentialStore.getCredentials(currentProfile.name);
|
|
25
|
+
if (!credentials) {
|
|
26
|
+
throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
|
|
27
|
+
}
|
|
28
|
+
// 解析 JWT(只解码,不验证签名)
|
|
29
|
+
const anonJwt = await introspectJwt(credentials.anonKey);
|
|
30
|
+
const serviceJwt = await introspectJwt(credentials.serviceRoleKey);
|
|
31
|
+
const output = {
|
|
32
|
+
profile: currentProfile.name,
|
|
33
|
+
endpoint: currentProfile.endpoint,
|
|
34
|
+
tenantId: currentProfile.tenantId || '(single-tenant)',
|
|
35
|
+
mode: currentProfile.mode,
|
|
36
|
+
anonKey: {
|
|
37
|
+
fingerprint: computeFingerprint(credentials.anonKey),
|
|
38
|
+
role: anonJwt.payload.role,
|
|
39
|
+
tenantId: anonJwt.payload.tenant_id || '(none)',
|
|
40
|
+
expiry: formatExpiry(anonJwt.expiresIn),
|
|
41
|
+
isExpired: anonJwt.isExpired,
|
|
42
|
+
},
|
|
43
|
+
serviceKey: {
|
|
44
|
+
fingerprint: computeFingerprint(credentials.serviceRoleKey),
|
|
45
|
+
role: serviceJwt.payload.role,
|
|
46
|
+
tenantId: serviceJwt.payload.tenant_id || '(none)',
|
|
47
|
+
expiry: formatExpiry(serviceJwt.expiresIn),
|
|
48
|
+
isExpired: serviceJwt.isExpired,
|
|
49
|
+
},
|
|
50
|
+
storedAt: credentials.storedAt,
|
|
51
|
+
};
|
|
52
|
+
if (program.opts().json) {
|
|
53
|
+
console.log(JSON.stringify(output, null, 2));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.log(`Profile: ${output.profile}`);
|
|
57
|
+
console.log(`Endpoint: ${output.endpoint}`);
|
|
58
|
+
console.log(`Tenant ID: ${output.tenantId}`);
|
|
59
|
+
console.log(`Mode: ${output.mode}`);
|
|
60
|
+
console.log();
|
|
61
|
+
console.log(`Anon Key:`);
|
|
62
|
+
console.log(` Fingerprint: ${output.anonKey.fingerprint}`);
|
|
63
|
+
console.log(` Role: ${output.anonKey.role}`);
|
|
64
|
+
console.log(` Tenant ID: ${output.anonKey.tenantId}`);
|
|
65
|
+
console.log(` Expiry: ${output.anonKey.expiry}`);
|
|
66
|
+
if (output.anonKey.isExpired) {
|
|
67
|
+
console.log(` Status: ⚠️ EXPIRED`);
|
|
68
|
+
}
|
|
69
|
+
console.log();
|
|
70
|
+
console.log(`Service Key:`);
|
|
71
|
+
console.log(` Fingerprint: ${output.serviceKey.fingerprint}`);
|
|
72
|
+
console.log(` Role: ${output.serviceKey.role}`);
|
|
73
|
+
console.log(` Tenant ID: ${output.serviceKey.tenantId}`);
|
|
74
|
+
console.log(` Expiry: ${output.serviceKey.expiry}`);
|
|
75
|
+
if (output.serviceKey.isExpired) {
|
|
76
|
+
console.log(` Status: ⚠️ EXPIRED`);
|
|
77
|
+
}
|
|
78
|
+
console.log();
|
|
79
|
+
console.log(`Stored at: ${output.storedAt}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/whoami/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uEAAuE,CAAC;SACpF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAgB;IAC1C,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;IAEhE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAE9E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qCAAqC,cAAc,CAAC,IAAI,uCAAuC,CAAC,CAAC;IACnH,CAAC;IAED,oBAAoB;IACpB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAEnE,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,cAAc,CAAC,IAAI;QAC5B,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,QAAQ,EAAE,cAAc,CAAC,QAAQ,IAAI,iBAAiB;QACtD,IAAI,EAAE,cAAc,CAAC,IAAI;QACzB,OAAO,EAAE;YACP,WAAW,EAAE,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC;YACpD,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;YAC1B,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ;YAC/C,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC;YACvC,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B;QACD,UAAU,EAAE;YACV,WAAW,EAAE,kBAAkB,CAAC,WAAW,CAAC,cAAc,CAAC;YAC3D,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI;YAC7B,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ;YAClD,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC;YAC1C,SAAS,EAAE,UAAU,CAAC,SAAS;SAChC;QACD,QAAQ,EAAE,WAAW,CAAC,QAAQ;KAC/B,CAAC;IAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 凭据落库共享逻辑 - login(交互/stdin)与 profile import(env 文件)复用。
|
|
3
|
+
*
|
|
4
|
+
* 统一执行:JWT 解析 → 过期校验 → 租户一致性校验 → 写 profile → 切为当前 → 写凭据。
|
|
5
|
+
* 只返回指纹,绝不回传明文密钥。
|
|
6
|
+
*/
|
|
7
|
+
import { ProfileManager, type ProfileMode } from './profile.js';
|
|
8
|
+
import { CredentialStore } from './credential-store.js';
|
|
9
|
+
export interface CommitInput {
|
|
10
|
+
profileName: string;
|
|
11
|
+
endpoint: string;
|
|
12
|
+
anonKey: string;
|
|
13
|
+
serviceRoleKey: string;
|
|
14
|
+
/** 多租户模式必填;单租户留空。 */
|
|
15
|
+
tenantId?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 可选依赖注入:默认落到真实 ~/.baas;单测可传入 temp-dir 支撑的实例做隔离。
|
|
19
|
+
*/
|
|
20
|
+
export interface CommitDeps {
|
|
21
|
+
profileManager?: ProfileManager;
|
|
22
|
+
credentialStore?: CredentialStore;
|
|
23
|
+
}
|
|
24
|
+
export interface CommitResult {
|
|
25
|
+
profileName: string;
|
|
26
|
+
endpoint: string;
|
|
27
|
+
tenantId?: string;
|
|
28
|
+
mode: ProfileMode;
|
|
29
|
+
anonKeyFingerprint: string;
|
|
30
|
+
serviceKeyFingerprint: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 校验并持久化一份 profile + 凭据。
|
|
34
|
+
*
|
|
35
|
+
* @throws Error 密钥过期、或 profile 与 JWT 的 tenant_id 不一致时抛出。
|
|
36
|
+
*/
|
|
37
|
+
export declare function commitProfileCredentials(input: CommitInput, deps?: CommitDeps): Promise<CommitResult>;
|
|
38
|
+
//# sourceMappingURL=commit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/credentials/commit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAoB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKxD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,YAAY,CAAC,CA8CvB"}
|