prjct-cli 0.44.0 ā 0.44.1
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 +19 -0
- package/core/commands/shipping.ts +1 -1
- package/core/infrastructure/ai-provider.ts +11 -36
- package/core/utils/branding.ts +2 -3
- package/package.json +1 -1
- package/templates/commands/git.md +143 -54
- package/templates/commands/merge.md +121 -13
- package/templates/commands/review.md +1 -1
- package/templates/commands/ship.md +165 -20
- package/templates/commands/sync.md +1 -1
- package/templates/commands/task.md +104 -7
- package/templates/global/ANTIGRAVITY.md +2 -4
- package/templates/global/CLAUDE.md +58 -29
- package/templates/global/CURSOR.mdc +1 -3
- package/templates/global/GEMINI.md +2 -4
- package/templates/global/WINDSURF.md +1 -3
- package/templates/subagents/workflow/prjct-shipper.md +1 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.44.1] - 2026-01-29
|
|
4
|
+
|
|
5
|
+
### Fixed: Workflow Templates with Mandatory Steps (PRJ-143)
|
|
6
|
+
|
|
7
|
+
Templates now enforce step-by-step workflows with explicit blocking conditions.
|
|
8
|
+
|
|
9
|
+
**Problem:** Claude was skipping workflow steps (pushing directly to main, skipping PRs, etc.)
|
|
10
|
+
|
|
11
|
+
**Solution:** Added ā BLOCKING conditions to critical templates:
|
|
12
|
+
- `ship.md` - Must check branch, create PR, bump version
|
|
13
|
+
- `merge.md` - Must verify PR approval and CI status
|
|
14
|
+
- `task.md` - Pre-flight checks before branch creation
|
|
15
|
+
- `git.md` - Block commits/pushes on main/master
|
|
16
|
+
|
|
17
|
+
**Also Fixed:**
|
|
18
|
+
- Commit footer simplified to `Generated with [p/](https://www.prjct.app/)` (no emoji, no provider-specific line)
|
|
19
|
+
- All provider templates updated (Claude, Gemini, Cursor, Antigravity, Windsurf)
|
|
20
|
+
- Global CLAUDE.md strengthened with git workflow rules
|
|
21
|
+
|
|
3
22
|
## [0.44.0] - 2026-01-29
|
|
4
23
|
|
|
5
24
|
### Feature: Workflow State Machine (PRJ-139)
|
|
@@ -217,7 +217,7 @@ export class ShippingCommands extends PrjctCommandsBase {
|
|
|
217
217
|
try {
|
|
218
218
|
await toolRegistry.get('Bash')!('git add .')
|
|
219
219
|
|
|
220
|
-
const commitMsg = `feat: ${feature}\n\
|
|
220
|
+
const commitMsg = `feat: ${feature}\n\nGenerated with [p/](https://www.prjct.app/)`
|
|
221
221
|
|
|
222
222
|
await toolRegistry.get('Bash')!(`git commit -m "${commitMsg.replace(/"/g, '\\"')}"`)
|
|
223
223
|
|
|
@@ -283,45 +283,20 @@ export function hasProviderConfig(provider: AIProviderName): boolean {
|
|
|
283
283
|
* Get provider-specific branding
|
|
284
284
|
*/
|
|
285
285
|
export function getProviderBranding(provider: AIProviderName): ProviderBranding {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
if (provider === 'cursor') {
|
|
297
|
-
return {
|
|
298
|
-
commitFooter: `š¤ Generated with [p/](https://www.prjct.app/)
|
|
299
|
-
Built with [Cursor](${config.websiteUrl})`,
|
|
300
|
-
signature: 'ā” prjct + Cursor',
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
if (provider === 'antigravity') {
|
|
305
|
-
return {
|
|
306
|
-
commitFooter: `š¤ Generated with [p/](https://www.prjct.app/)
|
|
307
|
-
Powered by [Antigravity](${config.websiteUrl})`,
|
|
308
|
-
signature: 'ā” prjct + Antigravity',
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
if (provider === 'windsurf') {
|
|
313
|
-
return {
|
|
314
|
-
commitFooter: `š¤ Generated with [p/](https://www.prjct.app/)
|
|
315
|
-
Built with [Windsurf](${config.websiteUrl})`,
|
|
316
|
-
signature: 'ā” prjct + Windsurf',
|
|
317
|
-
}
|
|
286
|
+
// Generic commit footer for all providers
|
|
287
|
+
const commitFooter = `Generated with [p/](https://www.prjct.app/)`
|
|
288
|
+
|
|
289
|
+
const signatures: Record<AIProviderName, string> = {
|
|
290
|
+
claude: 'ā” prjct + Claude',
|
|
291
|
+
gemini: 'ā” prjct + Gemini',
|
|
292
|
+
cursor: 'ā” prjct + Cursor',
|
|
293
|
+
antigravity: 'ā” prjct + Antigravity',
|
|
294
|
+
windsurf: 'ā” prjct + Windsurf',
|
|
318
295
|
}
|
|
319
296
|
|
|
320
|
-
// Default: Claude
|
|
321
297
|
return {
|
|
322
|
-
commitFooter
|
|
323
|
-
|
|
324
|
-
signature: 'ā” prjct + Claude',
|
|
298
|
+
commitFooter,
|
|
299
|
+
signature: signatures[provider] || 'ā” prjct',
|
|
325
300
|
}
|
|
326
301
|
}
|
|
327
302
|
|
package/core/utils/branding.ts
CHANGED
|
@@ -65,9 +65,8 @@ const branding: Branding = {
|
|
|
65
65
|
footer: 'ā” prjct'
|
|
66
66
|
},
|
|
67
67
|
|
|
68
|
-
// Default Git commit footer (
|
|
69
|
-
commitFooter:
|
|
70
|
-
Designed for [Claude](https://www.anthropic.com/claude)`,
|
|
68
|
+
// Default Git commit footer (generic)
|
|
69
|
+
commitFooter: `Generated with [p/](https://www.prjct.app/)`,
|
|
71
70
|
|
|
72
71
|
// URLs
|
|
73
72
|
urls: {
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
allowed-tools: [Bash, Read, Write]
|
|
2
|
+
allowed-tools: [Bash, Read, Write, AskUserQuestion]
|
|
3
3
|
description: 'Smart git operations with context'
|
|
4
4
|
architecture: 'Write-Through (JSON ā MD ā Events)'
|
|
5
5
|
storage-layer: true
|
|
@@ -8,11 +8,11 @@ source-of-truth: 'storage/state.json'
|
|
|
8
8
|
|
|
9
9
|
# /p:git - Smart Git Operations
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## ā MANDATORY WORKFLOW - FOLLOW STEPS IN ORDER
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
**All git operations through prjct MUST follow these rules.**
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
---
|
|
16
16
|
|
|
17
17
|
## Usage
|
|
18
18
|
|
|
@@ -23,6 +23,33 @@ Reads from **Storage (JSON)** as source of truth.
|
|
|
23
23
|
/p:git undo # Undo last commit
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
+
## ā GLOBAL BLOCKING RULES
|
|
27
|
+
|
|
28
|
+
### Rule 1: Protected Branch Check (ALL OPERATIONS)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
CURRENT_BRANCH=$(git branch --show-current)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**ā IF branch is `main` or `master`:**
|
|
35
|
+
```
|
|
36
|
+
For commit: STOP. "Cannot commit on main. Create a feature branch."
|
|
37
|
+
For push: STOP. "Cannot push to main. Use p. ship to create PR."
|
|
38
|
+
ABORT the operation entirely.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Rule 2: Dirty Working Directory
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
git status --porcelain
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**ā IF uncommitted changes AND operation is push/sync:**
|
|
48
|
+
```
|
|
49
|
+
STOP. "Uncommitted changes detected. Commit first with p. git commit."
|
|
50
|
+
ABORT.
|
|
51
|
+
```
|
|
52
|
+
|
|
26
53
|
## Context Variables
|
|
27
54
|
- `{projectId}`: From `.prjct/prjct.config.json`
|
|
28
55
|
- `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
|
|
@@ -31,65 +58,129 @@ Reads from **Storage (JSON)** as source of truth.
|
|
|
31
58
|
|
|
32
59
|
## Flow: commit
|
|
33
60
|
|
|
34
|
-
### Step 1:
|
|
35
|
-
|
|
36
|
-
|
|
61
|
+
### Step 1: Pre-flight Checks (BLOCKING)
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Get current branch
|
|
65
|
+
CURRENT_BRANCH=$(git branch --show-current)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**ā IF on main/master:**
|
|
69
|
+
```
|
|
70
|
+
STOP. DO NOT PROCEED.
|
|
71
|
+
OUTPUT: "Cannot commit on protected branch: {currentBranch}"
|
|
72
|
+
OUTPUT: "Create a feature branch first with: p. task 'description'"
|
|
73
|
+
ABORT.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Check for changes
|
|
78
|
+
git status --porcelain
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**ā IF no changes:**
|
|
82
|
+
```
|
|
83
|
+
STOP. DO NOT PROCEED.
|
|
84
|
+
OUTPUT: "Nothing to commit."
|
|
85
|
+
ABORT.
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Step 2: Show Plan and Get Approval (BLOCKING)
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
git diff --stat
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
OUTPUT:
|
|
96
|
+
"""
|
|
97
|
+
## Commit Plan
|
|
98
|
+
|
|
99
|
+
Branch: {currentBranch}
|
|
100
|
+
Changes:
|
|
101
|
+
{git diff --stat output}
|
|
37
102
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
ELSE:
|
|
42
|
-
SET: {expectedBranch} = null
|
|
103
|
+
Will create commit with prjct footer.
|
|
104
|
+
Proceed? (yes/no)
|
|
105
|
+
"""
|
|
43
106
|
|
|
44
|
-
|
|
45
|
-
|
|
107
|
+
WAIT for explicit approval.
|
|
108
|
+
DO NOT assume.
|
|
109
|
+
```
|
|
46
110
|
|
|
47
|
-
|
|
48
|
-
OUTPUT:
|
|
49
|
-
```
|
|
50
|
-
ā ļø Cannot commit on protected branch: {currentBranch}
|
|
111
|
+
### Step 3: Stage and Commit
|
|
51
112
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
113
|
+
```bash
|
|
114
|
+
git add .
|
|
115
|
+
git commit -m "$(cat <<'EOF'
|
|
116
|
+
{type}: {description}
|
|
55
117
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
118
|
+
Generated with [p/](https://www.prjct.app/)
|
|
119
|
+
EOF
|
|
120
|
+
)"
|
|
121
|
+
```
|
|
60
122
|
|
|
61
|
-
|
|
62
|
-
Expected: {expectedBranch}
|
|
123
|
+
**ā The prjct footer is MANDATORY. No exceptions.**
|
|
63
124
|
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
STOP
|
|
125
|
+
### Step 4: Log to Memory
|
|
67
126
|
|
|
68
|
-
|
|
69
|
-
1. Git: `add .` ā stage changes
|
|
70
|
-
2. Create: commit message with prjct metadata
|
|
71
|
-
3. Commit: with message
|
|
72
|
-
4. Log: `memory/events.jsonl`
|
|
127
|
+
APPEND to `{globalPath}/memory/events.jsonl`
|
|
73
128
|
|
|
74
129
|
## Flow: push
|
|
75
130
|
|
|
76
|
-
### Step 1:
|
|
77
|
-
|
|
78
|
-
|
|
131
|
+
### Step 1: Pre-flight Checks (BLOCKING)
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
CURRENT_BRANCH=$(git branch --show-current)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**ā IF on main/master:**
|
|
138
|
+
```
|
|
139
|
+
STOP. DO NOT PROCEED.
|
|
140
|
+
OUTPUT: "Cannot push directly to main/master."
|
|
141
|
+
OUTPUT: "Use `p. ship` to create a Pull Request instead."
|
|
142
|
+
ABORT.
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
git status --porcelain
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**ā IF uncommitted changes:**
|
|
150
|
+
```
|
|
151
|
+
STOP. DO NOT PROCEED.
|
|
152
|
+
OUTPUT: "Uncommitted changes detected. Commit first."
|
|
153
|
+
ABORT.
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Step 2: Show Plan and Get Approval (BLOCKING)
|
|
79
157
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
158
|
+
```bash
|
|
159
|
+
git log origin/{currentBranch}..HEAD --oneline 2>/dev/null || git log --oneline -3
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
OUTPUT:
|
|
164
|
+
"""
|
|
165
|
+
## Push Plan
|
|
84
166
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
167
|
+
Branch: {currentBranch}
|
|
168
|
+
Commits to push:
|
|
169
|
+
{commits}
|
|
170
|
+
|
|
171
|
+
Proceed? (yes/no)
|
|
172
|
+
"""
|
|
173
|
+
|
|
174
|
+
WAIT for explicit approval.
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Step 3: Execute Push
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
git push -u origin {currentBranch}
|
|
181
|
+
```
|
|
88
182
|
|
|
89
|
-
|
|
90
|
-
1. Git: `status` ā verify clean
|
|
91
|
-
2. Git: `push -u origin {currentBranch}` with branch tracking
|
|
92
|
-
3. Handle: errors (upstream, conflicts)
|
|
183
|
+
**IF push fails:** Show error and STOP. Do not retry automatically.
|
|
93
184
|
|
|
94
185
|
## Flow: sync
|
|
95
186
|
|
|
@@ -106,20 +197,18 @@ IF {currentBranch} == "main" OR {currentBranch} == "master":
|
|
|
106
197
|
|
|
107
198
|
{details if any}
|
|
108
199
|
|
|
109
|
-
|
|
110
|
-
Designed for [Claude](https://www.anthropic.com/claude)
|
|
200
|
+
Generated with [p/](https://www.prjct.app/)
|
|
111
201
|
|
|
112
202
|
```
|
|
113
203
|
|
|
114
|
-
**NON-NEGOTIABLE: The
|
|
204
|
+
**NON-NEGOTIABLE: The `Generated with [p/]` line MUST appear in ALL commits.**
|
|
115
205
|
|
|
116
206
|
Use HEREDOC for proper formatting:
|
|
117
207
|
```bash
|
|
118
208
|
git commit -m "$(cat <<'EOF'
|
|
119
209
|
{type}: {description}
|
|
120
210
|
|
|
121
|
-
|
|
122
|
-
Designed for [Claude](https://www.anthropic.com/claude)
|
|
211
|
+
Generated with [p/](https://www.prjct.app/)
|
|
123
212
|
|
|
124
213
|
EOF
|
|
125
214
|
)"
|
|
@@ -1,38 +1,146 @@
|
|
|
1
1
|
---
|
|
2
|
-
allowed-tools: [Bash, Read, Write]
|
|
2
|
+
allowed-tools: [Bash, Read, Write, AskUserQuestion]
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# p. merge
|
|
6
6
|
|
|
7
|
+
## ā MANDATORY WORKFLOW - DO NOT SKIP ANY STEP
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
### STEP 1: Pre-flight Checks (BLOCKING)
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# 1a. Check if there's an active task with a PR
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**ā IF no `currentTask`:**
|
|
18
|
+
```
|
|
19
|
+
STOP. DO NOT PROCEED.
|
|
20
|
+
Tell user: "No active task. Use p. task first."
|
|
21
|
+
ABORT.
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**ā IF no PR number in task state:**
|
|
25
|
+
```
|
|
26
|
+
STOP. DO NOT PROCEED.
|
|
27
|
+
Tell user: "No PR found. Run p. ship first to create a PR."
|
|
28
|
+
ABORT.
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
### STEP 2: Check PR Status (BLOCKING)
|
|
34
|
+
|
|
7
35
|
```bash
|
|
8
|
-
|
|
36
|
+
gh pr view {prNumber} --json reviewDecision,mergeable,state,statusCheckRollup
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**ā IF PR is not approved:**
|
|
40
|
+
```
|
|
41
|
+
STOP. DO NOT PROCEED.
|
|
42
|
+
Tell user: "PR needs approval. Get reviews first."
|
|
43
|
+
Show: gh pr view {prNumber} --web
|
|
44
|
+
ABORT.
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**ā IF PR has merge conflicts:**
|
|
48
|
+
```
|
|
49
|
+
STOP. DO NOT PROCEED.
|
|
50
|
+
Tell user: "PR has conflicts. Resolve them first:
|
|
51
|
+
git checkout {branch}
|
|
52
|
+
git pull origin main
|
|
53
|
+
# fix conflicts
|
|
54
|
+
git push"
|
|
55
|
+
ABORT.
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**ā IF CI checks are failing:**
|
|
59
|
+
```
|
|
60
|
+
STOP. DO NOT PROCEED.
|
|
61
|
+
Tell user: "CI checks are failing. Fix them first."
|
|
62
|
+
Show failing checks.
|
|
63
|
+
ABORT.
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### STEP 3: Show Plan and Get Approval (BLOCKING)
|
|
69
|
+
|
|
70
|
+
Show the user:
|
|
71
|
+
```
|
|
72
|
+
## Merge Plan
|
|
73
|
+
|
|
74
|
+
PR: #{prNumber} - {title}
|
|
75
|
+
Branch: {branch} ā main
|
|
76
|
+
Strategy: squash
|
|
77
|
+
|
|
78
|
+
Will do:
|
|
79
|
+
1. Merge PR with squash
|
|
80
|
+
2. Delete feature branch
|
|
81
|
+
3. Update local main
|
|
82
|
+
|
|
83
|
+
Proceed? (yes/no)
|
|
9
84
|
```
|
|
10
85
|
|
|
11
|
-
|
|
12
|
-
|
|
86
|
+
**ā WAIT for explicit approval. Do not assume.**
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
### STEP 4: Execute Merge
|
|
13
91
|
|
|
14
92
|
```bash
|
|
15
|
-
gh pr
|
|
93
|
+
gh pr merge {prNumber} --squash --delete-branch
|
|
16
94
|
```
|
|
17
95
|
|
|
18
|
-
|
|
19
|
-
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### STEP 5: Update Local
|
|
20
99
|
|
|
21
100
|
```bash
|
|
22
|
-
|
|
23
|
-
git
|
|
101
|
+
git checkout main
|
|
102
|
+
git pull origin main
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### STEP 6: Update Task State
|
|
108
|
+
|
|
109
|
+
- Set `currentTask.status = "merged"`
|
|
110
|
+
- Set `currentTask.mergedAt = {now}`
|
|
111
|
+
- Clear PR reference
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### STEP 7: Update Linear (if applicable)
|
|
116
|
+
|
|
117
|
+
IF `currentTask.linearId`:
|
|
24
118
|
```
|
|
119
|
+
Update Linear issue status to "Done" or "Merged"
|
|
120
|
+
Add comment: "PR #{prNumber} merged"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
25
124
|
|
|
26
|
-
|
|
125
|
+
## Output Format
|
|
27
126
|
|
|
28
|
-
**Output**:
|
|
29
127
|
```
|
|
30
|
-
ā
|
|
128
|
+
ā
Merged: {title}
|
|
31
129
|
|
|
32
130
|
PR: #{prNumber}
|
|
33
131
|
Strategy: squash
|
|
132
|
+
Branch: {branch} (deleted)
|
|
34
133
|
|
|
35
134
|
Next:
|
|
36
|
-
- Release ā `p. ship`
|
|
37
135
|
- New task ā `p. task "description"`
|
|
136
|
+
- See backlog ā `p. next`
|
|
38
137
|
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## ā VIOLATIONS
|
|
142
|
+
|
|
143
|
+
- ā Merging without PR approval
|
|
144
|
+
- ā Merging with failing CI
|
|
145
|
+
- ā Merging with conflicts
|
|
146
|
+
- ā Not waiting for user approval
|
|
@@ -4,50 +4,195 @@ allowed-tools: [Read, Write, Bash, AskUserQuestion]
|
|
|
4
4
|
|
|
5
5
|
# p. ship "$ARGUMENTS"
|
|
6
6
|
|
|
7
|
+
## ā MANDATORY WORKFLOW - DO NOT SKIP ANY STEP
|
|
8
|
+
|
|
9
|
+
**CRITICAL: Execute steps IN ORDER. Each step MUST complete before proceeding.**
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
### STEP 1: Pre-flight Checks (BLOCKING)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# 1a. Check current branch
|
|
17
|
+
BRANCH=$(git branch --show-current)
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**ā IF branch is `main` or `master`:**
|
|
21
|
+
```
|
|
22
|
+
STOP. DO NOT PROCEED.
|
|
23
|
+
Tell user: "Cannot ship from main branch. Create a feature branch first."
|
|
24
|
+
ABORT the ship command entirely.
|
|
25
|
+
```
|
|
26
|
+
|
|
7
27
|
```bash
|
|
8
|
-
|
|
28
|
+
# 1b. Check GitHub auth
|
|
29
|
+
gh auth status
|
|
9
30
|
```
|
|
10
31
|
|
|
11
|
-
IF
|
|
32
|
+
**ā IF not authenticated:**
|
|
33
|
+
```
|
|
34
|
+
STOP. DO NOT PROCEED.
|
|
35
|
+
Tell user: "GitHub CLI not authenticated. Run: gh auth login"
|
|
36
|
+
ABORT the ship command entirely.
|
|
37
|
+
```
|
|
12
38
|
|
|
13
39
|
```bash
|
|
14
|
-
|
|
15
|
-
git
|
|
40
|
+
# 1c. Check for changes
|
|
41
|
+
git status --porcelain
|
|
16
42
|
```
|
|
17
43
|
|
|
18
|
-
|
|
44
|
+
**ā IF no changes:**
|
|
45
|
+
```
|
|
46
|
+
STOP. DO NOT PROCEED.
|
|
47
|
+
Tell user: "No changes to ship."
|
|
48
|
+
ABORT the ship command entirely.
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
19
52
|
|
|
20
|
-
|
|
53
|
+
### STEP 2: Show Plan and Get Approval (BLOCKING)
|
|
21
54
|
|
|
22
|
-
|
|
23
|
-
|
|
55
|
+
**ā DO NOT execute any commits/pushes until user explicitly approves.**
|
|
56
|
+
|
|
57
|
+
Show the user:
|
|
58
|
+
```
|
|
59
|
+
## Ship Plan
|
|
60
|
+
|
|
61
|
+
Branch: {branch}
|
|
62
|
+
Changes:
|
|
63
|
+
{git diff --stat}
|
|
64
|
+
|
|
65
|
+
Will do:
|
|
66
|
+
1. Run tests (if configured)
|
|
67
|
+
2. Bump version (patch/minor/major)
|
|
68
|
+
3. Update CHANGELOG.md
|
|
69
|
+
4. Commit with prjct footer
|
|
70
|
+
5. Push branch
|
|
71
|
+
6. Create PR to main
|
|
72
|
+
|
|
73
|
+
Proceed? (yes/no)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**ā WAIT for explicit "yes" or approval. Do not assume.**
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
### STEP 3: Quality Checks
|
|
24
81
|
|
|
25
82
|
```bash
|
|
26
|
-
|
|
27
|
-
|
|
83
|
+
# Run tests if package.json has test script
|
|
84
|
+
npm test 2>/dev/null || bun test 2>/dev/null || echo "No tests configured"
|
|
28
85
|
```
|
|
29
86
|
|
|
30
|
-
|
|
87
|
+
```bash
|
|
88
|
+
# Run lint if configured
|
|
89
|
+
npm run lint 2>/dev/null || echo "No lint configured"
|
|
31
90
|
```
|
|
32
|
-
|
|
33
|
-
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### STEP 4: Version Bump (REQUIRED)
|
|
95
|
+
|
|
96
|
+
Determine version bump type:
|
|
97
|
+
- `fix:` commits ā **patch** (0.0.X)
|
|
98
|
+
- `feat:` commits ā **minor** (0.X.0)
|
|
99
|
+
- `BREAKING:` in commits ā **major** (X.0.0)
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# Read current version
|
|
103
|
+
OLD_VERSION=$(node -p "require('./package.json').version")
|
|
104
|
+
|
|
105
|
+
# Calculate new version and update package.json
|
|
106
|
+
# Use npm version OR manual edit
|
|
34
107
|
```
|
|
35
108
|
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### STEP 5: Update CHANGELOG.md (REQUIRED)
|
|
112
|
+
|
|
113
|
+
Add entry at top of CHANGELOG.md:
|
|
114
|
+
```markdown
|
|
115
|
+
## [X.X.X] - YYYY-MM-DD
|
|
116
|
+
|
|
117
|
+
### {Fixed/Added/Changed}
|
|
118
|
+
- {description of changes}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
### STEP 6: Commit (REQUIRED FORMAT)
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
git add .
|
|
127
|
+
git commit -m "$(cat <<'EOF'
|
|
128
|
+
{type}: {description}
|
|
129
|
+
|
|
130
|
+
{body if needed}
|
|
131
|
+
|
|
132
|
+
Generated with [p/](https://www.prjct.app/)
|
|
133
|
+
EOF
|
|
134
|
+
)"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**ā The prjct footer MUST be included. No exceptions.**
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### STEP 7: Push and Create PR (REQUIRED)
|
|
142
|
+
|
|
36
143
|
```bash
|
|
37
|
-
git
|
|
38
|
-
gh pr create --title "
|
|
144
|
+
git push -u origin {branch}
|
|
145
|
+
gh pr create --title "{type}: {description}" --base main --body "$(cat <<'EOF'
|
|
146
|
+
## Summary
|
|
147
|
+
{bullet points}
|
|
148
|
+
|
|
149
|
+
## Changes
|
|
150
|
+
{what changed}
|
|
151
|
+
|
|
152
|
+
## Test Plan
|
|
153
|
+
{how to verify}
|
|
154
|
+
|
|
155
|
+
Generated with [p/](https://www.prjct.app/)
|
|
156
|
+
EOF
|
|
157
|
+
)"
|
|
39
158
|
```
|
|
40
159
|
|
|
41
|
-
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
### STEP 8: Update Linear/Issue Tracker (if applicable)
|
|
163
|
+
|
|
164
|
+
If task has `linearId`:
|
|
165
|
+
- Update issue status to "In Review" or appropriate state
|
|
166
|
+
- Add comment with PR link
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Output Format
|
|
171
|
+
|
|
42
172
|
```
|
|
43
173
|
š Shipped: {feature}
|
|
44
174
|
|
|
45
175
|
Version: {old} ā {new}
|
|
46
176
|
PR: {url}
|
|
47
|
-
|
|
177
|
+
Branch: {branch}
|
|
48
178
|
|
|
49
179
|
Next:
|
|
50
|
-
-
|
|
51
|
-
- Merge ready
|
|
52
|
-
- New task? ā `p. task "description"`
|
|
180
|
+
- Review PR ā {url}
|
|
181
|
+
- Merge when ready ā `p. merge`
|
|
53
182
|
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## ā VIOLATIONS
|
|
187
|
+
|
|
188
|
+
**If you skip ANY step, you are BREAKING the prjct workflow.**
|
|
189
|
+
|
|
190
|
+
Common violations:
|
|
191
|
+
- ā Committing directly to main
|
|
192
|
+
- ā Pushing without creating PR
|
|
193
|
+
- ā Skipping version bump
|
|
194
|
+
- ā Skipping CHANGELOG update
|
|
195
|
+
- ā Not waiting for user approval
|
|
196
|
+
- ā Missing prjct footer in commit
|
|
197
|
+
|
|
198
|
+
**These violations make prjct useless. Follow the workflow.**
|
|
@@ -18,7 +18,7 @@ READ: {globalPath}/project.json ā check integrations.linear.enabled
|
|
|
18
18
|
|
|
19
19
|
IF integrations.linear.enabled:
|
|
20
20
|
# Sync Linear issues to local cache
|
|
21
|
-
RUN: bun core/cli/linear.ts --project {projectId} sync
|
|
21
|
+
RUN: bun $PRJCT_CLI/core/cli/linear.ts --project {projectId} sync
|
|
22
22
|
|
|
23
23
|
# Result stored in {globalPath}/storage/issues.json
|
|
24
24
|
# Contains all assigned issues from Linear
|
|
@@ -4,10 +4,62 @@ allowed-tools: [Read, Write, Bash, Task, Glob, Grep, AskUserQuestion]
|
|
|
4
4
|
|
|
5
5
|
# p. task "$ARGUMENTS"
|
|
6
6
|
|
|
7
|
+
## ā MANDATORY PRE-FLIGHT CHECKS
|
|
8
|
+
|
|
9
|
+
**Execute these checks BEFORE any task creation:**
|
|
10
|
+
|
|
11
|
+
### Check 1: Validate Arguments
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
IF $ARGUMENTS is empty:
|
|
15
|
+
ASK: "What task do you want to start?"
|
|
16
|
+
WAIT for response
|
|
17
|
+
DO NOT proceed with empty task
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Check 2: Check for Active Task
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
READ: {globalPath}/storage/state.json
|
|
24
|
+
|
|
25
|
+
IF currentTask exists AND currentTask.status == "active":
|
|
26
|
+
OUTPUT:
|
|
27
|
+
"""
|
|
28
|
+
ā ļø Active task detected: {currentTask.description}
|
|
29
|
+
|
|
30
|
+
Options:
|
|
31
|
+
1. Complete current task first ā `p. done`
|
|
32
|
+
2. Pause current task ā `p. pause`
|
|
33
|
+
3. Switch anyway (current task will be paused)
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
ASK: "What would you like to do?"
|
|
37
|
+
WAIT for explicit choice
|
|
38
|
+
DO NOT automatically switch tasks
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Check 3: Validate Git State
|
|
42
|
+
|
|
7
43
|
```bash
|
|
8
|
-
|
|
44
|
+
git status --porcelain
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
IF uncommitted changes exist:
|
|
49
|
+
OUTPUT:
|
|
50
|
+
"""
|
|
51
|
+
ā ļø You have uncommitted changes:
|
|
52
|
+
{list of files}
|
|
53
|
+
|
|
54
|
+
Commit or stash them before starting a new task.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
ASK: "Would you like to commit these changes first?"
|
|
58
|
+
WAIT for response
|
|
9
59
|
```
|
|
10
60
|
|
|
61
|
+
---
|
|
62
|
+
|
|
11
63
|
## Step 0: Detect Issue Tracker Reference
|
|
12
64
|
|
|
13
65
|
IF `$ARGUMENTS` matches pattern `/^[A-Z]+-\d+$/` (e.g., PRJ-123, PROJ-456):
|
|
@@ -20,7 +72,7 @@ IF integrations.linear.enabled:
|
|
|
20
72
|
# Linear issue detected - use LOCAL-FIRST approach
|
|
21
73
|
# Try local cache first (issues.json), then API if not found
|
|
22
74
|
|
|
23
|
-
RUN: bun core/cli/linear.ts --project {projectId} get-local "$ARGUMENTS"
|
|
75
|
+
RUN: bun $PRJCT_CLI/core/cli/linear.ts --project {projectId} get-local "$ARGUMENTS"
|
|
24
76
|
|
|
25
77
|
IF issue found in local cache:
|
|
26
78
|
USE cached issue data (no API call needed)
|
|
@@ -67,14 +119,59 @@ ELSE:
|
|
|
67
119
|
|
|
68
120
|
## Main Flow
|
|
69
121
|
|
|
70
|
-
|
|
122
|
+
### Step A: Show Plan and Get Approval (BLOCKING)
|
|
71
123
|
|
|
124
|
+
**ā DO NOT create branches or modify state without user approval.**
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
OUTPUT:
|
|
128
|
+
"""
|
|
129
|
+
## Task Plan
|
|
130
|
+
|
|
131
|
+
Description: $ARGUMENTS
|
|
132
|
+
Type: {classified type}
|
|
133
|
+
Branch: {type}/{slug}
|
|
134
|
+
|
|
135
|
+
Will do:
|
|
136
|
+
1. Create feature branch from current branch
|
|
137
|
+
2. Initialize task tracking in state.json
|
|
138
|
+
3. Break down into subtasks
|
|
139
|
+
4. {If Linear: Update issue status to In Progress}
|
|
140
|
+
|
|
141
|
+
Proceed? (yes/no)
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
WAIT for explicit "yes" or approval
|
|
145
|
+
DO NOT assume
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Step B: Explore Codebase
|
|
149
|
+
|
|
150
|
+
```
|
|
72
151
|
USE Task(Explore) ā find similar code, affected files
|
|
73
|
-
READ
|
|
74
|
-
|
|
75
|
-
|
|
152
|
+
READ agents/*.md ā get domain patterns
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Step C: Classify Task
|
|
76
156
|
|
|
77
|
-
|
|
157
|
+
Determine type: feature | bug | improvement | refactor | chore
|
|
158
|
+
|
|
159
|
+
### Step D: Create Branch (if needed)
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
CURRENT_BRANCH=$(git branch --show-current)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
IF CURRENT_BRANCH == "main" OR CURRENT_BRANCH == "master":
|
|
167
|
+
OUTPUT: "Creating feature branch: {type}/{slug}"
|
|
168
|
+
|
|
169
|
+
git checkout -b {type}/{slug}
|
|
170
|
+
|
|
171
|
+
IF git command fails:
|
|
172
|
+
OUTPUT: "Failed to create branch. Check git status."
|
|
173
|
+
STOP
|
|
174
|
+
```
|
|
78
175
|
|
|
79
176
|
```bash
|
|
80
177
|
prjct work "$ARGUMENTS"
|
|
@@ -79,12 +79,10 @@ node -e "console.log(require('crypto').randomUUID())"
|
|
|
79
79
|
**Every commit made with prjct MUST include this footer:**
|
|
80
80
|
|
|
81
81
|
```
|
|
82
|
-
|
|
83
|
-
Powered by [Antigravity](https://gemini.google.com/app/antigravity)
|
|
84
|
-
|
|
82
|
+
Generated with [p/](https://www.prjct.app/)
|
|
85
83
|
```
|
|
86
84
|
|
|
87
|
-
**This is NON-NEGOTIABLE. The prjct signature
|
|
85
|
+
**This is NON-NEGOTIABLE. The prjct signature must appear in ALL commits.**
|
|
88
86
|
|
|
89
87
|
### 5. Storage Rules (CROSS-AGENT COMPATIBILITY)
|
|
90
88
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
## HOW TO USE PRJCT (Read This First)
|
|
7
7
|
|
|
8
|
-
When user types `p. <command>`, load the template from `templates/commands/{command}.md` and execute it
|
|
8
|
+
When user types `p. <command>`, load the template from `templates/commands/{command}.md` and execute it.
|
|
9
9
|
|
|
10
10
|
```
|
|
11
11
|
p. sync ā templates/commands/sync.md
|
|
@@ -14,39 +14,70 @@ p. done ā templates/commands/done.md
|
|
|
14
14
|
p. ship X ā templates/commands/ship.md
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
**Key Insight**: Templates are GUIDANCE, not scripts. Use your intelligence to adapt them to the situation.
|
|
18
|
-
|
|
19
17
|
---
|
|
20
18
|
|
|
21
|
-
## CRITICAL RULES
|
|
19
|
+
## ā CRITICAL RULES - READ BEFORE EVERY COMMAND
|
|
22
20
|
|
|
23
|
-
### 0.
|
|
21
|
+
### 0. FOLLOW TEMPLATES STEP BY STEP (NON-NEGOTIABLE)
|
|
24
22
|
|
|
25
|
-
**
|
|
23
|
+
**Templates are MANDATORY WORKFLOWS, not suggestions.**
|
|
26
24
|
|
|
27
25
|
```
|
|
28
|
-
|
|
29
|
-
1.
|
|
30
|
-
2.
|
|
31
|
-
3.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
- Potential risks
|
|
35
|
-
4. ASK - Present plan to user and wait for explicit approval
|
|
36
|
-
5. EXECUTE - Only after user says "yes", "approved", "go ahead", etc.
|
|
26
|
+
ā BEFORE executing ANY p. command:
|
|
27
|
+
1. READ the template file COMPLETELY
|
|
28
|
+
2. FOLLOW each step IN ORDER
|
|
29
|
+
3. DO NOT skip steps - even "obvious" ones
|
|
30
|
+
4. DO NOT take shortcuts - even for "simple" tasks
|
|
31
|
+
5. STOP at any ā BLOCKING condition
|
|
37
32
|
```
|
|
38
33
|
|
|
39
|
-
**
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
34
|
+
**WHY THIS MATTERS:**
|
|
35
|
+
- Skipping steps breaks the prjct workflow for ALL users
|
|
36
|
+
- "Intelligent adaptation" is NOT permission to skip steps
|
|
37
|
+
- Every step exists for a reason
|
|
38
|
+
- If you skip steps, prjct becomes useless
|
|
39
|
+
|
|
40
|
+
### ā BLOCKING CONDITIONS
|
|
41
|
+
|
|
42
|
+
When a template says "STOP" or has a ā symbol:
|
|
43
|
+
```
|
|
44
|
+
1. HALT execution immediately
|
|
45
|
+
2. TELL the user why you stopped
|
|
46
|
+
3. DO NOT proceed until the condition is resolved
|
|
47
|
+
4. DO NOT work around the blocker
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Examples of blockers:**
|
|
51
|
+
- `p. ship` on main branch ā STOP, tell user to create branch
|
|
52
|
+
- `gh auth status` fails ā STOP, tell user to authenticate
|
|
53
|
+
- No changes to commit ā STOP, tell user nothing to ship
|
|
54
|
+
|
|
55
|
+
### GIT WORKFLOW RULES (CRITICAL)
|
|
43
56
|
|
|
44
|
-
**
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
57
|
+
**ā NEVER commit directly to main/master**
|
|
58
|
+
- Always create a feature branch first
|
|
59
|
+
- Always create a PR for review
|
|
60
|
+
- Direct pushes to main are FORBIDDEN
|
|
48
61
|
|
|
49
|
-
|
|
62
|
+
**ā NEVER push without a PR**
|
|
63
|
+
- All changes go through pull requests
|
|
64
|
+
- No exceptions for "small fixes"
|
|
65
|
+
|
|
66
|
+
**ā NEVER skip version bump on ship**
|
|
67
|
+
- Every ship requires version update
|
|
68
|
+
- Every ship requires CHANGELOG entry
|
|
69
|
+
|
|
70
|
+
### PLAN BEFORE DESTRUCTIVE ACTIONS
|
|
71
|
+
|
|
72
|
+
For commands that modify git state (ship, merge, done):
|
|
73
|
+
```
|
|
74
|
+
1. Show the user what will happen
|
|
75
|
+
2. List all changes/files affected
|
|
76
|
+
3. WAIT for explicit approval ("yes", "proceed", "do it")
|
|
77
|
+
4. Only then execute
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**DO NOT assume approval. WAIT for it.**
|
|
50
81
|
|
|
51
82
|
---
|
|
52
83
|
|
|
@@ -79,12 +110,10 @@ bun -e "console.log(crypto.randomUUID())" 2>/dev/null || node -e "console.log(re
|
|
|
79
110
|
**Every commit made with prjct MUST include this footer:**
|
|
80
111
|
|
|
81
112
|
```
|
|
82
|
-
|
|
83
|
-
Designed for [Claude](https://www.anthropic.com/claude)
|
|
84
|
-
|
|
113
|
+
Generated with [p/](https://www.prjct.app/)
|
|
85
114
|
```
|
|
86
115
|
|
|
87
|
-
**This is NON-NEGOTIABLE. The prjct signature
|
|
116
|
+
**This is NON-NEGOTIABLE. The prjct signature must appear in ALL commits.**
|
|
88
117
|
|
|
89
118
|
### 5. Storage Rules (CROSS-AGENT COMPATIBILITY)
|
|
90
119
|
|
|
@@ -256,7 +285,7 @@ Next: [suggested action]
|
|
|
256
285
|
|
|
257
286
|
5. **Prefer prjct CLI over raw commands**:
|
|
258
287
|
```
|
|
259
|
-
GOOD: bun core/cli/linear.ts list
|
|
288
|
+
GOOD: bun $PRJCT_CLI/core/cli/linear.ts list
|
|
260
289
|
BAD: curl -X POST https://api.linear.app/graphql...
|
|
261
290
|
```
|
|
262
291
|
|
|
@@ -99,9 +99,7 @@ node -e "console.log(require('crypto').randomUUID())"
|
|
|
99
99
|
**Every commit made with prjct MUST include this footer:**
|
|
100
100
|
|
|
101
101
|
```
|
|
102
|
-
|
|
103
|
-
Built with [Cursor](https://www.cursor.com/)
|
|
104
|
-
|
|
102
|
+
Generated with [p/](https://www.prjct.app/)
|
|
105
103
|
```
|
|
106
104
|
|
|
107
105
|
**This is NON-NEGOTIABLE. The prjct signature must appear in ALL commits.**
|
|
@@ -79,12 +79,10 @@ bun -e "console.log(crypto.randomUUID())" 2>/dev/null || node -e "console.log(re
|
|
|
79
79
|
**Every commit made with prjct MUST include this footer:**
|
|
80
80
|
|
|
81
81
|
```
|
|
82
|
-
|
|
83
|
-
Designed for [Gemini](https://geminicli.com/)
|
|
84
|
-
|
|
82
|
+
Generated with [p/](https://www.prjct.app/)
|
|
85
83
|
```
|
|
86
84
|
|
|
87
|
-
**This is NON-NEGOTIABLE. The prjct signature
|
|
85
|
+
**This is NON-NEGOTIABLE. The prjct signature must appear in ALL commits.**
|
|
88
86
|
|
|
89
87
|
### 5. Storage Rules (CROSS-AGENT COMPATIBILITY)
|
|
90
88
|
|
|
@@ -99,9 +99,7 @@ node -e "console.log(require('crypto').randomUUID())"
|
|
|
99
99
|
**Every commit made with prjct MUST include this footer:**
|
|
100
100
|
|
|
101
101
|
```
|
|
102
|
-
|
|
103
|
-
Built with [Windsurf](https://www.windsurf.com/)
|
|
104
|
-
|
|
102
|
+
Generated with [p/](https://www.prjct.app/)
|
|
105
103
|
```
|
|
106
104
|
|
|
107
105
|
**This is NON-NEGOTIABLE. The prjct signature must appear in ALL commits.**
|
|
@@ -64,8 +64,7 @@ Fix issues and try again.
|
|
|
64
64
|
|
|
65
65
|
{body if needed}
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
Designed for [Claude](https://www.anthropic.com/claude)
|
|
67
|
+
Generated with [p/](https://www.prjct.app/)
|
|
69
68
|
```
|
|
70
69
|
3. Commit: `git commit -m "{message}"`
|
|
71
70
|
4. Push: `git push origin {current-branch}`
|