@agentprojectcontext/apx 1.2.0 → 1.3.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentprojectcontext/apx",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "APX — unified CLI + daemon for the Agent Project Context (APC) standard.",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -6,8 +6,9 @@ import fs from "node:fs";
6
6
  import https from "node:https";
7
7
  import http from "node:http";
8
8
  import readline from "node:readline";
9
- import { spawnSync, spawn } from "node:child_process";
10
- import { readConfig, writeConfig, APX_HOME } from "../../core/config.js";
9
+ import { spawnSync } from "node:child_process";
10
+ import { readConfig, writeConfig } from "../../core/config.js";
11
+ import { mascot } from "../../core/mascot.js";
11
12
 
12
13
  // ── ANSI helpers ──────────────────────────────────────────────────────────────
13
14
  const c = {
@@ -93,13 +94,8 @@ const PROVIDERS = [
93
94
  export async function cmdSetup() {
94
95
  initRl();
95
96
 
96
- console.log();
97
- console.log(b(cy(" ╔═══════════════════════════════════╗")));
98
- console.log(b(cy(" ║ APX Setup Wizard ║")));
99
- console.log(b(cy(" ╚═══════════════════════════════════╝")));
100
- console.log();
101
- console.log(di(" This will configure the APX daemon and super-agent."));
102
- console.log(di(" You can re-run `apx setup` at any time to change settings."));
97
+ mascot("wave", "Setup Wizard — configure daemon, model, and channels");
98
+ console.log(di(" Re-run `apx setup` anytime to change settings."));
103
99
  console.log();
104
100
 
105
101
  // ── Super-agent? ────────────────────────────────────────────────────────────
@@ -4,7 +4,7 @@ import { getLatestVersion } from "../../core/update-check.js";
4
4
 
5
5
  const PACKAGE_NAME = "@agentprojectcontext/apx";
6
6
 
7
- export async function cmdUpdate(args) {
7
+ export async function cmdUpdate(args, currentVersion) {
8
8
  const force = args.flags.force || args.flags.yes || args.flags.y;
9
9
 
10
10
  console.log("Checking for updates...");
@@ -15,12 +15,7 @@ export async function cmdUpdate(args) {
15
15
  process.exit(1);
16
16
  }
17
17
 
18
- // Read current version from the package that owns this file.
19
- const { createRequire } = await import("node:module");
20
- const { fileURLToPath } = await import("node:url");
21
- const require = createRequire(import.meta.url);
22
- const pkg = require("../../package.json");
23
- const current = pkg.version;
18
+ const current = currentVersion;
24
19
 
25
20
  function isNewer(cur, lat) {
26
21
  const parse = (v) => v.replace(/^v/, "").split(".").map(Number);
package/src/cli/index.js CHANGED
@@ -74,6 +74,7 @@ import { cmdCommandList, cmdCommandShow } from "./commands/command.js";
74
74
  import { cmdUpdate } from "./commands/update.js";
75
75
  import { cmdSetup } from "./commands/setup.js";
76
76
  import { checkForUpdate } from "../core/update-check.js";
77
+ import { mascot } from "../core/mascot.js";
77
78
  import {
78
79
  cmdRoutineList,
79
80
  cmdRoutineGet,
@@ -246,7 +247,9 @@ function parseArgs(argv) {
246
247
  }
247
248
 
248
249
  function die(msg, code = 1) {
249
- process.stderr.write(`apx: ${msg}\n`);
250
+ // Show panda mascot for user-facing errors
251
+ const isUnknown = msg.startsWith("unknown command") || msg.startsWith("unknown");
252
+ mascot(isUnknown ? "confused" : "sad", `apx: ${msg}`);
250
253
  process.exit(code);
251
254
  }
252
255
 
@@ -487,7 +490,7 @@ async function dispatch(cmd, rest) {
487
490
 
488
491
  case "update":
489
492
  case "upgrade":
490
- await cmdUpdate(parseArgs(rest));
493
+ await cmdUpdate(parseArgs(rest), VERSION);
491
494
  return; // skip checkForUpdate after an update
492
495
 
493
496
  default:
@@ -0,0 +1,124 @@
1
+ // APX mascot — a panda that appears in different moods across the CLI.
2
+ // Usage: import { mascot } from '../core/mascot.js'; mascot('happy');
3
+
4
+ const R = "\x1b[0m";
5
+ const B = "\x1b[1m";
6
+ const W = "\x1b[97m"; // bright white
7
+ const K = "\x1b[30m"; // black
8
+ const BK = "\x1b[40m"; // bg black
9
+ const BW = "\x1b[47m"; // bg white
10
+ const CY = "\x1b[36m";
11
+ const YE = "\x1b[33m";
12
+ const GR = "\x1b[32m";
13
+ const RE = "\x1b[31m";
14
+ const DI = "\x1b[2m";
15
+ const BL = "\x1b[34m";
16
+
17
+ // Each mood: [panda lines, caption]
18
+ const MOODS = {
19
+ // ─── happy: default greeting / daemon started ────────────────────────────
20
+ happy: {
21
+ color: GR,
22
+ lines: [
23
+ ` ${BK}${W} ▄███████▄ ${R}`,
24
+ ` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
25
+ ` ${BK}${W} █ ◕ ◕ █ ${R}`,
26
+ ` ${BK}${W} █ ╰ω╯ █ ${R}`,
27
+ ` ${BK}${W} ▀███████▀ ${R}`,
28
+ ` ${DI} ╱ ╲ ╱ ╲ ${R}`,
29
+ ],
30
+ caption: `${GR}${B}ready to go!${R}`,
31
+ },
32
+
33
+ // ─── wave: first run / setup ─────────────────────────────────────────────
34
+ wave: {
35
+ color: CY,
36
+ lines: [
37
+ ` ${BK}${W} ▄███████▄ ${R} 👋`,
38
+ ` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
39
+ ` ${BK}${W} █ ◕ ◕ █ ${R}`,
40
+ ` ${BK}${W} █ ╰▽╯ █ ${R}`,
41
+ ` ${BK}${W} ▀███████▀ ${R}`,
42
+ ` ${DI} ╱ ╲ ╱ ╲ ${R}`,
43
+ ],
44
+ caption: `${CY}${B}APX — Agent Project Context${R}`,
45
+ },
46
+
47
+ // ─── confused: unknown command / not found ────────────────────────────────
48
+ confused: {
49
+ color: YE,
50
+ lines: [
51
+ ` ${BK}${W} ▄███████▄ ${R} ${YE}?${R}`,
52
+ ` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
53
+ ` ${BK}${W} █ ◔ ◔ █ ${R}`,
54
+ ` ${BK}${W} █ ╰~╯ █ ${R}`,
55
+ ` ${BK}${W} ▀███████▀ ${R}`,
56
+ ` ${DI} ╱ ╲ ╱ ╲ ${R}`,
57
+ ],
58
+ caption: `${YE}${B}hmm, I don't know that one${R}`,
59
+ },
60
+
61
+ // ─── sad: error ───────────────────────────────────────────────────────────
62
+ sad: {
63
+ color: RE,
64
+ lines: [
65
+ ` ${BK}${W} ▄███████▄ ${R}`,
66
+ ` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
67
+ ` ${BK}${W} █ ╥ ╥ █ ${R}`,
68
+ ` ${BK}${W} █ ╰︵╯ █ ${R}`,
69
+ ` ${BK}${W} ▀███████▀ ${R}`,
70
+ ` ${DI} ╱ ╲ ╱ ╲ ${R}`,
71
+ ],
72
+ caption: `${RE}${B}something went wrong${R}`,
73
+ },
74
+
75
+ // ─── excited: update available ────────────────────────────────────────────
76
+ excited: {
77
+ color: BL,
78
+ lines: [
79
+ ` ${BK}${W} ▄███████▄ ${R} ${BL}⬆${R}`,
80
+ ` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
81
+ ` ${BK}${W} █ ★ ★ █ ${R}`,
82
+ ` ${BK}${W} █ ╰◡╯ █ ${R}`,
83
+ ` ${BK}${W} ▀███████▀ ${R}`,
84
+ ` ${DI} ╱ ╲ ╱ ╲ ${R}`,
85
+ ],
86
+ caption: `${BL}${B}new version available!${R}`,
87
+ },
88
+
89
+ // ─── sleeping: daemon not running ────────────────────────────────────────
90
+ sleeping: {
91
+ color: DI,
92
+ lines: [
93
+ ` ${BK}${W} ▄███████▄ ${R} ${DI}z z z${R}`,
94
+ ` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
95
+ ` ${BK}${W} █ − − █ ${R}`,
96
+ ` ${BK}${W} █ ╰_╯ █ ${R}`,
97
+ ` ${BK}${W} ▀███████▀ ${R}`,
98
+ ` ${DI} ╱ ╲ ╱ ╲ ${R}`,
99
+ ],
100
+ caption: `${DI}${B}daemon is not running${R}`,
101
+ },
102
+ };
103
+
104
+ // Print the mascot to stderr (doesn't interfere with piped output).
105
+ // mood: 'happy' | 'wave' | 'confused' | 'sad' | 'excited' | 'sleeping'
106
+ export function mascot(mood = "happy", message = "") {
107
+ const def = MOODS[mood] || MOODS.happy;
108
+ const out = [
109
+ "",
110
+ ...def.lines,
111
+ ` ${def.caption}`,
112
+ message ? ` ${def.color}${message}${R}` : "",
113
+ "",
114
+ ].join("\n");
115
+ process.stderr.write(out + "\n");
116
+ }
117
+
118
+ // One-liner for inline use: mascot.confused("apx: unknown command: foo")
119
+ mascot.confused = (msg) => mascot("confused", msg);
120
+ mascot.sad = (msg) => mascot("sad", msg);
121
+ mascot.happy = (msg) => mascot("happy", msg);
122
+ mascot.wave = (msg) => mascot("wave", msg);
123
+ mascot.excited = (msg) => mascot("excited", msg);
124
+ mascot.sleeping = (msg) => mascot("sleeping", msg);