prjct-cli 0.39.0 → 0.41.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/CHANGELOG.md +38 -0
- package/core/agentic/orchestrator-executor.ts +23 -6
- package/core/integrations/jira/cache.ts +57 -0
- package/core/integrations/jira/index.ts +16 -11
- package/core/integrations/jira/service.ts +244 -0
- package/core/integrations/linear/cache.ts +68 -0
- package/core/integrations/linear/index.ts +15 -1
- package/core/integrations/linear/service.ts +260 -0
- package/core/services/skill-installer.ts +431 -0
- package/core/services/skill-lock.ts +132 -0
- package/core/services/skill-service.ts +34 -24
- package/core/types/services.ts +6 -1
- package/dist/bin/prjct.mjs +17 -6
- package/dist/core/infrastructure/setup.js +192 -238
- package/package.json +1 -1
- package/templates/commands/done.md +24 -1
- package/templates/commands/jira.md +91 -139
- package/templates/commands/linear.md +81 -130
- package/templates/commands/skill.md +174 -25
- package/templates/commands/task.md +66 -2
- package/templates/mcp-config.json +4 -20
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
allowed-tools: [Read, Write, Bash, AskUserQuestion]
|
|
3
|
-
description: 'Linear issue tracker integration via
|
|
3
|
+
description: 'Linear issue tracker integration via SDK'
|
|
4
4
|
extends: '_bases/tracker-base.md'
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -10,20 +10,12 @@ extends: '_bases/tracker-base.md'
|
|
|
10
10
|
|
|
11
11
|
**ARGUMENTS**: $ARGUMENTS
|
|
12
12
|
|
|
13
|
-
Manage Linear issues directly from prjct using
|
|
14
|
-
|
|
15
|
-
## Tracker-Specific Config
|
|
16
|
-
|
|
17
|
-
- `{mcpServerName}`: "linear"
|
|
18
|
-
- `{mcpPrefix}`: "mcp__linear__"
|
|
19
|
-
- `{projectKey}`: "teamId"
|
|
13
|
+
Manage Linear issues directly from prjct using the @linear/sdk for fast performance.
|
|
20
14
|
|
|
21
15
|
## Context Variables
|
|
22
16
|
|
|
23
17
|
- `{projectId}`: From `.prjct/prjct.config.json`
|
|
24
18
|
- `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
|
|
25
|
-
- `{agentName}`: Name of the AI agent (Claude Code, Gemini CLI)
|
|
26
|
-
- `{agentSettingsPath}`: Path to agent settings (settings.json)
|
|
27
19
|
- `{args}`: User-provided arguments (subcommand)
|
|
28
20
|
|
|
29
21
|
---
|
|
@@ -33,7 +25,7 @@ Manage Linear issues directly from prjct using MCP (no SDK needed).
|
|
|
33
25
|
| Command | Description |
|
|
34
26
|
|---------|-------------|
|
|
35
27
|
| `p. linear` | Show your assigned issues |
|
|
36
|
-
| `p. linear setup` | Configure Linear (first time) |
|
|
28
|
+
| `p. linear setup` | Configure Linear API key (first time) |
|
|
37
29
|
| `p. linear start <ID>` | Start working on issue (e.g., PRJ-59) |
|
|
38
30
|
| `p. linear comment <ID> <text>` | Add comment to issue |
|
|
39
31
|
|
|
@@ -41,11 +33,10 @@ Manage Linear issues directly from prjct using MCP (no SDK needed).
|
|
|
41
33
|
|
|
42
34
|
## Authentication
|
|
43
35
|
|
|
44
|
-
Linear uses
|
|
36
|
+
Linear uses API key authentication for fast SDK access.
|
|
45
37
|
|
|
46
|
-
**
|
|
47
|
-
**
|
|
48
|
-
**Tools prefix**: `mcp__linear__*`
|
|
38
|
+
**Get API Key**: https://linear.app/settings/api
|
|
39
|
+
**Env Variable**: `LINEAR_API_KEY`
|
|
49
40
|
|
|
50
41
|
---
|
|
51
42
|
|
|
@@ -63,46 +54,20 @@ IF file not found:
|
|
|
63
54
|
|
|
64
55
|
---
|
|
65
56
|
|
|
66
|
-
## Step 2:
|
|
57
|
+
## Step 2: Check API Key
|
|
67
58
|
|
|
68
59
|
```
|
|
69
|
-
|
|
70
|
-
CHECK: Does mcpServers.linear exist?
|
|
71
|
-
|
|
72
|
-
IF not exists:
|
|
73
|
-
READ: templates/mcp-config.json
|
|
74
|
-
EXTRACT: mcpServers.linear
|
|
75
|
-
|
|
76
|
-
MERGE into {agentSettingsPath}:
|
|
77
|
-
{
|
|
78
|
-
"mcpServers": {
|
|
79
|
-
"linear": {
|
|
80
|
-
"command": "npx",
|
|
81
|
-
"args": ["-y", "mcp-remote", "https://mcp.linear.app/mcp"]
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
WRITE: {agentSettingsPath}
|
|
87
|
-
|
|
88
|
-
OUTPUT: "✅ Installed Linear MCP server"
|
|
89
|
-
OUTPUT: ""
|
|
90
|
-
OUTPUT: "⚠️ Restart {agentName} to activate the MCP server."
|
|
91
|
-
OUTPUT: "Then run `p. linear setup` again to complete configuration."
|
|
92
|
-
STOP
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
---
|
|
60
|
+
CHECK: Is LINEAR_API_KEY set in environment?
|
|
96
61
|
|
|
97
|
-
|
|
62
|
+
IF not set:
|
|
63
|
+
ASK: "Enter your Linear API key"
|
|
64
|
+
HINT: "Get it from https://linear.app/settings/api"
|
|
98
65
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
OUTPUT: "
|
|
104
|
-
OUTPUT: "Restart {agentName}, then run `p. linear setup` again."
|
|
105
|
-
STOP
|
|
66
|
+
ONCE PROVIDED:
|
|
67
|
+
OUTPUT: "Add to your shell profile:"
|
|
68
|
+
OUTPUT: "export LINEAR_API_KEY='your-key'"
|
|
69
|
+
OUTPUT: ""
|
|
70
|
+
OUTPUT: "Or add to .env file in project root"
|
|
106
71
|
```
|
|
107
72
|
|
|
108
73
|
---
|
|
@@ -111,30 +76,28 @@ IF not available:
|
|
|
111
76
|
|
|
112
77
|
### Flow
|
|
113
78
|
|
|
114
|
-
1. **
|
|
79
|
+
1. **Check for API key**
|
|
115
80
|
```
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
81
|
+
IF LINEAR_API_KEY not in environment:
|
|
82
|
+
ASK: "Enter your Linear API key"
|
|
83
|
+
PROVIDE: Link to https://linear.app/settings/api
|
|
119
84
|
```
|
|
120
85
|
|
|
121
|
-
2. **Test connection
|
|
86
|
+
2. **Test SDK connection**
|
|
122
87
|
```
|
|
123
|
-
|
|
124
|
-
|
|
88
|
+
IMPORT: linearService from core/integrations/linear
|
|
89
|
+
CALL: linearService.initializeFromApiKey(apiKey)
|
|
125
90
|
|
|
126
|
-
#
|
|
91
|
+
# This will verify the connection
|
|
127
92
|
```
|
|
128
93
|
|
|
129
94
|
3. **Get user info and teams**
|
|
130
95
|
```
|
|
131
|
-
|
|
132
|
-
EXTRACT:
|
|
133
|
-
|
|
134
|
-
USE TOOL: mcp__linear__list_teams
|
|
96
|
+
CALL: linearService.getTeams()
|
|
97
|
+
EXTRACT: List of teams with id, name, key
|
|
135
98
|
```
|
|
136
99
|
|
|
137
|
-
4. **Ask user to select team**
|
|
100
|
+
4. **Ask user to select default team**
|
|
138
101
|
```
|
|
139
102
|
ASK: "Select your default team"
|
|
140
103
|
OPTIONS: List of teams
|
|
@@ -146,11 +109,10 @@ IF not available:
|
|
|
146
109
|
"integrations": {
|
|
147
110
|
"linear": {
|
|
148
111
|
"enabled": true,
|
|
149
|
-
"authMode": "
|
|
112
|
+
"authMode": "api-key",
|
|
150
113
|
"teamId": "{teamId}",
|
|
151
114
|
"teamName": "{teamName}",
|
|
152
115
|
"teamKey": "{teamKey}",
|
|
153
|
-
"userId": "{userId}",
|
|
154
116
|
"setupAt": "{timestamp}"
|
|
155
117
|
}
|
|
156
118
|
}
|
|
@@ -160,11 +122,10 @@ IF not available:
|
|
|
160
122
|
### Output
|
|
161
123
|
|
|
162
124
|
```
|
|
163
|
-
|
|
125
|
+
Linear configured
|
|
164
126
|
|
|
165
|
-
Connected as: {name} ({email})
|
|
166
127
|
Team: {teamName} ({teamKey})
|
|
167
|
-
Auth:
|
|
128
|
+
Auth: API Key (SDK)
|
|
168
129
|
|
|
169
130
|
Next: `p. linear` to see your issues
|
|
170
131
|
```
|
|
@@ -174,18 +135,15 @@ Next: `p. linear` to see your issues
|
|
|
174
135
|
## Subcommand: status (default, no args)
|
|
175
136
|
|
|
176
137
|
```
|
|
177
|
-
|
|
178
|
-
PARAMS:
|
|
179
|
-
assignedToMe: true
|
|
180
|
-
limit: 10
|
|
138
|
+
CALL: linearService.fetchAssignedIssues({ limit: 10 })
|
|
181
139
|
|
|
182
140
|
OUTPUT:
|
|
183
|
-
Linear: Connected
|
|
141
|
+
Linear: Connected
|
|
184
142
|
Team: {teamName} ({teamKey})
|
|
185
143
|
|
|
186
144
|
Your issues ({count}):
|
|
187
|
-
|
|
188
|
-
|
|
145
|
+
{PRJ-123} {title} ({status})
|
|
146
|
+
{PRJ-124} {title} ({status})
|
|
189
147
|
...
|
|
190
148
|
|
|
191
149
|
Next: `p. linear start PRJ-123` to begin work
|
|
@@ -197,24 +155,25 @@ Next: `p. linear start PRJ-123` to begin work
|
|
|
197
155
|
|
|
198
156
|
```
|
|
199
157
|
1. Get issue
|
|
200
|
-
|
|
201
|
-
|
|
158
|
+
CALL: linearService.fetchIssue("{ID}")
|
|
159
|
+
EXTRACT: id, title, description, status
|
|
202
160
|
|
|
203
161
|
2. Update status to In Progress
|
|
204
|
-
|
|
205
|
-
PARAMS:
|
|
206
|
-
issueId: "{uuid}"
|
|
207
|
-
stateId: "{in_progress_state_id}"
|
|
162
|
+
CALL: linearService.markInProgress("{ID}")
|
|
208
163
|
|
|
209
164
|
3. Create prjct task from issue
|
|
165
|
+
- Use issue title as task description
|
|
166
|
+
- Link externalId to Linear issue
|
|
210
167
|
|
|
211
|
-
4. Create git branch
|
|
168
|
+
4. Create git branch
|
|
169
|
+
PATTERN: feature/{ID}-{slug}
|
|
170
|
+
EXAMPLE: feature/PRJ-59-add-user-auth
|
|
212
171
|
|
|
213
172
|
OUTPUT:
|
|
214
173
|
Started: {ID} - {title}
|
|
215
174
|
|
|
216
175
|
Branch: feature/PRJ-59-add-user-auth
|
|
217
|
-
Linear: In Progress
|
|
176
|
+
Linear: In Progress
|
|
218
177
|
|
|
219
178
|
Next: Work on the task, then `p. done`
|
|
220
179
|
```
|
|
@@ -224,15 +183,8 @@ Next: Work on the task, then `p. done`
|
|
|
224
183
|
## Subcommand: comment <ID> <text>
|
|
225
184
|
|
|
226
185
|
```
|
|
227
|
-
1.
|
|
228
|
-
|
|
229
|
-
PARAMS: { "issueId": "{ID}" }
|
|
230
|
-
|
|
231
|
-
2. Add comment
|
|
232
|
-
USE TOOL: mcp__linear__create_comment
|
|
233
|
-
PARAMS:
|
|
234
|
-
issueId: "{uuid}"
|
|
235
|
-
body: "{text}"
|
|
186
|
+
1. Add comment via SDK
|
|
187
|
+
CALL: linearService.addComment("{ID}", "{text}")
|
|
236
188
|
|
|
237
189
|
OUTPUT:
|
|
238
190
|
Comment added to {ID}
|
|
@@ -240,44 +192,31 @@ Comment added to {ID}
|
|
|
240
192
|
|
|
241
193
|
---
|
|
242
194
|
|
|
243
|
-
##
|
|
195
|
+
## SDK Service Reference
|
|
244
196
|
|
|
245
|
-
|
|
246
|
-
|-----------|----------|
|
|
247
|
-
| List issues | `mcp__linear__list_issues` |
|
|
248
|
-
| Get issue | `mcp__linear__get_issue` |
|
|
249
|
-
| Update issue | `mcp__linear__update_issue` |
|
|
250
|
-
| Create issue | `mcp__linear__create_issue` |
|
|
251
|
-
| Add comment | `mcp__linear__create_comment` |
|
|
252
|
-
| Get viewer | `mcp__linear__get_viewer` |
|
|
253
|
-
| List teams | `mcp__linear__list_teams` |
|
|
197
|
+
The `linearService` from `core/integrations/linear` provides:
|
|
254
198
|
|
|
255
|
-
|
|
199
|
+
| Operation | SDK Method |
|
|
200
|
+
|-----------|------------|
|
|
201
|
+
| Initialize | `linearService.initializeFromApiKey(key, teamId?)` |
|
|
202
|
+
| List assigned | `linearService.fetchAssignedIssues(options?)` |
|
|
203
|
+
| Get issue | `linearService.fetchIssue(id)` |
|
|
204
|
+
| Create issue | `linearService.createIssue(input)` |
|
|
205
|
+
| Update issue | `linearService.updateIssue(id, input)` |
|
|
206
|
+
| Mark in progress | `linearService.markInProgress(id)` |
|
|
207
|
+
| Mark done | `linearService.markDone(id)` |
|
|
208
|
+
| Add comment | `linearService.addComment(id, body)` |
|
|
209
|
+
| Get teams | `linearService.getTeams()` |
|
|
210
|
+
| Get projects | `linearService.getProjects()` |
|
|
256
211
|
|
|
257
|
-
|
|
258
|
-
USE TOOL: mcp__linear__list_issues
|
|
259
|
-
PARAMS:
|
|
260
|
-
assignedToMe: true
|
|
261
|
-
includeArchived: false
|
|
262
|
-
limit: 20
|
|
263
|
-
```
|
|
212
|
+
### Caching
|
|
264
213
|
|
|
265
|
-
|
|
214
|
+
All read operations are cached for 5 minutes:
|
|
215
|
+
- Issues are cached by ID and identifier (e.g., "PRJ-123")
|
|
216
|
+
- Assigned issues list is cached per user
|
|
217
|
+
- Teams and projects are cached globally
|
|
266
218
|
|
|
267
|
-
|
|
268
|
-
USE TOOL: mcp__linear__get_issue
|
|
269
|
-
PARAMS:
|
|
270
|
-
issueId: "PRJ-59"
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
### Example: Add Comment
|
|
274
|
-
|
|
275
|
-
```
|
|
276
|
-
USE TOOL: mcp__linear__create_comment
|
|
277
|
-
PARAMS:
|
|
278
|
-
issueId: "{uuid}"
|
|
279
|
-
body: "Implementation complete. Used MCP instead of SDK."
|
|
280
|
-
```
|
|
219
|
+
Cache is automatically invalidated on writes (create, update, status changes).
|
|
281
220
|
|
|
282
221
|
---
|
|
283
222
|
|
|
@@ -285,9 +224,8 @@ PARAMS:
|
|
|
285
224
|
|
|
286
225
|
| What | Where |
|
|
287
226
|
|------|-------|
|
|
288
|
-
|
|
|
227
|
+
| API Key | `LINEAR_API_KEY` environment variable |
|
|
289
228
|
| Config | `{globalPath}/project.json` → `integrations.linear` |
|
|
290
|
-
| Issue cache | `{globalPath}/storage/issues.json` |
|
|
291
229
|
|
|
292
230
|
---
|
|
293
231
|
|
|
@@ -295,9 +233,10 @@ PARAMS:
|
|
|
295
233
|
|
|
296
234
|
| Error | Action |
|
|
297
235
|
|-------|--------|
|
|
298
|
-
|
|
|
299
|
-
|
|
|
236
|
+
| No API key | "Set LINEAR_API_KEY or run `p. linear setup`" |
|
|
237
|
+
| Invalid API key | "Check your API key at https://linear.app/settings/api" |
|
|
300
238
|
| Issue not found | "Issue {ID} not found in Linear" |
|
|
239
|
+
| Network error | "Check your internet connection" |
|
|
301
240
|
|
|
302
241
|
---
|
|
303
242
|
|
|
@@ -310,3 +249,15 @@ PARAMS:
|
|
|
310
249
|
|
|
311
250
|
Next: {suggested action}
|
|
312
251
|
```
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Performance
|
|
256
|
+
|
|
257
|
+
SDK operations are significantly faster than MCP:
|
|
258
|
+
|
|
259
|
+
| Operation | SDK | MCP (deprecated) |
|
|
260
|
+
|-----------|-----|------------------|
|
|
261
|
+
| Fetch issue | ~150ms | ~600ms |
|
|
262
|
+
| Create issue | ~200ms | ~800ms |
|
|
263
|
+
| Batch (10) | ~500ms | ~8000ms |
|
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
---
|
|
2
|
-
allowed-tools: [Read, Glob]
|
|
2
|
+
allowed-tools: [Read, Glob, Bash]
|
|
3
3
|
description: 'List, search, and invoke skills'
|
|
4
4
|
timestamp-rule: 'None'
|
|
5
|
-
architecture: 'Skill discovery and execution'
|
|
5
|
+
architecture: 'Skill discovery, installation, and execution'
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# /p:skill - Skill Management
|
|
9
9
|
|
|
10
|
-
List, search, and invoke reusable skills.
|
|
10
|
+
List, search, install, and invoke reusable skills.
|
|
11
11
|
|
|
12
12
|
## Usage
|
|
13
13
|
|
|
14
14
|
```
|
|
15
|
-
/p:skill
|
|
16
|
-
/p:skill list
|
|
17
|
-
/p:skill search <query>
|
|
18
|
-
/p:skill show <id>
|
|
19
|
-
/p:skill invoke <id>
|
|
15
|
+
/p:skill # List all skills
|
|
16
|
+
/p:skill list # List all skills
|
|
17
|
+
/p:skill search <query> # Search skills
|
|
18
|
+
/p:skill show <id> # Show skill details
|
|
19
|
+
/p:skill invoke <id> # Invoke a skill
|
|
20
|
+
/p:skill add <source> # Install skill from remote source
|
|
21
|
+
/p:skill remove <name> # Remove an installed skill
|
|
22
|
+
/p:skill init <name> # Scaffold a new skill
|
|
23
|
+
/p:skill check # Check for available updates
|
|
20
24
|
```
|
|
21
25
|
|
|
22
26
|
## Flow
|
|
@@ -24,11 +28,14 @@ List, search, and invoke reusable skills.
|
|
|
24
28
|
### List Skills (`/p:skill` or `/p:skill list`)
|
|
25
29
|
|
|
26
30
|
1. Load skills from all sources:
|
|
27
|
-
- Project: `.prjct/skills/*.md`
|
|
28
|
-
-
|
|
31
|
+
- Project: `.prjct/skills/*.md` and `.prjct/skills/*/SKILL.md`
|
|
32
|
+
- Provider: `~/.claude/skills/*/SKILL.md` and `~/.claude/skills/*.md`
|
|
33
|
+
- Global: `~/.prjct-cli/skills/*.md` and `~/.prjct-cli/skills/*/SKILL.md`
|
|
29
34
|
- Built-in: `templates/skills/*.md`
|
|
30
35
|
|
|
31
|
-
2.
|
|
36
|
+
2. Check lock file at `~/.prjct-cli/skills/.skill-lock.json` for source info
|
|
37
|
+
|
|
38
|
+
3. Output grouped by source:
|
|
32
39
|
|
|
33
40
|
```
|
|
34
41
|
## Available Skills
|
|
@@ -36,13 +43,13 @@ List, search, and invoke reusable skills.
|
|
|
36
43
|
### Project Skills
|
|
37
44
|
- **custom-deploy** - Deploy to staging server
|
|
38
45
|
|
|
39
|
-
### Global Skills
|
|
46
|
+
### Global Skills (Provider)
|
|
47
|
+
- **frontend-design** - Create production-grade UIs [github: vercel-labs/skills]
|
|
40
48
|
- **my-template** - Personal code template
|
|
41
49
|
|
|
42
50
|
### Built-in Skills
|
|
43
51
|
- **code-review** - Review code for quality
|
|
44
52
|
- **refactor** - Refactor code structure
|
|
45
|
-
- **debug** - Systematic debugging
|
|
46
53
|
```
|
|
47
54
|
|
|
48
55
|
### Search Skills (`/p:skill search <query>`)
|
|
@@ -55,14 +62,17 @@ List, search, and invoke reusable skills.
|
|
|
55
62
|
|
|
56
63
|
1. Load skill by ID
|
|
57
64
|
2. Display metadata and content
|
|
65
|
+
3. If remotely installed, show source tracking info
|
|
58
66
|
|
|
59
67
|
```
|
|
60
|
-
## Skill:
|
|
68
|
+
## Skill: frontend-design
|
|
61
69
|
|
|
62
|
-
**Description:**
|
|
63
|
-
**Source:**
|
|
64
|
-
**Tags:**
|
|
65
|
-
**
|
|
70
|
+
**Description:** Create production-grade frontend interfaces
|
|
71
|
+
**Source:** global (github: vercel-labs/skills)
|
|
72
|
+
**Tags:** frontend, design, ui
|
|
73
|
+
**Version:** 1.0.0
|
|
74
|
+
**Installed:** 2026-01-28T12:00:00.000Z
|
|
75
|
+
**SHA:** abc123
|
|
66
76
|
|
|
67
77
|
### Content
|
|
68
78
|
[Full skill prompt content]
|
|
@@ -74,9 +84,122 @@ List, search, and invoke reusable skills.
|
|
|
74
84
|
2. Return skill content for execution
|
|
75
85
|
3. The skill content becomes the prompt
|
|
76
86
|
|
|
87
|
+
### Add Skill (`/p:skill add <source>`)
|
|
88
|
+
|
|
89
|
+
Install skills from remote sources.
|
|
90
|
+
|
|
91
|
+
**Supported source formats:**
|
|
92
|
+
- `owner/repo` — Clone GitHub repo, install all discovered skills
|
|
93
|
+
- `owner/repo@skill-name` — Install specific skill from GitHub repo
|
|
94
|
+
- `./local-path` — Install from local directory
|
|
95
|
+
|
|
96
|
+
**Install flow:**
|
|
97
|
+
1. Parse source string
|
|
98
|
+
2. For GitHub: `git clone --depth 1` to temp dir (60s timeout)
|
|
99
|
+
3. Discover SKILL.md files (scans `*/SKILL.md` and `skills/*/SKILL.md`)
|
|
100
|
+
4. Copy to `~/.claude/skills/{name}/SKILL.md` (ecosystem standard format)
|
|
101
|
+
5. Add `_prjct` metadata block to frontmatter (sourceUrl, sha, installedAt)
|
|
102
|
+
6. Update lock file at `~/.prjct-cli/skills/.skill-lock.json`
|
|
103
|
+
7. Clean up temp dir
|
|
104
|
+
|
|
105
|
+
**Example:**
|
|
106
|
+
```
|
|
107
|
+
p. skill add vercel-labs/skills
|
|
108
|
+
p. skill add my-org/custom-skills@api-designer
|
|
109
|
+
p. skill add ./my-local-skill
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Output:**
|
|
113
|
+
```
|
|
114
|
+
✅ Installed 3 skills from vercel-labs/skills
|
|
115
|
+
|
|
116
|
+
- frontend-design → ~/.claude/skills/frontend-design/SKILL.md
|
|
117
|
+
- find-skills → ~/.claude/skills/find-skills/SKILL.md
|
|
118
|
+
- code-review → ~/.claude/skills/code-review/SKILL.md
|
|
119
|
+
|
|
120
|
+
Lock file updated: ~/.prjct-cli/skills/.skill-lock.json
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Remove Skill (`/p:skill remove <name>`)
|
|
124
|
+
|
|
125
|
+
1. Remove skill directory from `~/.claude/skills/{name}/`
|
|
126
|
+
2. Also remove flat file if it exists (`~/.claude/skills/{name}.md`)
|
|
127
|
+
3. Remove entry from lock file
|
|
128
|
+
4. Confirm removal
|
|
129
|
+
|
|
130
|
+
**Output:**
|
|
131
|
+
```
|
|
132
|
+
✅ Removed skill: frontend-design
|
|
133
|
+
|
|
134
|
+
Deleted: ~/.claude/skills/frontend-design/
|
|
135
|
+
Lock file updated.
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Init Skill (`/p:skill init <name>`)
|
|
139
|
+
|
|
140
|
+
Scaffold a new skill in the project.
|
|
141
|
+
|
|
142
|
+
1. Create `.prjct/skills/{name}/SKILL.md` with template frontmatter
|
|
143
|
+
2. Open for editing
|
|
144
|
+
|
|
145
|
+
**Template:**
|
|
146
|
+
```markdown
|
|
147
|
+
---
|
|
148
|
+
name: {name}
|
|
149
|
+
description: TODO - describe what this skill does
|
|
150
|
+
agent: general
|
|
151
|
+
tags: []
|
|
152
|
+
version: 1.0.0
|
|
153
|
+
author: {detected-author}
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
# {Name} Skill
|
|
157
|
+
|
|
158
|
+
## Purpose
|
|
159
|
+
|
|
160
|
+
Describe what this skill helps with.
|
|
161
|
+
|
|
162
|
+
## Instructions
|
|
163
|
+
|
|
164
|
+
Step-by-step instructions for the AI agent...
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Check Updates (`/p:skill check`)
|
|
168
|
+
|
|
169
|
+
Compare lock file SHAs with remote repositories to detect available updates.
|
|
170
|
+
|
|
171
|
+
1. Read lock file entries
|
|
172
|
+
2. For each GitHub-sourced skill, run `git ls-remote` to get latest SHA
|
|
173
|
+
3. Compare with stored SHA
|
|
174
|
+
4. Report skills with available updates (no auto-update)
|
|
175
|
+
|
|
176
|
+
**Output:**
|
|
177
|
+
```
|
|
178
|
+
## Skill Update Check
|
|
179
|
+
|
|
180
|
+
- **frontend-design** (vercel-labs/skills) — Update available
|
|
181
|
+
Current: abc123 → Latest: def456
|
|
182
|
+
- **code-review** (vercel-labs/skills) — Up to date
|
|
183
|
+
- **my-local-skill** (local) — Skipped (local source)
|
|
184
|
+
|
|
185
|
+
1 update available. Run `p. skill add <source>` to update.
|
|
186
|
+
```
|
|
187
|
+
|
|
77
188
|
## Skill File Format
|
|
78
189
|
|
|
79
|
-
Skills are markdown files with frontmatter:
|
|
190
|
+
Skills are markdown files with frontmatter. Two formats are supported:
|
|
191
|
+
|
|
192
|
+
### Subdirectory Format (Ecosystem Standard)
|
|
193
|
+
```
|
|
194
|
+
~/.claude/skills/my-skill/SKILL.md
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Flat Format (Legacy)
|
|
198
|
+
```
|
|
199
|
+
~/.claude/skills/my-skill.md
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Frontmatter Schema
|
|
80
203
|
|
|
81
204
|
```markdown
|
|
82
205
|
---
|
|
@@ -85,6 +208,13 @@ description: What the skill does
|
|
|
85
208
|
agent: general
|
|
86
209
|
tags: [tag1, tag2]
|
|
87
210
|
version: 1.0.0
|
|
211
|
+
author: Author Name
|
|
212
|
+
category: development
|
|
213
|
+
_prjct:
|
|
214
|
+
sourceUrl: https://github.com/owner/repo
|
|
215
|
+
sourceType: github
|
|
216
|
+
installedAt: 2026-01-28T12:00:00.000Z
|
|
217
|
+
sha: abc123
|
|
88
218
|
---
|
|
89
219
|
|
|
90
220
|
# Skill Content
|
|
@@ -94,11 +224,30 @@ The actual prompt/instructions...
|
|
|
94
224
|
|
|
95
225
|
## Creating Custom Skills
|
|
96
226
|
|
|
97
|
-
### Project Skill
|
|
98
|
-
Create `.prjct/skills/my-skill.md`
|
|
99
|
-
|
|
100
|
-
### Global Skill
|
|
101
|
-
Create `~/.prjct-cli/skills/my-skill.md`
|
|
227
|
+
### Project Skill (repo-specific)
|
|
228
|
+
Create `.prjct/skills/my-skill/SKILL.md` or `.prjct/skills/my-skill.md`
|
|
229
|
+
|
|
230
|
+
### Global Skill (all projects)
|
|
231
|
+
Create `~/.claude/skills/my-skill/SKILL.md` or `~/.prjct-cli/skills/my-skill.md`
|
|
232
|
+
|
|
233
|
+
## Lock File
|
|
234
|
+
|
|
235
|
+
Installed skills are tracked in `~/.prjct-cli/skills/.skill-lock.json`:
|
|
236
|
+
|
|
237
|
+
```json
|
|
238
|
+
{
|
|
239
|
+
"version": 1,
|
|
240
|
+
"generatedAt": "2026-01-28T...",
|
|
241
|
+
"skills": {
|
|
242
|
+
"frontend-design": {
|
|
243
|
+
"name": "frontend-design",
|
|
244
|
+
"source": { "type": "github", "url": "vercel-labs/skills", "sha": "abc123" },
|
|
245
|
+
"installedAt": "2026-01-28T...",
|
|
246
|
+
"filePath": "~/.claude/skills/frontend-design/SKILL.md"
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
102
251
|
|
|
103
252
|
## Output Format
|
|
104
253
|
|
|
@@ -106,5 +255,5 @@ Create `~/.prjct-cli/skills/my-skill.md`
|
|
|
106
255
|
## Skills ({count} total)
|
|
107
256
|
|
|
108
257
|
### {source}
|
|
109
|
-
- **{name}** ({id}): {description}
|
|
258
|
+
- **{name}** ({id}): {description} [{sourceInfo}]
|
|
110
259
|
```
|