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.
Files changed (83) hide show
  1. package/.claude/agents/manager.md +13 -3
  2. package/.claude/agents/worker.md +27 -50
  3. package/.claude/rules/testing.md +4 -7
  4. package/.claude/scripts/merge-pr.sh +24 -55
  5. package/.claude/scripts/project-status.sh +67 -0
  6. package/.claude/skills/build/SKILL.md +17 -3
  7. package/.claude-plugin/marketplace.json +2 -2
  8. package/dist/config-migrations.js +1 -1
  9. package/dist/config-migrations.js.map +1 -1
  10. package/dist/config.d.ts +2 -2
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +0 -2
  13. package/dist/config.js.map +1 -1
  14. package/dist/daemon/ideation.d.ts.map +1 -1
  15. package/dist/daemon/ideation.js +11 -48
  16. package/dist/daemon/ideation.js.map +1 -1
  17. package/dist/daemon/pulse-state.d.ts +59 -0
  18. package/dist/daemon/pulse-state.d.ts.map +1 -0
  19. package/dist/daemon/pulse-state.js +122 -0
  20. package/dist/daemon/pulse-state.js.map +1 -0
  21. package/dist/daemon/pulse.js +2 -2
  22. package/dist/daemon/pulse.js.map +1 -1
  23. package/dist/lib/github.d.ts +36 -0
  24. package/dist/lib/github.d.ts.map +1 -1
  25. package/dist/lib/github.js +72 -3
  26. package/dist/lib/github.js.map +1 -1
  27. package/dist/studio/assets/{_basePickBy-B-dYIPO9.js → _basePickBy-CaRVkU_i.js} +1 -1
  28. package/dist/studio/assets/{_baseUniq-DtSwUsWb.js → _baseUniq-DB9CANVr.js} +1 -1
  29. package/dist/studio/assets/{arc-BSHCxjoI.js → arc-DwNKwVLD.js} +1 -1
  30. package/dist/studio/assets/{architectureDiagram-VXUJARFQ-HuyB70lr.js → architectureDiagram-VXUJARFQ-CDW4khKr.js} +1 -1
  31. package/dist/studio/assets/{blockDiagram-VD42YOAC-B9HUfXTF.js → blockDiagram-VD42YOAC-D6_LSve2.js} +1 -1
  32. package/dist/studio/assets/{c4Diagram-YG6GDRKO-CZkxr6sB.js → c4Diagram-YG6GDRKO-SFPE64AJ.js} +1 -1
  33. package/dist/studio/assets/channel-h6J62PW8.js +1 -0
  34. package/dist/studio/assets/{chunk-4BX2VUAB-DN6HQi6o.js → chunk-4BX2VUAB-BqHoEHlQ.js} +1 -1
  35. package/dist/studio/assets/{chunk-55IACEB6-BisQl6jn.js → chunk-55IACEB6-DkHQ5WBd.js} +1 -1
  36. package/dist/studio/assets/{chunk-B4BG7PRW-Bdix9s7H.js → chunk-B4BG7PRW-CW_kq6KT.js} +1 -1
  37. package/dist/studio/assets/{chunk-DI55MBZ5-DAIoIssd.js → chunk-DI55MBZ5-DNDwEGQ5.js} +1 -1
  38. package/dist/studio/assets/{chunk-FMBD7UC4-DNH4o1Hu.js → chunk-FMBD7UC4-5PX-ftxQ.js} +1 -1
  39. package/dist/studio/assets/{chunk-QN33PNHL-B22BHIBA.js → chunk-QN33PNHL-QkQfQaqN.js} +1 -1
  40. package/dist/studio/assets/{chunk-QZHKN3VN-7BKcU0AB.js → chunk-QZHKN3VN-Do2RvhJA.js} +1 -1
  41. package/dist/studio/assets/{chunk-TZMSLE5B-BNK-Y8sm.js → chunk-TZMSLE5B-xiebau4j.js} +1 -1
  42. package/dist/studio/assets/classDiagram-2ON5EDUG-D8lIj2-P.js +1 -0
  43. package/dist/studio/assets/classDiagram-v2-WZHVMYZB-D8lIj2-P.js +1 -0
  44. package/dist/studio/assets/clone-Chwjzlof.js +1 -0
  45. package/dist/studio/assets/{cose-bilkent-S5V4N54A-C1h3-66S.js → cose-bilkent-S5V4N54A-Apnpf-ki.js} +1 -1
  46. package/dist/studio/assets/{dagre-6UL2VRFP-ua8g2h-7.js → dagre-6UL2VRFP-BxyPIzB8.js} +1 -1
  47. package/dist/studio/assets/{diagram-PSM6KHXK-B64zbYxC.js → diagram-PSM6KHXK-24YoaI-e.js} +1 -1
  48. package/dist/studio/assets/{diagram-QEK2KX5R-KdhA98u6.js → diagram-QEK2KX5R-lHpdi46q.js} +1 -1
  49. package/dist/studio/assets/{diagram-S2PKOQOG-DALWb6Tg.js → diagram-S2PKOQOG-9u1_ee6B.js} +1 -1
  50. package/dist/studio/assets/{erDiagram-Q2GNP2WA-CadgQK9g.js → erDiagram-Q2GNP2WA-Dlmgb2ym.js} +1 -1
  51. package/dist/studio/assets/{flowDiagram-NV44I4VS-DO4RmSUY.js → flowDiagram-NV44I4VS-5sj_GCzk.js} +1 -1
  52. package/dist/studio/assets/{ganttDiagram-JELNMOA3-Cxb9OlHt.js → ganttDiagram-JELNMOA3-CUJF-slV.js} +1 -1
  53. package/dist/studio/assets/{gitGraphDiagram-V2S2FVAM-otm97EPi.js → gitGraphDiagram-V2S2FVAM-CKpDBk3b.js} +1 -1
  54. package/dist/studio/assets/{graph-5oKS2LK4.js → graph-BRYklN25.js} +1 -1
  55. package/dist/studio/assets/{index-DU1UoE3B.js → index-WEgtt1oI.js} +2 -2
  56. package/dist/studio/assets/{infoDiagram-HS3SLOUP-DTgzXTlP.js → infoDiagram-HS3SLOUP-DKF6awtp.js} +1 -1
  57. package/dist/studio/assets/{journeyDiagram-XKPGCS4Q-Bl7_rMO-.js → journeyDiagram-XKPGCS4Q-CgrhL8R0.js} +1 -1
  58. package/dist/studio/assets/{kanban-definition-3W4ZIXB7-DfXkmWYb.js → kanban-definition-3W4ZIXB7-28MC-pF6.js} +1 -1
  59. package/dist/studio/assets/{layout-CfjDDkzK.js → layout-gwYv6lHv.js} +1 -1
  60. package/dist/studio/assets/{linear-Bg2mbmM0.js → linear-Dl48BTRW.js} +1 -1
  61. package/dist/studio/assets/{mermaid.core-Cwhxv6mz.js → mermaid.core-YPNEyw9M.js} +4 -4
  62. package/dist/studio/assets/{mindmap-definition-VGOIOE7T-Di0QPIFD.js → mindmap-definition-VGOIOE7T-CNO-62gT.js} +1 -1
  63. package/dist/studio/assets/{pieDiagram-ADFJNKIX-Cuw6mZ_s.js → pieDiagram-ADFJNKIX-DutNO8TU.js} +1 -1
  64. package/dist/studio/assets/{quadrantDiagram-AYHSOK5B-BfzOkC1I.js → quadrantDiagram-AYHSOK5B-CyL-T3po.js} +1 -1
  65. package/dist/studio/assets/{requirementDiagram-UZGBJVZJ-CsTE75LG.js → requirementDiagram-UZGBJVZJ-Decs2Rps.js} +1 -1
  66. package/dist/studio/assets/{sankeyDiagram-TZEHDZUN-AsrOeW85.js → sankeyDiagram-TZEHDZUN-CXQHF2nL.js} +1 -1
  67. package/dist/studio/assets/{sequenceDiagram-WL72ISMW-CpNum0nP.js → sequenceDiagram-WL72ISMW-C9cFuo_6.js} +1 -1
  68. package/dist/studio/assets/{stateDiagram-FKZM4ZOC-BFtnF9LR.js → stateDiagram-FKZM4ZOC-Dvs2TeCM.js} +1 -1
  69. package/dist/studio/assets/stateDiagram-v2-4FDKWEC3-NKg7XNVy.js +1 -0
  70. package/dist/studio/assets/{timeline-definition-IT6M3QCI-D8wb271_.js → timeline-definition-IT6M3QCI-BpsJlgf7.js} +1 -1
  71. package/dist/studio/assets/{treemap-GDKQZRPO-DbBWYkT8.js → treemap-GDKQZRPO-DVxRTPr1.js} +1 -1
  72. package/dist/studio/assets/{xychartDiagram-PRI3JC2R-ChIi73X1.js → xychartDiagram-PRI3JC2R-QUfHK5a4.js} +1 -1
  73. package/dist/studio/index.html +1 -1
  74. package/dist/templates/config.yaml +10 -2
  75. package/dist/templates/templates/config.yaml +2 -2
  76. package/global/agents/sleepless.md +46 -27
  77. package/global/scripts/project-sync.sh +92 -55
  78. package/package.json +2 -2
  79. package/dist/studio/assets/channel-CsDzmrvf.js +0 -1
  80. package/dist/studio/assets/classDiagram-2ON5EDUG-BPqf3_Tt.js +0 -1
  81. package/dist/studio/assets/classDiagram-v2-WZHVMYZB-BPqf3_Tt.js +0 -1
  82. package/dist/studio/assets/clone-BFu3hFPa.js +0 -1
  83. 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
- **Reviewer** (for M+ work, after PR is created):
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
@@ -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
- REPO_NAME=$(gh repo view --json nameWithOwner --jq '.nameWithOwner')
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 Status → In Progress** add to project if needed, then set status:
127
-
136
+ **Update Project #6 → In Progress / Running** (best-effort):
128
137
  ```bash
129
- ISSUE_URL=$(gh issue view <N> --json url --jq '.url')
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 Status → Under Review** (best-effort):
249
+ **Update Project #6 → Under Review / Review** (best-effort):
248
250
  ```bash
249
- REPO_NAME=$(gh repo view --json nameWithOwner --jq '.nameWithOwner')
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
- **Update Project #6 Status Done** (best-effort):
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
@@ -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 committed to the repo. The `prepare` script skips building when `dist/` already exists. This means stale `dist/` = users run old code.
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 rebuild and commit dist/:**
30
+ **After changing any `src/` file, always verify the build succeeds:**
31
31
  ```bash
32
- bun run build:server
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
- - Changing `src/` without rebuilding and committing `dist/`
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 — Robust PR merge that works regardless of CWD or worktree state.
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
- # Behavior:
7
- # 1. Resolve the main repo root via git-common-dir (CWD-agnostic)
8
- # 2. cd to main root before any git/gh operations
9
- # 3. Try gh pr merge (happy path works when main is not checked out elsewhere)
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 tabsno interference possible.
12
10
  #
13
- # Exit codes: 0 = merged + synced, 1 = merge failed, 2 = sync failed
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
- # Happy path: gh pr merge handles everything locally
36
- if gh pr merge "$PR" --squash --delete-branch 2>/dev/null; then
37
- echo "Merged via gh pr merge."
38
- else
39
- echo "gh pr merge failed (likely worktree conflict) — falling back to API merge..."
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
- echo "Merged via API."
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
- # Re-anchor to main root (gh pr merge may change CWD)
58
- cd "$MAIN_ROOT"
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
- # Inline sync: return to home branch
61
- # Detect if this script was invoked from a worktree context
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 [[ "$GIT_DIR" == */.git/worktrees/* ]]; then
65
- WORKTREE_NAME=$(basename "$GIT_DIR")
66
- HOME_BRANCH="worktree-$WORKTREE_NAME"
67
- git checkout "$HOME_BRANCH" 2>/dev/null || true
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. Run full suite: `bun test`
109
-
110
- **Team (M+ — >2 files, >100 lines):** Use the Agent tool to spawn developer and reviewer agents.
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.0",
24
+ "version": "0.9.3",
25
25
  "strict": true,
26
26
  "category": "development"
27
27
  }
28
28
  ],
29
- "version": "0.9.0"
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, pulse.timezone are added by addMissingKeys
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":"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"}
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,2DAA2D;YAC3D,uDAAuD;QACxD,CAAC;KACD;CACD,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC7B,GAAa,EACb,QAAiC,EACjC,SAAmB,EACnB,aAAuB,EAAE;IAEzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAErC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACjD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1E,6EAA6E;gBAC7E,uEAAuE;gBACvE,qDAAqD;gBACrD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnC,cAAc,CAAC,GAAG,EAAE,KAAgC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACP,iCAAiC;gBACjC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC3B,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACpC,CAAC;QACF,CAAC;aAAM,IACN,KAAK,KAAK,IAAI;YACd,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACrB,KAAK,CAAC,QAAQ,CAAC,EACd,CAAC;YACF,2DAA2D;YAC3D,cAAc,CAAC,GAAG,EAAE,KAAgC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,qDAAqD;QACtD,CAAC;QACD,+CAA+C;IAChD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,UAAkB,EAClB,QAAiC;IAEjC,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEnC,MAAM,OAAO,GAAI,GAAG,CAAC,GAAG,CAAC,eAAe,CAAY,IAAI,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAoB;QAC/B,eAAe,EAAE,OAAO;QACxB,cAAc,EAAE,sBAAsB;QACtC,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,EAAE;KACb,CAAC;IAEF,qCAAqC;IACrC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACpC,IAAI,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;YACtC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;IACF,CAAC;IAED,qCAAqC;IACrC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAEhD,qBAAqB;IACrB,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;IAEjD,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE1C,OAAO,MAAM,CAAC;AACf,CAAC"}
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: string;
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: string;
66
+ timezone?: string;
67
67
  slackUserId: string;
68
68
  };
69
69
  goals: string[];
@@ -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;QACjB,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,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,WAAW,CAAC;CACpB;AA2DD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAevD;AAED,wBAAgB,gBAAgB,IAAI,cAAc,CAEjD"}
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: [],
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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;AAOH,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,CAiBzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GAChB,IAAI,CAwDN;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAWtD"}
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"}
@@ -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 * as childProcess from "node:child_process";
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
- const result = childProcess.execSync(`gh issue create --title ${JSON.stringify(idea.title)} --body ${JSON.stringify(body)} --label "${idea.type},ready" --json url --jq .url`, { encoding: "utf-8", cwd: projectDir, stdio: ["pipe", "pipe", "pipe"] });
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
- // Write GraphQL request to temp file to handle body/title escaping
101
- const tmpFile = join(tmpdir(), `pulse-idea-${Date.now()}.json`);
102
- try {
103
- const [owner, repoName] = repo.split("/");
104
- // 1. Get repo node ID + category node ID via GraphQL
105
- const infoOut = childProcess.execSync(`gh api graphql -f query='{ repository(owner:"${owner}", name:"${repoName}") { id discussionCategories(first:20) { nodes { id name } } } }'`, { encoding: "utf-8", cwd: projectDir, stdio: ["pipe", "pipe", "pipe"] });
106
- const info = JSON.parse(infoOut);
107
- const repoId = info.data.repository.id;
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
- try {
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":"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"}
1
+ {"version":3,"file":"ideation.js","sourceRoot":"","sources":["../../src/daemon/ideation.ts"],"names":[],"mappings":"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"}