@polpo-ai/cli 0.6.3 → 0.6.5

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 (37) hide show
  1. package/dist/commands/cloud/byok.js +44 -22
  2. package/dist/commands/cloud/byok.js.map +1 -1
  3. package/dist/commands/cloud/deploy.js +254 -134
  4. package/dist/commands/cloud/deploy.js.map +1 -1
  5. package/dist/commands/cloud/login.js +42 -20
  6. package/dist/commands/cloud/login.js.map +1 -1
  7. package/dist/commands/cloud/logout.js +8 -1
  8. package/dist/commands/cloud/logout.js.map +1 -1
  9. package/dist/commands/cloud/projects.js +24 -10
  10. package/dist/commands/cloud/projects.js.map +1 -1
  11. package/dist/commands/cloud/status.js +9 -8
  12. package/dist/commands/cloud/status.js.map +1 -1
  13. package/dist/commands/create.js +76 -15
  14. package/dist/commands/create.js.map +1 -1
  15. package/dist/commands/install.js +108 -0
  16. package/dist/commands/install.js.map +1 -0
  17. package/dist/commands/link.js +167 -9
  18. package/dist/commands/link.js.map +1 -1
  19. package/dist/commands/orgs.js +12 -6
  20. package/dist/commands/orgs.js.map +1 -1
  21. package/dist/commands/update.js +28 -61
  22. package/dist/commands/update.js.map +1 -1
  23. package/dist/commands/whoami.js +18 -11
  24. package/dist/commands/whoami.js.map +1 -1
  25. package/dist/index.js +2 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/update-check.js +57 -0
  28. package/dist/update-check.js.map +1 -1
  29. package/dist/util/conflicts.js +90 -0
  30. package/dist/util/conflicts.js.map +1 -0
  31. package/dist/util/pull.js +286 -0
  32. package/dist/util/pull.js.map +1 -0
  33. package/dist/util/self-update.js +71 -0
  34. package/dist/util/self-update.js.map +1 -0
  35. package/dist/util/skills.js +4 -1
  36. package/dist/util/skills.js.map +1 -1
  37. package/package.json +3 -3
@@ -0,0 +1,286 @@
1
+ /**
2
+ * polpo pull — download cloud project state into the local .polpo/ directory.
3
+ *
4
+ * The inverse of `polpo deploy`. Fetches agents, teams, memory, skills,
5
+ * missions, playbooks, and schedules from the data plane API and writes
6
+ * them in the exact format that the CLI and FileStores expect on disk.
7
+ *
8
+ * Each resource is compared against the local version before writing.
9
+ * In interactive mode, the user is prompted per-resource when they differ.
10
+ * In force mode (--yes / --force), cloud always wins.
11
+ */
12
+ import * as fs from "node:fs";
13
+ import * as path from "node:path";
14
+ import { resolveJsonConflict, resolveFileConflict, } from "./conflicts.js";
15
+ function ensureDir(dir) {
16
+ if (!fs.existsSync(dir))
17
+ fs.mkdirSync(dir, { recursive: true });
18
+ }
19
+ function writeJson(filePath, data) {
20
+ ensureDir(path.dirname(filePath));
21
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf-8");
22
+ }
23
+ function writeText(filePath, content) {
24
+ ensureDir(path.dirname(filePath));
25
+ fs.writeFileSync(filePath, content, "utf-8");
26
+ }
27
+ export async function pullProject(client, polpoDir, opts = { force: true, interactive: false }) {
28
+ ensureDir(polpoDir);
29
+ const result = { pulled: [], unchanged: [], skipped: [], errors: [] };
30
+ // ── Agents ──────────────────────────────────
31
+ try {
32
+ const res = await client.get("/v1/agents");
33
+ if (res.status === 200) {
34
+ const agents = res.data?.data ?? res.data ?? [];
35
+ if (Array.isArray(agents) && agents.length > 0) {
36
+ const entries = agents.map((a) => ({
37
+ agent: {
38
+ name: a.name,
39
+ role: a.role,
40
+ model: a.model,
41
+ systemPrompt: a.systemPrompt,
42
+ allowedTools: a.allowedTools,
43
+ allowedPaths: a.allowedPaths,
44
+ skills: a.skills,
45
+ maxTurns: a.maxTurns,
46
+ maxConcurrency: a.maxConcurrency,
47
+ reasoning: a.reasoning,
48
+ reportsTo: a.reportsTo,
49
+ identity: a.identity,
50
+ browserProfile: a.browserProfile,
51
+ emailAllowedDomains: a.emailAllowedDomains,
52
+ },
53
+ teamName: a.teamName ?? a.team ?? "default",
54
+ }));
55
+ const clean = JSON.parse(JSON.stringify(entries));
56
+ const filePath = path.join(polpoDir, "agents.json");
57
+ const action = await resolveJsonConflict(filePath, clean, `agents.json (${agents.length} agents)`, opts);
58
+ if (action === "write") {
59
+ writeJson(filePath, clean);
60
+ result.pulled.push(`agents (${agents.length})`);
61
+ }
62
+ else if (action === "skip") {
63
+ if (fs.existsSync(filePath))
64
+ result.skipped.push("agents (local kept)");
65
+ else
66
+ result.unchanged.push("agents");
67
+ }
68
+ }
69
+ else {
70
+ result.unchanged.push("agents (none in cloud)");
71
+ }
72
+ }
73
+ }
74
+ catch (err) {
75
+ result.errors.push(`agents: ${err.message}`);
76
+ }
77
+ // ── Teams ──────────────────────────────────
78
+ try {
79
+ const res = await client.get("/v1/agents/teams");
80
+ if (res.status === 200) {
81
+ const teams = res.data?.data ?? res.data ?? [];
82
+ if (Array.isArray(teams) && teams.length > 0) {
83
+ const clean = JSON.parse(JSON.stringify(teams.map((t) => ({ name: t.name, description: t.description }))));
84
+ const filePath = path.join(polpoDir, "teams.json");
85
+ const action = await resolveJsonConflict(filePath, clean, `teams.json (${teams.length} teams)`, opts);
86
+ if (action === "write") {
87
+ writeJson(filePath, clean);
88
+ result.pulled.push(`teams (${teams.length})`);
89
+ }
90
+ else if (action === "skip") {
91
+ result.skipped.push("teams (local kept)");
92
+ }
93
+ }
94
+ else {
95
+ result.unchanged.push("teams (none in cloud)");
96
+ }
97
+ }
98
+ }
99
+ catch (err) {
100
+ result.errors.push(`teams: ${err.message}`);
101
+ }
102
+ // ── Memory (shared) ──────────────────────────────────
103
+ try {
104
+ const res = await client.get("/v1/memory");
105
+ if (res.status === 200) {
106
+ const content = res.data?.content ?? res.data;
107
+ if (typeof content === "string" && content.trim()) {
108
+ const filePath = path.join(polpoDir, "memory.md");
109
+ const action = await resolveFileConflict(filePath, content, "memory.md (shared)", opts);
110
+ if (action === "write") {
111
+ writeText(filePath, content);
112
+ result.pulled.push("memory (shared)");
113
+ }
114
+ else {
115
+ result.skipped.push("memory (local kept)");
116
+ }
117
+ }
118
+ else {
119
+ result.unchanged.push("memory (empty)");
120
+ }
121
+ }
122
+ }
123
+ catch (err) {
124
+ result.errors.push(`memory: ${err.message}`);
125
+ }
126
+ // ── Memory (per-agent) ──────────────────────────────────
127
+ try {
128
+ const agentsRes = await client.get("/v1/agents");
129
+ const agents = agentsRes.data?.data ?? agentsRes.data ?? [];
130
+ if (Array.isArray(agents)) {
131
+ for (const a of agents) {
132
+ try {
133
+ const memRes = await client.get(`/v1/memory/agent/${encodeURIComponent(a.name)}`);
134
+ if (memRes.status === 200) {
135
+ const content = memRes.data?.content ?? memRes.data;
136
+ if (typeof content === "string" && content.trim()) {
137
+ const filePath = path.join(polpoDir, "memory", `${a.name}.md`);
138
+ const action = await resolveFileConflict(filePath, content, `memory/${a.name}.md`, opts);
139
+ if (action === "write") {
140
+ writeText(filePath, content);
141
+ result.pulled.push(`memory (${a.name})`);
142
+ }
143
+ else {
144
+ result.skipped.push(`memory/${a.name} (local kept)`);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ catch { /* agent has no memory — skip */ }
150
+ }
151
+ }
152
+ }
153
+ catch { /* agents list failed — skip agent memories */ }
154
+ // ── Skills ──────────────────────────────────
155
+ try {
156
+ const res = await client.get("/v1/skills");
157
+ if (res.status === 200) {
158
+ const skills = res.data?.data ?? res.data ?? [];
159
+ if (Array.isArray(skills)) {
160
+ for (const skill of skills) {
161
+ try {
162
+ const contentRes = await client.get(`/v1/skills/${encodeURIComponent(skill.name)}/content`);
163
+ if (contentRes.status === 200) {
164
+ const content = contentRes.data?.content ?? contentRes.data;
165
+ if (typeof content === "string" && content.trim()) {
166
+ const filePath = path.join(polpoDir, "skills", skill.name, "SKILL.md");
167
+ const action = await resolveFileConflict(filePath, content, `skill "${skill.name}"`, opts);
168
+ if (action === "write") {
169
+ writeText(filePath, content);
170
+ result.pulled.push(`skill (${skill.name})`);
171
+ }
172
+ else {
173
+ result.skipped.push(`skill/${skill.name} (local kept)`);
174
+ }
175
+ }
176
+ }
177
+ }
178
+ catch {
179
+ result.errors.push(`skill "${skill.name}": could not fetch content`);
180
+ }
181
+ }
182
+ }
183
+ }
184
+ }
185
+ catch (err) {
186
+ result.errors.push(`skills: ${err.message}`);
187
+ }
188
+ // ── Missions ──────────────────────────────────
189
+ try {
190
+ const res = await client.get("/v1/missions");
191
+ if (res.status === 200) {
192
+ const missions = res.data?.data ?? res.data ?? [];
193
+ if (Array.isArray(missions) && missions.length > 0) {
194
+ for (const m of missions) {
195
+ const filename = (m.name ?? m.id ?? "mission").replace(/[^a-zA-Z0-9._-]/g, "-");
196
+ const data = {
197
+ name: m.name,
198
+ data: m.data,
199
+ prompt: m.prompt,
200
+ status: m.status,
201
+ schedule: m.schedule,
202
+ deadline: m.deadline,
203
+ };
204
+ const filePath = path.join(polpoDir, "missions", `${filename}.json`);
205
+ const action = await resolveJsonConflict(filePath, data, `mission "${m.name ?? filename}"`, opts);
206
+ if (action === "write") {
207
+ writeJson(filePath, data);
208
+ result.pulled.push(`mission (${m.name ?? filename})`);
209
+ }
210
+ else {
211
+ result.skipped.push(`mission/${filename} (local kept)`);
212
+ }
213
+ }
214
+ }
215
+ else {
216
+ result.unchanged.push("missions (none in cloud)");
217
+ }
218
+ }
219
+ }
220
+ catch (err) {
221
+ result.errors.push(`missions: ${err.message}`);
222
+ }
223
+ // ── Playbooks ──────────────────────────────────
224
+ try {
225
+ const res = await client.get("/v1/playbooks");
226
+ if (res.status === 200) {
227
+ const playbooks = res.data?.data ?? res.data ?? [];
228
+ if (Array.isArray(playbooks) && playbooks.length > 0) {
229
+ for (const pb of playbooks) {
230
+ const dirname = (pb.name ?? "playbook").replace(/[^a-zA-Z0-9._-]/g, "-");
231
+ const data = {
232
+ name: pb.name,
233
+ description: pb.description,
234
+ mission: pb.mission,
235
+ parameters: pb.parameters,
236
+ };
237
+ const filePath = path.join(polpoDir, "playbooks", dirname, "playbook.json");
238
+ const action = await resolveJsonConflict(filePath, data, `playbook "${pb.name ?? dirname}"`, opts);
239
+ if (action === "write") {
240
+ writeJson(filePath, data);
241
+ result.pulled.push(`playbook (${pb.name ?? dirname})`);
242
+ }
243
+ else {
244
+ result.skipped.push(`playbook/${dirname} (local kept)`);
245
+ }
246
+ }
247
+ }
248
+ else {
249
+ result.unchanged.push("playbooks (none in cloud)");
250
+ }
251
+ }
252
+ }
253
+ catch (err) {
254
+ result.errors.push(`playbooks: ${err.message}`);
255
+ }
256
+ // ── Schedules ──────────────────────────────────
257
+ try {
258
+ const res = await client.get("/v1/schedules");
259
+ if (res.status === 200) {
260
+ const schedules = res.data?.data ?? res.data ?? [];
261
+ if (Array.isArray(schedules) && schedules.length > 0) {
262
+ for (const sc of schedules) {
263
+ const filename = (sc.name ?? sc.missionId ?? "schedule").replace(/[^a-zA-Z0-9._-]/g, "-");
264
+ const filePath = path.join(polpoDir, "schedules", `${filename}.json`);
265
+ const action = await resolveJsonConflict(filePath, sc, `schedule "${sc.name ?? filename}"`, opts);
266
+ if (action === "write") {
267
+ writeJson(filePath, sc);
268
+ result.pulled.push(`schedule (${sc.name ?? filename})`);
269
+ }
270
+ else {
271
+ result.skipped.push(`schedule/${filename} (local kept)`);
272
+ }
273
+ }
274
+ }
275
+ else {
276
+ result.unchanged.push("schedules (none in cloud)");
277
+ }
278
+ }
279
+ }
280
+ catch (err) {
281
+ result.errors.push(`schedules: ${err.message}`);
282
+ }
283
+ // Vault is NOT pulled — the API only returns metadata (keys, not values).
284
+ return result;
285
+ }
286
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/util/pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Self-update primitives shared by `polpo update` and the interactive
3
+ * update prompt at the start of long-running commands (`install`, `create`).
4
+ *
5
+ * Kept here (not in `update-check.ts`) so both the synchronous `update`
6
+ * command and the interactive prompt can reuse the same package-manager
7
+ * detection + install logic without circular imports.
8
+ */
9
+ import { execSync } from "node:child_process";
10
+ export const PACKAGE_NAME = "polpo-ai";
11
+ /**
12
+ * Detect which package manager installed polpo globally. Falls back to
13
+ * `npm` when detection fails — npm ships with Node.js so it's a safe bet.
14
+ */
15
+ export function detectPackageManager() {
16
+ try {
17
+ const out = execSync("pnpm list -g polpo-ai --depth=0 2>/dev/null", {
18
+ encoding: "utf-8",
19
+ timeout: 10_000,
20
+ });
21
+ if (out.includes("polpo-ai"))
22
+ return "pnpm";
23
+ }
24
+ catch {
25
+ // pnpm absent or listing failed — fall through.
26
+ }
27
+ return "npm";
28
+ }
29
+ /**
30
+ * Fetch the latest published version from the npm registry.
31
+ */
32
+ export async function getLatestVersion() {
33
+ const res = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, {
34
+ headers: { Accept: "application/json" },
35
+ });
36
+ if (!res.ok)
37
+ throw new Error(`Registry returned ${res.status}`);
38
+ const data = (await res.json());
39
+ return data.version;
40
+ }
41
+ /**
42
+ * Install `polpo-ai@{version}` globally via the detected package manager.
43
+ * Returns `{ success: true, cmd }` on success, `{ success: false, cmd, error }`
44
+ * on failure. Never throws — callers typically want to warn + continue.
45
+ */
46
+ export function runSelfUpdate(version) {
47
+ const pm = detectPackageManager();
48
+ const cmd = pm === "pnpm"
49
+ ? `pnpm add -g polpo-ai@${version}`
50
+ : `npm install -g polpo-ai@${version}`;
51
+ if (pm === "npm") {
52
+ try {
53
+ execSync("npm cache clean --force", { stdio: "ignore", timeout: 30_000 });
54
+ }
55
+ catch {
56
+ // Best effort — stale cache is recoverable by re-running.
57
+ }
58
+ }
59
+ try {
60
+ execSync(cmd, { stdio: "inherit", timeout: 120_000 });
61
+ return { success: true, cmd };
62
+ }
63
+ catch (err) {
64
+ return {
65
+ success: false,
66
+ cmd,
67
+ error: err.message ?? "unknown error",
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=self-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/util/self-update.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,6CAA6C,EAAE;YAClE,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,MAAM,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,8BAA8B,YAAY,SAAS,EAAE;QAC3E,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;KACxC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAC;IACvD,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAK3C,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAClC,MAAM,GAAG,GACP,EAAE,KAAK,MAAM;QACX,CAAC,CAAC,wBAAwB,OAAO,EAAE;QACnC,CAAC,CAAC,2BAA2B,OAAO,EAAE,CAAC;IAE3C,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,QAAQ,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,GAAG;YACH,KAAK,EAAG,GAAa,CAAC,OAAO,IAAI,eAAe;SACjD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -20,7 +20,7 @@ import { promisify } from "node:util";
20
20
  const execAsync = promisify(exec);
21
21
  export const POLPO_SKILLS_REPO = "lumea-labs/polpo-skills";
22
22
  /**
23
- * Shell out to `npx skills@latest add lumea-labs/polpo-skills [-g] -y`.
23
+ * Shell out to `npx skills@latest add lumea-labs/polpo-skills [-g] [-a <c>]... -y`.
24
24
  *
25
25
  * Returns `true` on success, `false` on failure. We never throw — skills
26
26
  * install is an enhancement, not a prerequisite. Callers should log
@@ -34,6 +34,9 @@ export async function installCodingAgentSkills(opts) {
34
34
  ];
35
35
  if (opts.scope === "global")
36
36
  flags.push("--global");
37
+ for (const client of opts.clients ?? []) {
38
+ flags.push("-a", client);
39
+ }
37
40
  const cmd = `npx --yes skills@latest add ${POLPO_SKILLS_REPO} ${flags.join(" ")}`;
38
41
  try {
39
42
  await execAsync(cmd, {
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/util/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAY3D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAA0B;IACvE,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAExC,MAAM,KAAK,GAAG;QACZ,OAAO,EAAE,qDAAqD;KAC/D,CAAC;IACF,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpD,MAAM,GAAG,GAAG,+BAA+B,iBAAiB,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAElF,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,GAAG,EAAE;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE,IAAI,CAAC,SAAS,IAAI,MAAM;YACjC,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,yBAAyB,iBAAiB,WAAW,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/util/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAkB3D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAA0B;IACvE,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAExC,MAAM,KAAK,GAAa;QACtB,OAAO,EAAE,qDAAqD;KAC/D,CAAC;IACF,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,GAAG,GAAG,+BAA+B,iBAAiB,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAElF,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,GAAG,EAAE;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE,IAAI,CAAC,SAAS,IAAI,MAAM;YACjC,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,yBAAyB,iBAAiB,WAAW,CAAC;AAC/D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polpo-ai/cli",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
4
4
  "description": "Command-line client for Polpo — create/link/deploy cloud projects from your terminal.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -18,8 +18,8 @@
18
18
  "@clack/prompts": "^0.9.1",
19
19
  "commander": "^13.1.0",
20
20
  "picocolors": "^1.1.1",
21
- "@polpo-ai/server": "0.6.3",
22
- "@polpo-ai/vault-crypto": "0.6.3"
21
+ "@polpo-ai/server": "0.6.5",
22
+ "@polpo-ai/vault-crypto": "0.6.5"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/node": "^22.10.2",