panopticon-cli 0.3.3 → 0.3.6

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/README.md CHANGED
@@ -223,6 +223,21 @@ See [docs/DNS_SETUP.md](docs/DNS_SETUP.md) for detailed DNS configuration (espec
223
223
  - **Linear API key** - For issue tracking integration
224
224
  - **Beads CLI (bd)** - For persistent task tracking across sessions
225
225
 
226
+ ### Platform Support
227
+
228
+ The Panopticon dashboard includes terminal streaming, which requires a native binary (`node-pty`). Prebuilt binaries are available for:
229
+
230
+ | Platform | Architecture | Support |
231
+ |----------|-------------|---------|
232
+ | macOS | Intel (x64) | ✅ Prebuilt |
233
+ | macOS | Apple Silicon (arm64) | ✅ Prebuilt |
234
+ | Linux | x64 (glibc) | ✅ Prebuilt |
235
+ | Linux | arm64 (glibc) | ✅ Prebuilt |
236
+ | Linux | musl (Alpine) | ✅ Prebuilt |
237
+ | Windows | x64 | ✅ Prebuilt |
238
+
239
+ If a prebuilt binary is not available for your platform, node-gyp will automatically compile from source during installation (requires Python and build tools).
240
+
226
241
  ### Why CLI tools instead of API tokens?
227
242
 
228
243
  Panopticon uses `gh` and `glab` CLIs instead of raw API tokens because:
@@ -342,20 +357,27 @@ Cloister manages specialized agents that handle specific phases of the developme
342
357
 
343
358
  #### Merge Agent Workflow
344
359
 
345
- The merge-agent is a specialist that handles the entire PR merge process:
360
+ The merge-agent is a specialist that handles **ALL** merges, not just conflicts. This ensures:
361
+ - It sees all code changes coming through the pipeline
362
+ - It builds context about the codebase over time
363
+ - When conflicts DO occur, it has better understanding for intelligent resolution
364
+ - Tests are always run before completing the merge
365
+
366
+ **Workflow:**
346
367
 
347
368
  1. **Pull latest main** - Ensures local main is up-to-date
348
- 2. **Merge main into feature branch** - Brings in any changes from main
349
- 3. **Resolve conflicts** - Uses AI to resolve merge conflicts intelligently
350
- 4. **Run tests** - Verifies the merge didn't break anything
351
- 5. **Push changes** - Pushes the resolved merge
352
- 6. **Create/Update PR** - Creates a PR if one doesn't exist
353
- 7. **Merge PR** - Merges the PR using `gh pr merge`
369
+ 2. **Analyze incoming changes** - Reviews what the feature branch contains
370
+ 3. **Perform merge** - Merges feature branch into main
371
+ 4. **Resolve conflicts** - If conflicts exist, uses AI to resolve them intelligently
372
+ 5. **Run tests** - Verifies the merge didn't break anything
373
+ 6. **Commit merge** - Commits the merge with descriptive message
374
+ 7. **Report results** - Returns success/failure with details
354
375
 
355
376
  **Triggering merge-agent:**
356
377
 
357
378
  ```bash
358
379
  # Via dashboard - click "Approve & Merge" on an issue card
380
+ # merge-agent is ALWAYS invoked, regardless of whether conflicts exist
359
381
 
360
382
  # Via CLI
361
383
  pan specialists wake merge-agent --issue MIN-123
@@ -363,9 +385,9 @@ pan specialists wake merge-agent --issue MIN-123
363
385
 
364
386
  The merge-agent uses a specialized prompt template that instructs it to:
365
387
  - Never force-push
366
- - Always run tests before merging
388
+ - Always run tests before completing
367
389
  - Document conflict resolution decisions
368
- - Update the issue status on success
390
+ - Provide detailed feedback on what was merged
369
391
 
370
392
  #### Specialist Auto-Initialization
371
393
 
@@ -692,7 +714,7 @@ pan work health status
692
714
  pan work health daemon --interval 30
693
715
  ```
694
716
 
695
- ### GUPP Hooks
717
+ ### FPP Hooks (Fixed Point Principle)
696
718
 
697
719
  ```bash
698
720
  # Check for pending work on hook
@@ -1223,7 +1245,7 @@ This ensures every Panopticon-managed project has a well-defined canonical PRD t
1223
1245
  agent-min-123/
1224
1246
  state.json # Agent state (model, phase, complexity)
1225
1247
  health.json # Health status
1226
- hook.json # GUPP work queue
1248
+ hook.json # FPP work queue
1227
1249
  cv.json # Work history
1228
1250
  mail/ # Incoming messages
1229
1251
  handoffs/ # Handoff prompts (for debugging)
@@ -1289,11 +1311,15 @@ When an agent is stuck (no activity for 30+ minutes), Panopticon will:
1289
1311
  2. Record the kill in health.json
1290
1312
  3. Respawn with crash recovery context
1291
1313
 
1292
- ## GUPP (Give Up Push Pop)
1314
+ ## FPP (Fixed Point Principle)
1315
+
1316
+ > "Any runnable action is a fixed point and must resolve before the system can rest."
1317
+
1318
+ *Inspired by Doctor Who: a fixed point in time must occur — it cannot be avoided.*
1293
1319
 
1294
- > "If there is work on your Hook, YOU MUST RUN IT."
1320
+ **Fixed Point Principle (FPP):** Any runnable bead, hook, or agent action represents a fixed point in execution and must be resolved immediately. Panopticon continues executing until no fixed points remain.
1295
1321
 
1296
- GUPP ensures agents are self-propelling:
1322
+ FPP ensures agents are self-propelling:
1297
1323
  1. Work items are pushed to the agent's hook
1298
1324
  2. On spawn/recovery, the hook is checked
1299
1325
  3. Pending work is injected into the agent's prompt
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  PANOPTICON_HOME
3
- } from "./chunk-3SI436SZ.js";
3
+ } from "./chunk-P5TQ5C3J.js";
4
4
 
5
5
  // src/lib/projects.ts
6
6
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
@@ -170,4 +170,4 @@ export {
170
170
  createDefaultProjectsConfig,
171
171
  initializeProjectsConfig
172
172
  };
173
- //# sourceMappingURL=chunk-IVAFJ6DS.js.map
173
+ //# sourceMappingURL=chunk-BH6BR26M.js.map
@@ -7,7 +7,7 @@ import {
7
7
  SKILLS_DIR,
8
8
  SOURCE_SCRIPTS_DIR,
9
9
  SYNC_TARGETS
10
- } from "./chunk-3SI436SZ.js";
10
+ } from "./chunk-P5TQ5C3J.js";
11
11
 
12
12
  // src/lib/config.ts
13
13
  import { readFileSync, writeFileSync, existsSync } from "fs";
@@ -1445,4 +1445,4 @@ export {
1445
1445
  LinkManager,
1446
1446
  getLinkManager
1447
1447
  };
1448
- //# sourceMappingURL=chunk-ZT55DPAC.js.map
1448
+ //# sourceMappingURL=chunk-C6A7S65K.js.map
@@ -3,7 +3,7 @@ import { homedir } from "os";
3
3
  import { join } from "path";
4
4
  import { fileURLToPath } from "url";
5
5
  import { dirname } from "path";
6
- var PANOPTICON_HOME = join(homedir(), ".panopticon");
6
+ var PANOPTICON_HOME = process.env.PANOPTICON_HOME || join(homedir(), ".panopticon");
7
7
  var CONFIG_DIR = PANOPTICON_HOME;
8
8
  var SKILLS_DIR = join(PANOPTICON_HOME, "skills");
9
9
  var COMMANDS_DIR = join(PANOPTICON_HOME, "commands");
@@ -100,4 +100,4 @@ export {
100
100
  SOURCE_SCRIPTS_DIR,
101
101
  INIT_DIRS
102
102
  };
103
- //# sourceMappingURL=chunk-3SI436SZ.js.map
103
+ //# sourceMappingURL=chunk-P5TQ5C3J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/paths.ts"],"sourcesContent":["import { homedir } from 'os';\nimport { join } from 'path';\n\n// Panopticon home directory (can be overridden for testing)\nexport const PANOPTICON_HOME = process.env.PANOPTICON_HOME || join(homedir(), '.panopticon');\n\n// Subdirectories\nexport const CONFIG_DIR = PANOPTICON_HOME;\nexport const SKILLS_DIR = join(PANOPTICON_HOME, 'skills');\nexport const COMMANDS_DIR = join(PANOPTICON_HOME, 'commands');\nexport const AGENTS_DIR = join(PANOPTICON_HOME, 'agents');\nexport const BIN_DIR = join(PANOPTICON_HOME, 'bin');\nexport const BACKUPS_DIR = join(PANOPTICON_HOME, 'backups');\nexport const COSTS_DIR = join(PANOPTICON_HOME, 'costs');\nexport const HEARTBEATS_DIR = join(PANOPTICON_HOME, 'heartbeats');\n\n// Traefik directories\nexport const TRAEFIK_DIR = join(PANOPTICON_HOME, 'traefik');\nexport const TRAEFIK_DYNAMIC_DIR = join(TRAEFIK_DIR, 'dynamic');\nexport const TRAEFIK_CERTS_DIR = join(TRAEFIK_DIR, 'certs');\n\n// Legacy certs directory (for backwards compatibility)\nexport const CERTS_DIR = join(PANOPTICON_HOME, 'certs');\n\n// Config files\nexport const CONFIG_FILE = join(CONFIG_DIR, 'config.toml');\n\n// AI tool directories\nexport const CLAUDE_DIR = join(homedir(), '.claude');\nexport const CODEX_DIR = join(homedir(), '.codex');\nexport const CURSOR_DIR = join(homedir(), '.cursor');\nexport const GEMINI_DIR = join(homedir(), '.gemini');\n\n// Target sync locations\nexport const SYNC_TARGETS = {\n claude: {\n skills: join(CLAUDE_DIR, 'skills'),\n commands: join(CLAUDE_DIR, 'commands'),\n agents: join(CLAUDE_DIR, 'agents'),\n },\n codex: {\n skills: join(CODEX_DIR, 'skills'),\n commands: join(CODEX_DIR, 'commands'),\n agents: join(CODEX_DIR, 'agents'),\n },\n cursor: {\n skills: join(CURSOR_DIR, 'skills'),\n commands: join(CURSOR_DIR, 'commands'),\n agents: join(CURSOR_DIR, 'agents'),\n },\n gemini: {\n skills: join(GEMINI_DIR, 'skills'),\n commands: join(GEMINI_DIR, 'commands'),\n agents: join(GEMINI_DIR, 'agents'),\n },\n} as const;\n\nexport type Runtime = keyof typeof SYNC_TARGETS;\n\n// Templates directory (in user's ~/.panopticon)\nexport const TEMPLATES_DIR = join(PANOPTICON_HOME, 'templates');\nexport const CLAUDE_MD_TEMPLATES = join(TEMPLATES_DIR, 'claude-md', 'sections');\n\n// Source templates directory (bundled with the package)\n// This is resolved at runtime from the package root\nimport { fileURLToPath } from 'url';\nimport { dirname } from 'path';\n\nconst currentFile = fileURLToPath(import.meta.url);\nconst currentDir = dirname(currentFile);\n\n// Handle both development (src/lib/) and production (dist/) modes\n// In dev: /path/to/panopticon/src/lib/paths.ts -> /path/to/panopticon\n// In prod: /path/to/panopticon/dist/lib/paths.js -> /path/to/panopticon\nlet packageRoot: string;\nif (currentDir.includes('/src/')) {\n // Development mode - go up from src/lib to package root\n packageRoot = dirname(dirname(currentDir));\n} else {\n // Production mode - go up from dist (or dist/lib) to package root\n packageRoot = currentDir.endsWith('/lib')\n ? dirname(dirname(currentDir))\n : dirname(currentDir);\n}\n\nexport const SOURCE_TEMPLATES_DIR = join(packageRoot, 'templates');\nexport const SOURCE_TRAEFIK_TEMPLATES = join(SOURCE_TEMPLATES_DIR, 'traefik');\nexport const SOURCE_SCRIPTS_DIR = join(packageRoot, 'scripts');\n\n// All directories to create on init\nexport const INIT_DIRS = [\n PANOPTICON_HOME,\n SKILLS_DIR,\n COMMANDS_DIR,\n AGENTS_DIR,\n BIN_DIR,\n BACKUPS_DIR,\n COSTS_DIR,\n HEARTBEATS_DIR,\n TEMPLATES_DIR,\n CLAUDE_MD_TEMPLATES,\n CERTS_DIR,\n TRAEFIK_DIR,\n TRAEFIK_DYNAMIC_DIR,\n TRAEFIK_CERTS_DIR,\n];\n"],"mappings":";AAAA,SAAS,eAAe;AACxB,SAAS,YAAY;AAgErB,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AA9DjB,IAAM,kBAAkB,QAAQ,IAAI,mBAAmB,KAAK,QAAQ,GAAG,aAAa;AAGpF,IAAM,aAAa;AACnB,IAAM,aAAa,KAAK,iBAAiB,QAAQ;AACjD,IAAM,eAAe,KAAK,iBAAiB,UAAU;AACrD,IAAM,aAAa,KAAK,iBAAiB,QAAQ;AACjD,IAAM,UAAU,KAAK,iBAAiB,KAAK;AAC3C,IAAM,cAAc,KAAK,iBAAiB,SAAS;AACnD,IAAM,YAAY,KAAK,iBAAiB,OAAO;AAC/C,IAAM,iBAAiB,KAAK,iBAAiB,YAAY;AAGzD,IAAM,cAAc,KAAK,iBAAiB,SAAS;AACnD,IAAM,sBAAsB,KAAK,aAAa,SAAS;AACvD,IAAM,oBAAoB,KAAK,aAAa,OAAO;AAGnD,IAAM,YAAY,KAAK,iBAAiB,OAAO;AAG/C,IAAM,cAAc,KAAK,YAAY,aAAa;AAGlD,IAAM,aAAa,KAAK,QAAQ,GAAG,SAAS;AAC5C,IAAM,YAAY,KAAK,QAAQ,GAAG,QAAQ;AAC1C,IAAM,aAAa,KAAK,QAAQ,GAAG,SAAS;AAC5C,IAAM,aAAa,KAAK,QAAQ,GAAG,SAAS;AAG5C,IAAM,eAAe;AAAA,EAC1B,QAAQ;AAAA,IACN,QAAQ,KAAK,YAAY,QAAQ;AAAA,IACjC,UAAU,KAAK,YAAY,UAAU;AAAA,IACrC,QAAQ,KAAK,YAAY,QAAQ;AAAA,EACnC;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,KAAK,WAAW,QAAQ;AAAA,IAChC,UAAU,KAAK,WAAW,UAAU;AAAA,IACpC,QAAQ,KAAK,WAAW,QAAQ;AAAA,EAClC;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ,KAAK,YAAY,QAAQ;AAAA,IACjC,UAAU,KAAK,YAAY,UAAU;AAAA,IACrC,QAAQ,KAAK,YAAY,QAAQ;AAAA,EACnC;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ,KAAK,YAAY,QAAQ;AAAA,IACjC,UAAU,KAAK,YAAY,UAAU;AAAA,IACrC,QAAQ,KAAK,YAAY,QAAQ;AAAA,EACnC;AACF;AAKO,IAAM,gBAAgB,KAAK,iBAAiB,WAAW;AACvD,IAAM,sBAAsB,KAAK,eAAe,aAAa,UAAU;AAO9E,IAAM,cAAc,cAAc,YAAY,GAAG;AACjD,IAAM,aAAa,QAAQ,WAAW;AAKtC,IAAI;AACJ,IAAI,WAAW,SAAS,OAAO,GAAG;AAEhC,gBAAc,QAAQ,QAAQ,UAAU,CAAC;AAC3C,OAAO;AAEL,gBAAc,WAAW,SAAS,MAAM,IACpC,QAAQ,QAAQ,UAAU,CAAC,IAC3B,QAAQ,UAAU;AACxB;AAEO,IAAM,uBAAuB,KAAK,aAAa,WAAW;AAC1D,IAAM,2BAA2B,KAAK,sBAAsB,SAAS;AACrE,IAAM,qBAAqB,KAAK,aAAa,SAAS;AAGtD,IAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}