claudius-core 0.9.0 → 0.9.3
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/.claude/agents/manager.md +13 -3
- package/.claude/agents/worker.md +27 -50
- package/.claude/rules/testing.md +4 -7
- package/.claude/scripts/merge-pr.sh +24 -55
- package/.claude/scripts/project-status.sh +67 -0
- package/.claude/skills/build/SKILL.md +17 -3
- package/.claude-plugin/marketplace.json +2 -2
- package/dist/config-migrations.js +1 -1
- package/dist/config-migrations.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -2
- package/dist/config.js.map +1 -1
- package/dist/daemon/ideation.d.ts.map +1 -1
- package/dist/daemon/ideation.js +11 -48
- package/dist/daemon/ideation.js.map +1 -1
- package/dist/daemon/pulse-state.d.ts +59 -0
- package/dist/daemon/pulse-state.d.ts.map +1 -0
- package/dist/daemon/pulse-state.js +122 -0
- package/dist/daemon/pulse-state.js.map +1 -0
- package/dist/daemon/pulse.js +2 -2
- package/dist/daemon/pulse.js.map +1 -1
- package/dist/lib/github.d.ts +36 -0
- package/dist/lib/github.d.ts.map +1 -1
- package/dist/lib/github.js +72 -3
- package/dist/lib/github.js.map +1 -1
- package/dist/studio/assets/{_basePickBy-B-dYIPO9.js → _basePickBy-CaRVkU_i.js} +1 -1
- package/dist/studio/assets/{_baseUniq-DtSwUsWb.js → _baseUniq-DB9CANVr.js} +1 -1
- package/dist/studio/assets/{arc-BSHCxjoI.js → arc-DwNKwVLD.js} +1 -1
- package/dist/studio/assets/{architectureDiagram-VXUJARFQ-HuyB70lr.js → architectureDiagram-VXUJARFQ-CDW4khKr.js} +1 -1
- package/dist/studio/assets/{blockDiagram-VD42YOAC-B9HUfXTF.js → blockDiagram-VD42YOAC-D6_LSve2.js} +1 -1
- package/dist/studio/assets/{c4Diagram-YG6GDRKO-CZkxr6sB.js → c4Diagram-YG6GDRKO-SFPE64AJ.js} +1 -1
- package/dist/studio/assets/channel-h6J62PW8.js +1 -0
- package/dist/studio/assets/{chunk-4BX2VUAB-DN6HQi6o.js → chunk-4BX2VUAB-BqHoEHlQ.js} +1 -1
- package/dist/studio/assets/{chunk-55IACEB6-BisQl6jn.js → chunk-55IACEB6-DkHQ5WBd.js} +1 -1
- package/dist/studio/assets/{chunk-B4BG7PRW-Bdix9s7H.js → chunk-B4BG7PRW-CW_kq6KT.js} +1 -1
- package/dist/studio/assets/{chunk-DI55MBZ5-DAIoIssd.js → chunk-DI55MBZ5-DNDwEGQ5.js} +1 -1
- package/dist/studio/assets/{chunk-FMBD7UC4-DNH4o1Hu.js → chunk-FMBD7UC4-5PX-ftxQ.js} +1 -1
- package/dist/studio/assets/{chunk-QN33PNHL-B22BHIBA.js → chunk-QN33PNHL-QkQfQaqN.js} +1 -1
- package/dist/studio/assets/{chunk-QZHKN3VN-7BKcU0AB.js → chunk-QZHKN3VN-Do2RvhJA.js} +1 -1
- package/dist/studio/assets/{chunk-TZMSLE5B-BNK-Y8sm.js → chunk-TZMSLE5B-xiebau4j.js} +1 -1
- package/dist/studio/assets/classDiagram-2ON5EDUG-D8lIj2-P.js +1 -0
- package/dist/studio/assets/classDiagram-v2-WZHVMYZB-D8lIj2-P.js +1 -0
- package/dist/studio/assets/clone-Chwjzlof.js +1 -0
- package/dist/studio/assets/{cose-bilkent-S5V4N54A-C1h3-66S.js → cose-bilkent-S5V4N54A-Apnpf-ki.js} +1 -1
- package/dist/studio/assets/{dagre-6UL2VRFP-ua8g2h-7.js → dagre-6UL2VRFP-BxyPIzB8.js} +1 -1
- package/dist/studio/assets/{diagram-PSM6KHXK-B64zbYxC.js → diagram-PSM6KHXK-24YoaI-e.js} +1 -1
- package/dist/studio/assets/{diagram-QEK2KX5R-KdhA98u6.js → diagram-QEK2KX5R-lHpdi46q.js} +1 -1
- package/dist/studio/assets/{diagram-S2PKOQOG-DALWb6Tg.js → diagram-S2PKOQOG-9u1_ee6B.js} +1 -1
- package/dist/studio/assets/{erDiagram-Q2GNP2WA-CadgQK9g.js → erDiagram-Q2GNP2WA-Dlmgb2ym.js} +1 -1
- package/dist/studio/assets/{flowDiagram-NV44I4VS-DO4RmSUY.js → flowDiagram-NV44I4VS-5sj_GCzk.js} +1 -1
- package/dist/studio/assets/{ganttDiagram-JELNMOA3-Cxb9OlHt.js → ganttDiagram-JELNMOA3-CUJF-slV.js} +1 -1
- package/dist/studio/assets/{gitGraphDiagram-V2S2FVAM-otm97EPi.js → gitGraphDiagram-V2S2FVAM-CKpDBk3b.js} +1 -1
- package/dist/studio/assets/{graph-5oKS2LK4.js → graph-BRYklN25.js} +1 -1
- package/dist/studio/assets/{index-DU1UoE3B.js → index-WEgtt1oI.js} +2 -2
- package/dist/studio/assets/{infoDiagram-HS3SLOUP-DTgzXTlP.js → infoDiagram-HS3SLOUP-DKF6awtp.js} +1 -1
- package/dist/studio/assets/{journeyDiagram-XKPGCS4Q-Bl7_rMO-.js → journeyDiagram-XKPGCS4Q-CgrhL8R0.js} +1 -1
- package/dist/studio/assets/{kanban-definition-3W4ZIXB7-DfXkmWYb.js → kanban-definition-3W4ZIXB7-28MC-pF6.js} +1 -1
- package/dist/studio/assets/{layout-CfjDDkzK.js → layout-gwYv6lHv.js} +1 -1
- package/dist/studio/assets/{linear-Bg2mbmM0.js → linear-Dl48BTRW.js} +1 -1
- package/dist/studio/assets/{mermaid.core-Cwhxv6mz.js → mermaid.core-YPNEyw9M.js} +4 -4
- package/dist/studio/assets/{mindmap-definition-VGOIOE7T-Di0QPIFD.js → mindmap-definition-VGOIOE7T-CNO-62gT.js} +1 -1
- package/dist/studio/assets/{pieDiagram-ADFJNKIX-Cuw6mZ_s.js → pieDiagram-ADFJNKIX-DutNO8TU.js} +1 -1
- package/dist/studio/assets/{quadrantDiagram-AYHSOK5B-BfzOkC1I.js → quadrantDiagram-AYHSOK5B-CyL-T3po.js} +1 -1
- package/dist/studio/assets/{requirementDiagram-UZGBJVZJ-CsTE75LG.js → requirementDiagram-UZGBJVZJ-Decs2Rps.js} +1 -1
- package/dist/studio/assets/{sankeyDiagram-TZEHDZUN-AsrOeW85.js → sankeyDiagram-TZEHDZUN-CXQHF2nL.js} +1 -1
- package/dist/studio/assets/{sequenceDiagram-WL72ISMW-CpNum0nP.js → sequenceDiagram-WL72ISMW-C9cFuo_6.js} +1 -1
- package/dist/studio/assets/{stateDiagram-FKZM4ZOC-BFtnF9LR.js → stateDiagram-FKZM4ZOC-Dvs2TeCM.js} +1 -1
- package/dist/studio/assets/stateDiagram-v2-4FDKWEC3-NKg7XNVy.js +1 -0
- package/dist/studio/assets/{timeline-definition-IT6M3QCI-D8wb271_.js → timeline-definition-IT6M3QCI-BpsJlgf7.js} +1 -1
- package/dist/studio/assets/{treemap-GDKQZRPO-DbBWYkT8.js → treemap-GDKQZRPO-DVxRTPr1.js} +1 -1
- package/dist/studio/assets/{xychartDiagram-PRI3JC2R-ChIi73X1.js → xychartDiagram-PRI3JC2R-QUfHK5a4.js} +1 -1
- package/dist/studio/index.html +1 -1
- package/dist/templates/config.yaml +10 -2
- package/dist/templates/templates/config.yaml +2 -2
- package/global/agents/sleepless.md +46 -27
- package/global/scripts/project-sync.sh +92 -55
- package/package.json +2 -2
- package/dist/studio/assets/channel-CsDzmrvf.js +0 -1
- package/dist/studio/assets/classDiagram-2ON5EDUG-BPqf3_Tt.js +0 -1
- package/dist/studio/assets/classDiagram-v2-WZHVMYZB-BPqf3_Tt.js +0 -1
- package/dist/studio/assets/clone-BFu3hFPa.js +0 -1
- package/dist/studio/assets/stateDiagram-v2-4FDKWEC3-BSIEq3zy.js +0 -1
|
@@ -17,7 +17,7 @@ When asked who you are: "I am the Claudius manager. I route work, coordinate age
|
|
|
17
17
|
2. Decide solo (XS/S) vs team (M+) based on scope
|
|
18
18
|
3. Create feature branch from main — **unless already in a worktree** (see Branch Convention)
|
|
19
19
|
4. For solo: implement directly with TDD
|
|
20
|
-
5. For team: spawn developer via Agent tool, then reviewer
|
|
20
|
+
5. For team: spawn developer via Agent tool, then simplifier (best-effort), then reviewer
|
|
21
21
|
6. **Validate before PR** — `bun test && bun run lint && bun run build` must all pass. Fix failures before creating PR. Never create a PR with known lint or build failures.
|
|
22
22
|
7. Create PR
|
|
23
23
|
8. Update issue checkboxes as criteria are met
|
|
@@ -43,9 +43,19 @@ Use the Agent tool with `subagent_type: "developer"`. Include in the prompt:
|
|
|
43
43
|
- The constraint: only implement what's asked, no scope creep
|
|
44
44
|
- **Reminder: developer must run `bun test`, `bun run lint`, and `bun run build` before pushing**
|
|
45
45
|
|
|
46
|
-
The developer runs in an isolated worktree, implements via TDD, validates (test + lint + build), and returns its output. After it completes, verify the developer reported all three validations passing, then create the PR: `gh pr create`.
|
|
46
|
+
The developer runs in an isolated worktree, implements via TDD, validates (test + lint + build), and returns its output. After it completes, verify the developer reported all three validations passing, then spawn the simplifier (best-effort), then create the PR: `gh pr create`. Only spawn the reviewer after the PR exists.
|
|
47
47
|
|
|
48
|
-
**
|
|
48
|
+
**Simplifier** (for M+ work, after developer completes and before reviewer):
|
|
49
|
+
Use the Agent tool with `subagent_type: "general-purpose"` and `agent: "code-simplifier"`. Include in the prompt:
|
|
50
|
+
- The git diff of all changes so far: output of `git diff main...HEAD`
|
|
51
|
+
- The original issue acceptance criteria
|
|
52
|
+
- Project conventions: contents of CLAUDE.md
|
|
53
|
+
- Instruction: reduce complexity, improve reuse, fix quality issues — without changing behavior or adding new features
|
|
54
|
+
- Constraint: only touch files already changed on this branch (visible in the diff above)
|
|
55
|
+
|
|
56
|
+
The simplifier is **non-blocking**: if it returns no changes, errors, or is unavailable, log the outcome and continue to the reviewer. Never let the simplifier halt the pipeline.
|
|
57
|
+
|
|
58
|
+
**Reviewer** (for M+ work, after simplifier completes and PR is created):
|
|
49
59
|
Use the Agent tool with `subagent_type: "reviewer"`. Include in the prompt:
|
|
50
60
|
- The PR number to review
|
|
51
61
|
- Return structured verdict: approve / request-changes / block
|
package/.claude/agents/worker.md
CHANGED
|
@@ -41,6 +41,7 @@ gh pr list --search "Closes #<N> in:body" --state open --json number --limit 1
|
|
|
41
41
|
If no open PR found → stale claim → restore to ready:
|
|
42
42
|
```bash
|
|
43
43
|
gh issue edit <N> --remove-label "in-progress,claude" --add-label "ready"
|
|
44
|
+
bash .claude/scripts/project-status.sh <N> "Todo" "Queued"
|
|
44
45
|
```
|
|
45
46
|
|
|
46
47
|
## Guard Checks
|
|
@@ -62,11 +63,26 @@ tail -20 .claudius/job-runs.jsonl
|
|
|
62
63
|
Before picking new work, merge any open XS/S/M PRs with passing CI:
|
|
63
64
|
|
|
64
65
|
```bash
|
|
65
|
-
gh pr list --json number,title,headRefName,statusCheckRollup --limit 20
|
|
66
|
-
bash .claude/scripts/merge-pr.sh <N>
|
|
67
|
-
gh issue close <issue-N> --comment "Closed by PR #<N>."
|
|
66
|
+
gh pr list --json number,title,headRefName,statusCheckRollup,mergeable --limit 20
|
|
68
67
|
```
|
|
69
68
|
|
|
69
|
+
For each PR with all checks passing:
|
|
70
|
+
1. **Check mergeability** — if `mergeable` is `CONFLICTING`, try rebasing first:
|
|
71
|
+
```bash
|
|
72
|
+
gh pr view <N> --json mergeable --jq '.mergeable'
|
|
73
|
+
# If CONFLICTING → attempt rebase:
|
|
74
|
+
git fetch origin main
|
|
75
|
+
git checkout <branch>
|
|
76
|
+
git rebase origin/main
|
|
77
|
+
git push --force-with-lease
|
|
78
|
+
# If rebase fails: skip this PR, leave for human or next cycle
|
|
79
|
+
```
|
|
80
|
+
2. **Merge** — only if mergeable:
|
|
81
|
+
```bash
|
|
82
|
+
bash .claude/scripts/merge-pr.sh <N>
|
|
83
|
+
gh issue close <issue-N> --comment "Closed by PR #<N>."
|
|
84
|
+
```
|
|
85
|
+
|
|
70
86
|
## Step 2: Pick Top-3 Issues
|
|
71
87
|
|
|
72
88
|
```bash
|
|
@@ -97,13 +113,7 @@ PRIOR_ATTEMPTS=$(gh issue view <N> --json comments \
|
|
|
97
113
|
if [ "${PRIOR_ATTEMPTS:-0}" -ge "$MAX_ATTEMPTS" ]; then
|
|
98
114
|
gh issue edit <N> --remove-label "ready" --add-label "blocked"
|
|
99
115
|
gh issue comment <N> --body "Claudius: exceeded ${MAX_ATTEMPTS} build attempts. Needs human review before retrying."
|
|
100
|
-
|
|
101
|
-
ITEM_ID=$(gh api graphql -f query='{user(login:"SharadKumar"){projectV2(number:6){items(first:100){nodes{id content{...on Issue{number repository{nameWithOwner}}}}}}}}' \
|
|
102
|
-
--jq ".data.user.projectV2.items.nodes[] | select(.content.number == <N> and .content.repository.nameWithOwner == \"$REPO_NAME\") | .id" 2>/dev/null | head -1)
|
|
103
|
-
[ -n "$ITEM_ID" ] && gh project item-edit --id "$ITEM_ID" \
|
|
104
|
-
--project-id "PVT_kwHOAFO-EM4BRTW5" \
|
|
105
|
-
--field-id "PVTSSF_lAHOAFO-EM4BRTW5zg_K3tE" \
|
|
106
|
-
--single-select-option-id "d239ddb3" 2>/dev/null || true
|
|
116
|
+
bash .claude/scripts/project-status.sh <N> "Blocked" "Blocked"
|
|
107
117
|
# skip this issue — continue to next candidate
|
|
108
118
|
fi
|
|
109
119
|
```
|
|
@@ -123,18 +133,9 @@ NEW_ATTEMPTS=$(( ${PRIOR_ATTEMPTS:-0} + 1 ))
|
|
|
123
133
|
bash .claude/scripts/workpad-upsert.sh <N> "🔄 Claimed — reading issue" "TBD" "- [ ] (loading)" "pending" "$NEW_ATTEMPTS"
|
|
124
134
|
```
|
|
125
135
|
|
|
126
|
-
**Update Project #6
|
|
127
|
-
|
|
136
|
+
**Update Project #6 → In Progress / Running** (best-effort):
|
|
128
137
|
```bash
|
|
129
|
-
|
|
130
|
-
REPO_NAME=$(gh repo view --json nameWithOwner --jq '.nameWithOwner')
|
|
131
|
-
gh project item-add 6 --owner SharadKumar --url "$ISSUE_URL" 2>/dev/null || true
|
|
132
|
-
ITEM_ID=$(gh api graphql -f query='{user(login:"SharadKumar"){projectV2(number:6){items(first:100){nodes{id content{...on Issue{number repository{nameWithOwner}}}}}}}}' \
|
|
133
|
-
--jq ".data.user.projectV2.items.nodes[] | select(.content.number == <N> and .content.repository.nameWithOwner == \"$REPO_NAME\") | .id" 2>/dev/null | head -1)
|
|
134
|
-
[ -n "$ITEM_ID" ] && gh project item-edit --id "$ITEM_ID" \
|
|
135
|
-
--project-id "PVT_kwHOAFO-EM4BRTW5" \
|
|
136
|
-
--field-id "PVTSSF_lAHOAFO-EM4BRTW5zg_K3tE" \
|
|
137
|
-
--single-select-option-id "0d583361" 2>/dev/null || true
|
|
138
|
+
bash .claude/scripts/project-status.sh <N> "In Progress" "Running"
|
|
138
139
|
```
|
|
139
140
|
|
|
140
141
|
## Step 3: Develop in Parallel
|
|
@@ -177,6 +178,7 @@ Wait for all developer agents to complete before proceeding.
|
|
|
177
178
|
```bash
|
|
178
179
|
gh issue edit <N> --remove-label "in-progress,claude" --add-label "ready"
|
|
179
180
|
gh issue comment <N> --body "Worker: developer failed. Restored to ready queue."
|
|
181
|
+
bash .claude/scripts/project-status.sh <N> "Todo" "Queued"
|
|
180
182
|
```
|
|
181
183
|
Remove it from the active set and continue with the rest.
|
|
182
184
|
|
|
@@ -244,15 +246,9 @@ if [ -n "$SLACK_CHANNEL" ]; then
|
|
|
244
246
|
fi
|
|
245
247
|
```
|
|
246
248
|
|
|
247
|
-
**Update Project #6
|
|
249
|
+
**Update Project #6 → Under Review / Review** (best-effort):
|
|
248
250
|
```bash
|
|
249
|
-
|
|
250
|
-
ITEM_ID=$(gh api graphql -f query='{user(login:"SharadKumar"){projectV2(number:6){items(first:100){nodes{id content{...on Issue{number repository{nameWithOwner}}}}}}}}' \
|
|
251
|
-
--jq ".data.user.projectV2.items.nodes[] | select(.content.number == <N> and .content.repository.nameWithOwner == \"$REPO_NAME\") | .id" 2>/dev/null | head -1)
|
|
252
|
-
[ -n "$ITEM_ID" ] && gh project item-edit --id "$ITEM_ID" \
|
|
253
|
-
--project-id "PVT_kwHOAFO-EM4BRTW5" \
|
|
254
|
-
--field-id "PVTSSF_lAHOAFO-EM4BRTW5zg_K3tE" \
|
|
255
|
-
--single-select-option-id "173633ca" 2>/dev/null || true
|
|
251
|
+
bash .claude/scripts/project-status.sh <N> "Under Review" "Review"
|
|
256
252
|
```
|
|
257
253
|
|
|
258
254
|
## Step 5: Review in Parallel
|
|
@@ -276,17 +272,7 @@ Wait for all reviewer agents to complete.
|
|
|
276
272
|
```bash
|
|
277
273
|
gh issue edit <N> --remove-label "in-progress,claude" --add-label "ready"
|
|
278
274
|
gh issue comment <N> --body "Worker: reviewer blocked. Reason: <reason>."
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
**Update Project #6 Status → Blocked** (best-effort):
|
|
282
|
-
```bash
|
|
283
|
-
REPO_NAME=$(gh repo view --json nameWithOwner --jq '.nameWithOwner')
|
|
284
|
-
ITEM_ID=$(gh api graphql -f query='{user(login:"SharadKumar"){projectV2(number:6){items(first:100){nodes{id content{...on Issue{number repository{nameWithOwner}}}}}}}}' \
|
|
285
|
-
--jq ".data.user.projectV2.items.nodes[] | select(.content.number == <N> and .content.repository.nameWithOwner == \"$REPO_NAME\") | .id" 2>/dev/null | head -1)
|
|
286
|
-
[ -n "$ITEM_ID" ] && gh project item-edit --id "$ITEM_ID" \
|
|
287
|
-
--project-id "PVT_kwHOAFO-EM4BRTW5" \
|
|
288
|
-
--field-id "PVTSSF_lAHOAFO-EM4BRTW5zg_K3tE" \
|
|
289
|
-
--single-select-option-id "d239ddb3" 2>/dev/null || true
|
|
275
|
+
bash .claude/scripts/project-status.sh <N> "Todo" "Queued"
|
|
290
276
|
```
|
|
291
277
|
|
|
292
278
|
## Step 6: Merge & Record
|
|
@@ -297,16 +283,7 @@ bash .claude/scripts/merge-pr.sh <PR-number>
|
|
|
297
283
|
gh issue close <N> --comment "Closed by PR #<M>."
|
|
298
284
|
```
|
|
299
285
|
|
|
300
|
-
|
|
301
|
-
```bash
|
|
302
|
-
REPO_NAME=$(gh repo view --json nameWithOwner --jq '.nameWithOwner')
|
|
303
|
-
ITEM_ID=$(gh api graphql -f query='{user(login:"SharadKumar"){projectV2(number:6){items(first:100){nodes{id content{...on Issue{number repository{nameWithOwner}}}}}}}}' \
|
|
304
|
-
--jq ".data.user.projectV2.items.nodes[] | select(.content.number == <N> and .content.repository.nameWithOwner == \"$REPO_NAME\") | .id" 2>/dev/null | head -1)
|
|
305
|
-
[ -n "$ITEM_ID" ] && gh project item-edit --id "$ITEM_ID" \
|
|
306
|
-
--project-id "PVT_kwHOAFO-EM4BRTW5" \
|
|
307
|
-
--field-id "PVTSSF_lAHOAFO-EM4BRTW5zg_K3tE" \
|
|
308
|
-
--single-select-option-id "b60a81d0" 2>/dev/null || true
|
|
309
|
-
```
|
|
286
|
+
Closing the issue removes it from the active Project #6 board — no explicit "Done" status needed.
|
|
310
287
|
|
|
311
288
|
After each merge, reply in the PR's Slack thread (best-effort):
|
|
312
289
|
```bash
|
package/.claude/rules/testing.md
CHANGED
|
@@ -25,20 +25,17 @@ Every change that can be tested locally MUST be tested locally before committing
|
|
|
25
25
|
|
|
26
26
|
### dist/ freshness
|
|
27
27
|
|
|
28
|
-
`dist/` is
|
|
28
|
+
`dist/` is gitignored and built at install time via the `prepare` script. Do NOT commit `dist/` — it is a build artifact.
|
|
29
29
|
|
|
30
|
-
**After changing any `src/` file, always
|
|
30
|
+
**After changing any `src/` file, always verify the build succeeds:**
|
|
31
31
|
```bash
|
|
32
|
-
bun run build
|
|
33
|
-
git add dist/
|
|
32
|
+
bun run build
|
|
34
33
|
```
|
|
35
34
|
|
|
36
|
-
If you forget, `npx github:SharadKumar/claudius` will silently run old code — the most dangerous kind of bug.
|
|
37
|
-
|
|
38
35
|
### Anti-patterns
|
|
39
36
|
|
|
40
37
|
- Committing install commands without testing them in the target environment
|
|
41
38
|
- Assuming package managers behave identically (they don't — especially for private repos, workspaces, lockfiles)
|
|
42
39
|
- Shipping a fix for a fix for a fix instead of reverting and getting it right once
|
|
43
40
|
- Trusting `bun run build` as sufficient validation when the change is user-facing
|
|
44
|
-
-
|
|
41
|
+
- Committing `dist/` — it is gitignored and built at install time
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# merge-pr.sh —
|
|
2
|
+
# merge-pr.sh — API-only PR merge. Never touches local branches.
|
|
3
3
|
#
|
|
4
4
|
# Usage: bash .claude/scripts/merge-pr.sh <PR-number>
|
|
5
5
|
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
# 4. On failure, fall back to GitHub API merge + remote branch deletion
|
|
11
|
-
# 5. Sync home branch inline (no external script dependency)
|
|
6
|
+
# Principle: Merging is a GitHub operation. This script never runs
|
|
7
|
+
# `git checkout`, never switches branches, never mutates local state.
|
|
8
|
+
# Safe to call from any context: main checkout, worktree, subdirectory,
|
|
9
|
+
# multiple concurrent tabs — no interference possible.
|
|
12
10
|
#
|
|
13
|
-
# Exit codes: 0 = merged
|
|
11
|
+
# Exit codes: 0 = merged, 1 = merge failed
|
|
14
12
|
|
|
15
13
|
set -euo pipefail
|
|
16
14
|
|
|
@@ -20,60 +18,31 @@ if [[ -z "$PR" ]]; then
|
|
|
20
18
|
exit 1
|
|
21
19
|
fi
|
|
22
20
|
|
|
23
|
-
# Resolve main repo root — works from any CWD (worktree, subdir, main checkout)
|
|
24
|
-
GIT_COMMON_DIR=$(git rev-parse --git-common-dir 2>/dev/null)
|
|
25
|
-
MAIN_ROOT=$(cd "$(git rev-parse --show-toplevel)" && cd "$(git rev-parse --git-common-dir)/.." && pwd)
|
|
26
|
-
|
|
27
|
-
cd "$MAIN_ROOT"
|
|
28
|
-
|
|
29
|
-
# Get branch name before merging (needed for API fallback cleanup)
|
|
30
21
|
BRANCH=$(gh pr view "$PR" --json headRefName --jq '.headRefName' 2>/dev/null)
|
|
31
22
|
REPO=$(gh repo view --json nameWithOwner --jq '.nameWithOwner' 2>/dev/null)
|
|
23
|
+
TITLE=$(gh pr view "$PR" --json title --jq '.title')
|
|
32
24
|
|
|
33
25
|
echo "Merging PR #$PR ($BRANCH) in $REPO..."
|
|
34
26
|
|
|
35
|
-
#
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
# API merge
|
|
42
|
-
TITLE=$(gh pr view "$PR" --json title --jq '.title')
|
|
43
|
-
gh api "repos/$REPO/pulls/$PR/merge" \
|
|
44
|
-
-X PUT \
|
|
45
|
-
-f merge_method=squash \
|
|
46
|
-
-f commit_title="$TITLE" \
|
|
47
|
-
--silent
|
|
27
|
+
# Merge via GitHub API — zero local git operations
|
|
28
|
+
gh api "repos/$REPO/pulls/$PR/merge" \
|
|
29
|
+
-X PUT \
|
|
30
|
+
-f merge_method=squash \
|
|
31
|
+
-f commit_title="$TITLE" \
|
|
32
|
+
--silent
|
|
48
33
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
# Delete remote branch
|
|
52
|
-
if git ls-remote --exit-code origin "$BRANCH" &>/dev/null; then
|
|
53
|
-
git push origin --delete "$BRANCH" 2>/dev/null && echo "Deleted remote branch: $BRANCH" || echo "⚠ Could not delete remote branch: $BRANCH"
|
|
54
|
-
fi
|
|
55
|
-
fi
|
|
34
|
+
echo "Merged PR #$PR."
|
|
56
35
|
|
|
57
|
-
#
|
|
58
|
-
|
|
36
|
+
# Delete remote branch via API
|
|
37
|
+
gh api "repos/$REPO/git/refs/heads/$BRANCH" -X DELETE --silent 2>/dev/null \
|
|
38
|
+
&& echo "Deleted remote branch: $BRANCH" \
|
|
39
|
+
|| echo "⚠ Could not delete remote branch: $BRANCH"
|
|
59
40
|
|
|
60
|
-
#
|
|
61
|
-
|
|
62
|
-
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
|
41
|
+
# Update remote refs locally (no branch change, no checkout)
|
|
42
|
+
git fetch origin main 2>/dev/null || true
|
|
63
43
|
|
|
64
|
-
if
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
git
|
|
68
|
-
echo "Returned to home branch: $HOME_BRANCH"
|
|
69
|
-
else
|
|
70
|
-
# Root repo — return to main and sync
|
|
71
|
-
git checkout main 2>/dev/null || true
|
|
72
|
-
if git pull --ff-only origin main 2>/dev/null; then
|
|
73
|
-
echo "main synced to latest."
|
|
74
|
-
else
|
|
75
|
-
echo "⚠ main has diverged from origin/main — fast-forward not possible."
|
|
76
|
-
echo " Resolve manually: git fetch origin && git rebase origin/main"
|
|
77
|
-
exit 2
|
|
78
|
-
fi
|
|
44
|
+
# Clean up local branch if we're not currently on it
|
|
45
|
+
CURRENT=$(git branch --show-current 2>/dev/null || echo "")
|
|
46
|
+
if [[ -n "$BRANCH" ]] && [[ "$CURRENT" != "$BRANCH" ]]; then
|
|
47
|
+
git branch -d "$BRANCH" 2>/dev/null && echo "Deleted local branch: $BRANCH" || true
|
|
79
48
|
fi
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# project-status.sh — Update Project #6 Status and Execution fields for an issue.
|
|
3
|
+
#
|
|
4
|
+
# Usage: bash .claude/scripts/project-status.sh <issue-number> <status> <execution>
|
|
5
|
+
#
|
|
6
|
+
# Status values: Todo | "In Progress" | "Under Review" | Blocked
|
|
7
|
+
# Execution values: Queued | Running | Review | Blocked
|
|
8
|
+
#
|
|
9
|
+
# Both fields are updated atomically. Missing or invalid values are skipped silently.
|
|
10
|
+
# All operations are best-effort — failures are logged but never fatal.
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
ISSUE_NUMBER="${1:?Usage: project-status.sh <issue-number> <status> <execution>}"
|
|
15
|
+
STATUS="${2:?Missing status value}"
|
|
16
|
+
EXECUTION="${3:?Missing execution value}"
|
|
17
|
+
|
|
18
|
+
# --- Project #6 constants ---
|
|
19
|
+
PROJECT_ID="PVT_kwHOAFO-EM4BRTW5"
|
|
20
|
+
STATUS_FIELD="PVTSSF_lAHOAFO-EM4BRTW5zg_K3tE"
|
|
21
|
+
EXECUTION_FIELD="PVTSSF_lAHOAFO-EM4BRTW5zg_Lokk"
|
|
22
|
+
|
|
23
|
+
# Resolve Status option ID
|
|
24
|
+
case "$STATUS" in
|
|
25
|
+
"Todo") STATUS_OPT="6ed537f9" ;;
|
|
26
|
+
"In Progress") STATUS_OPT="0d583361" ;;
|
|
27
|
+
"Under Review") STATUS_OPT="173633ca" ;;
|
|
28
|
+
"Blocked") STATUS_OPT="d239ddb3" ;;
|
|
29
|
+
*) echo "[project-status] Unknown status: $STATUS" >&2; exit 1 ;;
|
|
30
|
+
esac
|
|
31
|
+
|
|
32
|
+
# Resolve Execution option ID
|
|
33
|
+
case "$EXECUTION" in
|
|
34
|
+
"Queued") EXECUTION_OPT="f00eea4e" ;;
|
|
35
|
+
"Running") EXECUTION_OPT="14585208" ;;
|
|
36
|
+
"Review") EXECUTION_OPT="8e0939cc" ;;
|
|
37
|
+
"Blocked") EXECUTION_OPT="65e212b0" ;;
|
|
38
|
+
*) echo "[project-status] Unknown execution: $EXECUTION" >&2; exit 1 ;;
|
|
39
|
+
esac
|
|
40
|
+
|
|
41
|
+
# Get issue URL
|
|
42
|
+
ISSUE_URL=$(gh issue view "$ISSUE_NUMBER" --json url --jq '.url' 2>/dev/null || echo "")
|
|
43
|
+
if [ -z "$ISSUE_URL" ]; then
|
|
44
|
+
echo "[project-status] Could not find issue #$ISSUE_NUMBER" >&2
|
|
45
|
+
exit 0
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# Add to project (idempotent) — returns the item ID whether new or existing
|
|
49
|
+
ITEM_ID=$(gh project item-add 6 --owner SharadKumar --url "$ISSUE_URL" --format json --jq '.id' 2>/dev/null || echo "")
|
|
50
|
+
|
|
51
|
+
if [ -z "$ITEM_ID" ]; then
|
|
52
|
+
echo "[project-status] Could not add/find issue #$ISSUE_NUMBER in Project #6" >&2
|
|
53
|
+
exit 0
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
# Update both fields
|
|
57
|
+
gh project item-edit --id "$ITEM_ID" \
|
|
58
|
+
--project-id "$PROJECT_ID" \
|
|
59
|
+
--field-id "$STATUS_FIELD" \
|
|
60
|
+
--single-select-option-id "$STATUS_OPT" 2>/dev/null || true
|
|
61
|
+
|
|
62
|
+
gh project item-edit --id "$ITEM_ID" \
|
|
63
|
+
--project-id "$PROJECT_ID" \
|
|
64
|
+
--field-id "$EXECUTION_FIELD" \
|
|
65
|
+
--single-select-option-id "$EXECUTION_OPT" 2>/dev/null || true
|
|
66
|
+
|
|
67
|
+
echo "[project-status] #$ISSUE_NUMBER → Status: $STATUS, Execution: $EXECUTION"
|
|
@@ -105,9 +105,23 @@ Also read: `.claudius/design/tokens.css` for token values, `.claudius/design/com
|
|
|
105
105
|
1. Write failing test from first acceptance criterion
|
|
106
106
|
2. Implement until test passes
|
|
107
107
|
3. Repeat for each AC
|
|
108
|
-
4.
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
4. Invoke `/simplify` on the changed files to reduce complexity before validating (best-effort: if it returns no changes or errors, log and continue)
|
|
109
|
+
5. Run full suite: `bun test`
|
|
110
|
+
|
|
111
|
+
**Team (M+ — >2 files, >100 lines):** Use the Agent tool to spawn developer, simplifier, and reviewer agents in sequence.
|
|
112
|
+
|
|
113
|
+
1. **Spawn builder** — developer agent implements the issue with TDD (full cycle: failing tests → implementation → passing tests)
|
|
114
|
+
2. **Spawn simplifier** — after builder completes, spawn the `code-simplifier` agent (best-effort: if it returns no changes or errors, log and continue to reviewer):
|
|
115
|
+
```
|
|
116
|
+
Agent tool, subagent_type: general-purpose, agent: code-simplifier
|
|
117
|
+
Prompt:
|
|
118
|
+
<git diff of all changes: `git diff main...HEAD`>
|
|
119
|
+
<original issue ACs>
|
|
120
|
+
Project conventions: see CLAUDE.md
|
|
121
|
+
Task: Reduce complexity, improve reuse, fix quality issues — without changing behavior or adding new features.
|
|
122
|
+
Constraint: Only touch files already changed on this branch (visible in the diff above).
|
|
123
|
+
```
|
|
124
|
+
3. **Spawn reviewer** — reviewer agent runs quality gate after simplifier completes (or after simplifier is skipped due to error)
|
|
111
125
|
|
|
112
126
|
### 5. Validate
|
|
113
127
|
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
"name": "claudius",
|
|
22
22
|
"source": "./",
|
|
23
23
|
"description": "Autonomous orchestration layer for Claude Code — agents, skills, hooks, and heartbeat daemon for round-the-clock development",
|
|
24
|
-
"version": "0.9.
|
|
24
|
+
"version": "0.9.3",
|
|
25
25
|
"strict": true,
|
|
26
26
|
"category": "development"
|
|
27
27
|
}
|
|
28
28
|
],
|
|
29
|
-
"version": "0.9.
|
|
29
|
+
"version": "0.9.3"
|
|
30
30
|
}
|
|
@@ -26,7 +26,7 @@ const migrations = [
|
|
|
26
26
|
fromVersion: 1,
|
|
27
27
|
toVersion: 2,
|
|
28
28
|
migrate: (_doc) => {
|
|
29
|
-
// owner, slack, pulse.ideation
|
|
29
|
+
// owner, slack, pulse.ideation are added by addMissingKeys
|
|
30
30
|
// This migration handles any structural changes needed
|
|
31
31
|
},
|
|
32
32
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-migrations.js","sourceRoot":"","sources":["../src/config-migrations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAiB,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAgBrD,MAAM,UAAU,GAAgB;IAC/B;QACC,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAChB,uDAAuD;YACvD,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/C,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACjD,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;gBAChC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACzB,CAAC;QACF,CAAC;KACD;IACD;QACC,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACjB,
|
|
1
|
+
{"version":3,"file":"config-migrations.js","sourceRoot":"","sources":["../src/config-migrations.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ export interface ClaudiusConfig {
|
|
|
31
31
|
pulse: {
|
|
32
32
|
enabled: boolean;
|
|
33
33
|
intervalMinutes: number;
|
|
34
|
-
timezone
|
|
34
|
+
timezone?: string;
|
|
35
35
|
activeHours: {
|
|
36
36
|
start: string;
|
|
37
37
|
end: string;
|
|
@@ -63,7 +63,7 @@ export interface ClaudiusConfig {
|
|
|
63
63
|
};
|
|
64
64
|
owner: {
|
|
65
65
|
name: string;
|
|
66
|
-
timezone
|
|
66
|
+
timezone?: string;
|
|
67
67
|
slackUserId: string;
|
|
68
68
|
};
|
|
69
69
|
goals: string[];
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,MAAM,WAAW,WAAW;IAC3B,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,KAAK,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;IAChC,MAAM,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAClC,QAAQ,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,EAAE;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE;QACT,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,MAAM,WAAW,WAAW;IAC3B,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,KAAK,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;IAChC,MAAM,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAClC,QAAQ,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,EAAE;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE;QACT,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QACnD,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,cAAc,EAAE,OAAO,CAAC;QACxB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,QAAQ,EAAE;YACT,aAAa,EAAE,MAAM,CAAC;YACtB,WAAW,EAAE,MAAM,CAAC;YACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;YAC5B,qBAAqB,EAAE,MAAM,EAAE,CAAC;YAChC,kBAAkB,EAAE,MAAM,CAAC;SAC3B,CAAC;KACF,CAAC;IACF,IAAI,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,MAAM,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,OAAO,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;IACF,KAAK,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,WAAW,CAAC;CACpB;AAyDD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAevD;AAED,wBAAgB,gBAAgB,IAAI,cAAc,CAEjD"}
|
package/dist/config.js
CHANGED
|
@@ -25,7 +25,6 @@ const DEFAULT_CONFIG = {
|
|
|
25
25
|
pulse: {
|
|
26
26
|
enabled: false,
|
|
27
27
|
intervalMinutes: 15,
|
|
28
|
-
timezone: "America/Los_Angeles",
|
|
29
28
|
activeHours: { start: "09:00", end: "22:00" },
|
|
30
29
|
budgetCapUsd: 100,
|
|
31
30
|
maxIssuesPerDay: 5,
|
|
@@ -54,7 +53,6 @@ const DEFAULT_CONFIG = {
|
|
|
54
53
|
},
|
|
55
54
|
owner: {
|
|
56
55
|
name: "",
|
|
57
|
-
timezone: "America/Los_Angeles",
|
|
58
56
|
slackUserId: "",
|
|
59
57
|
},
|
|
60
58
|
goals: [],
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAqExC,MAAM,cAAc,GAAmB;IACtC,aAAa,EAAE,sBAAsB;IACrC,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE;QACT,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,eAAe;KACtB;IACD,QAAQ,EAAE;QACT,aAAa,EAAE,MAAM;QACrB,WAAW,EAAE,IAAI;KACjB;IACD,QAAQ,EAAE;QACT,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,CAAC;KACd;IACD,KAAK,EAAE;QACN,OAAO,EAAE,KAAK;QACd,eAAe,EAAE,EAAE;QACnB,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ideation.d.ts","sourceRoot":"","sources":["../../src/daemon/ideation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"ideation.d.ts","sourceRoot":"","sources":["../../src/daemon/ideation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;CACrC;AAED,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAKD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CA4CnF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAEtE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAazE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GAChB,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
package/dist/daemon/ideation.js
CHANGED
|
@@ -9,10 +9,7 @@
|
|
|
9
9
|
* handles this directly from job prompts (ideate.md, qualify.md, pulse.md).
|
|
10
10
|
* These utilities remain for programmatic use.
|
|
11
11
|
*/
|
|
12
|
-
import
|
|
13
|
-
import { unlinkSync, writeFileSync } from "node:fs";
|
|
14
|
-
import { tmpdir } from "node:os";
|
|
15
|
-
import { join } from "node:path";
|
|
12
|
+
import { createIssueWithUrl, getDiscussionCategories, getRepoName, postDiscussionGraphql, } from "../lib/github.js";
|
|
16
13
|
/** Labels applied when auto-executing candidates. */
|
|
17
14
|
const AUTO_EXECUTE_TYPES = new Set(["bug", "chore", "test"]);
|
|
18
15
|
/**
|
|
@@ -80,8 +77,7 @@ export function fileIssue(idea, projectDir) {
|
|
|
80
77
|
"---",
|
|
81
78
|
"*Generated by Pulse ideation engine*",
|
|
82
79
|
].join("\n");
|
|
83
|
-
|
|
84
|
-
return result.trim();
|
|
80
|
+
return createIssueWithUrl(idea.title, body, [idea.type, "ready"], projectDir);
|
|
85
81
|
}
|
|
86
82
|
/**
|
|
87
83
|
* Post a single idea candidate as a GitHub Discussion.
|
|
@@ -97,52 +93,19 @@ export function postDiscussion(idea, category, repo, projectDir) {
|
|
|
97
93
|
"---",
|
|
98
94
|
"*Generated by Pulse ideation engine*",
|
|
99
95
|
].join("\n");
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
const catMatch = info.data.repository.discussionCategories.nodes.find((c) => c.name === category);
|
|
109
|
-
if (!catMatch)
|
|
110
|
-
throw new Error(`Discussion category "${category}" not found`);
|
|
111
|
-
// 2. Create discussion via GraphQL mutation
|
|
112
|
-
const request = JSON.stringify({
|
|
113
|
-
query: "mutation($repoId:ID!, $catId:ID!, $title:String!, $body:String!) { createDiscussion(input:{repositoryId:$repoId, categoryId:$catId, title:$title, body:$body}) { discussion { url } } }",
|
|
114
|
-
variables: { repoId, catId: catMatch.id, title: idea.title, body },
|
|
115
|
-
});
|
|
116
|
-
writeFileSync(tmpFile, request);
|
|
117
|
-
childProcess.execSync(`gh api graphql --input "${tmpFile}"`, {
|
|
118
|
-
encoding: "utf-8",
|
|
119
|
-
cwd: projectDir,
|
|
120
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
finally {
|
|
124
|
-
try {
|
|
125
|
-
unlinkSync(tmpFile);
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
/* ignore cleanup errors */
|
|
129
|
-
}
|
|
130
|
-
}
|
|
96
|
+
const [owner, repoName] = repo.split("/");
|
|
97
|
+
// 1. Get repo node ID + category node ID via GraphQL
|
|
98
|
+
const { repoId, categories } = getDiscussionCategories(owner, repoName, projectDir);
|
|
99
|
+
const catMatch = categories.find((c) => c.name === category);
|
|
100
|
+
if (!catMatch)
|
|
101
|
+
throw new Error(`Discussion category "${category}" not found`);
|
|
102
|
+
// 2. Create discussion via GraphQL mutation
|
|
103
|
+
postDiscussionGraphql({ repoId, catId: catMatch.id, title: idea.title, body }, projectDir);
|
|
131
104
|
}
|
|
132
105
|
/**
|
|
133
106
|
* Resolve the GitHub repo name (owner/repo) for the given project directory.
|
|
134
107
|
*/
|
|
135
108
|
export function resolveRepo(projectDir) {
|
|
136
|
-
|
|
137
|
-
const output = childProcess.execSync("gh repo view --json nameWithOwner --jq .nameWithOwner", {
|
|
138
|
-
encoding: "utf-8",
|
|
139
|
-
cwd: projectDir,
|
|
140
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
141
|
-
});
|
|
142
|
-
return output.trim();
|
|
143
|
-
}
|
|
144
|
-
catch {
|
|
145
|
-
return "";
|
|
146
|
-
}
|
|
109
|
+
return getRepoName(projectDir);
|
|
147
110
|
}
|
|
148
111
|
//# sourceMappingURL=ideation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ideation.js","sourceRoot":"","sources":["../../src/daemon/ideation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"ideation.js","sourceRoot":"","sources":["../../src/daemon/ideation.ts"],"names":[],"mappings":"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"}
|