panopticon-cli 0.4.0 → 0.4.4

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/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ declare const TRAEFIK_DYNAMIC_DIR: string;
12
12
  declare const TRAEFIK_CERTS_DIR: string;
13
13
  declare const CERTS_DIR: string;
14
14
  declare const CONFIG_FILE: string;
15
+ declare const SETTINGS_FILE: string;
15
16
  declare const CLAUDE_DIR: string;
16
17
  declare const CODEX_DIR: string;
17
18
  declare const CURSOR_DIR: string;
@@ -518,4 +519,127 @@ declare class LinkManager {
518
519
  }
519
520
  declare function getLinkManager(): LinkManager;
520
521
 
521
- export { AGENTS_DIR, BACKUPS_DIR, BIN_DIR, type BackupInfo, CERTS_DIR, CLAUDE_DIR, CLAUDE_MD_TEMPLATES, CODEX_DIR, COMMANDS_DIR, CONFIG_DIR, CONFIG_FILE, COSTS_DIR, CURSOR_DIR, type Comment, GEMINI_DIR, type GitHubConfig, GitHubTracker, type GitLabConfig, GitLabTracker, HEARTBEATS_DIR, type HookItem, INIT_DIRS, type Issue, type IssueFilters, IssueNotFoundError, type IssueState, type IssueTracker, type IssueUpdate, type LinearConfig, LinearTracker, type LinkDirection, LinkManager, type NewIssue, NotImplementedError, PANOPTICON_HOME, type PanopticonConfig, type RallyConfig, type Runtime, SKILLS_DIR, SOURCE_DEV_SKILLS_DIR, SOURCE_SCRIPTS_DIR, SOURCE_SKILLS_DIR, SOURCE_TEMPLATES_DIR, SOURCE_TRAEFIK_TEMPLATES, SYNC_TARGETS, type Shell, 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, addAlias, cleanOldBackups, createBackup, createBackupTimestamp, createTracker, createTrackerFromConfig, detectShell, executeSync, formatIssueRef, getAliasInstructions, getAllTrackers, getDefaultConfig, getLinkManager, getPrimaryTracker, getSecondaryTracker, getShellRcFile, hasAlias, isDevMode, isPanopticonSymlink, listBackups, loadConfig, parseIssueRef, planHooksSync, planSync, restoreBackup, saveConfig, syncHooks };
522
+ type AnthropicModel = 'claude-opus-4-5' | 'claude-sonnet-4-5' | 'claude-haiku-4-5';
523
+ type OpenAIModel = 'gpt-5.2-codex' | 'o3-deep-research' | 'gpt-4o' | 'gpt-4o-mini';
524
+ type GoogleModel = 'gemini-3-pro-preview' | 'gemini-3-flash-preview' | 'gemini-2.5-pro' | 'gemini-2.5-flash';
525
+ type ZAIModel = 'glm-4.7' | 'glm-4.7-flash';
526
+ type KimiModel = 'kimi-k2' | 'kimi-k2.5';
527
+ type ModelId = AnthropicModel | OpenAIModel | GoogleModel | ZAIModel | KimiModel;
528
+ type ComplexityLevel = 'trivial' | 'simple' | 'medium' | 'complex' | 'expert';
529
+ interface SpecialistModels {
530
+ review_agent: ModelId;
531
+ test_agent: ModelId;
532
+ merge_agent: ModelId;
533
+ }
534
+ type ComplexityModels = {
535
+ [K in ComplexityLevel]: ModelId;
536
+ };
537
+ interface ModelsConfig {
538
+ specialists: SpecialistModels;
539
+ planning_agent: ModelId;
540
+ complexity: ComplexityModels;
541
+ }
542
+ interface ApiKeysConfig {
543
+ openai?: string;
544
+ google?: string;
545
+ zai?: string;
546
+ kimi?: string;
547
+ }
548
+ interface SettingsConfig {
549
+ models: ModelsConfig;
550
+ api_keys: ApiKeysConfig;
551
+ }
552
+ /**
553
+ * Load settings from ~/.panopticon/settings.json
554
+ * Returns default settings if file doesn't exist or is invalid
555
+ * Also loads API keys from environment variables as fallback
556
+ */
557
+ declare function loadSettings(): SettingsConfig;
558
+ /**
559
+ * Save settings to ~/.panopticon/settings.json
560
+ * Writes with pretty formatting (2-space indent)
561
+ */
562
+ declare function saveSettings(settings: SettingsConfig): void;
563
+ /**
564
+ * Validate settings structure and model IDs
565
+ * Returns error message if invalid, null if valid
566
+ */
567
+ declare function validateSettings(settings: SettingsConfig): string | null;
568
+ /**
569
+ * Get a deep copy of the default settings
570
+ */
571
+ declare function getDefaultSettings(): SettingsConfig;
572
+ /**
573
+ * Get available models for a provider based on configured API keys
574
+ * Returns empty array if provider API key is not configured
575
+ */
576
+ declare function getAvailableModels(settings: SettingsConfig): {
577
+ anthropic: AnthropicModel[];
578
+ openai: OpenAIModel[];
579
+ google: GoogleModel[];
580
+ zai: ZAIModel[];
581
+ kimi: KimiModel[];
582
+ };
583
+
584
+ /**
585
+ * Provider Configuration and Compatibility
586
+ *
587
+ * Defines which LLM providers are compatible with Claude Code's API format.
588
+ * - Direct providers: Implement Anthropic-compatible API (no router needed)
589
+ * - Router providers: Require claude-code-router for API translation
590
+ */
591
+
592
+ type ProviderName = 'anthropic' | 'kimi' | 'openai' | 'google' | 'zai';
593
+ /**
594
+ * Provider compatibility types
595
+ * - direct: Anthropic-compatible API, use ANTHROPIC_BASE_URL directly
596
+ * - router: Incompatible API, requires claude-code-router for translation
597
+ */
598
+ type ProviderCompatibility = 'direct' | 'router';
599
+ /**
600
+ * Provider configuration
601
+ */
602
+ interface ProviderConfig {
603
+ name: ProviderName;
604
+ displayName: string;
605
+ compatibility: ProviderCompatibility;
606
+ baseUrl?: string;
607
+ models: ModelId[];
608
+ tested: boolean;
609
+ description: string;
610
+ }
611
+ /**
612
+ * All provider configurations
613
+ */
614
+ declare const PROVIDERS: Record<ProviderName, ProviderConfig>;
615
+ /**
616
+ * Get provider for a given model ID
617
+ */
618
+ declare function getProviderForModel(modelId: ModelId): ProviderConfig;
619
+ /**
620
+ * Check if a provider requires claude-code-router
621
+ */
622
+ declare function requiresRouter(provider: ProviderName): boolean;
623
+ /**
624
+ * Get all providers that require router (have router compatibility)
625
+ */
626
+ declare function getRouterProviders(): ProviderConfig[];
627
+ /**
628
+ * Get all direct-compatible providers
629
+ */
630
+ declare function getDirectProviders(): ProviderConfig[];
631
+ /**
632
+ * Check if any configured providers require router
633
+ * Used to determine if router installation is needed
634
+ */
635
+ declare function needsRouter(apiKeys: {
636
+ openai?: string;
637
+ google?: string;
638
+ zai?: string;
639
+ }): boolean;
640
+ /**
641
+ * Get environment variables for spawning agent with specific provider
642
+ */
643
+ declare function getProviderEnv(provider: ProviderConfig, apiKey: string): Record<string, string>;
644
+
645
+ export { AGENTS_DIR, type AnthropicModel, type ApiKeysConfig, BACKUPS_DIR, BIN_DIR, type BackupInfo, CERTS_DIR, CLAUDE_DIR, CLAUDE_MD_TEMPLATES, CODEX_DIR, COMMANDS_DIR, CONFIG_DIR, CONFIG_FILE, COSTS_DIR, CURSOR_DIR, type Comment, type ComplexityLevel, type ComplexityModels, GEMINI_DIR, 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, type LinearConfig, LinearTracker, type LinkDirection, LinkManager, type ModelId, type ModelsConfig, type NewIssue, NotImplementedError, type OpenAIModel, PANOPTICON_HOME, PROVIDERS, type PanopticonConfig, type ProviderCompatibility, type ProviderConfig, type ProviderName, type RallyConfig, type Runtime, SETTINGS_FILE, SKILLS_DIR, SOURCE_DEV_SKILLS_DIR, SOURCE_SCRIPTS_DIR, SOURCE_SKILLS_DIR, SOURCE_TEMPLATES_DIR, SOURCE_TRAEFIK_TEMPLATES, SYNC_TARGETS, type SettingsConfig, 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, createBackup, createBackupTimestamp, createTracker, createTrackerFromConfig, detectShell, executeSync, formatIssueRef, getAliasInstructions, getAllTrackers, getAvailableModels, getDefaultConfig, getDefaultSettings, getDirectProviders, getLinkManager, getPrimaryTracker, getProviderEnv, getProviderForModel, getRouterProviders, getSecondaryTracker, getShellRcFile, hasAlias, isDevMode, isPanopticonSymlink, listBackups, loadConfig, loadSettings, needsRouter, parseIssueRef, planHooksSync, planSync, requiresRouter, restoreBackup, saveConfig, saveSettings, syncHooks, validateSettings };
package/dist/index.js CHANGED
@@ -32,7 +32,7 @@ import {
32
32
  restoreBackup,
33
33
  saveConfig,
34
34
  syncHooks
35
- } from "./chunk-7BGFIAWQ.js";
35
+ } from "./chunk-ITI4IC5A.js";
36
36
  import {
37
37
  AGENTS_DIR,
38
38
  BACKUPS_DIR,
@@ -50,6 +50,8 @@ import {
50
50
  HEARTBEATS_DIR,
51
51
  INIT_DIRS,
52
52
  PANOPTICON_HOME,
53
+ PROVIDERS,
54
+ SETTINGS_FILE,
53
55
  SKILLS_DIR,
54
56
  SOURCE_DEV_SKILLS_DIR,
55
57
  SOURCE_SCRIPTS_DIR,
@@ -61,9 +63,19 @@ import {
61
63
  TRAEFIK_CERTS_DIR,
62
64
  TRAEFIK_DIR,
63
65
  TRAEFIK_DYNAMIC_DIR,
64
- isDevMode
65
- } from "./chunk-U4LCHEVU.js";
66
- import "./chunk-DGUM43GV.js";
66
+ getAvailableModels,
67
+ getDefaultSettings,
68
+ getDirectProviders,
69
+ getProviderEnv,
70
+ getProviderForModel,
71
+ getRouterProviders,
72
+ isDevMode,
73
+ loadSettings,
74
+ needsRouter,
75
+ requiresRouter,
76
+ saveSettings,
77
+ validateSettings
78
+ } from "./chunk-7HHDVXBM.js";
67
79
  export {
68
80
  AGENTS_DIR,
69
81
  BACKUPS_DIR,
@@ -87,6 +99,8 @@ export {
87
99
  LinkManager,
88
100
  NotImplementedError,
89
101
  PANOPTICON_HOME,
102
+ PROVIDERS,
103
+ SETTINGS_FILE,
90
104
  SKILLS_DIR,
91
105
  SOURCE_DEV_SKILLS_DIR,
92
106
  SOURCE_SCRIPTS_DIR,
@@ -110,9 +124,15 @@ export {
110
124
  formatIssueRef,
111
125
  getAliasInstructions,
112
126
  getAllTrackers,
127
+ getAvailableModels,
113
128
  getDefaultConfig,
129
+ getDefaultSettings,
130
+ getDirectProviders,
114
131
  getLinkManager,
115
132
  getPrimaryTracker,
133
+ getProviderEnv,
134
+ getProviderForModel,
135
+ getRouterProviders,
116
136
  getSecondaryTracker,
117
137
  getShellRcFile,
118
138
  hasAlias,
@@ -120,11 +140,16 @@ export {
120
140
  isPanopticonSymlink,
121
141
  listBackups,
122
142
  loadConfig,
143
+ loadSettings,
144
+ needsRouter,
123
145
  parseIssueRef,
124
146
  planHooksSync,
125
147
  planSync,
148
+ requiresRouter,
126
149
  restoreBackup,
127
150
  saveConfig,
128
- syncHooks
151
+ saveSettings,
152
+ syncHooks,
153
+ validateSettings
129
154
  };
130
155
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "panopticon-cli",
3
- "version": "0.4.0",
3
+ "version": "0.4.4",
4
4
  "description": "Multi-agent orchestration for AI coding assistants (Claude Code, Codex, Cursor, Gemini CLI)",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -24,6 +24,11 @@
24
24
  "url": "https://github.com/eltmon/panopticon-cli/issues"
25
25
  },
26
26
  "type": "module",
27
+ "workspaces": [
28
+ "packages/shared",
29
+ "src/dashboard/server",
30
+ "src/dashboard/frontend"
31
+ ],
27
32
  "bin": {
28
33
  "pan": "./dist/cli/index.js",
29
34
  "panopticon": "./dist/cli/index.js"
@@ -49,7 +54,7 @@
49
54
  "build:dashboard:server": "cd src/dashboard/server && npm run build",
50
55
  "typecheck": "tsc --noEmit",
51
56
  "lint": "eslint src/",
52
- "test": "vitest --run --no-file-parallelism",
57
+ "test": "vitest --run --no-file-parallelism && cd src/dashboard/frontend && npm test",
53
58
  "test:unit": "vitest run tests/unit",
54
59
  "test:integration": "vitest run tests/integration",
55
60
  "test:e2e": "vitest run tests/e2e",
@@ -70,12 +75,14 @@
70
75
  "conf": "^12.0.0",
71
76
  "execa": "^8.0.1",
72
77
  "inquirer": "^9.3.8",
78
+ "js-yaml": "^4.1.1",
73
79
  "ora": "^8.2.0",
74
80
  "yaml": "^2.8.2"
75
81
  },
76
82
  "devDependencies": {
77
83
  "@types/better-sqlite3": "^7.6.13",
78
84
  "@types/inquirer": "^9.0.9",
85
+ "@types/js-yaml": "^4.0.9",
79
86
  "@types/node": "^20.10.0",
80
87
  "@vitest/coverage-v8": "^1.0.4",
81
88
  "eslint": "^8.55.0",
@@ -4,6 +4,22 @@
4
4
  - **DO NOT** push to main/master branch directly
5
5
  - **ALWAYS** check for existing patterns before introducing new ones
6
6
 
7
+ ## CRITICAL: Workspace Isolation
8
+
9
+ **You are working in an ISOLATED WORKSPACE. Your working directory MUST be:**
10
+
11
+ ```
12
+ {{WORKSPACE_PATH}}
13
+ ```
14
+
15
+ **Before making ANY file changes:**
16
+ 1. Run `pwd` to verify you're in the workspace
17
+ 2. All file paths should be relative to the workspace OR absolute paths within the workspace
18
+ 3. NEVER use paths like `/home/.../projects/panopticon/src/...` (main project)
19
+ 4. ALWAYS use paths like `./src/...` or `{{WORKSPACE_PATH}}/src/...` (workspace)
20
+
21
+ **If you see yourself working in the main project directory instead of the workspace, STOP and correct your working directory.**
22
+
7
23
  ## NEVER Defer Work (CRITICAL)
8
24
 
9
25
  **You MUST complete ALL work in the issue scope. NEVER defer tasks to "future PRs".**
@@ -37,9 +53,18 @@
37
53
  # 1. Run tests
38
54
  npm test # or: mvn test, cargo test, etc.
39
55
 
40
- # 2. Stage and commit ALL changes
56
+ # 2. Stage and commit ALL changes with Co-Authored-By line
57
+ # CRITICAL: Use YOUR EXACT MODEL ID in the Co-Authored-By line
58
+ # You have access to your model ID - it's shown in your system context
41
59
  git add -A
42
- git commit -m "feat: description (ISSUE-XXX)"
60
+ git commit -m "feat: description (ISSUE-XXX)
61
+
62
+ Co-Authored-By: Claude <your-exact-model-id-here> <noreply@anthropic.com>"
63
+
64
+ # Example for claude-sonnet-4-5-20250929:
65
+ # git commit -m "feat: add specialist completion API
66
+ #
67
+ # Co-Authored-By: Claude claude-sonnet-4-5-20250929 <noreply@anthropic.com>"
43
68
 
44
69
  # 3. Push to remote
45
70
  git push -u origin $(git branch --show-current)
@@ -67,6 +67,28 @@ Before marking this issue complete:
67
67
  - [ ] No console errors or warnings
68
68
  - [ ] Documentation updated if needed
69
69
 
70
+ ## Responding to Review Feedback
71
+
72
+ If you receive feedback from review-agent indicating issues to fix:
73
+
74
+ 1. **Read the feedback carefully** - Understand each issue raised
75
+ 2. **Fix all issues** - Address every item in the feedback
76
+ 3. **Test your fixes** - Ensure tests still pass
77
+ 4. **Commit and push** - Push your fixes to the remote branch
78
+ 5. **Request re-review** - Run this command:
79
+ ```bash
80
+ pan work request-review {{ISSUE_ID}} -m "Fixed: [brief summary of what you fixed]"
81
+ ```
82
+
83
+ **Circuit breaker**: You can auto-request re-review up to 3 times. After that, a human must click "Review" in the dashboard.
84
+
85
+ **Example**:
86
+ ```bash
87
+ pan work request-review PAN-123 -m "Fixed: added real tests instead of placeholders"
88
+ ```
89
+
90
+ This will queue the review-agent to re-review your changes.
91
+
70
92
  ## Emergency Recovery
71
93
 
72
94
  If you're resuming after a crash:
@@ -0,0 +1,75 @@
1
+ # Reopened Issue: {{ISSUE_ID}}
2
+
3
+ ## ⚠️ Important: This is Follow-up Work
4
+
5
+ This issue was previously completed and merged. It has been **reopened** for additional work.
6
+
7
+ ## What This Means
8
+
9
+ You are NOT starting from scratch. Instead:
10
+
11
+ 1. **Previous work exists** - Code has already been written, tested, and merged
12
+ 2. **Build on what's there** - Extend, fix, or enhance the existing implementation
13
+ 3. **Preserve functionality** - Don't break what's already working
14
+ 4. **Understand the context** - Review what was done before planning new work
15
+
16
+ ## Your Mission
17
+
18
+ **{{ISSUE_ID}}**: {{ISSUE_TITLE}}
19
+
20
+ ### Why It Was Reopened
21
+
22
+ {{REOPEN_REASON}}
23
+
24
+ ### What Was Previously Accomplished
25
+
26
+ {{PREVIOUS_WORK_SUMMARY}}
27
+
28
+ ### Original Issue Description
29
+
30
+ {{ISSUE_DESCRIPTION}}
31
+
32
+ ## Getting Started
33
+
34
+ 1. **Read `.planning/REOPEN.md`** - Detailed context about previous work
35
+ 2. **Read `.planning/STATE.md`** - Full implementation history
36
+ 3. **Review the codebase** - Understand what was built:
37
+ {{KEY_FILES}}
38
+ 4. **Check for new requirements** - Look for:
39
+ - New comments on the GitHub issue
40
+ - User feedback or bug reports
41
+ - Additional acceptance criteria
42
+ 5. **Plan your approach** - Identify what needs to be added/fixed
43
+ 6. **Implement carefully** - Build on the existing foundation
44
+ 7. **Test thoroughly** - Ensure both old and new functionality works
45
+ 8. **Request review** - When complete, run `pan work request-review {{ISSUE_ID}}`
46
+
47
+ ## Critical Guidelines
48
+
49
+ - **Don't duplicate work** - Check if functionality already exists
50
+ - **Don't break existing tests** - All {{EXISTING_TESTS}} existing tests must still pass
51
+ - **Follow existing patterns** - Match the code style and architecture
52
+ - **Update existing docs** - Don't create duplicate documentation
53
+ - **Respect git history** - Review commits to understand design decisions
54
+
55
+ ## Workspace Info
56
+
57
+ - **Branch**: {{BRANCH_NAME}}
58
+ - **Workspace**: {{WORKSPACE_PATH}}
59
+ - **Previous commits**: {{COMMIT_COUNT}} commits on this branch
60
+ - **Tests**: {{TEST_COUNT}} tests currently passing
61
+
62
+ ## Review Workflow
63
+
64
+ This reopened issue can go through the standard review workflow:
65
+
66
+ 1. Complete your work
67
+ 2. Commit and push: `git push -u origin {{BRANCH_NAME}}`
68
+ 3. Request review: `pan work request-review {{ISSUE_ID}} -m "Completed follow-up work"`
69
+ 4. Review-agent will review
70
+ 5. Test-agent will run tests
71
+ 6. Human will approve and merge
72
+
73
+ ---
74
+
75
+ **Remember**: This is iterative development. You're adding to something that already works, not building from zero.