panopticon-cli 0.1.3 → 0.2.0

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 (37) hide show
  1. package/README.md +645 -22
  2. package/dist/chunk-J7JUNJGH.js +1058 -0
  3. package/dist/chunk-J7JUNJGH.js.map +1 -0
  4. package/dist/cli/index.js +1733 -717
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/index.d.ts +368 -5
  7. package/dist/index.js +43 -1
  8. package/package.json +11 -2
  9. package/templates/context/CLAUDE.md.template +81 -0
  10. package/templates/context/STATE.md.template +106 -0
  11. package/templates/context/WORKSPACE.md.template +90 -0
  12. package/templates/docker/dotnet/Dockerfile.dev +22 -0
  13. package/templates/docker/dotnet/README.md +111 -0
  14. package/templates/docker/dotnet/docker-compose.yml +55 -0
  15. package/templates/docker/monorepo/Dockerfile.backend +15 -0
  16. package/templates/docker/monorepo/Dockerfile.frontend +17 -0
  17. package/templates/docker/monorepo/README.md +208 -0
  18. package/templates/docker/monorepo/docker-compose.yml +88 -0
  19. package/templates/docker/nextjs/Dockerfile.dev +20 -0
  20. package/templates/docker/nextjs/README.md +103 -0
  21. package/templates/docker/nextjs/docker-compose.yml +30 -0
  22. package/templates/docker/python-fastapi/Dockerfile.dev +22 -0
  23. package/templates/docker/python-fastapi/README.md +148 -0
  24. package/templates/docker/python-fastapi/docker-compose.yml +65 -0
  25. package/templates/docker/react-vite/Dockerfile.dev +20 -0
  26. package/templates/docker/react-vite/README.md +94 -0
  27. package/templates/docker/react-vite/docker-compose.yml +29 -0
  28. package/templates/docker/spring-boot/Dockerfile.dev +24 -0
  29. package/templates/docker/spring-boot/README.md +111 -0
  30. package/templates/docker/spring-boot/docker-compose.yml +71 -0
  31. package/templates/traefik/README.md +106 -0
  32. package/templates/traefik/docker-compose.yml +40 -0
  33. package/templates/traefik/dynamic/panopticon.yml +51 -0
  34. package/templates/traefik/dynamic/workspace.yml.template +34 -0
  35. package/templates/traefik/traefik.yml +45 -0
  36. package/dist/chunk-FR2P66GU.js +0 -352
  37. package/dist/chunk-FR2P66GU.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -5,6 +5,10 @@ declare const COMMANDS_DIR: string;
5
5
  declare const AGENTS_DIR: string;
6
6
  declare const BACKUPS_DIR: string;
7
7
  declare const COSTS_DIR: string;
8
+ declare const TRAEFIK_DIR: string;
9
+ declare const TRAEFIK_DYNAMIC_DIR: string;
10
+ declare const TRAEFIK_CERTS_DIR: string;
11
+ declare const CERTS_DIR: string;
8
12
  declare const CONFIG_FILE: string;
9
13
  declare const CLAUDE_DIR: string;
10
14
  declare const CODEX_DIR: string;
@@ -31,8 +35,174 @@ declare const SYNC_TARGETS: {
31
35
  type Runtime = keyof typeof SYNC_TARGETS;
32
36
  declare const TEMPLATES_DIR: string;
33
37
  declare const CLAUDE_MD_TEMPLATES: string;
38
+ declare const SOURCE_TEMPLATES_DIR: string;
39
+ declare const SOURCE_TRAEFIK_TEMPLATES: string;
34
40
  declare const INIT_DIRS: string[];
35
41
 
42
+ /**
43
+ * Issue Tracker Abstraction Layer
44
+ *
45
+ * Provides a unified interface for different issue tracking systems
46
+ * (Linear, GitHub Issues, GitLab Issues, etc.)
47
+ */
48
+ type TrackerType = 'linear' | 'github' | 'gitlab';
49
+ type IssueState = 'open' | 'in_progress' | 'closed';
50
+ interface Issue {
51
+ /** Tracker-specific unique ID */
52
+ id: string;
53
+ /** Human-readable reference (e.g., MIN-630, #42) */
54
+ ref: string;
55
+ /** Issue title */
56
+ title: string;
57
+ /** Issue description/body (markdown) */
58
+ description: string;
59
+ /** Normalized state */
60
+ state: IssueState;
61
+ /** Labels/tags */
62
+ labels: string[];
63
+ /** Assignee username/name */
64
+ assignee?: string;
65
+ /** Web URL to the issue */
66
+ url: string;
67
+ /** Which tracker this issue came from */
68
+ tracker: TrackerType;
69
+ /** Cross-tracker linked issue references */
70
+ linkedIssues?: string[];
71
+ /** Priority (1=urgent, 2=high, 3=normal, 4=low) */
72
+ priority?: number;
73
+ /** Due date (ISO string) */
74
+ dueDate?: string;
75
+ /** Creation timestamp (ISO string) */
76
+ createdAt: string;
77
+ /** Last update timestamp (ISO string) */
78
+ updatedAt: string;
79
+ }
80
+ interface Comment {
81
+ id: string;
82
+ issueId: string;
83
+ body: string;
84
+ author: string;
85
+ createdAt: string;
86
+ updatedAt: string;
87
+ }
88
+ interface IssueFilters {
89
+ /** Filter by state */
90
+ state?: IssueState;
91
+ /** Filter by labels (AND logic) */
92
+ labels?: string[];
93
+ /** Filter by assignee */
94
+ assignee?: string;
95
+ /** Filter by team/project (tracker-specific) */
96
+ team?: string;
97
+ /** Search query for title/description */
98
+ query?: string;
99
+ /** Maximum number of results */
100
+ limit?: number;
101
+ /** Include closed issues (default: false) */
102
+ includeClosed?: boolean;
103
+ }
104
+ interface NewIssue {
105
+ title: string;
106
+ description?: string;
107
+ labels?: string[];
108
+ assignee?: string;
109
+ team?: string;
110
+ priority?: number;
111
+ dueDate?: string;
112
+ }
113
+ interface IssueUpdate {
114
+ title?: string;
115
+ description?: string;
116
+ state?: IssueState;
117
+ labels?: string[];
118
+ assignee?: string;
119
+ priority?: number;
120
+ dueDate?: string;
121
+ }
122
+ /**
123
+ * Abstract interface for issue trackers.
124
+ * Implementations must handle normalization to/from tracker-specific formats.
125
+ */
126
+ interface IssueTracker {
127
+ /** Tracker type identifier */
128
+ readonly name: TrackerType;
129
+ /**
130
+ * List issues matching filters
131
+ */
132
+ listIssues(filters?: IssueFilters): Promise<Issue[]>;
133
+ /**
134
+ * Get a single issue by ID or ref
135
+ * @param id - Issue ID or human-readable ref (e.g., "MIN-630", "#42")
136
+ */
137
+ getIssue(id: string): Promise<Issue>;
138
+ /**
139
+ * Update an existing issue
140
+ */
141
+ updateIssue(id: string, update: IssueUpdate): Promise<Issue>;
142
+ /**
143
+ * Create a new issue
144
+ */
145
+ createIssue(issue: NewIssue): Promise<Issue>;
146
+ /**
147
+ * Get comments on an issue
148
+ */
149
+ getComments(issueId: string): Promise<Comment[]>;
150
+ /**
151
+ * Add a comment to an issue
152
+ */
153
+ addComment(issueId: string, body: string): Promise<Comment>;
154
+ /**
155
+ * Transition issue to a new state
156
+ */
157
+ transitionIssue(id: string, state: IssueState): Promise<void>;
158
+ /**
159
+ * Link a PR/MR to an issue
160
+ */
161
+ linkPR(issueId: string, prUrl: string): Promise<void>;
162
+ }
163
+ /**
164
+ * Error thrown when a tracker feature is not implemented
165
+ */
166
+ declare class NotImplementedError extends Error {
167
+ constructor(feature: string);
168
+ }
169
+ /**
170
+ * Error thrown when an issue is not found
171
+ */
172
+ declare class IssueNotFoundError extends Error {
173
+ constructor(id: string, tracker: TrackerType);
174
+ }
175
+ /**
176
+ * Error thrown when tracker authentication fails
177
+ */
178
+ declare class TrackerAuthError extends Error {
179
+ constructor(tracker: TrackerType, message: string);
180
+ }
181
+
182
+ interface LinearConfig {
183
+ type: 'linear';
184
+ api_key_env?: string;
185
+ team?: string;
186
+ }
187
+ interface GitHubConfig {
188
+ type: 'github';
189
+ token_env?: string;
190
+ owner: string;
191
+ repo: string;
192
+ }
193
+ interface GitLabConfig {
194
+ type: 'gitlab';
195
+ token_env?: string;
196
+ project_id: string;
197
+ }
198
+ type TrackerConfigItem = LinearConfig | GitHubConfig | GitLabConfig;
199
+ interface TrackersConfig {
200
+ primary: TrackerType;
201
+ secondary?: TrackerType;
202
+ linear?: LinearConfig;
203
+ github?: GitHubConfig;
204
+ gitlab?: GitLabConfig;
205
+ }
36
206
  interface PanopticonConfig {
37
207
  panopticon: {
38
208
  version: string;
@@ -40,15 +210,19 @@ interface PanopticonConfig {
40
210
  sync: {
41
211
  targets: string[];
42
212
  backup_before_sync: boolean;
213
+ auto_sync?: boolean;
214
+ strategy?: 'symlink' | 'copy';
43
215
  };
44
- trackers: {
45
- primary: string;
46
- secondary?: string;
47
- };
216
+ trackers: TrackersConfig;
48
217
  dashboard: {
49
218
  port: number;
50
219
  api_port: number;
51
220
  };
221
+ traefik?: {
222
+ enabled: boolean;
223
+ dashboard_port?: number;
224
+ domain?: string;
225
+ };
52
226
  }
53
227
  declare function loadConfig(): PanopticonConfig;
54
228
  declare function saveConfig(config: PanopticonConfig): void;
@@ -105,4 +279,193 @@ interface SyncResult {
105
279
  */
106
280
  declare function executeSync(runtime: Runtime, options?: SyncOptions): SyncResult;
107
281
 
108
- export { AGENTS_DIR, BACKUPS_DIR, type BackupInfo, CLAUDE_DIR, CLAUDE_MD_TEMPLATES, CODEX_DIR, COMMANDS_DIR, CONFIG_DIR, CONFIG_FILE, COSTS_DIR, CURSOR_DIR, GEMINI_DIR, INIT_DIRS, PANOPTICON_HOME, type PanopticonConfig, type Runtime, SKILLS_DIR, SYNC_TARGETS, type Shell, type SyncItem, type SyncOptions, type SyncPlan, type SyncResult, TEMPLATES_DIR, addAlias, cleanOldBackups, createBackup, createBackupTimestamp, detectShell, executeSync, getAliasInstructions, getDefaultConfig, getShellRcFile, hasAlias, isPanopticonSymlink, listBackups, loadConfig, planSync, restoreBackup, saveConfig };
282
+ /**
283
+ * Linear Issue Tracker Adapter
284
+ *
285
+ * Implements IssueTracker interface for Linear.
286
+ */
287
+
288
+ declare class LinearTracker implements IssueTracker {
289
+ readonly name: TrackerType;
290
+ private client;
291
+ private defaultTeam?;
292
+ constructor(apiKey: string, options?: {
293
+ team?: string;
294
+ });
295
+ listIssues(filters?: IssueFilters): Promise<Issue[]>;
296
+ getIssue(id: string): Promise<Issue>;
297
+ updateIssue(id: string, update: IssueUpdate): Promise<Issue>;
298
+ createIssue(newIssue: NewIssue): Promise<Issue>;
299
+ getComments(issueId: string): Promise<Comment[]>;
300
+ addComment(issueId: string, body: string): Promise<Comment>;
301
+ transitionIssue(id: string, state: IssueState): Promise<void>;
302
+ linkPR(issueId: string, prUrl: string): Promise<void>;
303
+ private normalizeIssue;
304
+ private mapState;
305
+ private reverseMapState;
306
+ }
307
+
308
+ /**
309
+ * GitHub Issues Tracker Adapter
310
+ *
311
+ * Implements IssueTracker interface for GitHub Issues.
312
+ */
313
+
314
+ declare class GitHubTracker implements IssueTracker {
315
+ readonly name: TrackerType;
316
+ private octokit;
317
+ private owner;
318
+ private repo;
319
+ constructor(token: string, owner: string, repo: string);
320
+ listIssues(filters?: IssueFilters): Promise<Issue[]>;
321
+ getIssue(id: string): Promise<Issue>;
322
+ updateIssue(id: string, update: IssueUpdate): Promise<Issue>;
323
+ createIssue(newIssue: NewIssue): Promise<Issue>;
324
+ getComments(issueId: string): Promise<Comment[]>;
325
+ addComment(issueId: string, body: string): Promise<Comment>;
326
+ transitionIssue(id: string, state: IssueState): Promise<void>;
327
+ linkPR(issueId: string, prUrl: string): Promise<void>;
328
+ private normalizeIssue;
329
+ private mapStateFromGitHub;
330
+ private mapStateToGitHub;
331
+ }
332
+
333
+ /**
334
+ * GitLab Issues Tracker Adapter (Stub)
335
+ *
336
+ * Placeholder implementation for GitLab Issues support.
337
+ * Full implementation will use @gitbeaker/rest.
338
+ */
339
+
340
+ declare class GitLabTracker implements IssueTracker {
341
+ private token;
342
+ private projectId;
343
+ readonly name: TrackerType;
344
+ constructor(token: string, projectId: string);
345
+ listIssues(_filters?: IssueFilters): Promise<Issue[]>;
346
+ getIssue(_id: string): Promise<Issue>;
347
+ updateIssue(_id: string, _update: IssueUpdate): Promise<Issue>;
348
+ createIssue(_issue: NewIssue): Promise<Issue>;
349
+ getComments(_issueId: string): Promise<Comment[]>;
350
+ addComment(_issueId: string, _body: string): Promise<Comment>;
351
+ transitionIssue(_id: string, _state: IssueState): Promise<void>;
352
+ linkPR(_issueId: string, _prUrl: string): Promise<void>;
353
+ }
354
+
355
+ /**
356
+ * Tracker Factory
357
+ *
358
+ * Creates appropriate tracker instances based on configuration.
359
+ */
360
+
361
+ interface TrackerConfig {
362
+ type: TrackerType;
363
+ apiKeyEnv?: string;
364
+ team?: string;
365
+ tokenEnv?: string;
366
+ owner?: string;
367
+ repo?: string;
368
+ projectId?: string;
369
+ }
370
+ /**
371
+ * Create a tracker instance from configuration
372
+ */
373
+ declare function createTracker(config: TrackerConfig): IssueTracker;
374
+ /**
375
+ * Create tracker from trackers configuration section
376
+ */
377
+ declare function createTrackerFromConfig(trackersConfig: TrackersConfig, trackerType: TrackerType): IssueTracker;
378
+ /**
379
+ * Get the primary tracker from configuration
380
+ */
381
+ declare function getPrimaryTracker(trackersConfig: TrackersConfig): IssueTracker;
382
+ /**
383
+ * Get the secondary tracker from configuration (if configured)
384
+ */
385
+ declare function getSecondaryTracker(trackersConfig: TrackersConfig): IssueTracker | null;
386
+ /**
387
+ * Get all configured trackers
388
+ */
389
+ declare function getAllTrackers(trackersConfig: TrackersConfig): IssueTracker[];
390
+
391
+ /**
392
+ * Cross-Tracker Linking
393
+ *
394
+ * Manages links between issues in different trackers.
395
+ * Links are stored in a local JSON file for persistence.
396
+ */
397
+
398
+ type LinkDirection = 'blocks' | 'blocked_by' | 'related' | 'duplicate_of';
399
+ interface TrackerLink {
400
+ sourceIssueRef: string;
401
+ sourceTracker: TrackerType;
402
+ targetIssueRef: string;
403
+ targetTracker: TrackerType;
404
+ direction: LinkDirection;
405
+ createdAt: string;
406
+ }
407
+ /**
408
+ * Parse an issue reference to extract tracker and ID
409
+ * Examples:
410
+ * "#42" -> { tracker: "github", ref: "#42" }
411
+ * "github#42" -> { tracker: "github", ref: "#42" }
412
+ * "MIN-630" -> { tracker: "linear", ref: "MIN-630" }
413
+ * "gitlab#15" -> { tracker: "gitlab", ref: "#15" }
414
+ */
415
+ declare function parseIssueRef(ref: string): {
416
+ tracker: TrackerType;
417
+ ref: string;
418
+ } | null;
419
+ /**
420
+ * Format an issue ref with tracker prefix for display
421
+ */
422
+ declare function formatIssueRef(ref: string, tracker: TrackerType): string;
423
+ /**
424
+ * Link Manager for cross-tracker issue linking
425
+ */
426
+ declare class LinkManager {
427
+ private storePath;
428
+ private store;
429
+ constructor(storePath?: string);
430
+ private load;
431
+ private save;
432
+ /**
433
+ * Add a link between two issues
434
+ */
435
+ addLink(source: {
436
+ ref: string;
437
+ tracker: TrackerType;
438
+ }, target: {
439
+ ref: string;
440
+ tracker: TrackerType;
441
+ }, direction?: LinkDirection): TrackerLink;
442
+ /**
443
+ * Remove a link between two issues
444
+ */
445
+ removeLink(source: {
446
+ ref: string;
447
+ tracker: TrackerType;
448
+ }, target: {
449
+ ref: string;
450
+ tracker: TrackerType;
451
+ }): boolean;
452
+ /**
453
+ * Get all issues linked to a given issue
454
+ */
455
+ getLinkedIssues(ref: string, tracker: TrackerType): TrackerLink[];
456
+ /**
457
+ * Get all links (for debugging/admin)
458
+ */
459
+ getAllLinks(): TrackerLink[];
460
+ /**
461
+ * Find linked issue in another tracker
462
+ */
463
+ findLinkedIssue(ref: string, sourceTracker: TrackerType, targetTracker: TrackerType): string | null;
464
+ /**
465
+ * Clear all links (for testing)
466
+ */
467
+ clear(): void;
468
+ }
469
+ declare function getLinkManager(): LinkManager;
470
+
471
+ export { AGENTS_DIR, BACKUPS_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, 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 Runtime, 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, isPanopticonSymlink, listBackups, loadConfig, parseIssueRef, planSync, restoreBackup, saveConfig };
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  AGENTS_DIR,
3
3
  BACKUPS_DIR,
4
+ CERTS_DIR,
4
5
  CLAUDE_DIR,
5
6
  CLAUDE_MD_TEMPLATES,
6
7
  CODEX_DIR,
@@ -10,31 +11,52 @@ import {
10
11
  COSTS_DIR,
11
12
  CURSOR_DIR,
12
13
  GEMINI_DIR,
14
+ GitHubTracker,
15
+ GitLabTracker,
13
16
  INIT_DIRS,
17
+ IssueNotFoundError,
18
+ LinearTracker,
19
+ LinkManager,
20
+ NotImplementedError,
14
21
  PANOPTICON_HOME,
15
22
  SKILLS_DIR,
23
+ SOURCE_TEMPLATES_DIR,
24
+ SOURCE_TRAEFIK_TEMPLATES,
16
25
  SYNC_TARGETS,
17
26
  TEMPLATES_DIR,
27
+ TRAEFIK_CERTS_DIR,
28
+ TRAEFIK_DIR,
29
+ TRAEFIK_DYNAMIC_DIR,
30
+ TrackerAuthError,
18
31
  addAlias,
19
32
  cleanOldBackups,
20
33
  createBackup,
21
34
  createBackupTimestamp,
35
+ createTracker,
36
+ createTrackerFromConfig,
22
37
  detectShell,
23
38
  executeSync,
39
+ formatIssueRef,
24
40
  getAliasInstructions,
41
+ getAllTrackers,
25
42
  getDefaultConfig,
43
+ getLinkManager,
44
+ getPrimaryTracker,
45
+ getSecondaryTracker,
26
46
  getShellRcFile,
27
47
  hasAlias,
28
48
  isPanopticonSymlink,
29
49
  listBackups,
30
50
  loadConfig,
51
+ parseIssueRef,
31
52
  planSync,
32
53
  restoreBackup,
33
54
  saveConfig
34
- } from "./chunk-FR2P66GU.js";
55
+ } from "./chunk-J7JUNJGH.js";
35
56
  export {
36
57
  AGENTS_DIR,
37
58
  BACKUPS_DIR,
59
+ CERTS_DIR,
38
60
  CLAUDE_DIR,
39
61
  CLAUDE_MD_TEMPLATES,
40
62
  CODEX_DIR,
@@ -44,24 +66,44 @@ export {
44
66
  COSTS_DIR,
45
67
  CURSOR_DIR,
46
68
  GEMINI_DIR,
69
+ GitHubTracker,
70
+ GitLabTracker,
47
71
  INIT_DIRS,
72
+ IssueNotFoundError,
73
+ LinearTracker,
74
+ LinkManager,
75
+ NotImplementedError,
48
76
  PANOPTICON_HOME,
49
77
  SKILLS_DIR,
78
+ SOURCE_TEMPLATES_DIR,
79
+ SOURCE_TRAEFIK_TEMPLATES,
50
80
  SYNC_TARGETS,
51
81
  TEMPLATES_DIR,
82
+ TRAEFIK_CERTS_DIR,
83
+ TRAEFIK_DIR,
84
+ TRAEFIK_DYNAMIC_DIR,
85
+ TrackerAuthError,
52
86
  addAlias,
53
87
  cleanOldBackups,
54
88
  createBackup,
55
89
  createBackupTimestamp,
90
+ createTracker,
91
+ createTrackerFromConfig,
56
92
  detectShell,
57
93
  executeSync,
94
+ formatIssueRef,
58
95
  getAliasInstructions,
96
+ getAllTrackers,
59
97
  getDefaultConfig,
98
+ getLinkManager,
99
+ getPrimaryTracker,
100
+ getSecondaryTracker,
60
101
  getShellRcFile,
61
102
  hasAlias,
62
103
  isPanopticonSymlink,
63
104
  listBackups,
64
105
  loadConfig,
106
+ parseIssueRef,
65
107
  planSync,
66
108
  restoreBackup,
67
109
  saveConfig
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "panopticon-cli",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "Multi-agent orchestration for AI coding assistants (Claude Code, Codex, Cursor, Gemini CLI)",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -44,12 +44,19 @@
44
44
  "build": "tsup",
45
45
  "typecheck": "tsc --noEmit",
46
46
  "lint": "eslint src/",
47
- "test": "vitest",
47
+ "test": "vitest --no-file-parallelism",
48
+ "test:unit": "vitest run tests/unit",
49
+ "test:integration": "vitest run tests/integration",
50
+ "test:e2e": "vitest run tests/e2e",
51
+ "test:coverage": "vitest run --coverage",
52
+ "docs": "typedoc",
53
+ "docs:watch": "typedoc --watch",
48
54
  "prepublishOnly": "npm run build"
49
55
  },
50
56
  "dependencies": {
51
57
  "@iarna/toml": "^2.2.5",
52
58
  "@linear/sdk": "^70.0.0",
59
+ "@octokit/rest": "^22.0.1",
53
60
  "chalk": "^5.6.2",
54
61
  "commander": "^12.1.0",
55
62
  "conf": "^12.0.0",
@@ -60,9 +67,11 @@
60
67
  "devDependencies": {
61
68
  "@types/inquirer": "^9.0.9",
62
69
  "@types/node": "^20.10.0",
70
+ "@vitest/coverage-v8": "^1.0.4",
63
71
  "eslint": "^8.55.0",
64
72
  "tsup": "^8.0.1",
65
73
  "tsx": "^4.6.2",
74
+ "typedoc": "^0.25.0",
66
75
  "typescript": "^5.3.2",
67
76
  "vitest": "^1.0.4"
68
77
  }
@@ -0,0 +1,81 @@
1
+ # Agent Instructions: {{ISSUE_ID}}
2
+
3
+ ## Your Mission
4
+
5
+ You are an autonomous AI coding agent working on:
6
+
7
+ **{{ISSUE_ID}}**: {{ISSUE_TITLE}}
8
+
9
+ ## Critical Rules
10
+
11
+ 1. **Read STATE.md first** - Always check `.planning/STATE.md` for current progress
12
+ 2. **Update STATE.md frequently** - Keep state current for crash recovery
13
+ 3. **Commit often** - Small, focused commits with clear messages
14
+ 4. **Test your changes** - Run tests before marking work complete
15
+ 5. **Ask when unsure** - Don't guess on requirements, ask for clarification
16
+
17
+ ## Project Context
18
+
19
+ {{PROJECT_CONTEXT}}
20
+
21
+ ## Coding Standards
22
+
23
+ {{CODING_STANDARDS}}
24
+
25
+ ## Issue Details
26
+
27
+ ### Description
28
+ {{ISSUE_DESCRIPTION}}
29
+
30
+ ### Acceptance Criteria
31
+ {{ACCEPTANCE_CRITERIA}}
32
+
33
+ ### Technical Requirements
34
+ {{TECHNICAL_REQUIREMENTS}}
35
+
36
+ ## File Locations
37
+
38
+ | Purpose | Path |
39
+ |---------|------|
40
+ {{FILE_LOCATIONS}}
41
+
42
+ ## Workflow
43
+
44
+ 1. **Start**: Read STATE.md, understand current progress
45
+ 2. **Plan**: Break down work into small steps
46
+ 3. **Implement**: Write code, following project standards
47
+ 4. **Test**: Run tests, fix any failures
48
+ 5. **Document**: Update STATE.md with progress
49
+ 6. **Commit**: Create focused commits with clear messages
50
+ 7. **Repeat**: Continue until issue is complete
51
+
52
+ ## Communication
53
+
54
+ To send a message to the user or request help:
55
+ - Update STATE.md with your question under "Questions for Review"
56
+ - Include clear context about what you need
57
+
58
+ ## Completion Checklist
59
+
60
+ Before marking this issue complete:
61
+
62
+ - [ ] All acceptance criteria met
63
+ - [ ] Tests pass
64
+ - [ ] Code follows project standards
65
+ - [ ] STATE.md updated with final status
66
+ - [ ] Changes committed and pushed
67
+ - [ ] No console errors or warnings
68
+ - [ ] Documentation updated if needed
69
+
70
+ ## Emergency Recovery
71
+
72
+ If you're resuming after a crash:
73
+
74
+ 1. Run `git status` to see uncommitted changes
75
+ 2. Read STATE.md for last known progress
76
+ 3. Check "Last Action" and "Next Steps" sections
77
+ 4. Continue from where work was interrupted
78
+
79
+ ---
80
+
81
+ *This file is auto-generated by Panopticon. Modify project-specific sections as needed.*