panopticon-cli 0.5.8 → 0.5.10

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 (100) hide show
  1. package/README.md +29 -83
  2. package/dist/{agents-I6RAEGL5.js → agents-MOMDECON.js} +8 -6
  3. package/dist/{archive-planning-U3AZAKWI.js → archive-planning-54J6EP6A.js} +3 -3
  4. package/dist/{chunk-UKSGE6RH.js → chunk-3KYTNMSE.js} +1 -2
  5. package/dist/{chunk-UKSGE6RH.js.map → chunk-3KYTNMSE.js.map} +1 -1
  6. package/dist/{chunk-M6ZVVKZ3.js → chunk-4OQ4SXQZ.js} +219 -107
  7. package/dist/chunk-4OQ4SXQZ.js.map +1 -0
  8. package/dist/{chunk-ZMJFEHGF.js → chunk-7ZB5D46Y.js} +2 -2
  9. package/dist/{chunk-ZMJFEHGF.js.map → chunk-7ZB5D46Y.js.map} +1 -1
  10. package/dist/{chunk-BYWVPPAZ.js → chunk-BHRMW7BY.js} +31 -4
  11. package/dist/chunk-BHRMW7BY.js.map +1 -0
  12. package/dist/{chunk-WEQW3EAT.js → chunk-F4XS2FQN.js} +3 -2
  13. package/dist/chunk-F4XS2FQN.js.map +1 -0
  14. package/dist/{chunk-OJF4QS3S.js → chunk-GIW2TUWI.js} +2 -2
  15. package/dist/{chunk-SUM2WVPF.js → chunk-H7T35QDO.js} +30 -12
  16. package/dist/chunk-H7T35QDO.js.map +1 -0
  17. package/dist/{chunk-MJXYTGK5.js → chunk-JZWCL5S5.js} +2 -2
  18. package/dist/{chunk-ZN5RHWGR.js → chunk-PFA5XE2V.js} +5 -41
  19. package/dist/chunk-PFA5XE2V.js.map +1 -0
  20. package/dist/{chunk-6OYUJ4AJ.js → chunk-R47UJWF6.js} +2 -2
  21. package/dist/{chunk-NYOGHGIW.js → chunk-RCYJK3ZC.js} +10 -9
  22. package/dist/chunk-RCYJK3ZC.js.map +1 -0
  23. package/dist/{chunk-R4KPLLRB.js → chunk-SFX3BG6N.js} +1 -1
  24. package/dist/chunk-SFX3BG6N.js.map +1 -0
  25. package/dist/{chunk-IZIXJYXZ.js → chunk-TA5X4QYQ.js} +6 -2
  26. package/dist/{chunk-IZIXJYXZ.js.map → chunk-TA5X4QYQ.js.map} +1 -1
  27. package/dist/{chunk-43F4LDZ4.js → chunk-VVTAPQOI.js} +2 -2
  28. package/dist/{chunk-YAAT66RT.js → chunk-WP6ZLWU3.js} +28 -3
  29. package/dist/chunk-WP6ZLWU3.js.map +1 -0
  30. package/dist/clean-planning-V4SSVU26.js +9 -0
  31. package/dist/cli/index.js +1654 -1056
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/close-issue-5OMOP2FU.js +9 -0
  34. package/dist/compact-beads-YQDVF6FQ.js +9 -0
  35. package/dist/dashboard/prompts/inspect-agent.md +157 -0
  36. package/dist/dashboard/prompts/merge-agent.md +11 -0
  37. package/dist/dashboard/prompts/review-agent.md +9 -0
  38. package/dist/dashboard/prompts/test-agent.md +9 -0
  39. package/dist/dashboard/prompts/uat-agent.md +215 -0
  40. package/dist/dashboard/prompts/work-agent.md +53 -5
  41. package/dist/dashboard/public/assets/index-5hYjhhGn.js +826 -0
  42. package/dist/dashboard/public/assets/index-DIFh3T1V.css +32 -0
  43. package/dist/dashboard/public/index.html +3 -6
  44. package/dist/dashboard/server.js +3338 -2033
  45. package/dist/factory-KKT7324R.js +20 -0
  46. package/dist/{feedback-writer-T2WCT6EZ.js → feedback-writer-IPPIUPDX.js} +2 -2
  47. package/dist/feedback-writer-IPPIUPDX.js.map +1 -0
  48. package/dist/index.d.ts +8 -3
  49. package/dist/index.js +19 -19
  50. package/dist/{label-cleanup-4HJVX6NP.js → label-cleanup-4IVZIPGK.js} +2 -2
  51. package/dist/{merge-agent-ZITLVF2B.js → merge-agent-6YOMGQMX.js} +16 -16
  52. package/dist/{projects-3CRF57ZU.js → projects-BPGM6IFB.js} +2 -2
  53. package/dist/{remote-workspace-M4IULGFZ.js → remote-workspace-LKRDGYEB.js} +2 -2
  54. package/dist/{review-status-J2YJGL3E.js → review-status-E77PZZWG.js} +2 -2
  55. package/dist/{specialist-context-W25PPWM4.js → specialist-context-GVF4DV3M.js} +5 -5
  56. package/dist/{specialist-logs-KPC45SZN.js → specialist-logs-W47SAAIU.js} +5 -5
  57. package/dist/{specialists-H4LGYR7R.js → specialists-SIXRWCZ3.js} +5 -5
  58. package/dist/{traefik-QXLZ4PO2.js → traefik-X2IWTUHO.js} +3 -3
  59. package/dist/{workspace-manager-G6TTBPC3.js → workspace-manager-Z57ROWBQ.js} +2 -2
  60. package/dist/workspace-manager-Z57ROWBQ.js.map +1 -0
  61. package/package.json +1 -1
  62. package/scripts/inspect-on-bead-close +73 -0
  63. package/scripts/stop-hook +17 -0
  64. package/skills/pan-new-project/SKILL.md +1 -1
  65. package/skills/pan-oversee/SKILL.md +45 -10
  66. package/skills/plan/SKILL.md +336 -0
  67. package/dist/chunk-BYWVPPAZ.js.map +0 -1
  68. package/dist/chunk-M6ZVVKZ3.js.map +0 -1
  69. package/dist/chunk-NYOGHGIW.js.map +0 -1
  70. package/dist/chunk-R4KPLLRB.js.map +0 -1
  71. package/dist/chunk-SUM2WVPF.js.map +0 -1
  72. package/dist/chunk-WEQW3EAT.js.map +0 -1
  73. package/dist/chunk-YAAT66RT.js.map +0 -1
  74. package/dist/chunk-ZN5RHWGR.js.map +0 -1
  75. package/dist/clean-planning-7Z5YY64X.js +0 -9
  76. package/dist/close-issue-CTZK777I.js +0 -9
  77. package/dist/compact-beads-72SHALOL.js +0 -9
  78. package/dist/dashboard/public/assets/index-Bx4NCn9A.css +0 -32
  79. package/dist/dashboard/public/assets/index-C7hJ5-o1.js +0 -756
  80. package/dist/feedback-writer-T2WCT6EZ.js.map +0 -1
  81. package/skills/opus-plan/SKILL.md +0 -400
  82. /package/dist/{agents-I6RAEGL5.js.map → agents-MOMDECON.js.map} +0 -0
  83. /package/dist/{archive-planning-U3AZAKWI.js.map → archive-planning-54J6EP6A.js.map} +0 -0
  84. /package/dist/{chunk-OJF4QS3S.js.map → chunk-GIW2TUWI.js.map} +0 -0
  85. /package/dist/{chunk-MJXYTGK5.js.map → chunk-JZWCL5S5.js.map} +0 -0
  86. /package/dist/{chunk-6OYUJ4AJ.js.map → chunk-R47UJWF6.js.map} +0 -0
  87. /package/dist/{chunk-43F4LDZ4.js.map → chunk-VVTAPQOI.js.map} +0 -0
  88. /package/dist/{clean-planning-7Z5YY64X.js.map → clean-planning-V4SSVU26.js.map} +0 -0
  89. /package/dist/{close-issue-CTZK777I.js.map → close-issue-5OMOP2FU.js.map} +0 -0
  90. /package/dist/{compact-beads-72SHALOL.js.map → compact-beads-YQDVF6FQ.js.map} +0 -0
  91. /package/dist/{projects-3CRF57ZU.js.map → factory-KKT7324R.js.map} +0 -0
  92. /package/dist/{label-cleanup-4HJVX6NP.js.map → label-cleanup-4IVZIPGK.js.map} +0 -0
  93. /package/dist/{merge-agent-ZITLVF2B.js.map → merge-agent-6YOMGQMX.js.map} +0 -0
  94. /package/dist/{review-status-J2YJGL3E.js.map → projects-BPGM6IFB.js.map} +0 -0
  95. /package/dist/{remote-workspace-M4IULGFZ.js.map → remote-workspace-LKRDGYEB.js.map} +0 -0
  96. /package/dist/{specialist-logs-KPC45SZN.js.map → review-status-E77PZZWG.js.map} +0 -0
  97. /package/dist/{specialist-context-W25PPWM4.js.map → specialist-context-GVF4DV3M.js.map} +0 -0
  98. /package/dist/{specialists-H4LGYR7R.js.map → specialist-logs-W47SAAIU.js.map} +0 -0
  99. /package/dist/{traefik-QXLZ4PO2.js.map → specialists-SIXRWCZ3.js.map} +0 -0
  100. /package/dist/{workspace-manager-G6TTBPC3.js.map → traefik-X2IWTUHO.js.map} +0 -0
@@ -0,0 +1,20 @@
1
+ import {
2
+ createTracker,
3
+ createTrackerFromConfig,
4
+ getAllTrackers,
5
+ getPrimaryTracker,
6
+ getSecondaryTracker,
7
+ init_factory
8
+ } from "./chunk-3KYTNMSE.js";
9
+ import "./chunk-ZP6EWSZV.js";
10
+ import "./chunk-DMRTN432.js";
11
+ import "./chunk-ZHC57RCV.js";
12
+ init_factory();
13
+ export {
14
+ createTracker,
15
+ createTrackerFromConfig,
16
+ getAllTrackers,
17
+ getPrimaryTracker,
18
+ getSecondaryTracker
19
+ };
20
+ //# sourceMappingURL=factory-KKT7324R.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  init_projects,
3
3
  resolveProjectFromIssue
4
- } from "./chunk-ZMJFEHGF.js";
4
+ } from "./chunk-7ZB5D46Y.js";
5
5
  import "./chunk-ZTFNYOC7.js";
6
6
  import {
7
7
  __esm,
@@ -112,4 +112,4 @@ init_feedback_writer();
112
112
  export {
113
113
  writeFeedbackFile
114
114
  };
115
- //# sourceMappingURL=feedback-writer-T2WCT6EZ.js.map
115
+ //# sourceMappingURL=feedback-writer-IPPIUPDX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/cloister/feedback-writer.ts"],"sourcesContent":["/**\n * Feedback Writer — writes specialist feedback to workspace files.\n *\n * All specialist feedback (review, test, merge) is written to\n * .planning/feedback/ in the workspace, with a breadcrumb in STATE.md.\n * The work agent reads these on startup or after crash recovery.\n *\n * All I/O is async (fs/promises) — never execSync.\n */\n\nimport { writeFile, readFile, mkdir, readdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { resolveProjectFromIssue } from '../projects.js';\n\nexport interface WriteFeedbackOptions {\n issueId: string;\n workspacePath?: string;\n specialist: 'verification-gate' | 'review-agent' | 'test-agent' | 'inspect-agent' | 'uat-agent' | 'merge-agent';\n outcome: string;\n summary: string;\n markdownBody: string;\n}\n\nexport interface WriteFeedbackResult {\n success: boolean;\n /** Relative path from workspace root */\n relativePath?: string;\n /** Absolute path */\n filePath?: string;\n error?: string;\n}\n\n/**\n * Resolve workspace path from an issue ID.\n */\nfunction resolveWorkspacePath(issueId: string): string | null {\n const resolved = resolveProjectFromIssue(issueId);\n if (!resolved) return null;\n\n const wsPath = join(resolved.projectPath, 'workspaces', `feature-${issueId.toLowerCase()}`);\n return existsSync(wsPath) ? wsPath : null;\n}\n\n/**\n * Get the next sequence number from existing files in the feedback directory.\n */\nasync function getNextSequenceNumber(feedbackDir: string): Promise<number> {\n try {\n const files = await readdir(feedbackDir);\n let max = 0;\n for (const file of files) {\n const match = file.match(/^(\\d{3})-/);\n if (match) {\n const n = parseInt(match[1], 10);\n if (n > max) max = n;\n }\n }\n return max + 1;\n } catch {\n return 1;\n }\n}\n\n/**\n * Append a feedback entry to STATE.md's \"Specialist Feedback\" section.\n * Creates the section if it doesn't exist. Creates STATE.md if it doesn't exist.\n */\nasync function appendToStateMd(\n planningDir: string,\n entry: { timestamp: string; specialist: string; outcome: string; relativePath: string; issueId: string }\n): Promise<void> {\n const statePath = join(planningDir, 'STATE.md');\n const line = `- **[${entry.timestamp}] ${entry.specialist} → ${entry.outcome.toUpperCase()}** — \\`${entry.relativePath}\\``;\n\n let content: string;\n try {\n content = await readFile(statePath, 'utf-8');\n } catch {\n // STATE.md doesn't exist — create a minimal one\n content = `# Agent State: ${entry.issueId}\\n`;\n }\n\n const sectionHeader = '## Specialist Feedback';\n const sectionIndex = content.indexOf(sectionHeader);\n\n if (sectionIndex >= 0) {\n // Find the end of the section (next ## or EOF)\n const afterHeader = sectionIndex + sectionHeader.length;\n const nextSection = content.indexOf('\\n## ', afterHeader);\n const insertPos = nextSection >= 0 ? nextSection : content.length;\n content = content.slice(0, insertPos).trimEnd() + '\\n' + line + '\\n' + content.slice(insertPos);\n } else {\n // Append the section at the end\n content = content.trimEnd() + '\\n\\n' + sectionHeader + '\\n\\n' + line + '\\n';\n }\n\n await writeFile(statePath, content, 'utf-8');\n}\n\n/**\n * Write specialist feedback to a file in the workspace and update STATE.md.\n */\nexport async function writeFeedbackFile(opts: WriteFeedbackOptions): Promise<WriteFeedbackResult> {\n // Validate workspacePath — reject project roots (must contain /workspaces/ or have .planning dir)\n let providedPath = opts.workspacePath;\n if (providedPath && !existsSync(join(providedPath, '.planning')) && !providedPath.includes('/workspaces/')) {\n // Looks like a project root, not a workspace — fall back to resolution\n providedPath = undefined;\n }\n const workspacePath = providedPath || resolveWorkspacePath(opts.issueId);\n if (!workspacePath) {\n return { success: false, error: `Workspace not found for ${opts.issueId}` };\n }\n\n const planningDir = join(workspacePath, '.planning');\n const feedbackDir = join(planningDir, 'feedback');\n\n try {\n await mkdir(feedbackDir, { recursive: true });\n\n const seq = await getNextSequenceNumber(feedbackDir);\n const seqStr = String(seq).padStart(3, '0');\n const filename = `${seqStr}-${opts.specialist}-${opts.outcome}.md`;\n const filePath = join(feedbackDir, filename);\n const relativePath = `.planning/feedback/${filename}`;\n\n const timestamp = new Date().toISOString().replace(/\\.\\d+Z$/, 'Z');\n const shortTimestamp = timestamp.replace(/:\\d{2}Z$/, 'Z');\n\n const content = [\n '---',\n `specialist: ${opts.specialist}`,\n `issueId: ${opts.issueId}`,\n `outcome: ${opts.outcome}`,\n `timestamp: ${timestamp}`,\n '---',\n '',\n opts.markdownBody,\n '',\n ].join('\\n');\n\n await writeFile(filePath, content, 'utf-8');\n\n // Update STATE.md with breadcrumb\n await appendToStateMd(planningDir, {\n timestamp: shortTimestamp,\n specialist: opts.specialist,\n outcome: opts.outcome,\n relativePath,\n issueId: opts.issueId,\n });\n\n console.log(`[feedback-writer] Wrote ${relativePath} for ${opts.issueId}`);\n return { success: true, relativePath, filePath };\n } catch (error: any) {\n console.error(`[feedback-writer] Failed to write feedback for ${opts.issueId}:`, error);\n return { success: false, error: error.message };\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -390,9 +390,14 @@ interface MigrationResult {
390
390
  * .panopticon directories. Removes only those symlinks, preserving any
391
391
  * user-created content (real files/directories).
392
392
  *
393
- * This is safe to run multiple times — it's a no-op if no symlinks remain.
393
+ * This is safe to run multiple times — it's a no-op if nothing remains to clean up.
394
+ *
395
+ * Removes two kinds of stale Panopticon content from ~/.claude/:
396
+ * 1. Symlinks pointing to .panopticon or panopticon-cli (legacy sync method)
397
+ * 2. Plain directories that also exist in the devroot (stale copies from before
398
+ * the devroot migration — these cause duplicate skill listings)
394
399
  */
395
- declare function migrateFromPersonalSymlinks(): MigrationResult;
400
+ declare function migrateStalePersonalContent(): MigrationResult;
396
401
  interface RefreshCacheResult {
397
402
  skills: {
398
403
  copied: number;
@@ -849,4 +854,4 @@ declare function setupCredentialFileAuth(provider: ProviderConfig, workspacePath
849
854
  */
850
855
  declare function clearCredentialFileAuth(workspacePath: string): void;
851
856
 
852
- export { AGENTS_DIR, ARCHIVES_DIR, type AnthropicModel, type ApiKeysConfig, BACKUPS_DIR, BIN_DIR, type BackupInfo, CACHE_AGENTS_DIR, CACHE_MANIFEST, CACHE_RULES_DIR, CACHE_SKILLS_DIR, CERTS_DIR, CLAUDE_DIR, CLAUDE_MD_TEMPLATES, COMMANDS_DIR, CONFIG_DIR, CONFIG_FILE, COSTS_DIR, type Comment, type ComplexityLevel, type ComplexityModels, DOCS_DIR, type DevrootSyncItem, type GitHubConfig, GitHubTracker, type GitLabConfig, GitLabTracker, type GoogleModel, HEARTBEATS_DIR, type HookItem, INIT_DIRS, type Issue, type IssueFilters, IssueNotFoundError, type IssueState, type IssueTracker, type IssueUpdate, type KimiModel, LEGACY_RUNTIME_DIRS, type LinearConfig, LinearTracker, type LinkDirection, LinkManager, type MigrationResult, type ModelId, type ModelsConfig, type NewIssue, NotImplementedError, type OpenAIModel, PANOPTICON_HOME, PRDS_DIR, PRD_DRAFTS_DIR, PRD_PUBLISHED_DIR, PROJECT_DOCS_SUBDIR, PROJECT_PRDS_ACTIVE_SUBDIR, PROJECT_PRDS_COMPLETED_SUBDIR, PROJECT_PRDS_PLANNED_SUBDIR, PROJECT_PRDS_SUBDIR, PROVIDERS, type PanopticonConfig, type ProviderAuthType, type ProviderCompatibility, type ProviderConfig, type ProviderName, type RallyConfig, type RefreshCacheResult, type RemoteConfig, type RemoteFlyConfig, SETTINGS_FILE, SKILLS_DIR, SOURCE_AGENTS_DIR, SOURCE_DEV_SKILLS_DIR, SOURCE_RULES_DIR, SOURCE_SCRIPTS_DIR, SOURCE_SKILLS_DIR, SOURCE_TEMPLATES_DIR, SOURCE_TRAEFIK_TEMPLATES, SYNC_TARGET, type SettingsConfig, type ShadowConfig, type Shell, type SpecialistModels, type SyncItem, type SyncOptions, type SyncPlan, type SyncResult, TEMPLATES_DIR, TRAEFIK_CERTS_DIR, TRAEFIK_DIR, TRAEFIK_DYNAMIC_DIR, TrackerAuthError, type TrackerConfig, type TrackerConfigItem, type TrackerLink, type TrackerType, type TrackersConfig, type ZAIModel, addAlias, cleanOldBackups, clearCredentialFileAuth, createBackup, createBackupTimestamp, createTracker, createTrackerFromConfig, detectShell, executeSync, findDevrootForProject, formatIssueRef, getAgentCommand, getAliasInstructions, getAllTrackers, getAvailableModels, getClaudeModelFlag, getDashboardApiUrl, getDefaultConfig, getDefaultSettings, getDevrootPath, getDirectProviders, getLinkManager, getPanopticonHome, getPrimaryTracker, getProviderEnv, getProviderForModel, getRouterProviders, getSecondaryTracker, getShellRcFile, hasAlias, isAnthropicModel, isDevMode, isPanopticonSymlink, listBackups, loadConfig, loadSettings, migrateFromPersonalSymlinks, needsRouter, parseIssueRef, planHooksSync, planSync, refreshCache, requiresRouter, restoreBackup, saveConfig, saveSettings, setupCredentialFileAuth, syncHooks, syncStatusline, validateSettings };
857
+ export { AGENTS_DIR, ARCHIVES_DIR, type AnthropicModel, type ApiKeysConfig, BACKUPS_DIR, BIN_DIR, type BackupInfo, CACHE_AGENTS_DIR, CACHE_MANIFEST, CACHE_RULES_DIR, CACHE_SKILLS_DIR, CERTS_DIR, CLAUDE_DIR, CLAUDE_MD_TEMPLATES, COMMANDS_DIR, CONFIG_DIR, CONFIG_FILE, COSTS_DIR, type Comment, type ComplexityLevel, type ComplexityModels, DOCS_DIR, type DevrootSyncItem, type GitHubConfig, GitHubTracker, type GitLabConfig, GitLabTracker, type GoogleModel, HEARTBEATS_DIR, type HookItem, INIT_DIRS, type Issue, type IssueFilters, IssueNotFoundError, type IssueState, type IssueTracker, type IssueUpdate, type KimiModel, LEGACY_RUNTIME_DIRS, type LinearConfig, LinearTracker, type LinkDirection, LinkManager, type MigrationResult, type ModelId, type ModelsConfig, type NewIssue, NotImplementedError, type OpenAIModel, PANOPTICON_HOME, PRDS_DIR, PRD_DRAFTS_DIR, PRD_PUBLISHED_DIR, PROJECT_DOCS_SUBDIR, PROJECT_PRDS_ACTIVE_SUBDIR, PROJECT_PRDS_COMPLETED_SUBDIR, PROJECT_PRDS_PLANNED_SUBDIR, PROJECT_PRDS_SUBDIR, PROVIDERS, type PanopticonConfig, type ProviderAuthType, type ProviderCompatibility, type ProviderConfig, type ProviderName, type RallyConfig, type RefreshCacheResult, type RemoteConfig, type RemoteFlyConfig, SETTINGS_FILE, SKILLS_DIR, SOURCE_AGENTS_DIR, SOURCE_DEV_SKILLS_DIR, SOURCE_RULES_DIR, SOURCE_SCRIPTS_DIR, SOURCE_SKILLS_DIR, SOURCE_TEMPLATES_DIR, SOURCE_TRAEFIK_TEMPLATES, SYNC_TARGET, type SettingsConfig, type ShadowConfig, type Shell, type SpecialistModels, type SyncItem, type SyncOptions, type SyncPlan, type SyncResult, TEMPLATES_DIR, TRAEFIK_CERTS_DIR, TRAEFIK_DIR, TRAEFIK_DYNAMIC_DIR, TrackerAuthError, type TrackerConfig, type TrackerConfigItem, type TrackerLink, type TrackerType, type TrackersConfig, type ZAIModel, addAlias, cleanOldBackups, clearCredentialFileAuth, createBackup, createBackupTimestamp, createTracker, createTrackerFromConfig, detectShell, executeSync, findDevrootForProject, formatIssueRef, getAgentCommand, getAliasInstructions, getAllTrackers, getAvailableModels, getClaudeModelFlag, getDashboardApiUrl, getDefaultConfig, getDefaultSettings, getDevrootPath, getDirectProviders, getLinkManager, getPanopticonHome, getPrimaryTracker, getProviderEnv, getProviderForModel, getRouterProviders, getSecondaryTracker, getShellRcFile, hasAlias, isAnthropicModel, isDevMode, isPanopticonSymlink, listBackups, loadConfig, loadSettings, migrateStalePersonalContent, needsRouter, parseIssueRef, planHooksSync, planSync, refreshCache, requiresRouter, restoreBackup, saveConfig, saveSettings, setupCredentialFileAuth, syncHooks, syncStatusline, validateSettings };
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  hasAlias,
14
14
  isPanopticonSymlink,
15
15
  listBackups,
16
- migrateFromPersonalSymlinks,
16
+ migrateStalePersonalContent,
17
17
  parseIssueRef,
18
18
  planHooksSync,
19
19
  planSync,
@@ -21,18 +21,8 @@ import {
21
21
  restoreBackup,
22
22
  syncHooks,
23
23
  syncStatusline
24
- } from "./chunk-SUM2WVPF.js";
24
+ } from "./chunk-H7T35QDO.js";
25
25
  import "./chunk-AQXETQHW.js";
26
- import {
27
- GitHubTracker,
28
- GitLabTracker,
29
- LinearTracker,
30
- createTracker,
31
- createTrackerFromConfig,
32
- getAllTrackers,
33
- getPrimaryTracker,
34
- getSecondaryTracker
35
- } from "./chunk-UKSGE6RH.js";
36
26
  import {
37
27
  PROVIDERS,
38
28
  clearCredentialFileAuth,
@@ -63,12 +53,6 @@ import {
63
53
  loadConfig,
64
54
  saveConfig
65
55
  } from "./chunk-QAJAJBFW.js";
66
- import "./chunk-ZP6EWSZV.js";
67
- import {
68
- IssueNotFoundError,
69
- NotImplementedError,
70
- TrackerAuthError
71
- } from "./chunk-DMRTN432.js";
72
56
  import {
73
57
  AGENTS_DIR,
74
58
  ARCHIVES_DIR,
@@ -116,6 +100,22 @@ import {
116
100
  init_paths,
117
101
  isDevMode
118
102
  } from "./chunk-ZTFNYOC7.js";
103
+ import {
104
+ GitHubTracker,
105
+ GitLabTracker,
106
+ LinearTracker,
107
+ createTracker,
108
+ createTrackerFromConfig,
109
+ getAllTrackers,
110
+ getPrimaryTracker,
111
+ getSecondaryTracker
112
+ } from "./chunk-3KYTNMSE.js";
113
+ import "./chunk-ZP6EWSZV.js";
114
+ import {
115
+ IssueNotFoundError,
116
+ NotImplementedError,
117
+ TrackerAuthError
118
+ } from "./chunk-DMRTN432.js";
119
119
  import {
120
120
  init_esm_shims
121
121
  } from "./chunk-ZHC57RCV.js";
@@ -213,7 +213,7 @@ export {
213
213
  listBackups,
214
214
  loadConfig,
215
215
  loadSettings,
216
- migrateFromPersonalSymlinks,
216
+ migrateStalePersonalContent,
217
217
  needsRouter,
218
218
  parseIssueRef,
219
219
  planHooksSync,
@@ -3,7 +3,7 @@ import {
3
3
  stepFailed,
4
4
  stepOk,
5
5
  stepSkipped
6
- } from "./chunk-R4KPLLRB.js";
6
+ } from "./chunk-SFX3BG6N.js";
7
7
  import {
8
8
  init_esm_shims
9
9
  } from "./chunk-ZHC57RCV.js";
@@ -100,4 +100,4 @@ async function cleanupLabelsLinear(ctx, apiKey) {
100
100
  export {
101
101
  cleanupMergedLabels
102
102
  };
103
- //# sourceMappingURL=label-cleanup-4HJVX6NP.js.map
103
+ //# sourceMappingURL=label-cleanup-4IVZIPGK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveGitHubIssue
3
- } from "./chunk-YAAT66RT.js";
3
+ } from "./chunk-WP6ZLWU3.js";
4
4
  import {
5
5
  getTmuxSessionName,
6
6
  init_specialists,
@@ -8,13 +8,13 @@ import {
8
8
  recordWake,
9
9
  spawnEphemeralSpecialist,
10
10
  wakeSpecialist
11
- } from "./chunk-M6ZVVKZ3.js";
11
+ } from "./chunk-4OQ4SXQZ.js";
12
12
  import "./chunk-JQBV3Q2W.js";
13
13
  import {
14
14
  init_workspace_config,
15
15
  replacePlaceholders
16
16
  } from "./chunk-AAP4G6U7.js";
17
- import "./chunk-ZN5RHWGR.js";
17
+ import "./chunk-PFA5XE2V.js";
18
18
  import "./chunk-USYP2SBE.js";
19
19
  import {
20
20
  init_config,
@@ -24,17 +24,17 @@ import {
24
24
  init_projects,
25
25
  loadProjectsConfig,
26
26
  resolveProjectFromIssue
27
- } from "./chunk-ZMJFEHGF.js";
27
+ } from "./chunk-7ZB5D46Y.js";
28
28
  import {
29
29
  init_tmux,
30
30
  sendKeysAsync,
31
31
  sessionExists
32
32
  } from "./chunk-W2OTF6OS.js";
33
- import "./chunk-ZP6EWSZV.js";
34
33
  import {
35
34
  PANOPTICON_HOME,
36
35
  init_paths
37
36
  } from "./chunk-ZTFNYOC7.js";
37
+ import "./chunk-ZP6EWSZV.js";
38
38
  import {
39
39
  init_esm_shims
40
40
  } from "./chunk-ZHC57RCV.js";
@@ -534,7 +534,7 @@ async function postMergeLifecycle(issueId, projectPath) {
534
534
  }
535
535
  console.log(`[merge-agent] Running post-merge cleanup for ${issueId}`);
536
536
  try {
537
- const { movePrd } = await import("./archive-planning-U3AZAKWI.js");
537
+ const { movePrd } = await import("./archive-planning-54J6EP6A.js");
538
538
  const prdResult = await movePrd({ issueId, projectPath });
539
539
  if (prdResult.success && !prdResult.skipped) {
540
540
  console.log(`[merge-agent] \u2713 ${prdResult.details?.join("; ")}`);
@@ -548,7 +548,7 @@ async function postMergeLifecycle(issueId, projectPath) {
548
548
  console.warn(`[merge-agent] Could not move PRD: ${err}`);
549
549
  }
550
550
  try {
551
- const { cleanPlanningArtifacts } = await import("./clean-planning-7Z5YY64X.js");
551
+ const { cleanPlanningArtifacts } = await import("./clean-planning-V4SSVU26.js");
552
552
  const cleanResult = await cleanPlanningArtifacts({ issueId, projectPath });
553
553
  if (cleanResult.success && !cleanResult.skipped) {
554
554
  console.log(`[merge-agent] \u2713 ${cleanResult.details?.join("; ")}`);
@@ -563,7 +563,7 @@ async function postMergeLifecycle(issueId, projectPath) {
563
563
  }
564
564
  closeIssueWithCircuitBreaker(issueId, projectPath);
565
565
  try {
566
- const { cleanupMergedLabels } = await import("./label-cleanup-4HJVX6NP.js");
566
+ const { cleanupMergedLabels } = await import("./label-cleanup-4IVZIPGK.js");
567
567
  const ghResolved = resolveGitHubIssue(issueId);
568
568
  const labelCtx = ghResolved.isGitHub ? { issueId, projectPath, github: { owner: ghResolved.owner, repo: ghResolved.repo, number: ghResolved.number } } : { issueId, projectPath };
569
569
  const labelResult = await cleanupMergedLabels(labelCtx);
@@ -579,7 +579,7 @@ async function postMergeLifecycle(issueId, projectPath) {
579
579
  console.warn(`[merge-agent] Could not clean labels: ${err}`);
580
580
  }
581
581
  try {
582
- const { compactBeads } = await import("./compact-beads-72SHALOL.js");
582
+ const { compactBeads } = await import("./compact-beads-YQDVF6FQ.js");
583
583
  const beadsResult = await compactBeads({ issueId, projectPath });
584
584
  if (beadsResult.success && !beadsResult.skipped) {
585
585
  console.log(`[merge-agent] \u2713 ${beadsResult.details?.join("; ")}`);
@@ -589,7 +589,7 @@ async function postMergeLifecycle(issueId, projectPath) {
589
589
  console.warn(`[merge-agent] Beads compaction failed: ${err}`);
590
590
  }
591
591
  try {
592
- const { getAgentState, saveAgentState } = await import("./agents-I6RAEGL5.js");
592
+ const { getAgentState, saveAgentState } = await import("./agents-MOMDECON.js");
593
593
  const { killSession, sessionExists: sessionExists2 } = await import("./tmux-X2I5SAIJ.js");
594
594
  const agentId = `agent-${issueId.toLowerCase()}`;
595
595
  const agentState = getAgentState(agentId);
@@ -609,8 +609,8 @@ async function postMergeLifecycle(issueId, projectPath) {
609
609
  console.warn(`[merge-agent] Could not kill agent sessions: ${err}`);
610
610
  }
611
611
  try {
612
- const { findWorkspacePath } = await import("./archive-planning-U3AZAKWI.js");
613
- const { stopWorkspaceDocker } = await import("./workspace-manager-G6TTBPC3.js");
612
+ const { findWorkspacePath } = await import("./archive-planning-54J6EP6A.js");
613
+ const { stopWorkspaceDocker } = await import("./workspace-manager-Z57ROWBQ.js");
614
614
  const issueLower = issueId.toLowerCase();
615
615
  const workspacePath = findWorkspacePath(projectPath, issueLower);
616
616
  if (workspacePath) {
@@ -636,7 +636,7 @@ function closeIssueWithCircuitBreaker(issueId, projectPath) {
636
636
  }
637
637
  (async () => {
638
638
  try {
639
- const { closeIssue } = await import("./close-issue-CTZK777I.js");
639
+ const { closeIssue } = await import("./close-issue-5OMOP2FU.js");
640
640
  const ghResolved = resolveGitHubIssue(issueId);
641
641
  const ctx = ghResolved.isGitHub ? { issueId, projectPath, github: { owner: ghResolved.owner, repo: ghResolved.repo, number: ghResolved.number } } : { issueId, projectPath };
642
642
  const results = await closeIssue(ctx, { applyLabel: false, comment: "Merged to main via Panopticon merge-agent" });
@@ -1015,7 +1015,7 @@ async function spawnMergeAgentForBranches(projectPath, sourceBranch, targetBranc
1015
1015
  const message = `Branch ${sourceBranch} is not pushed to remote.`;
1016
1016
  console.error(`[merge-agent] ${message}`);
1017
1017
  logActivity("merge_blocked", message);
1018
- const { writeFeedbackFile } = await import("./feedback-writer-T2WCT6EZ.js");
1018
+ const { writeFeedbackFile } = await import("./feedback-writer-IPPIUPDX.js");
1019
1019
  const blockMsg = `# Merge Blocked
1020
1020
 
1021
1021
  Branch "${sourceBranch}" is not pushed to remote.
@@ -1210,7 +1210,7 @@ Report any issues or conflicts you encountered.`;
1210
1210
  console.warn(`[merge-agent] Could not resolve project for ${issueId} \u2014 falling back to global specialist. Check projects.yaml configuration.`);
1211
1211
  }
1212
1212
  if (mergeProjectKey) {
1213
- const { getAgentRuntimeState, saveAgentRuntimeState } = await import("./agents-I6RAEGL5.js");
1213
+ const { getAgentRuntimeState, saveAgentRuntimeState } = await import("./agents-MOMDECON.js");
1214
1214
  const IDLE_POLL_INTERVAL = 3e3;
1215
1215
  const IDLE_MAX_WAIT = 36e4;
1216
1216
  const idleStart = Date.now();
@@ -1722,4 +1722,4 @@ export {
1722
1722
  spawnMergeAgentForBranches,
1723
1723
  syncMainIntoWorkspace
1724
1724
  };
1725
- //# sourceMappingURL=merge-agent-ZITLVF2B.js.map
1725
+ //# sourceMappingURL=merge-agent-6YOMGQMX.js.map
@@ -19,7 +19,7 @@ import {
19
19
  resolveProjectPath,
20
20
  saveProjectsConfig,
21
21
  unregisterProject
22
- } from "./chunk-ZMJFEHGF.js";
22
+ } from "./chunk-7ZB5D46Y.js";
23
23
  import "./chunk-ZTFNYOC7.js";
24
24
  import "./chunk-ZHC57RCV.js";
25
25
  init_projects();
@@ -44,4 +44,4 @@ export {
44
44
  saveProjectsConfig,
45
45
  unregisterProject
46
46
  };
47
- //# sourceMappingURL=projects-3CRF57ZU.js.map
47
+ //# sourceMappingURL=projects-BPGM6IFB.js.map
@@ -11,7 +11,7 @@ import {
11
11
  extractTeamPrefix,
12
12
  findProjectByTeam,
13
13
  init_projects
14
- } from "./chunk-ZMJFEHGF.js";
14
+ } from "./chunk-7ZB5D46Y.js";
15
15
  import "./chunk-ZTFNYOC7.js";
16
16
  import {
17
17
  init_esm_shims
@@ -153,4 +153,4 @@ EOF`);
153
153
  export {
154
154
  createRemoteWorkspace
155
155
  };
156
- //# sourceMappingURL=remote-workspace-M4IULGFZ.js.map
156
+ //# sourceMappingURL=remote-workspace-LKRDGYEB.js.map
@@ -5,7 +5,7 @@ import {
5
5
  loadReviewStatuses,
6
6
  saveReviewStatuses,
7
7
  setReviewStatus
8
- } from "./chunk-IZIXJYXZ.js";
8
+ } from "./chunk-TA5X4QYQ.js";
9
9
  import "./chunk-JQBV3Q2W.js";
10
10
  import "./chunk-ZTFNYOC7.js";
11
11
  import "./chunk-ZHC57RCV.js";
@@ -17,4 +17,4 @@ export {
17
17
  saveReviewStatuses,
18
18
  setReviewStatus
19
19
  };
20
- //# sourceMappingURL=review-status-J2YJGL3E.js.map
20
+ //# sourceMappingURL=review-status-E77PZZWG.js.map
@@ -1,24 +1,24 @@
1
1
  import {
2
2
  getRecentRunLogs,
3
3
  init_specialist_logs
4
- } from "./chunk-M6ZVVKZ3.js";
4
+ } from "./chunk-4OQ4SXQZ.js";
5
5
  import "./chunk-JQBV3Q2W.js";
6
6
  import {
7
7
  getModelId,
8
8
  init_work_type_router
9
- } from "./chunk-ZN5RHWGR.js";
9
+ } from "./chunk-PFA5XE2V.js";
10
10
  import "./chunk-USYP2SBE.js";
11
11
  import "./chunk-QAJAJBFW.js";
12
12
  import {
13
13
  getProject,
14
14
  init_projects
15
- } from "./chunk-ZMJFEHGF.js";
15
+ } from "./chunk-7ZB5D46Y.js";
16
16
  import "./chunk-W2OTF6OS.js";
17
- import "./chunk-ZP6EWSZV.js";
18
17
  import {
19
18
  getPanopticonHome,
20
19
  init_paths
21
20
  } from "./chunk-ZTFNYOC7.js";
21
+ import "./chunk-ZP6EWSZV.js";
22
22
  import {
23
23
  __esm,
24
24
  init_esm_shims
@@ -257,4 +257,4 @@ export {
257
257
  regenerateContextDigest,
258
258
  scheduleDigestGeneration
259
259
  };
260
- //# sourceMappingURL=specialist-context-W25PPWM4.js.map
260
+ //# sourceMappingURL=specialist-context-GVF4DV3M.js.map
@@ -16,15 +16,15 @@ import {
16
16
  isRunLogActive,
17
17
  listRunLogs,
18
18
  parseLogMetadata
19
- } from "./chunk-M6ZVVKZ3.js";
19
+ } from "./chunk-4OQ4SXQZ.js";
20
20
  import "./chunk-JQBV3Q2W.js";
21
- import "./chunk-ZN5RHWGR.js";
21
+ import "./chunk-PFA5XE2V.js";
22
22
  import "./chunk-USYP2SBE.js";
23
23
  import "./chunk-QAJAJBFW.js";
24
- import "./chunk-ZMJFEHGF.js";
24
+ import "./chunk-7ZB5D46Y.js";
25
25
  import "./chunk-W2OTF6OS.js";
26
- import "./chunk-ZP6EWSZV.js";
27
26
  import "./chunk-ZTFNYOC7.js";
27
+ import "./chunk-ZP6EWSZV.js";
28
28
  import "./chunk-ZHC57RCV.js";
29
29
  init_specialist_logs();
30
30
  export {
@@ -45,4 +45,4 @@ export {
45
45
  listRunLogs,
46
46
  parseLogMetadata
47
47
  };
48
- //# sourceMappingURL=specialist-logs-KPC45SZN.js.map
48
+ //# sourceMappingURL=specialist-logs-W47SAAIU.js.map
@@ -55,15 +55,15 @@ import {
55
55
  wakeSpecialist,
56
56
  wakeSpecialistOrQueue,
57
57
  wakeSpecialistWithTask
58
- } from "./chunk-M6ZVVKZ3.js";
58
+ } from "./chunk-4OQ4SXQZ.js";
59
59
  import "./chunk-JQBV3Q2W.js";
60
- import "./chunk-ZN5RHWGR.js";
60
+ import "./chunk-PFA5XE2V.js";
61
61
  import "./chunk-USYP2SBE.js";
62
62
  import "./chunk-QAJAJBFW.js";
63
- import "./chunk-ZMJFEHGF.js";
63
+ import "./chunk-7ZB5D46Y.js";
64
64
  import "./chunk-W2OTF6OS.js";
65
- import "./chunk-ZP6EWSZV.js";
66
65
  import "./chunk-ZTFNYOC7.js";
66
+ import "./chunk-ZP6EWSZV.js";
67
67
  import "./chunk-ZHC57RCV.js";
68
68
  init_specialists();
69
69
  export {
@@ -123,4 +123,4 @@ export {
123
123
  wakeSpecialistOrQueue,
124
124
  wakeSpecialistWithTask
125
125
  };
126
- //# sourceMappingURL=specialists-H4LGYR7R.js.map
126
+ //# sourceMappingURL=specialists-SIXRWCZ3.js.map
@@ -4,9 +4,9 @@ import {
4
4
  ensureProjectCerts,
5
5
  generatePanopticonTraefikConfig,
6
6
  generateTlsConfig
7
- } from "./chunk-43F4LDZ4.js";
7
+ } from "./chunk-VVTAPQOI.js";
8
8
  import "./chunk-QAJAJBFW.js";
9
- import "./chunk-ZMJFEHGF.js";
9
+ import "./chunk-7ZB5D46Y.js";
10
10
  import "./chunk-ZTFNYOC7.js";
11
11
  import "./chunk-ZHC57RCV.js";
12
12
  export {
@@ -16,4 +16,4 @@ export {
16
16
  generatePanopticonTraefikConfig,
17
17
  generateTlsConfig
18
18
  };
19
- //# sourceMappingURL=traefik-QXLZ4PO2.js.map
19
+ //# sourceMappingURL=traefik-X2IWTUHO.js.map
@@ -4,7 +4,7 @@ import {
4
4
  preTrustDirectory,
5
5
  removeWorkspace,
6
6
  stopWorkspaceDocker
7
- } from "./chunk-BYWVPPAZ.js";
7
+ } from "./chunk-BHRMW7BY.js";
8
8
  import "./chunk-JT4O4YVM.js";
9
9
  import "./chunk-ZWZNEA26.js";
10
10
  import "./chunk-DW3PKGIS.js";
@@ -19,4 +19,4 @@ export {
19
19
  removeWorkspace,
20
20
  stopWorkspaceDocker
21
21
  };
22
- //# sourceMappingURL=workspace-manager-G6TTBPC3.js.map
22
+ //# sourceMappingURL=workspace-manager-Z57ROWBQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "panopticon-cli",
3
- "version": "0.5.8",
3
+ "version": "0.5.10",
4
4
  "description": "Multi-agent orchestration for AI coding assistants (Claude Code, Codex, Cursor, Gemini CLI)",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -0,0 +1,73 @@
1
+ #!/bin/bash
2
+ # ~/.panopticon/bin/inspect-on-bead-close
3
+ # PostToolUse hook: auto-triggers pan inspect when agent closes a bead
4
+ #
5
+ # When a Bash command matches "bd close <beadId>", this hook:
6
+ # 1. Extracts the bead ID
7
+ # 2. Triggers pan inspect for the current issue
8
+ # 3. Outputs a message telling the agent to WAIT for inspection results
9
+ #
10
+ # This makes inspection mechanical — the agent doesn't need to remember
11
+ # to call pan inspect. The framework does it automatically.
12
+
13
+ # Don't use set -e - never break Claude Code execution
14
+ TOOL_INFO=$(cat 2>/dev/null || echo '{}')
15
+
16
+ # Only care about Bash tool
17
+ TOOL_NAME=$(echo "$TOOL_INFO" | jq -r '.tool_name // "unknown"' 2>/dev/null || echo "unknown")
18
+ if [ "$TOOL_NAME" != "Bash" ]; then
19
+ exit 0
20
+ fi
21
+
22
+ # Check if the command contains "bd close" (may be prefixed with "cd /path &&")
23
+ TOOL_INPUT=$(echo "$TOOL_INFO" | jq -r '.tool_input.command // ""' 2>/dev/null || echo "")
24
+ if ! echo "$TOOL_INPUT" | grep -qE "bd close "; then
25
+ exit 0
26
+ fi
27
+
28
+ # Extract bead ID(s) from the command — only the arguments after "bd close"
29
+ # Handles: "bd close myn-80 --reason=...", "cd /path && bd close MIN-796-14 --reason=..."
30
+ # Extract everything after "bd close " up to the first flag (--) or end of string
31
+ BD_CLOSE_ARGS=$(echo "$TOOL_INPUT" | sed 's/.*bd close //' | sed 's/ --.*//')
32
+ # Bead IDs are space-separated tokens (myn-80, MIN-796-14, panopticon-abc123)
33
+ BEAD_IDS=$(echo "$BD_CLOSE_ARGS" | tr ' ' '\n' | grep -E '^[a-zA-Z]' | head -5)
34
+ if [ -z "$BEAD_IDS" ]; then
35
+ exit 0
36
+ fi
37
+
38
+ # Get issue ID from env (set by pan work issue)
39
+ ISSUE_ID="${PANOPTICON_ISSUE_ID:-}"
40
+ if [ -z "$ISSUE_ID" ]; then
41
+ exit 0
42
+ fi
43
+
44
+ # Get first bead ID for inspection
45
+ FIRST_BEAD=$(echo "$BEAD_IDS" | head -1)
46
+
47
+ # Check if multiple beads were closed at once — this is a problem
48
+ BEAD_COUNT=$(echo "$BEAD_IDS" | wc -l)
49
+ if [ "$BEAD_COUNT" -gt 1 ]; then
50
+ echo ""
51
+ echo "⚠️ WARNING: You closed $BEAD_COUNT beads at once. The Inspect Specialist needs"
52
+ echo "one bead per commit to verify each change individually. Close beads ONE AT A TIME."
53
+ echo ""
54
+ fi
55
+
56
+ # Dispatch inspection (fire and forget — don't block the hook)
57
+ pan inspect "$ISSUE_ID" --bead "$FIRST_BEAD" > /dev/null 2>&1 &
58
+
59
+ # Output message that gets injected into the agent's conversation
60
+ echo ""
61
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
62
+ echo "🔍 INSPECTION DISPATCHED for bead $FIRST_BEAD"
63
+ echo ""
64
+ echo "The Inspect Specialist is now reviewing your changes against"
65
+ echo "the bead specification. It is working in YOUR workspace —"
66
+ echo "do NOT make changes or start the next bead until you receive:"
67
+ echo ""
68
+ echo " INSPECTION PASSED → proceed to next bead"
69
+ echo " INSPECTION BLOCKED → fix issues, commit fix, close bead again"
70
+ echo ""
71
+ echo "WAIT for the inspection result message."
72
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
73
+ echo ""
package/scripts/stop-hook CHANGED
@@ -64,5 +64,22 @@ if [ -x "$WORK_AGENT_HOOK" ]; then
64
64
  "$WORK_AGENT_HOOK" &
65
65
  fi
66
66
 
67
+ # Auto-mark planning complete when a planning agent finishes.
68
+ # The planning agent creates STATE.md + beads but the .planning-complete marker
69
+ # is only written by the dashboard "Done" button. If the user doesn't click it
70
+ # (or the system crashes), the marker is never created and Panopticon shows
71
+ # "Plan" instead of "Start Agent". This hook fixes that by calling
72
+ # complete-planning automatically when a planning-* agent stops.
73
+ if [[ "$AGENT_ID" == planning-* ]]; then
74
+ # Extract issue ID from agent ID (planning-min-796 → MIN-796)
75
+ ISSUE_ID=$(echo "$AGENT_ID" | sed 's/^planning-//' | tr '[:lower:]' '[:upper:]')
76
+ if [ -n "$ISSUE_ID" ]; then
77
+ # Fire and forget — don't block the stop hook
78
+ curl -s -X POST "http://localhost:3011/api/issues/$ISSUE_ID/complete-planning" \
79
+ -H "Content-Type: application/json" \
80
+ -d '{}' > /dev/null 2>&1 &
81
+ fi
82
+ fi
83
+
67
84
  # Always exit successfully
68
85
  exit 0
@@ -266,7 +266,7 @@ Validation: 8/8 checks passed
266
266
 
267
267
  Next steps:
268
268
  1. Create issues on <tracker>
269
- 2. Run: pan opus-plan <PREFIX>-<N> (plan with Opus)
269
+ 2. Run: pan plan <PREFIX>-<N> (plan with Opus)
270
270
  3. Run: pan work issue <PREFIX>-<N> (spawn implementation agent)
271
271
  ```
272
272