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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  allowed-tools: [Read, Write, Bash, AskUserQuestion]
3
- description: 'Linear issue tracker integration via MCP'
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 MCP (no SDK needed).
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 MCP with OAuth - **no API key needed**.
36
+ Linear uses API key authentication for fast SDK access.
45
37
 
46
- **MCP Server**: `https://mcp.linear.app/mcp`
47
- **Auth**: Browser-based OAuth (first use opens browser)
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: Install MCP Server (if needed)
57
+ ## Step 2: Check API Key
67
58
 
68
59
  ```
69
- READ: {agentSettingsPath} (create {} if not exists)
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
- ## Step 3: Check MCP Tools Available
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
- CHECK: Are mcp__linear__* tools available?
101
-
102
- IF not available:
103
- OUTPUT: "Linear MCP is installed but not yet active."
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. **Install MCP + Verify tools available**
79
+ 1. **Check for API key**
115
80
  ```
116
- Execute Step 2 (auto-install if needed)
117
- Execute Step 3 (verify tools active)
118
- IF not available: Prompt restart and STOP
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 (triggers OAuth if needed)**
86
+ 2. **Test SDK connection**
122
87
  ```
123
- USE TOOL: mcp__linear__list_issues
124
- PARAMS: { "limit": 1 }
88
+ IMPORT: linearService from core/integrations/linear
89
+ CALL: linearService.initializeFromApiKey(apiKey)
125
90
 
126
- # First use will open browser for OAuth
91
+ # This will verify the connection
127
92
  ```
128
93
 
129
94
  3. **Get user info and teams**
130
95
  ```
131
- USE TOOL: mcp__linear__get_viewer
132
- EXTRACT: userId, name, email
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": "mcp",
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
- Linear configured
125
+ Linear configured
164
126
 
165
- Connected as: {name} ({email})
166
127
  Team: {teamName} ({teamKey})
167
- Auth: MCP (OAuth)
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
- USE TOOL: mcp__linear__list_issues
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
- {PRJ-123} {title} ({status})
188
- {PRJ-124} {title} ({status})
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
- USE TOOL: mcp__linear__get_issue
201
- PARAMS: { "issueId": "{ID}" }
158
+ CALL: linearService.fetchIssue("{ID}")
159
+ EXTRACT: id, title, description, status
202
160
 
203
161
  2. Update status to In Progress
204
- USE TOOL: mcp__linear__update_issue
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: feature/{ID}-{slug}
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. Get issue UUID
228
- USE TOOL: mcp__linear__get_issue
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
- ## MCP Tool Reference
195
+ ## SDK Service Reference
244
196
 
245
- | Operation | MCP Tool |
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
- ### Example: List My Issues
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
- ### Example: Get Issue by ID
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
- | Auth | MCP OAuth (managed by Linear) |
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
- | MCP tools not found | "Add Linear MCP to settings, restart {agentName}" |
299
- | OAuth failed | "Re-authenticate via browser" |
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 # 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
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
- - Global: `~/.prjct-cli/skills/*.md`
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. Output grouped by source:
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: code-review
68
+ ## Skill: frontend-design
61
69
 
62
- **Description:** Review code for quality
63
- **Source:** builtin
64
- **Tags:** review, quality, security
65
- **Agent:** general
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
  ```