@octp/cli 0.1.6 → 0.1.8

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.
@@ -1,130 +1,315 @@
1
1
  import { Command } from "commander";
2
- import { readdir, readFile, mkdir, writeFile, access } from "node:fs/promises";
3
- import { resolve, join, dirname } from "node:path";
4
- import { fileURLToPath } from "node:url";
2
+ import { mkdir, writeFile, readFile, unlink } from "node:fs/promises";
3
+ import { join, basename } from "node:path";
5
4
  import { homedir } from "node:os";
5
+ import { createHash } from "node:crypto";
6
6
  import chalk from "chalk";
7
- import { success, error, info, table } from "../lib/output.js";
8
- const __filename = fileURLToPath(import.meta.url);
9
- const __dirname = dirname(__filename);
10
- const SKILLS_DIR = resolve(__dirname, "..", "..", "src", "skiils");
11
- const CLAUDE_DIR = join(homedir(), ".claude", "commands");
12
- const CODEX_DIR = join(homedir(), ".agents", "skills");
13
- function parseSkillFrontmatter(content) {
14
- const match = content.match(/^---\n([\s\S]*?)\n---/);
15
- if (!match)
16
- return { name: "", description: "" };
17
- const fm = match[1];
18
- const name = fm.match(/(?:^|\n)name:\s*(.+)/)?.[1]?.trim() ?? "";
19
- const desc = fm.match(/(?:^|\n)description:\s*(.+)/)?.[1]?.trim() ?? "";
20
- return { name, description: desc };
21
- }
22
- async function getSkills() {
7
+ import { success, error, info, warn, table } from "../lib/output.js";
8
+ import { withSpinner } from "../lib/spinner.js";
9
+ import { getApiUrl } from "../lib/config-store.js";
10
+ const COMMANDS_DIR = join(process.cwd(), ".claude", "commands");
11
+ const STATE_DIR = join(homedir(), ".octopus");
12
+ const STATE_FILE = join(STATE_DIR, "skills-state.json");
13
+ // --- State persistence ---
14
+ async function loadState() {
23
15
  try {
24
- const files = await readdir(SKILLS_DIR);
25
- const skills = [];
26
- for (const file of files) {
27
- if (!file.endsWith(".md"))
28
- continue;
29
- const content = await readFile(join(SKILLS_DIR, file), "utf-8");
30
- const { name, description } = parseSkillFrontmatter(content);
31
- skills.push({
32
- fileName: file,
33
- name: name || file.replace(/\.md$/, ""),
34
- description,
35
- });
36
- }
37
- return skills;
16
+ const data = await readFile(STATE_FILE, "utf-8");
17
+ return JSON.parse(data);
38
18
  }
39
19
  catch {
40
- return [];
20
+ return { lastKnownVersion: 0, lastCheckedAt: "", installed: {} };
41
21
  }
42
22
  }
43
- async function exists(path) {
44
- try {
45
- await access(path);
46
- return true;
23
+ async function saveState(state) {
24
+ await mkdir(STATE_DIR, { recursive: true });
25
+ await writeFile(STATE_FILE, JSON.stringify(state, null, 2), "utf-8");
26
+ }
27
+ // --- Helpers ---
28
+ function getBaseUrl() {
29
+ return getApiUrl();
30
+ }
31
+ async function fetchSkillsManifest() {
32
+ const url = `${getBaseUrl()}/skills/skills.json`;
33
+ const res = await fetch(url);
34
+ if (!res.ok) {
35
+ throw new Error(`Failed to fetch skills list: ${res.status} ${res.statusText}`);
47
36
  }
48
- catch {
49
- return false;
37
+ return res.json();
38
+ }
39
+ async function fetchSkillContent(filename) {
40
+ const url = `${getBaseUrl()}/skills/${filename}`;
41
+ const res = await fetch(url);
42
+ if (!res.ok) {
43
+ throw new Error(`Failed to download skill file: ${res.status} ${res.statusText}`);
50
44
  }
45
+ return res.text();
51
46
  }
52
- async function installForClaude(skills) {
53
- await mkdir(CLAUDE_DIR, { recursive: true });
54
- let count = 0;
55
- for (const skill of skills) {
56
- const src = join(SKILLS_DIR, skill.fileName);
57
- const dest = join(CLAUDE_DIR, skill.fileName);
58
- const content = await readFile(src, "utf-8");
59
- await writeFile(dest, content, "utf-8");
60
- count++;
61
- }
62
- return count;
47
+ function computeHash(content) {
48
+ return createHash("sha256").update(content, "utf-8").digest("hex");
63
49
  }
64
- async function installForCodex(skills) {
65
- let count = 0;
66
- for (const skill of skills) {
67
- const skillName = skill.fileName.replace(/\.md$/, "");
68
- const skillDir = join(CODEX_DIR, skillName);
69
- await mkdir(skillDir, { recursive: true });
70
- const src = join(SKILLS_DIR, skill.fileName);
71
- const content = await readFile(src, "utf-8");
72
- // Codex expects SKILL.md inside a named directory
73
- await writeFile(join(skillDir, "SKILL.md"), content, "utf-8");
74
- count++;
75
- }
76
- return count;
50
+ function validateFilename(filename) {
51
+ const safe = basename(filename);
52
+ if (!safe.endsWith(".md") || safe !== filename) {
53
+ throw new Error(`Invalid skill filename: ${filename}`);
54
+ }
55
+ return safe;
77
56
  }
78
57
  // --- Commands ---
79
- const installCommand = new Command("install")
80
- .description("Install Octopus skills for Claude Code and/or Codex")
81
- .option("--claude", "Install only for Claude Code")
82
- .option("--codex", "Install only for Codex")
83
- .action(async (opts) => {
84
- const skills = await getSkills();
85
- if (skills.length === 0) {
86
- error("No skills found to install.");
87
- return;
88
- }
89
- const both = !opts.claude && !opts.codex;
90
- let claudeCount = 0;
91
- let codexCount = 0;
92
- if (both || opts.claude) {
93
- claudeCount = await installForClaude(skills);
94
- success(`Installed ${claudeCount} skill(s) to ${chalk.dim(CLAUDE_DIR)}`);
95
- }
96
- if (both || opts.codex) {
97
- codexCount = await installForCodex(skills);
98
- success(`Installed ${codexCount} skill(s) to ${chalk.dim(CODEX_DIR)}`);
99
- }
100
- console.log();
101
- for (const skill of skills) {
102
- info(`${chalk.bold(skill.name)} — ${skill.description || chalk.dim("no description")}`);
103
- }
104
- });
105
58
  const listCommand = new Command("list")
106
59
  .description("List available Octopus skills and their install status")
107
60
  .action(async () => {
108
- const skills = await getSkills();
109
- if (skills.length === 0) {
61
+ let manifest;
62
+ try {
63
+ manifest = await withSpinner("Fetching skills…", () => fetchSkillsManifest());
64
+ }
65
+ catch (err) {
66
+ error(err.message);
67
+ return;
68
+ }
69
+ const state = await loadState();
70
+ // New skills notification
71
+ if (manifest.version > state.lastKnownVersion && state.lastKnownVersion > 0) {
72
+ console.log(chalk.cyan("🆕 New skills available!\n"));
73
+ }
74
+ // Update state
75
+ state.lastKnownVersion = manifest.version;
76
+ state.lastCheckedAt = new Date().toISOString();
77
+ await saveState(state);
78
+ if (manifest.skills.length === 0) {
110
79
  info("No skills available.");
111
80
  return;
112
81
  }
113
82
  const rows = [];
114
- for (const skill of skills) {
115
- const claudeInstalled = await exists(join(CLAUDE_DIR, skill.fileName));
116
- const codexInstalled = await exists(join(CODEX_DIR, skill.fileName.replace(/\.md$/, ""), "SKILL.md"));
83
+ for (const skill of manifest.skills) {
84
+ const installedEntry = state.installed[skill.name];
85
+ let status;
86
+ if (installedEntry) {
87
+ if (installedEntry.hash !== skill.hash) {
88
+ status = chalk.green("✓ installed") + " " + chalk.yellow("(update available)");
89
+ }
90
+ else {
91
+ status = chalk.green("✓ installed");
92
+ }
93
+ }
94
+ else {
95
+ status = chalk.dim("not installed");
96
+ }
117
97
  rows.push([
118
98
  chalk.bold(skill.name),
119
99
  skill.description || chalk.dim("—"),
120
- claudeInstalled ? chalk.green("yes") : chalk.dim("no"),
121
- codexInstalled ? chalk.green("yes") : chalk.dim("no"),
100
+ status,
122
101
  ]);
123
102
  }
124
- table(rows, ["Skill", "Description", "Claude", "Codex"]);
103
+ table(rows, ["Name", "Description", "Status"]);
125
104
  });
105
+ const installCommand = new Command("install")
106
+ .description("Install a skill from Octopus skill registry")
107
+ .argument("[name]", "Skill name to install")
108
+ .option("--all", "Install all available skills")
109
+ .action(async (name, opts) => {
110
+ if (!name && !opts.all) {
111
+ error("Provide a skill name or use --all to install all skills.");
112
+ return;
113
+ }
114
+ let manifest;
115
+ try {
116
+ manifest = await withSpinner("Fetching skills…", () => fetchSkillsManifest());
117
+ }
118
+ catch (err) {
119
+ error(err.message);
120
+ return;
121
+ }
122
+ const toInstall = opts.all
123
+ ? manifest.skills
124
+ : manifest.skills.filter((s) => s.name === name);
125
+ if (toInstall.length === 0) {
126
+ error(`Skill "${name}" not found. Run ${chalk.cyan("octopus skills list")} to see available skills.`);
127
+ return;
128
+ }
129
+ await mkdir(COMMANDS_DIR, { recursive: true });
130
+ const state = await loadState();
131
+ for (const skill of toInstall) {
132
+ const installedEntry = state.installed[skill.name];
133
+ // Already up to date
134
+ if (installedEntry && installedEntry.hash === skill.hash) {
135
+ info(`${chalk.bold(skill.name)} is already up to date.`);
136
+ continue;
137
+ }
138
+ try {
139
+ const safeFilename = validateFilename(skill.filename);
140
+ const content = await withSpinner(`Downloading ${skill.name}…`, () => fetchSkillContent(safeFilename));
141
+ // Verify hash — abort on mismatch
142
+ const downloadedHash = computeHash(content);
143
+ if (downloadedHash !== skill.hash) {
144
+ error(`Hash mismatch for ${chalk.bold(skill.name)}: expected ${skill.hash.slice(0, 12)}… got ${downloadedHash.slice(0, 12)}…. Aborting.`);
145
+ continue;
146
+ }
147
+ const dest = join(COMMANDS_DIR, safeFilename);
148
+ await writeFile(dest, content, "utf-8");
149
+ // Update state
150
+ state.installed[skill.name] = {
151
+ hash: skill.hash,
152
+ installedAt: new Date().toISOString(),
153
+ };
154
+ if (installedEntry) {
155
+ success(`Updated ${chalk.bold(skill.name)}.`);
156
+ }
157
+ else {
158
+ success(`Installed ${chalk.bold(skill.name)}. Use it with: ${chalk.cyan(`/${skill.name}`)}`);
159
+ }
160
+ }
161
+ catch (err) {
162
+ error(`Failed to install ${skill.name}: ${err.message}`);
163
+ }
164
+ }
165
+ state.lastKnownVersion = manifest.version;
166
+ state.lastCheckedAt = new Date().toISOString();
167
+ await saveState(state);
168
+ });
169
+ const updateCommand = new Command("update")
170
+ .description("Update all installed skills to their latest versions")
171
+ .action(async () => {
172
+ let manifest;
173
+ try {
174
+ manifest = await withSpinner("Fetching skills…", () => fetchSkillsManifest());
175
+ }
176
+ catch (err) {
177
+ error(err.message);
178
+ return;
179
+ }
180
+ const state = await loadState();
181
+ const installedNames = Object.keys(state.installed);
182
+ if (installedNames.length === 0) {
183
+ info("No skills installed. Run " + chalk.cyan("octopus skills install <name>") + " first.");
184
+ return;
185
+ }
186
+ let updated = 0;
187
+ let upToDate = 0;
188
+ for (const name of installedNames) {
189
+ const skill = manifest.skills.find((s) => s.name === name);
190
+ if (!skill) {
191
+ warn(`Skill "${name}" no longer exists in registry, skipping.`);
192
+ continue;
193
+ }
194
+ if (state.installed[name].hash === skill.hash) {
195
+ upToDate++;
196
+ continue;
197
+ }
198
+ try {
199
+ const safeFilename = validateFilename(skill.filename);
200
+ const content = await withSpinner(`Updating ${skill.name}…`, () => fetchSkillContent(safeFilename));
201
+ const downloadedHash = computeHash(content);
202
+ if (downloadedHash !== skill.hash) {
203
+ error(`Hash mismatch for ${chalk.bold(skill.name)}: expected ${skill.hash.slice(0, 12)}… got ${downloadedHash.slice(0, 12)}…. Aborting.`);
204
+ continue;
205
+ }
206
+ await mkdir(COMMANDS_DIR, { recursive: true });
207
+ await writeFile(join(COMMANDS_DIR, safeFilename), content, "utf-8");
208
+ state.installed[name] = {
209
+ hash: skill.hash,
210
+ installedAt: new Date().toISOString(),
211
+ };
212
+ updated++;
213
+ }
214
+ catch (err) {
215
+ error(`Failed to update ${name}: ${err.message}`);
216
+ }
217
+ }
218
+ state.lastKnownVersion = manifest.version;
219
+ state.lastCheckedAt = new Date().toISOString();
220
+ await saveState(state);
221
+ const parts = [];
222
+ if (updated > 0)
223
+ parts.push(`Updated ${updated} skill(s)`);
224
+ if (upToDate > 0)
225
+ parts.push(`${upToDate} already up to date`);
226
+ success(parts.join(", ") || "Nothing to update.");
227
+ });
228
+ const removeCommand = new Command("remove")
229
+ .description("Remove an installed skill")
230
+ .argument("<name>", "Skill name to remove")
231
+ .action(async (name) => {
232
+ const state = await loadState();
233
+ if (!state.installed[name]) {
234
+ error(`Skill "${name}" is not installed.`);
235
+ return;
236
+ }
237
+ // Try to find filename from manifest, fallback to name-based convention
238
+ let filename = `${name}.md`;
239
+ try {
240
+ const manifest = await fetchSkillsManifest();
241
+ const skill = manifest.skills.find((s) => s.name === name);
242
+ if (skill)
243
+ filename = skill.filename;
244
+ }
245
+ catch {
246
+ // Use fallback filename
247
+ }
248
+ const safeFilename = basename(filename);
249
+ const dest = join(COMMANDS_DIR, safeFilename);
250
+ try {
251
+ await unlink(dest);
252
+ }
253
+ catch (err) {
254
+ if (err.code !== "ENOENT") {
255
+ error(`Failed to remove file: ${err.message}`);
256
+ return;
257
+ }
258
+ }
259
+ delete state.installed[name];
260
+ await saveState(state);
261
+ success(`Removed ${chalk.bold(name)}.`);
262
+ });
263
+ // --- Startup check (exported for use in index.ts) ---
264
+ export async function checkSkillUpdates() {
265
+ try {
266
+ const state = await loadState();
267
+ // Throttle: max once per day
268
+ if (state.lastCheckedAt) {
269
+ const lastCheck = new Date(state.lastCheckedAt).getTime();
270
+ const oneDayMs = 24 * 60 * 60 * 1000;
271
+ if (Date.now() - lastCheck < oneDayMs)
272
+ return;
273
+ }
274
+ const url = `${getBaseUrl()}/skills/skills.json`;
275
+ const res = await fetch(url);
276
+ if (!res.ok)
277
+ return;
278
+ const manifest = (await res.json());
279
+ // Update check timestamp
280
+ state.lastCheckedAt = new Date().toISOString();
281
+ // New version available
282
+ if (manifest.version > state.lastKnownVersion && state.lastKnownVersion > 0) {
283
+ console.log(chalk.cyan("🆕 New skills available!") +
284
+ " Run " +
285
+ chalk.cyan("`octopus skills list`") +
286
+ " to see them.");
287
+ }
288
+ // Check for hash changes in installed skills
289
+ const installedNames = Object.keys(state.installed);
290
+ if (installedNames.length > 0) {
291
+ const hasUpdates = installedNames.some((name) => {
292
+ const remote = manifest.skills.find((s) => s.name === name);
293
+ return remote && state.installed[name].hash !== remote.hash;
294
+ });
295
+ if (hasUpdates) {
296
+ console.log(chalk.yellow("📦 Skill updates available.") +
297
+ " Run " +
298
+ chalk.cyan("`octopus skills update`"));
299
+ }
300
+ }
301
+ state.lastKnownVersion = manifest.version;
302
+ await saveState(state);
303
+ }
304
+ catch {
305
+ // Silently ignore — startup check must never block or crash
306
+ }
307
+ }
308
+ // --- Export command ---
126
309
  export const skillsCommand = new Command("skills")
127
310
  .description("Manage Octopus skills for AI coding agents")
311
+ .addCommand(listCommand)
128
312
  .addCommand(installCommand)
129
- .addCommand(listCommand);
313
+ .addCommand(updateCommand)
314
+ .addCommand(removeCommand);
130
315
  //# sourceMappingURL=skills.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAY,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAEnE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAQvD,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAEjD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,IAAI,GACR,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAChE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBACvC,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAmB;IACjD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,KAAK,EAAE,CAAC;IACV,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAmB;IAChD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE7C,kDAAkD;QAClD,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9D,KAAK,EAAE,CAAC;IACV,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mBAAmB;AAEnB,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KAC1C,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;KAClD,MAAM,CAAC,SAAS,EAAE,wBAAwB,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,IAA2C,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACzC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,WAAW,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,aAAa,WAAW,gBAAgB,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,UAAU,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,CAAC,aAAa,UAAU,gBAAgB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACpC,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvE,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;QAEtG,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACtB,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YACnC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YACtD,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;SACtD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,4CAA4C,CAAC;KACzD,UAAU,CAAC,cAAc,CAAC;KAC1B,UAAU,CAAC,WAAW,CAAC,CAAC"}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,7 @@
1
1
  import { Command } from "commander";
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { dirname, join } from "node:path";
2
5
  import { loginCommand } from "./commands/login.js";
3
6
  import { logoutCommand } from "./commands/logout.js";
4
7
  import { whoamiCommand } from "./commands/whoami.js";
@@ -6,14 +9,25 @@ import { configCommand } from "./commands/config.js";
6
9
  import { usageCommand } from "./commands/usage.js";
7
10
  import { repoCommand } from "./commands/repo/index.js";
8
11
  import { prCommand } from "./commands/pr/index.js";
12
+ import { reviewAction, PR_ARG_DESC } from "./commands/pr/review.js";
9
13
  import { knowledgeCommand } from "./commands/knowledge/index.js";
10
14
  import { analyzeDepsCommand } from "./commands/analyze-deps.js";
11
- import { skillsCommand } from "./commands/skills.js";
15
+ import { skillsCommand, checkSkillUpdates } from "./commands/skills.js";
16
+ import { agentCommand } from "./commands/agent/index.js";
17
+ let version = "0.0.0";
18
+ try {
19
+ const __dirname = dirname(fileURLToPath(import.meta.url));
20
+ const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
21
+ version = pkg.version ?? version;
22
+ }
23
+ catch {
24
+ // fall back to placeholder; CLI remains functional
25
+ }
12
26
  const program = new Command();
13
27
  program
14
28
  .name("octopus")
15
29
  .description("Octopus CLI — AI-powered PR review and codebase intelligence")
16
- .version("0.1.0");
30
+ .version(version);
17
31
  program.addCommand(loginCommand);
18
32
  program.addCommand(logoutCommand);
19
33
  program.addCommand(whoamiCommand);
@@ -24,5 +38,15 @@ program.addCommand(prCommand);
24
38
  program.addCommand(knowledgeCommand);
25
39
  program.addCommand(analyzeDepsCommand);
26
40
  program.addCommand(skillsCommand);
41
+ program.addCommand(agentCommand);
42
+ // Top-level alias: `octopus review` → `octopus pr review`
43
+ program
44
+ .command("review")
45
+ .argument("[pr]", PR_ARG_DESC)
46
+ .option("--pr <pr>", PR_ARG_DESC)
47
+ .description("Trigger an AI review on a pull request (alias for 'pr review')")
48
+ .action(reviewAction);
49
+ // Non-blocking startup check for skill updates
50
+ checkSkillUpdates();
27
51
  program.parse();
28
52
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,IAAI,OAAO,GAAG,OAAO,CAAC;AACtB,IAAI,CAAC;IACH,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACrF,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AACnC,CAAC;AAAC,MAAM,CAAC;IACP,mDAAmD;AACrD,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,0DAA0D;AAC1D,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;KAC7B,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC;KAChC,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,+CAA+C;AAC/C,iBAAiB,EAAE,CAAC;AAEpB,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@octp/cli",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "CLI tool for Octopus — AI-powered PR review and codebase intelligence",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",