panopticon-cli 0.4.32 → 0.5.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.
- package/README.md +96 -210
- package/dist/{agents-BDFHF4T3.js → agents-E43Y3HNU.js} +10 -7
- package/dist/chunk-7SN4L4PH.js +150 -0
- package/dist/chunk-7SN4L4PH.js.map +1 -0
- package/dist/{chunk-2NIAOCIC.js → chunk-AAFQANKW.js} +358 -97
- package/dist/chunk-AAFQANKW.js.map +1 -0
- package/dist/chunk-AQXETQHW.js +113 -0
- package/dist/chunk-AQXETQHW.js.map +1 -0
- package/dist/chunk-B3PF6JPQ.js +212 -0
- package/dist/chunk-B3PF6JPQ.js.map +1 -0
- package/dist/chunk-CFCUOV3Q.js +669 -0
- package/dist/chunk-CFCUOV3Q.js.map +1 -0
- package/dist/chunk-CWELWPWQ.js +32 -0
- package/dist/chunk-CWELWPWQ.js.map +1 -0
- package/dist/chunk-DI7ABPNQ.js +352 -0
- package/dist/chunk-DI7ABPNQ.js.map +1 -0
- package/dist/{chunk-VU4FLXV5.js → chunk-FQ66DECN.js} +31 -4
- package/dist/chunk-FQ66DECN.js.map +1 -0
- package/dist/{chunk-VIWUCJ4V.js → chunk-FTCPTHIJ.js} +57 -432
- package/dist/chunk-FTCPTHIJ.js.map +1 -0
- package/dist/{review-status-GWQYY77L.js → chunk-GFP3PIPB.js} +14 -7
- package/dist/chunk-GFP3PIPB.js.map +1 -0
- package/dist/chunk-GR6ZZMCX.js +816 -0
- package/dist/chunk-GR6ZZMCX.js.map +1 -0
- package/dist/chunk-HJSM6E6U.js +1038 -0
- package/dist/chunk-HJSM6E6U.js.map +1 -0
- package/dist/{chunk-XP2DXWYP.js → chunk-HZT2AOPN.js} +164 -39
- package/dist/chunk-HZT2AOPN.js.map +1 -0
- package/dist/chunk-JQBV3Q2W.js +29 -0
- package/dist/chunk-JQBV3Q2W.js.map +1 -0
- package/dist/{chunk-BWGFN44T.js → chunk-JT4O4YVM.js} +28 -16
- package/dist/chunk-JT4O4YVM.js.map +1 -0
- package/dist/chunk-NTO3EDB3.js +600 -0
- package/dist/chunk-NTO3EDB3.js.map +1 -0
- package/dist/{chunk-JY7R7V4G.js → chunk-OMNXYPXC.js} +2 -2
- package/dist/chunk-OMNXYPXC.js.map +1 -0
- package/dist/chunk-PELXV435.js +215 -0
- package/dist/chunk-PELXV435.js.map +1 -0
- package/dist/chunk-PPRFKTVC.js +154 -0
- package/dist/chunk-PPRFKTVC.js.map +1 -0
- package/dist/chunk-WQG2TYCB.js +677 -0
- package/dist/chunk-WQG2TYCB.js.map +1 -0
- package/dist/{chunk-HCTJFIJJ.js → chunk-YLPSQAM2.js} +2 -2
- package/dist/{chunk-HCTJFIJJ.js.map → chunk-YLPSQAM2.js.map} +1 -1
- package/dist/{chunk-6HXKTOD7.js → chunk-ZTFNYOC7.js} +53 -38
- package/dist/chunk-ZTFNYOC7.js.map +1 -0
- package/dist/cli/index.js +5103 -3165
- package/dist/cli/index.js.map +1 -1
- package/dist/{config-BOAMSKTF.js → config-4CJNUE3O.js} +7 -3
- package/dist/dashboard/prompts/merge-agent.md +217 -0
- package/dist/dashboard/prompts/review-agent.md +409 -0
- package/dist/dashboard/prompts/sync-main.md +84 -0
- package/dist/dashboard/prompts/test-agent.md +283 -0
- package/dist/dashboard/prompts/work-agent.md +249 -0
- package/dist/dashboard/public/assets/index-BxpjweAL.css +32 -0
- package/dist/dashboard/public/assets/index-DQHkwvvJ.js +743 -0
- package/dist/dashboard/public/index.html +2 -2
- package/dist/dashboard/server.js +17619 -4044
- package/dist/{dns-L3L2BB27.js → dns-7BDJSD3E.js} +4 -2
- package/dist/{feedback-writer-AAKF5BTK.js → feedback-writer-LVZ5TFYZ.js} +8 -4
- package/dist/feedback-writer-LVZ5TFYZ.js.map +1 -0
- package/dist/hume-WMAUBBV2.js +13 -0
- package/dist/index.d.ts +162 -40
- package/dist/index.js +67 -23
- package/dist/index.js.map +1 -1
- package/dist/{projects-VXRUCMLM.js → projects-JEIVIYC6.js} +3 -3
- package/dist/rally-RKFSWC7E.js +10 -0
- package/dist/{remote-agents-Z3R2A5BN.js → remote-agents-TFSMW7GN.js} +2 -2
- package/dist/{remote-workspace-2G6V2KNP.js → remote-workspace-AHVHQEES.js} +8 -8
- package/dist/review-status-EPFG4XM7.js +19 -0
- package/dist/shadow-state-5MDP6YXH.js +30 -0
- package/dist/shadow-state-5MDP6YXH.js.map +1 -0
- package/dist/{specialist-context-N32QBNNQ.js → specialist-context-ZC6A4M3I.js} +8 -7
- package/dist/{specialist-context-N32QBNNQ.js.map → specialist-context-ZC6A4M3I.js.map} +1 -1
- package/dist/{specialist-logs-GF3YV4KL.js → specialist-logs-KLGJCEUL.js} +7 -6
- package/dist/specialist-logs-KLGJCEUL.js.map +1 -0
- package/dist/{specialists-JBIW6MP4.js → specialists-O4HWDJL5.js} +7 -6
- package/dist/specialists-O4HWDJL5.js.map +1 -0
- package/dist/tldr-daemon-T3THOUGT.js +21 -0
- package/dist/tldr-daemon-T3THOUGT.js.map +1 -0
- package/dist/traefik-QN7R5I6V.js +19 -0
- package/dist/traefik-QN7R5I6V.js.map +1 -0
- package/dist/tunnel-W2GZBLEV.js +13 -0
- package/dist/tunnel-W2GZBLEV.js.map +1 -0
- package/dist/workspace-manager-IE4JL2JP.js +22 -0
- package/dist/workspace-manager-IE4JL2JP.js.map +1 -0
- package/package.json +2 -2
- package/scripts/heartbeat-hook +37 -10
- package/scripts/patches/llm-tldr-tsx-support.py +109 -0
- package/scripts/pre-tool-hook +26 -15
- package/scripts/record-cost-event.js +177 -43
- package/scripts/record-cost-event.ts +87 -3
- package/scripts/statusline.sh +169 -0
- package/scripts/stop-hook +21 -11
- package/scripts/tldr-post-edit +72 -0
- package/scripts/tldr-read-enforcer +275 -0
- package/scripts/work-agent-stop-hook +137 -0
- package/skills/check-merged/SKILL.md +143 -0
- package/skills/crash-investigation/SKILL.md +301 -0
- package/skills/github-cli/SKILL.md +185 -0
- package/skills/myn-standards/SKILL.md +351 -0
- package/skills/pan-reopen/SKILL.md +65 -0
- package/skills/pan-sync-main/SKILL.md +87 -0
- package/skills/pan-tldr/SKILL.md +149 -0
- package/skills/react-best-practices/SKILL.md +125 -0
- package/skills/spec-readiness/REPORT-TEMPLATE.md +158 -0
- package/skills/spec-readiness/SCORING-REFERENCE.md +369 -0
- package/skills/spec-readiness/SKILL.md +400 -0
- package/skills/spec-readiness-setup/SKILL.md +361 -0
- package/skills/workspace-status/SKILL.md +56 -0
- package/skills/write-spec/SKILL.md +138 -0
- package/templates/traefik/dynamic/panopticon.yml.template +0 -5
- package/templates/traefik/traefik.yml +0 -8
- package/dist/chunk-2NIAOCIC.js.map +0 -1
- package/dist/chunk-3XAB4IXF.js +0 -51
- package/dist/chunk-3XAB4IXF.js.map +0 -1
- package/dist/chunk-6HXKTOD7.js.map +0 -1
- package/dist/chunk-BBCUK6N2.js +0 -241
- package/dist/chunk-BBCUK6N2.js.map +0 -1
- package/dist/chunk-BWGFN44T.js.map +0 -1
- package/dist/chunk-ELK6Q7QI.js +0 -545
- package/dist/chunk-ELK6Q7QI.js.map +0 -1
- package/dist/chunk-JY7R7V4G.js.map +0 -1
- package/dist/chunk-LYSBSZYV.js +0 -1523
- package/dist/chunk-LYSBSZYV.js.map +0 -1
- package/dist/chunk-VIWUCJ4V.js.map +0 -1
- package/dist/chunk-VU4FLXV5.js.map +0 -1
- package/dist/chunk-XP2DXWYP.js.map +0 -1
- package/dist/dashboard/public/assets/index-C7X6LP5Z.css +0 -32
- package/dist/dashboard/public/assets/index-ClYqpcAJ.js +0 -645
- package/dist/feedback-writer-AAKF5BTK.js.map +0 -1
- package/dist/review-status-GWQYY77L.js.map +0 -1
- package/dist/traefik-CUJM6K5Z.js +0 -12
- /package/dist/{agents-BDFHF4T3.js.map → agents-E43Y3HNU.js.map} +0 -0
- /package/dist/{config-BOAMSKTF.js.map → config-4CJNUE3O.js.map} +0 -0
- /package/dist/{dns-L3L2BB27.js.map → dns-7BDJSD3E.js.map} +0 -0
- /package/dist/{projects-VXRUCMLM.js.map → hume-WMAUBBV2.js.map} +0 -0
- /package/dist/{remote-agents-Z3R2A5BN.js.map → projects-JEIVIYC6.js.map} +0 -0
- /package/dist/{specialist-logs-GF3YV4KL.js.map → rally-RKFSWC7E.js.map} +0 -0
- /package/dist/{specialists-JBIW6MP4.js.map → remote-agents-TFSMW7GN.js.map} +0 -0
- /package/dist/{remote-workspace-2G6V2KNP.js.map → remote-workspace-AHVHQEES.js.map} +0 -0
- /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.
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: write-spec
|
|
3
|
+
description: >
|
|
4
|
+
Write a feature spec (*-spec.md) for an issue. The spec is the human-written
|
|
5
|
+
requirements document that feeds into the planning agent. Part of the
|
|
6
|
+
spec → plan → implement pipeline.
|
|
7
|
+
triggers:
|
|
8
|
+
- write spec
|
|
9
|
+
- write-spec
|
|
10
|
+
- create spec
|
|
11
|
+
- feature spec
|
|
12
|
+
allowed-tools:
|
|
13
|
+
- Read
|
|
14
|
+
- Write
|
|
15
|
+
- Bash
|
|
16
|
+
- Grep
|
|
17
|
+
- Glob
|
|
18
|
+
- ToolSearch
|
|
19
|
+
version: "1.0.0"
|
|
20
|
+
author: "Ed Becker"
|
|
21
|
+
license: "MIT"
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Write Feature Spec
|
|
25
|
+
|
|
26
|
+
**Trigger:** `/write-spec <issue-id>` or `/write-spec <issue-id> <title>`
|
|
27
|
+
|
|
28
|
+
## The Spec → Plan Pipeline
|
|
29
|
+
|
|
30
|
+
Panopticon uses a two-stage planning process:
|
|
31
|
+
|
|
32
|
+
1. **Spec** (`*-spec.md`) — Human-written (often with AI assistance). Defines WHAT to build and WHY. Contains requirements, constraints, scope, research, and design decisions.
|
|
33
|
+
2. **Plan** (`*-plan.md`) — Generated by the planning agent. Defines HOW to build it. Contains architecture, tasks with dependencies, file-level changes, and difficulty estimates.
|
|
34
|
+
|
|
35
|
+
The planning agent reads the spec as its primary input, explores the codebase, asks clarifying questions, then produces the implementation plan.
|
|
36
|
+
|
|
37
|
+
## When to Write a Spec
|
|
38
|
+
|
|
39
|
+
- **Complex features** (multi-file, cross-cutting, architectural) — always write a spec first
|
|
40
|
+
- **Features with research** — when you've explored options, talked to stakeholders, or analyzed competitors
|
|
41
|
+
- **Features with constraints** — when there are specific technical or UX requirements the agent needs to know
|
|
42
|
+
- **Simple bug fixes or small changes** — skip the spec, go directly to planning or implementation
|
|
43
|
+
|
|
44
|
+
## Execution Steps
|
|
45
|
+
|
|
46
|
+
### 1. Identify the Issue
|
|
47
|
+
|
|
48
|
+
Parse the issue ID from the command argument. Determine the project:
|
|
49
|
+
- `MIN-XXX` → MYN project, docs at `/home/eltmon/Projects/myn/docs/`
|
|
50
|
+
- `PAN-XXX` → Panopticon project, docs at `/home/eltmon/Projects/panopticon-cli/docs/`
|
|
51
|
+
|
|
52
|
+
### 2. Gather Context
|
|
53
|
+
|
|
54
|
+
- Fetch the issue from the tracker (Linear for MIN, GitHub for PAN) to get title, description, comments
|
|
55
|
+
- Check if a spec already exists at `docs/prds/active/{issue-id-lowercase}-*-spec.md`
|
|
56
|
+
- If updating an existing spec, read it first
|
|
57
|
+
|
|
58
|
+
### 3. Research (Interactive)
|
|
59
|
+
|
|
60
|
+
Use AskUserQuestion or discussion to understand:
|
|
61
|
+
- What problem does this solve?
|
|
62
|
+
- Who benefits?
|
|
63
|
+
- What's in scope vs out of scope?
|
|
64
|
+
- Any technical constraints or preferences?
|
|
65
|
+
- Are there related specs or prior art to reference?
|
|
66
|
+
|
|
67
|
+
### 4. Write the Spec
|
|
68
|
+
|
|
69
|
+
Create the file at: `docs/prds/active/{issue-id-lowercase}-{short-title}-spec.md`
|
|
70
|
+
|
|
71
|
+
Use this structure:
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
# {Issue ID}: {Title}
|
|
75
|
+
|
|
76
|
+
## Problem Statement
|
|
77
|
+
What problem does this solve? Why does it matter?
|
|
78
|
+
|
|
79
|
+
## Requirements
|
|
80
|
+
### Must Have
|
|
81
|
+
- Requirement 1
|
|
82
|
+
- Requirement 2
|
|
83
|
+
|
|
84
|
+
### Should Have
|
|
85
|
+
- Nice-to-have 1
|
|
86
|
+
|
|
87
|
+
### Out of Scope
|
|
88
|
+
- Explicitly excluded items
|
|
89
|
+
|
|
90
|
+
## Design
|
|
91
|
+
### User Experience
|
|
92
|
+
How should it work from the user's perspective?
|
|
93
|
+
|
|
94
|
+
### Technical Approach
|
|
95
|
+
High-level technical direction (NOT implementation details — that's for the plan).
|
|
96
|
+
|
|
97
|
+
### Constraints
|
|
98
|
+
- Performance requirements
|
|
99
|
+
- Compatibility requirements
|
|
100
|
+
- Security considerations
|
|
101
|
+
|
|
102
|
+
## References
|
|
103
|
+
- Related issues: MIN-XXX, MIN-YYY
|
|
104
|
+
- Prior art: links to existing code, docs, or external references
|
|
105
|
+
- Research: any analysis or competitor research
|
|
106
|
+
|
|
107
|
+
## Open Questions
|
|
108
|
+
- Questions to resolve during planning
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 5. Confirm File Location
|
|
112
|
+
|
|
113
|
+
After writing, confirm:
|
|
114
|
+
```
|
|
115
|
+
Spec written: docs/prds/active/{filename}-spec.md
|
|
116
|
+
|
|
117
|
+
Next steps:
|
|
118
|
+
1. Review and edit the spec as needed
|
|
119
|
+
2. Click "Plan" on the issue in the dashboard
|
|
120
|
+
3. The planning agent will read this spec and produce an implementation plan
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## File Naming Convention
|
|
124
|
+
|
|
125
|
+
| Type | Pattern | Created By | Example |
|
|
126
|
+
|------|---------|-----------|---------|
|
|
127
|
+
| Spec | `{issue-id}-{title}-spec.md` | Human (this skill) | `min-734-kaia-openclaw-a2a-spec.md` |
|
|
128
|
+
| Plan | `{issue-id}-plan.md` | Planning agent | `min-734-plan.md` |
|
|
129
|
+
|
|
130
|
+
Both live in `docs/prds/active/`. Specs are never overwritten by agents.
|
|
131
|
+
|
|
132
|
+
## Important Notes
|
|
133
|
+
|
|
134
|
+
- **Specs are for humans** — write clearly, include context and rationale
|
|
135
|
+
- **Plans are for agents** — the planning agent produces structured, actionable tasks
|
|
136
|
+
- **Don't over-specify implementation** — the planning agent + codebase exploration will figure out the HOW
|
|
137
|
+
- **DO specify constraints** — things the agent can't discover on its own (performance targets, UX requirements, API contracts)
|
|
138
|
+
- **Reference existing code** — point to patterns, files, or modules the agent should follow
|
|
@@ -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
|