panopticon-cli 0.4.31 → 0.4.33

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 (138) hide show
  1. package/dist/{agents-GQDAKTEQ.js → agents-VLK4BMVA.js} +10 -7
  2. package/dist/chunk-7SN4L4PH.js +150 -0
  3. package/dist/chunk-7SN4L4PH.js.map +1 -0
  4. package/dist/chunk-7XNJJBH6.js +538 -0
  5. package/dist/chunk-7XNJJBH6.js.map +1 -0
  6. package/dist/chunk-AQXETQHW.js +113 -0
  7. package/dist/chunk-AQXETQHW.js.map +1 -0
  8. package/dist/{chunk-TMXN7THF.js → chunk-ASY7T35E.js} +170 -64
  9. package/dist/chunk-ASY7T35E.js.map +1 -0
  10. package/dist/chunk-B3PF6JPQ.js +212 -0
  11. package/dist/chunk-B3PF6JPQ.js.map +1 -0
  12. package/dist/{chunk-HNEWTIR3.js → chunk-BKCWRMUX.js} +100 -40
  13. package/dist/chunk-BKCWRMUX.js.map +1 -0
  14. package/dist/chunk-CFCUOV3Q.js +669 -0
  15. package/dist/chunk-CFCUOV3Q.js.map +1 -0
  16. package/dist/chunk-CWELWPWQ.js +32 -0
  17. package/dist/chunk-CWELWPWQ.js.map +1 -0
  18. package/dist/chunk-DI7ABPNQ.js +352 -0
  19. package/dist/chunk-DI7ABPNQ.js.map +1 -0
  20. package/dist/{chunk-VU4FLXV5.js → chunk-FQ66DECN.js} +31 -4
  21. package/dist/chunk-FQ66DECN.js.map +1 -0
  22. package/dist/{review-status-GWQYY77L.js → chunk-GFP3PIPB.js} +14 -7
  23. package/dist/chunk-GFP3PIPB.js.map +1 -0
  24. package/dist/chunk-JQBV3Q2W.js +29 -0
  25. package/dist/chunk-JQBV3Q2W.js.map +1 -0
  26. package/dist/{chunk-BWGFN44T.js → chunk-JT4O4YVM.js} +28 -16
  27. package/dist/chunk-JT4O4YVM.js.map +1 -0
  28. package/dist/{chunk-VIWUCJ4V.js → chunk-KJ2TRXNK.js} +34 -36
  29. package/dist/chunk-KJ2TRXNK.js.map +1 -0
  30. package/dist/{chunk-JY7R7V4G.js → chunk-OMNXYPXC.js} +2 -2
  31. package/dist/chunk-OMNXYPXC.js.map +1 -0
  32. package/dist/chunk-PELXV435.js +215 -0
  33. package/dist/chunk-PELXV435.js.map +1 -0
  34. package/dist/chunk-PI7Y3PSN.js +797 -0
  35. package/dist/chunk-PI7Y3PSN.js.map +1 -0
  36. package/dist/chunk-RBUO57TC.js +154 -0
  37. package/dist/chunk-RBUO57TC.js.map +1 -0
  38. package/dist/chunk-XFR2DLMR.js +600 -0
  39. package/dist/chunk-XFR2DLMR.js.map +1 -0
  40. package/dist/chunk-XKT5MHPT.js +677 -0
  41. package/dist/chunk-XKT5MHPT.js.map +1 -0
  42. package/dist/{chunk-HCTJFIJJ.js → chunk-YLPSQAM2.js} +2 -2
  43. package/dist/{chunk-HCTJFIJJ.js.map → chunk-YLPSQAM2.js.map} +1 -1
  44. package/dist/{chunk-6HXKTOD7.js → chunk-ZTFNYOC7.js} +53 -38
  45. package/dist/chunk-ZTFNYOC7.js.map +1 -0
  46. package/dist/cli/index.js +4362 -2922
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/{config-BOAMSKTF.js → config-4CJNUE3O.js} +7 -3
  49. package/dist/dashboard/prompts/merge-agent.md +217 -0
  50. package/dist/dashboard/prompts/review-agent.md +409 -0
  51. package/dist/dashboard/prompts/sync-main.md +84 -0
  52. package/dist/dashboard/prompts/test-agent.md +283 -0
  53. package/dist/dashboard/prompts/work-agent.md +247 -0
  54. package/dist/dashboard/public/assets/index-UjZq6ykz.css +32 -0
  55. package/dist/dashboard/public/assets/index-kAJqtLDO.js +708 -0
  56. package/dist/dashboard/public/index.html +2 -2
  57. package/dist/dashboard/server.js +15272 -3169
  58. package/dist/{dns-L3L2BB27.js → dns-7BDJSD3E.js} +4 -2
  59. package/dist/{feedback-writer-AAKF5BTK.js → feedback-writer-LVZ5TFYZ.js} +8 -4
  60. package/dist/feedback-writer-LVZ5TFYZ.js.map +1 -0
  61. package/dist/hume-WMAUBBV2.js +13 -0
  62. package/dist/index.d.ts +153 -40
  63. package/dist/index.js +65 -23
  64. package/dist/index.js.map +1 -1
  65. package/dist/{projects-VXRUCMLM.js → projects-JEIVIYC6.js} +3 -3
  66. package/dist/rally-RKFSWC7E.js +10 -0
  67. package/dist/{remote-agents-Z3R2A5BN.js → remote-agents-TFSMW7GN.js} +2 -2
  68. package/dist/{remote-workspace-2G6V2KNP.js → remote-workspace-AHVHQEES.js} +8 -8
  69. package/dist/review-status-EPFG4XM7.js +19 -0
  70. package/dist/shadow-state-5MDP6YXH.js +30 -0
  71. package/dist/shadow-state-5MDP6YXH.js.map +1 -0
  72. package/dist/{specialist-context-6SE5VRRC.js → specialist-context-T3NBMCIE.js} +8 -7
  73. package/dist/{specialist-context-6SE5VRRC.js.map → specialist-context-T3NBMCIE.js.map} +1 -1
  74. package/dist/{specialist-logs-EXLOQHQ2.js → specialist-logs-CVKD3YJ3.js} +7 -6
  75. package/dist/specialist-logs-CVKD3YJ3.js.map +1 -0
  76. package/dist/{specialists-BRUHPAXE.js → specialists-TKAP6T6Z.js} +7 -6
  77. package/dist/specialists-TKAP6T6Z.js.map +1 -0
  78. package/dist/tldr-daemon-T3THOUGT.js +21 -0
  79. package/dist/tldr-daemon-T3THOUGT.js.map +1 -0
  80. package/dist/traefik-QX4ZV4YG.js +19 -0
  81. package/dist/traefik-QX4ZV4YG.js.map +1 -0
  82. package/dist/tunnel-W2GZBLEV.js +13 -0
  83. package/dist/tunnel-W2GZBLEV.js.map +1 -0
  84. package/dist/workspace-manager-KLHUCIZV.js +22 -0
  85. package/dist/workspace-manager-KLHUCIZV.js.map +1 -0
  86. package/package.json +2 -2
  87. package/scripts/heartbeat-hook +37 -10
  88. package/scripts/patches/llm-tldr-tsx-support.py +109 -0
  89. package/scripts/pre-tool-hook +26 -15
  90. package/scripts/record-cost-event.js +177 -43
  91. package/scripts/record-cost-event.ts +87 -3
  92. package/scripts/statusline.sh +169 -0
  93. package/scripts/stop-hook +14 -11
  94. package/scripts/tldr-post-edit +72 -0
  95. package/scripts/tldr-read-enforcer +275 -0
  96. package/skills/check-merged/SKILL.md +143 -0
  97. package/skills/crash-investigation/SKILL.md +301 -0
  98. package/skills/github-cli/SKILL.md +185 -0
  99. package/skills/pan-reopen/SKILL.md +65 -0
  100. package/skills/pan-sync-main/SKILL.md +87 -0
  101. package/skills/pan-tldr/SKILL.md +149 -0
  102. package/skills/react-best-practices/SKILL.md +125 -0
  103. package/skills/spec-readiness/REPORT-TEMPLATE.md +158 -0
  104. package/skills/spec-readiness/SCORING-REFERENCE.md +369 -0
  105. package/skills/spec-readiness/SKILL.md +400 -0
  106. package/skills/spec-readiness-setup/SKILL.md +361 -0
  107. package/skills/workspace-status/SKILL.md +56 -0
  108. package/templates/traefik/dynamic/panopticon.yml.template +0 -5
  109. package/templates/traefik/traefik.yml +0 -8
  110. package/dist/chunk-3XAB4IXF.js +0 -51
  111. package/dist/chunk-3XAB4IXF.js.map +0 -1
  112. package/dist/chunk-6HXKTOD7.js.map +0 -1
  113. package/dist/chunk-BBCUK6N2.js +0 -241
  114. package/dist/chunk-BBCUK6N2.js.map +0 -1
  115. package/dist/chunk-BWGFN44T.js.map +0 -1
  116. package/dist/chunk-ELK6Q7QI.js +0 -545
  117. package/dist/chunk-ELK6Q7QI.js.map +0 -1
  118. package/dist/chunk-HNEWTIR3.js.map +0 -1
  119. package/dist/chunk-JY7R7V4G.js.map +0 -1
  120. package/dist/chunk-LYSBSZYV.js +0 -1523
  121. package/dist/chunk-LYSBSZYV.js.map +0 -1
  122. package/dist/chunk-TMXN7THF.js.map +0 -1
  123. package/dist/chunk-VIWUCJ4V.js.map +0 -1
  124. package/dist/chunk-VU4FLXV5.js.map +0 -1
  125. package/dist/dashboard/public/assets/index-C7X6LP5Z.css +0 -32
  126. package/dist/dashboard/public/assets/index-izWbAt7V.js +0 -645
  127. package/dist/feedback-writer-AAKF5BTK.js.map +0 -1
  128. package/dist/review-status-GWQYY77L.js.map +0 -1
  129. package/dist/traefik-CUJM6K5Z.js +0 -12
  130. /package/dist/{agents-GQDAKTEQ.js.map → agents-VLK4BMVA.js.map} +0 -0
  131. /package/dist/{config-BOAMSKTF.js.map → config-4CJNUE3O.js.map} +0 -0
  132. /package/dist/{dns-L3L2BB27.js.map → dns-7BDJSD3E.js.map} +0 -0
  133. /package/dist/{projects-VXRUCMLM.js.map → hume-WMAUBBV2.js.map} +0 -0
  134. /package/dist/{remote-agents-Z3R2A5BN.js.map → projects-JEIVIYC6.js.map} +0 -0
  135. /package/dist/{specialist-logs-EXLOQHQ2.js.map → rally-RKFSWC7E.js.map} +0 -0
  136. /package/dist/{specialists-BRUHPAXE.js.map → remote-agents-TFSMW7GN.js.map} +0 -0
  137. /package/dist/{remote-workspace-2G6V2KNP.js.map → remote-workspace-AHVHQEES.js.map} +0 -0
  138. /package/dist/{traefik-CUJM6K5Z.js.map → review-status-EPFG4XM7.js.map} +0 -0
@@ -0,0 +1,361 @@
1
+ ---
2
+ name: spec-readiness-setup
3
+ description: >
4
+ Create a customized wrapper for the spec-readiness skill. Configures branding,
5
+ issue tracker bindings, field mappings, and org-specific conventions. Generates
6
+ a ready-to-use wrapper skill directory with config.yaml and SKILL.md.
7
+ triggers:
8
+ - spec readiness setup
9
+ - setup spec readiness
10
+ - configure spec readiness
11
+ - create readiness wrapper
12
+ - customize readiness skill
13
+ - spec readiness branding
14
+ - brand readiness report
15
+ allowed-tools:
16
+ - Read
17
+ - Write
18
+ - Bash
19
+ - AskUserQuestion
20
+ ---
21
+
22
+ # Spec Readiness Setup — Wrapper Creator
23
+
24
+ This skill creates a customized wrapper for the `spec-readiness` core skill. The wrapper binds your organization's branding, issue tracker, field names, and conventions to the generic scoring engine.
25
+
26
+ ## What Gets Created
27
+
28
+ ```
29
+ ~/.panopticon/skills/spec-readiness-{name}/
30
+ SKILL.md # Wrapper skill that invokes the core with your config
31
+ config.yaml # Branding, tracker bindings, field mappings, conventions
32
+ ```
33
+
34
+ After creation, the wrapper is immediately available. Users invoke it by name (e.g., `spec readiness acme MIN-704`) or the core skill auto-detects it.
35
+
36
+ ---
37
+
38
+ ## Workflow
39
+
40
+ ### Step 1: Gather Information
41
+
42
+ Ask the user the following questions. Use `AskUserQuestion` with sensible defaults. Skip questions the user has already answered in their prompt.
43
+
44
+ **1. Wrapper name** (used in directory name and skill name):
45
+ - "What should this wrapper be called? This becomes the skill name, e.g., `spec-readiness-acme`"
46
+ - Default: derive from company name (lowercase, kebab-case)
47
+ - Validation: kebab-case, no spaces, alphanumeric + hyphens only
48
+
49
+ **2. Company / Organization name** (for report branding):
50
+ - "What company or team name should appear on reports?"
51
+ - This appears in the HTML report header and footer
52
+
53
+ **3. Issue tracker**:
54
+ - "Which issue tracker do you use?"
55
+ - Options: Linear, GitHub Issues, GitLab Issues, Rally, Jira, Other
56
+ - If Other: ask for details, we'll create a custom mapping
57
+
58
+ **4. Branding colors** (optional):
59
+ - "Do you have brand colors for the report? (Enter hex codes or skip for defaults)"
60
+ - Primary color (header/accents): default `#1e293b` (dark slate)
61
+ - Stripe color (top bar): default matches primary
62
+ - If the user has an existing branding skill, offer to read colors from it
63
+
64
+ **5. Tracker-specific fields** (based on tracker choice):
65
+
66
+ For **Linear**:
67
+ - "What's your team name in Linear?"
68
+ - "Do you use a label for customer-directed issues? (e.g., 'Customer Request')"
69
+
70
+ For **GitHub**:
71
+ - "What's the repo (owner/name)?"
72
+ - "Do you use labels for epics/features? (e.g., 'epic')"
73
+
74
+ For **GitLab**:
75
+ - "What's the project path?"
76
+ - "Do you use epics or parent issues for features?"
77
+
78
+ For **Rally**:
79
+ - "What's the MCP tool prefix for your Rally MCP server?"
80
+ - "Do you have a custom estimate field? (e.g., `c_ManDays`)"
81
+ - "Do you have an investment category field for customer-directed work?"
82
+
83
+ For **Jira**:
84
+ - "What's your Jira instance URL?"
85
+ - "Do you use Epics or another issue type for features?"
86
+ - "Custom estimate field name? (e.g., `story_points`, `customfield_10016`)"
87
+
88
+ **6. Org-specific conventions** (optional):
89
+ - "Do you use any naming patterns for overflow/carryover issues? (e.g., `[Unfinished]`, `[Part 2]`)"
90
+ - "Do you use any naming patterns for spike/investigation issues? (e.g., `SPIKE:`, `[Investigation]`)"
91
+ - "Any custom footer text for reports?"
92
+
93
+ ### Step 2: Build Tracker Tool Mapping
94
+
95
+ Based on the tracker choice, generate the tool mapping. These are the MCP tools or CLI commands the core skill will use.
96
+
97
+ **Linear:**
98
+ ```yaml
99
+ tracker:
100
+ type: linear
101
+ team: "{team_name}"
102
+ tools:
103
+ get_issue: "mcp__linear__get_issue"
104
+ list_child_issues: "mcp__linear__list_issues"
105
+ get_comments: "mcp__linear__list_comments"
106
+ search_issues: "mcp__linear__list_issues"
107
+ get_relations: "mcp__linear__get_issue" # with includeRelations=true
108
+ get_activity_log: null # not available in Linear
109
+ fields:
110
+ identifier: "identifier"
111
+ estimate: "estimate"
112
+ status: "status"
113
+ parent_field: "parentId"
114
+ customer_directed_label: "{label_or_null}"
115
+ overflow_markers: []
116
+ ```
117
+
118
+ **GitHub:**
119
+ ```yaml
120
+ tracker:
121
+ type: github
122
+ repo: "{owner}/{repo}"
123
+ tools:
124
+ get_issue: "bash:gh issue view {id} --repo {repo} --json title,body,state,labels,milestone,assignees,comments"
125
+ list_child_issues: "bash:gh issue list --repo {repo} --search 'parent:{id}' --json number,title,body,state,createdAt"
126
+ get_comments: "bash:gh issue view {id} --repo {repo} --json comments"
127
+ search_issues: "bash:gh issue list --repo {repo} --label bug --search '{query}' --json number,title,state"
128
+ get_relations: "bash:gh issue view {id} --repo {repo} --json body" # parse from body
129
+ get_activity_log: "bash:gh api repos/{repo}/issues/{id}/events"
130
+ fields:
131
+ identifier: "number"
132
+ estimate: null # GitHub has no native estimate field
133
+ status: "state"
134
+ parent_field: null # GitHub uses tasklist / sub-issue references
135
+ customer_directed_label: "{label_or_null}"
136
+ overflow_markers: []
137
+ ```
138
+
139
+ **GitLab:**
140
+ ```yaml
141
+ tracker:
142
+ type: gitlab
143
+ project: "{project_path}"
144
+ tools:
145
+ get_issue: "bash:glab issue view {id}"
146
+ list_child_issues: "bash:glab api '/projects/{project_id}/issues?parent_id={id}'"
147
+ get_comments: "bash:glab issue note list {id}"
148
+ search_issues: "bash:glab issue list --label bug --search '{query}'"
149
+ get_relations: "bash:glab api '/projects/{project_id}/issues/{id}/links'"
150
+ get_activity_log: "bash:glab api '/projects/{project_id}/issues/{id}/resource_state_events'"
151
+ fields:
152
+ identifier: "iid"
153
+ estimate: "weight"
154
+ status: "state"
155
+ parent_field: "parent_id"
156
+ customer_directed_label: "{label_or_null}"
157
+ overflow_markers: []
158
+ ```
159
+
160
+ **Rally:**
161
+ ```yaml
162
+ tracker:
163
+ type: rally
164
+ tools:
165
+ get_issue: "{mcp_prefix}__get_feature"
166
+ get_story: "{mcp_prefix}__get_story"
167
+ get_defect: "{mcp_prefix}__get_defect"
168
+ list_child_issues: null # from _collections.UserStories in feature response
169
+ get_comments: null # from Discussion collection
170
+ search_issues: "{mcp_prefix}__search_work_items"
171
+ get_relations: null # from Predecessors/Successors collections
172
+ get_activity_log: "{mcp_prefix}__get_revision_history"
173
+ search_risks: "{mcp_prefix}__search_risks"
174
+ fields:
175
+ identifier: "FormattedID"
176
+ estimate: "{custom_estimate_field_or_PlanEstimate}"
177
+ status: "ScheduleState"
178
+ parent_field: null # Rally uses Feature→UserStory hierarchy
179
+ customer_directed_label: null
180
+ investment_category_field: "{field_or_null}"
181
+ investment_category_value: "{value_or_null}"
182
+ overflow_markers:
183
+ - "[Unfinished]"
184
+ - "[Continued]"
185
+ ```
186
+
187
+ **Jira:**
188
+ ```yaml
189
+ tracker:
190
+ type: jira
191
+ url: "{jira_url}"
192
+ tools:
193
+ get_issue: "bash:curl -s -H 'Authorization: Bearer $JIRA_TOKEN' '{jira_url}/rest/api/3/issue/{id}'"
194
+ list_child_issues: "bash:curl -s -H 'Authorization: Bearer $JIRA_TOKEN' '{jira_url}/rest/api/2/search?jql=parent={id}'"
195
+ get_comments: "bash:curl -s -H 'Authorization: Bearer $JIRA_TOKEN' '{jira_url}/rest/api/3/issue/{id}/comment'"
196
+ search_issues: "bash:curl -s -H 'Authorization: Bearer $JIRA_TOKEN' '{jira_url}/rest/api/2/search?jql={jql}'"
197
+ get_relations: "bash:curl -s -H 'Authorization: Bearer $JIRA_TOKEN' '{jira_url}/rest/api/3/issue/{id}?fields=issuelinks'"
198
+ get_activity_log: "bash:curl -s -H 'Authorization: Bearer $JIRA_TOKEN' '{jira_url}/rest/api/3/issue/{id}/changelog'"
199
+ fields:
200
+ identifier: "key"
201
+ estimate: "{custom_field_or_story_points}"
202
+ status: "status.name"
203
+ parent_field: "parent.key"
204
+ customer_directed_label: "{label_or_null}"
205
+ overflow_markers: []
206
+ ```
207
+
208
+ ### Step 3: Generate config.yaml
209
+
210
+ Assemble the full config from gathered information:
211
+
212
+ ```yaml
213
+ # Spec Readiness Wrapper: {wrapper_name}
214
+ # Generated by spec-readiness-setup on {date}
215
+
216
+ tracker:
217
+ type: {type}
218
+ # ... tracker-specific fields from Step 2
219
+
220
+ branding:
221
+ company_name: "{company_name}"
222
+ primary_color: "{primary_color}"
223
+ stripe_color: "{stripe_color}"
224
+ footer_text: "{footer_text_or_null}"
225
+ logo_url: null
226
+
227
+ conventions:
228
+ overflow_markers: {markers_list}
229
+ spike_patterns:
230
+ - "spike"
231
+ - "investigation"
232
+ - "discovery"
233
+ - "POC"
234
+ - "prototype"
235
+ - "analysis"
236
+ # ... plus any user-specified patterns
237
+ estimate_field_custom: "{custom_field_or_null}"
238
+ investment_category_field: "{field_or_null}"
239
+ investment_category_value: "{value_or_null}"
240
+ ```
241
+
242
+ ### Step 4: Generate Wrapper SKILL.md
243
+
244
+ Create the wrapper skill that invokes the core:
245
+
246
+ ```markdown
247
+ ---
248
+ name: spec-readiness-{name}
249
+ description: >
250
+ {company_name}-branded requirements readiness scoring. Wraps the core
251
+ spec-readiness skill with {company_name} branding and {tracker_type}
252
+ tracker integration. Score issues 0-100 across 5 dimensions.
253
+ triggers:
254
+ - spec readiness {name}
255
+ - {name} readiness
256
+ - {name} spec score
257
+ # ... include all core triggers too
258
+ allowed-tools:
259
+ - Read
260
+ - Write
261
+ - Bash
262
+ - WebFetch
263
+ - Task
264
+ {tracker_specific_tools}
265
+ ---
266
+
267
+ # Spec Readiness — {company_name}
268
+
269
+ This is a branded wrapper for the `spec-readiness` core skill.
270
+
271
+ ## Configuration
272
+
273
+ - **Tracker:** {tracker_type}
274
+ - **Branding:** {company_name}
275
+ - **Config:** ~/.panopticon/skills/spec-readiness-{name}/config.yaml
276
+
277
+ ## Usage
278
+
279
+ Invoke exactly like the core skill. This wrapper is auto-detected:
280
+
281
+ ```
282
+ spec readiness {example_id}
283
+ how ready is {example_id}
284
+ readiness check {example_id}
285
+ ```
286
+
287
+ ## How It Works
288
+
289
+ 1. This wrapper sets the configuration context (branding, tracker, field mappings)
290
+ 2. The core `spec-readiness` skill runs the scoring engine
291
+ 3. Reports are generated with {company_name} branding
292
+
293
+ **To modify configuration**, edit:
294
+ `~/.panopticon/skills/spec-readiness-{name}/config.yaml`
295
+
296
+ **To update the scoring model**, the core skill at
297
+ `~/.panopticon/skills/spec-readiness/SKILL.md` controls all scoring logic.
298
+ ```
299
+
300
+ ### Step 5: Write Files
301
+
302
+ ```bash
303
+ mkdir -p ~/.panopticon/skills/spec-readiness-{name}
304
+ write config.yaml to ~/.panopticon/skills/spec-readiness-{name}/config.yaml
305
+ write SKILL.md to ~/.panopticon/skills/spec-readiness-{name}/SKILL.md
306
+ ```
307
+
308
+ ### Step 6: Verify and Report
309
+
310
+ 1. Confirm both files were written
311
+ 2. Show the user a summary:
312
+
313
+ ```
314
+ Created spec-readiness wrapper: spec-readiness-{name}
315
+
316
+ Location: ~/.panopticon/skills/spec-readiness-{name}/
317
+ Tracker: {tracker_type}
318
+ Branding: {company_name} ({primary_color})
319
+
320
+ Files:
321
+ config.yaml — tracker bindings, branding, conventions
322
+ SKILL.md — wrapper skill definition
323
+
324
+ Usage:
325
+ spec readiness {example_id}
326
+
327
+ To customize further, edit:
328
+ ~/.panopticon/skills/spec-readiness-{name}/config.yaml
329
+ ```
330
+
331
+ 3. Ask if they want to run a test assessment on a real issue to verify the setup
332
+
333
+ ---
334
+
335
+ ## Updating an Existing Wrapper
336
+
337
+ If the user runs this skill and a wrapper already exists:
338
+
339
+ 1. Read the existing `config.yaml`
340
+ 2. Show current configuration
341
+ 3. Ask what they want to change
342
+ 4. Update only the changed fields
343
+ 5. Preserve any manual customizations
344
+
345
+ ---
346
+
347
+ ## Examples
348
+
349
+ ```
350
+ User: setup spec readiness
351
+ → Full wizard: asks all questions
352
+
353
+ User: create readiness wrapper for Acme using Linear
354
+ → Skips tracker question, asks remaining
355
+
356
+ User: configure spec readiness for our team using GitHub Issues on eltmon/panopticon-cli
357
+ → Skips tracker question and repo question
358
+
359
+ User: spec readiness branding — change colors to #0891b2
360
+ → Updates existing wrapper branding only
361
+ ```
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: workspace-status
3
+ description: Auto-applied when reporting on agent/workspace status. Displays robust workspace information with URLs and commands.
4
+ ---
5
+
6
+ # Workspace Status Display Format
7
+
8
+ When discussing agent status, workspace setup, or providing updates about spawned agents, ALWAYS include this comprehensive table format.
9
+
10
+ ## Required Information Table
11
+
12
+ Display workspace details in this exact format:
13
+
14
+ ```markdown
15
+ ## Agent: {ISSUE_ID} - {ISSUE_TITLE}
16
+
17
+ | Field | Value |
18
+ |-------|-------|
19
+ | Issue | {TRACKER_URL} |
20
+ | PR/MR | {PR_OR_MR_URL} (if available) |
21
+ | Workspace | {WORKSPACE_PATH} |
22
+ | **Frontend** | https://feature-{issue-id-lowercase}.{PROJECT_DOMAIN} |
23
+ | **API** | https://api-feature-{issue-id-lowercase}.{PROJECT_DOMAIN} |
24
+ | tmux Session | agent-{issue-id-lowercase} |
25
+
26
+ ## Commands
27
+
28
+ | Action | Command |
29
+ |--------|---------|
30
+ | **Watch agent** | `tmux attach -t agent-{issue-id-lowercase}` |
31
+ | **Send feedback** | `pan tell {ISSUE_ID} "your message"` |
32
+ | **Approve & merge** | `pan approve {ISSUE_ID}` |
33
+ | Detach | `Ctrl+b` then `d` |
34
+ | Kill | `tmux kill-session -t agent-{issue-id-lowercase}` |
35
+ | Resources | `htop` or `watch -n 5 'free -h'` |
36
+ ```
37
+
38
+ ## When to Apply This Format
39
+
40
+ Use this format when:
41
+ - Spawning a new agent
42
+ - Reporting agent completion
43
+ - Providing agent status updates
44
+ - Resuming or restarting an agent
45
+ - User asks about an agent's status
46
+ - Providing investigation/spike results
47
+
48
+ ## Additional Context (Optional)
49
+
50
+ After the tables, you may add additional context like:
51
+ - Investigation plan or next steps
52
+ - Important notes about the workspace
53
+ - Special setup or requirements
54
+ - Resource availability status
55
+
56
+ The tables should ALWAYS come first, followed by any additional narrative.
@@ -36,8 +36,3 @@ http:
36
36
  loadBalancer:
37
37
  servers:
38
38
  - url: "http://host.docker.internal:{{DASHBOARD_API_PORT}}"
39
-
40
- tls:
41
- certificates:
42
- - certFile: /etc/traefik/certs/_wildcard.{{TRAEFIK_DOMAIN}}.pem
43
- keyFile: /etc/traefik/certs/_wildcard.{{TRAEFIK_DOMAIN}}-key.pem
@@ -43,11 +43,3 @@ log:
43
43
  # Access Logs
44
44
  accessLog:
45
45
  format: common
46
-
47
- # TLS Configuration
48
- tls:
49
- stores:
50
- default:
51
- defaultCertificate:
52
- certFile: /etc/traefik/certs/_wildcard.pan.localhost.pem
53
- keyFile: /etc/traefik/certs/_wildcard.pan.localhost-key.pem
@@ -1,51 +0,0 @@
1
- import {
2
- init_config,
3
- loadConfig
4
- } from "./chunk-VU4FLXV5.js";
5
- import {
6
- SOURCE_TRAEFIK_TEMPLATES,
7
- TRAEFIK_DYNAMIC_DIR,
8
- init_paths
9
- } from "./chunk-6HXKTOD7.js";
10
- import {
11
- init_esm_shims
12
- } from "./chunk-ZHC57RCV.js";
13
-
14
- // src/lib/traefik.ts
15
- init_esm_shims();
16
- init_paths();
17
- init_config();
18
- import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from "fs";
19
- import { join } from "path";
20
- function generatePanopticonTraefikConfig() {
21
- const templatePath = join(SOURCE_TRAEFIK_TEMPLATES, "dynamic", "panopticon.yml.template");
22
- if (!existsSync(templatePath)) {
23
- return false;
24
- }
25
- const config = loadConfig();
26
- const placeholders = {
27
- TRAEFIK_DOMAIN: config.traefik?.domain || "pan.localhost",
28
- DASHBOARD_PORT: String(config.dashboard.port),
29
- DASHBOARD_API_PORT: String(config.dashboard.api_port)
30
- };
31
- let content = readFileSync(templatePath, "utf-8");
32
- for (const [key, value] of Object.entries(placeholders)) {
33
- content = content.replace(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value);
34
- }
35
- mkdirSync(TRAEFIK_DYNAMIC_DIR, { recursive: true });
36
- const outputPath = join(TRAEFIK_DYNAMIC_DIR, "panopticon.yml");
37
- writeFileSync(outputPath, content, "utf-8");
38
- return true;
39
- }
40
- function cleanupTemplateFiles() {
41
- const copiedTemplate = join(TRAEFIK_DYNAMIC_DIR, "panopticon.yml.template");
42
- if (existsSync(copiedTemplate)) {
43
- unlinkSync(copiedTemplate);
44
- }
45
- }
46
-
47
- export {
48
- generatePanopticonTraefikConfig,
49
- cleanupTemplateFiles
50
- };
51
- //# sourceMappingURL=chunk-3XAB4IXF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/traefik.ts"],"sourcesContent":["/**\n * Traefik Configuration Generator\n *\n * Generates the Panopticon dashboard Traefik routing config\n * from a template, substituting values from config.toml.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'fs';\nimport { join } from 'path';\nimport { TRAEFIK_DYNAMIC_DIR, SOURCE_TRAEFIK_TEMPLATES } from './paths.js';\nimport { loadConfig } from './config.js';\n\n/**\n * Generate panopticon.yml from template using current config values.\n * Safe to call multiple times (idempotent).\n * Returns true if file was written, false if template not found.\n */\nexport function generatePanopticonTraefikConfig(): boolean {\n const templatePath = join(SOURCE_TRAEFIK_TEMPLATES, 'dynamic', 'panopticon.yml.template');\n if (!existsSync(templatePath)) {\n return false;\n }\n\n const config = loadConfig();\n const placeholders: Record<string, string> = {\n TRAEFIK_DOMAIN: config.traefik?.domain || 'pan.localhost',\n DASHBOARD_PORT: String(config.dashboard.port),\n DASHBOARD_API_PORT: String(config.dashboard.api_port),\n };\n\n let content = readFileSync(templatePath, 'utf-8');\n for (const [key, value] of Object.entries(placeholders)) {\n content = content.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n\n mkdirSync(TRAEFIK_DYNAMIC_DIR, { recursive: true });\n const outputPath = join(TRAEFIK_DYNAMIC_DIR, 'panopticon.yml');\n writeFileSync(outputPath, content, 'utf-8');\n return true;\n}\n\n/**\n * Remove any accidentally-copied .template files from the runtime Traefik dir.\n * Called after copyDirectoryRecursive in pan install.\n */\nexport function cleanupTemplateFiles(): void {\n const copiedTemplate = join(TRAEFIK_DYNAMIC_DIR, 'panopticon.yml.template');\n if (existsSync(copiedTemplate)) {\n unlinkSync(copiedTemplate);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AASA;AACA;AAHA,SAAS,YAAY,cAAc,eAAe,WAAW,kBAAkB;AAC/E,SAAS,YAAY;AASd,SAAS,kCAA2C;AACzD,QAAM,eAAe,KAAK,0BAA0B,WAAW,yBAAyB;AACxF,MAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,WAAW;AAC1B,QAAM,eAAuC;AAAA,IAC3C,gBAAgB,OAAO,SAAS,UAAU;AAAA,IAC1C,gBAAgB,OAAO,OAAO,UAAU,IAAI;AAAA,IAC5C,oBAAoB,OAAO,OAAO,UAAU,QAAQ;AAAA,EACtD;AAEA,MAAI,UAAU,aAAa,cAAc,OAAO;AAChD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,cAAU,QAAQ,QAAQ,IAAI,OAAO,SAAS,GAAG,UAAU,GAAG,GAAG,KAAK;AAAA,EACxE;AAEA,YAAU,qBAAqB,EAAE,WAAW,KAAK,CAAC;AAClD,QAAM,aAAa,KAAK,qBAAqB,gBAAgB;AAC7D,gBAAc,YAAY,SAAS,OAAO;AAC1C,SAAO;AACT;AAMO,SAAS,uBAA6B;AAC3C,QAAM,iBAAiB,KAAK,qBAAqB,yBAAyB;AAC1E,MAAI,WAAW,cAAc,GAAG;AAC9B,eAAW,cAAc;AAAA,EAC3B;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/paths.ts"],"sourcesContent":["import { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\n// Panopticon home directory (can be overridden for testing)\nexport const PANOPTICON_HOME = process.env.PANOPTICON_HOME || join(homedir(), '.panopticon');\n\n/** Get PANOPTICON_HOME dynamically (reads env var on each call, useful for testing) */\nexport function getPanopticonHome(): string {\n return process.env.PANOPTICON_HOME || join(homedir(), '.panopticon');\n}\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');\nexport const SETTINGS_FILE = join(CONFIG_DIR, 'settings.json');\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');\nexport const OPENCODE_DIR = join(homedir(), '.opencode');\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 opencode: {\n skills: join(OPENCODE_DIR, 'skills'),\n commands: join(OPENCODE_DIR, 'commands'),\n agents: join(OPENCODE_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');\nexport const SOURCE_SKILLS_DIR = join(packageRoot, 'skills');\nexport const SOURCE_DEV_SKILLS_DIR = join(packageRoot, 'dev-skills');\n\n/**\n * Detect if running in development mode (from npm link or panopticon repo)\n *\n * Dev mode is detected if:\n * 1. Running from the panopticon source directory (npm link)\n * 2. The SOURCE_DEV_SKILLS_DIR exists (only present in repo, not in npm package)\n */\nexport function isDevMode(): boolean {\n try {\n // Check if dev-skills directory exists - this is only in the repo, not npm package\n return existsSync(SOURCE_DEV_SKILLS_DIR);\n } catch {\n return false;\n }\n}\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":"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","names":[]}