@automagik/genie 3.260322.2 → 4.260323.2

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 (110) hide show
  1. package/.claude/settings.json +44 -0
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/.genie/qa/framework/cross-repo-specs.md +12 -0
  4. package/.genie/qa/framework/domain-discovery.md +14 -0
  5. package/.genie/qa/framework/results-isolation.md +13 -0
  6. package/.genie/qa/lifecycle/agent-lifecycle.md +13 -0
  7. package/.genie/qa/lifecycle/idle-detection.md +13 -0
  8. package/.genie/qa/messaging/mailbox-delivery.md +12 -0
  9. package/.genie/qa/messaging/multi-agent-comm.md +14 -0
  10. package/.genie/qa/messaging/round-trip-response.md +13 -0
  11. package/.genie/qa/messaging/send-full-id.md +12 -0
  12. package/.genie/qa/observability/log-filter-type.md +14 -0
  13. package/.genie/qa/observability/log-follow-events.md +13 -0
  14. package/.genie/qa/observability/log-static.md +13 -0
  15. package/.genie/qa/observability/nats-streaming.md +13 -0
  16. package/.github/workflows/version.yml +32 -12
  17. package/dist/genie.js +941 -148
  18. package/knip.json +1 -0
  19. package/openclaw.plugin.json +1 -1
  20. package/package.json +7 -8
  21. package/plugins/genie/.claude-plugin/plugin.json +1 -1
  22. package/plugins/genie/agents/qa-runner/AGENTS.md +61 -0
  23. package/plugins/genie/agents/qa-runner.md +61 -0
  24. package/plugins/genie/package.json +1 -1
  25. package/scripts/version.ts +4 -4
  26. package/skills/brainstorm/SKILL.md +20 -0
  27. package/skills/council/SKILL.md +15 -0
  28. package/skills/dream/SKILL.md +40 -6
  29. package/skills/fix/SKILL.md +14 -0
  30. package/skills/genie/SKILL.md +68 -0
  31. package/skills/report/SKILL.md +22 -0
  32. package/skills/review/SKILL.md +12 -0
  33. package/skills/trace/SKILL.md +15 -0
  34. package/skills/wish/SKILL.md +29 -0
  35. package/skills/work/SKILL.md +38 -8
  36. package/src/__tests__/resume.test.ts +286 -0
  37. package/src/db/migrations/001_core.sql +176 -0
  38. package/src/db/migrations/002_task_lifecycle.sql +371 -0
  39. package/src/genie-commands/__tests__/session.test.ts +4 -4
  40. package/src/genie-commands/session.ts +70 -71
  41. package/src/genie.ts +106 -1
  42. package/src/hooks/handlers/auto-spawn.ts +1 -1
  43. package/src/hooks/handlers/nats-emit.ts +128 -0
  44. package/src/hooks/index.ts +27 -0
  45. package/src/lib/agent-directory.ts +3 -1
  46. package/src/lib/agent-registry.ts +41 -21
  47. package/src/lib/builtin-agents.test.ts +4 -4
  48. package/src/lib/cron.test.ts +113 -0
  49. package/src/lib/cron.ts +207 -0
  50. package/src/lib/db-migrations.ts +156 -0
  51. package/src/lib/db.ts +271 -0
  52. package/src/lib/mailbox.ts +48 -1
  53. package/src/lib/nats-client.test.ts +71 -0
  54. package/src/lib/nats-client.ts +244 -0
  55. package/src/lib/nats-integration.test.ts +255 -0
  56. package/src/lib/omni-registration.ts +167 -0
  57. package/src/lib/protocol-router-spawn.ts +140 -40
  58. package/src/lib/protocol-router.ts +49 -206
  59. package/src/lib/provider-adapters.ts +2 -2
  60. package/src/lib/qa-parser.ts +249 -0
  61. package/src/lib/qa-runner.test.ts +25 -0
  62. package/src/lib/qa-runner.ts +541 -0
  63. package/src/lib/qa-state.test.ts +319 -0
  64. package/src/lib/qa-state.ts +165 -0
  65. package/src/lib/run-spec.test.ts +177 -0
  66. package/src/lib/run-spec.ts +178 -0
  67. package/src/lib/scheduler-daemon.test.ts +1414 -0
  68. package/src/lib/scheduler-daemon.ts +1327 -0
  69. package/src/lib/spawn-command.test.ts +2 -2
  70. package/src/lib/spawn-command.ts +2 -2
  71. package/src/lib/task-service.test.ts +926 -0
  72. package/src/lib/task-service.ts +1419 -0
  73. package/src/lib/team-lead-command.ts +2 -2
  74. package/src/lib/team-manager.ts +8 -0
  75. package/src/lib/tmux.ts +27 -6
  76. package/src/lib/unified-log.test.ts +449 -0
  77. package/src/lib/unified-log.ts +373 -0
  78. package/src/lib/wish-state.test.ts +462 -346
  79. package/src/lib/wish-state.ts +349 -121
  80. package/src/term-commands/agents.ts +347 -27
  81. package/src/term-commands/daemon.test.ts +110 -0
  82. package/src/term-commands/daemon.ts +514 -0
  83. package/src/term-commands/db.ts +182 -0
  84. package/src/term-commands/dir.ts +96 -0
  85. package/src/term-commands/dispatch.ts +71 -63
  86. package/src/term-commands/log.test.ts +254 -0
  87. package/src/term-commands/log.ts +406 -0
  88. package/src/term-commands/msg.test.ts +2 -2
  89. package/src/term-commands/msg.ts +322 -160
  90. package/src/term-commands/notify.ts +132 -0
  91. package/src/term-commands/qa.ts +358 -0
  92. package/src/term-commands/release.ts +74 -0
  93. package/src/term-commands/schedule.test.ts +93 -0
  94. package/src/term-commands/schedule.ts +545 -0
  95. package/src/term-commands/state.test.ts +275 -0
  96. package/src/term-commands/state.ts +141 -3
  97. package/src/term-commands/tag.ts +77 -0
  98. package/src/term-commands/task.ts +614 -0
  99. package/src/term-commands/team.ts +67 -27
  100. package/src/term-commands/type.ts +178 -0
  101. package/src/types/genie-config.ts +9 -0
  102. package/src/types/pgserve.d.ts +28 -0
  103. package/.genie/state/v3-fixes-release.json +0 -26
  104. package/git-cliff/CHANGELOG.md +0 -7
  105. package/src/lib/batch-manager.test.ts +0 -565
  106. package/src/lib/batch-manager.ts +0 -358
  107. package/src/lib/genie-dir.ts +0 -67
  108. package/src/lib/local-tasks.test.ts +0 -361
  109. package/src/lib/local-tasks.ts +0 -296
  110. package/src/lib/protocol-router-session.test.ts +0 -631
@@ -10,6 +10,50 @@
10
10
  "timeout": 5
11
11
  }
12
12
  ]
13
+ },
14
+ {
15
+ "matcher": "*",
16
+ "hooks": [
17
+ {
18
+ "type": "command",
19
+ "command": "genie hook dispatch",
20
+ "timeout": 5
21
+ }
22
+ ]
23
+ }
24
+ ],
25
+ "PostToolUse": [
26
+ {
27
+ "matcher": "*",
28
+ "hooks": [
29
+ {
30
+ "type": "command",
31
+ "command": "genie hook dispatch",
32
+ "timeout": 5
33
+ }
34
+ ]
35
+ }
36
+ ],
37
+ "UserPromptSubmit": [
38
+ {
39
+ "hooks": [
40
+ {
41
+ "type": "command",
42
+ "command": "genie hook dispatch",
43
+ "timeout": 5
44
+ }
45
+ ]
46
+ }
47
+ ],
48
+ "Stop": [
49
+ {
50
+ "hooks": [
51
+ {
52
+ "type": "command",
53
+ "command": "genie hook dispatch",
54
+ "timeout": 5
55
+ }
56
+ ]
13
57
  }
14
58
  ]
15
59
  }
@@ -10,7 +10,7 @@
10
10
  "plugins": [
11
11
  {
12
12
  "name": "genie",
13
- "version": "3.260322.1",
13
+ "version": "4.260323.2",
14
14
  "source": "./plugins/genie",
15
15
  "description": "Human-AI partnership for Claude Code. Share a terminal, orchestrate workers, evolve together. Brainstorm ideas, wish them into plans, make with parallel agents, ship as one team. A coding genie that grows with your project."
16
16
  }
@@ -0,0 +1,12 @@
1
+ # Test: QA specs are read from repo .genie/qa/ directory
2
+
3
+ ## Setup
4
+ - start follow on team
5
+
6
+ ## Actions
7
+ 1. run mkdir -p /tmp/qa-test-repo/.genie/qa/smoke && echo '# Test: dummy' > /tmp/qa-test-repo/.genie/qa/smoke/dummy.md && cd /tmp/qa-test-repo && genie qa status 2>&1
8
+ 2. wait 2s
9
+
10
+ ## Expect
11
+ - [ ] output contains dummy
12
+ - [ ] output contains smoke
@@ -0,0 +1,14 @@
1
+ # Test: QA discovers specs organized by domain
2
+
3
+ ## Setup
4
+ - start follow on team
5
+
6
+ ## Actions
7
+ 1. run mkdir -p /tmp/qa-domain-test/.genie/qa/api /tmp/qa-domain-test/.genie/qa/auth && echo '# Test: health' > /tmp/qa-domain-test/.genie/qa/api/health.md && echo '# Test: login' > /tmp/qa-domain-test/.genie/qa/auth/login.md && echo 'not-a-spec.txt' > /tmp/qa-domain-test/.genie/qa/api/readme.txt && cd /tmp/qa-domain-test && genie qa status 2>&1
8
+ 2. wait 2s
9
+
10
+ ## Expect
11
+ - [ ] output contains api
12
+ - [ ] output contains auth
13
+ - [ ] output contains health
14
+ - [ ] output contains login
@@ -0,0 +1,13 @@
1
+ # Test: QA results are isolated per repo
2
+
3
+ ## Setup
4
+ - start follow on team
5
+
6
+ ## Actions
7
+ 1. run mkdir -p /tmp/qa-repo-a/.genie/qa && echo '# Test: repo-a test' > /tmp/qa-repo-a/.genie/qa/test-a.md && mkdir -p /tmp/qa-repo-b/.genie/qa && echo '# Test: repo-b test' > /tmp/qa-repo-b/.genie/qa/test-b.md && cd /tmp/qa-repo-a && genie qa status 2>&1 && echo "---SEPARATOR---" && cd /tmp/qa-repo-b && genie qa status 2>&1
8
+ 2. wait 2s
9
+
10
+ ## Expect
11
+ - [ ] output contains test-a
12
+ - [ ] output contains test-b
13
+ - [ ] output contains SEPARATOR
@@ -0,0 +1,13 @@
1
+ # Test: Agent spawn completes and responds to task
2
+
3
+ ## Setup
4
+ - start follow on team
5
+ - spawn engineer (provider: claude)
6
+
7
+ ## Actions
8
+ 1. send "echo LIFECYCLE_TEST and tell me done" to engineer
9
+ 2. wait 30s
10
+
11
+ ## Expect
12
+ - [ ] follow stream contains event kind=tool_call text~=LIFECYCLE_TEST
13
+ - [ ] follow stream contains event kind=message text~=LIFECYCLE_TEST
@@ -0,0 +1,13 @@
1
+ # Test: Agent completes task and tool calls are captured
2
+
3
+ ## Setup
4
+ - start follow on team
5
+ - spawn engineer (provider: claude)
6
+
7
+ ## Actions
8
+ 1. send "echo IDLE_QA_TEST and send me done" to engineer
9
+ 2. wait 30s
10
+
11
+ ## Expect
12
+ - [ ] follow stream contains event kind=tool_call text~=IDLE_QA_TEST
13
+ - [ ] follow stream contains event kind=tool_call text~=SendMessage
@@ -0,0 +1,12 @@
1
+ # Test: Mailbox delivery with NATS event
2
+
3
+ ## Setup
4
+ - start follow on team
5
+
6
+ ## Actions
7
+ 1. send "please review PR #42" to reviewer
8
+ 2. wait 2s
9
+
10
+ ## Expect
11
+ - [ ] follow stream contains event kind=message peer=reviewer
12
+ - [ ] follow stream contains event source=mailbox text~=review PR
@@ -0,0 +1,14 @@
1
+ # Test: Two agents communicate within same team
2
+
3
+ ## Setup
4
+ - start follow on team
5
+ - spawn engineer (provider: claude)
6
+ - spawn reviewer (provider: claude)
7
+
8
+ ## Actions
9
+ 1. send "send a message to reviewer saying CROSS_AGENT_QA" to engineer
10
+ 2. wait 30s
11
+
12
+ ## Expect
13
+ - [ ] follow stream contains event kind=tool_call text~=SendMessage
14
+ - [ ] follow stream contains event kind=message text~=CROSS_AGENT_QA
@@ -0,0 +1,13 @@
1
+ # Test: Agent receives message and responds via SendMessage
2
+
3
+ ## Setup
4
+ - start follow on team
5
+ - spawn engineer (provider: claude)
6
+
7
+ ## Actions
8
+ 1. send "send me a message saying PONG_QA_TEST using SendMessage" to engineer
9
+ 2. wait 30s
10
+
11
+ ## Expect
12
+ - [ ] follow stream contains event kind=tool_call text~=PONG_QA_TEST
13
+ - [ ] follow stream contains event kind=message text~=PONG_QA_TEST
@@ -0,0 +1,12 @@
1
+ # Test: Send message works with full worker ID
2
+
3
+ ## Setup
4
+ - start follow on team
5
+ - spawn engineer (provider: claude)
6
+
7
+ ## Actions
8
+ 1. send "reply with FULLID_QA_OK" to engineer
9
+ 2. wait 30s
10
+
11
+ ## Expect
12
+ - [ ] follow stream contains event kind=message text~=FULLID_QA_OK
@@ -0,0 +1,14 @@
1
+ # Test: Log filters by event type
2
+
3
+ ## Setup
4
+ - spawn engineer (provider: claude)
5
+
6
+ ## Actions
7
+ 1. send "run echo FILTER_TEST in bash" to engineer
8
+ 2. wait 20s
9
+ 3. run genie log engineer --ndjson --type message
10
+ 4. run genie log engineer --ndjson --last 5
11
+
12
+ ## Expect
13
+ - [ ] output contains message
14
+ - [ ] output contains FILTER_TEST
@@ -0,0 +1,13 @@
1
+ # Test: Follow mode captures tool calls and messages
2
+
3
+ ## Setup
4
+ - start follow on team
5
+ - spawn engineer (provider: claude)
6
+
7
+ ## Actions
8
+ 1. send "echo HELLO_QA_FOLLOW and send me done" to engineer
9
+ 2. wait 30s
10
+
11
+ ## Expect
12
+ - [ ] follow stream contains event kind=tool_call text~=HELLO_QA_FOLLOW
13
+ - [ ] follow stream contains event kind=message text~=HELLO_QA_FOLLOW
@@ -0,0 +1,13 @@
1
+ # Test: Static log reads all sources
2
+
3
+ ## Setup
4
+ - spawn engineer (team: log-test)
5
+
6
+ ## Actions
7
+ 1. send "implement feature X" to engineer
8
+ 2. wait 1s
9
+ 3. run genie log engineer --ndjson --last 10
10
+
11
+ ## Expect
12
+ - [ ] output contains kind=message
13
+ - [ ] output contains text~=implement feature
@@ -0,0 +1,13 @@
1
+ # Test: NATS streaming delivers tool calls from real agent
2
+
3
+ ## Setup
4
+ - start follow on team
5
+ - spawn engineer (provider: claude)
6
+
7
+ ## Actions
8
+ 1. send "run echo NATS_QA_TEST in bash and send me 'done'" to engineer
9
+ 2. wait 30s
10
+
11
+ ## Expect
12
+ - [ ] follow stream contains event kind=tool_call text~=NATS_QA_TEST
13
+ - [ ] follow stream contains event kind=message text~=done
@@ -4,15 +4,14 @@ on:
4
4
  workflow_run:
5
5
  workflows: ["CI"]
6
6
  types: [completed]
7
- branches: [main]
7
+ branches: [main, dev]
8
8
  workflow_dispatch:
9
9
 
10
10
  permissions:
11
11
  contents: write
12
12
 
13
13
  concurrency:
14
- # This workflow always writes to `dev`, regardless of the trigger ref.
15
- group: version-dev
14
+ group: version-${{ github.event.workflow_run.head_branch || 'manual' }}
16
15
  cancel-in-progress: false
17
16
 
18
17
  jobs:
@@ -24,15 +23,34 @@ jobs:
24
23
  (github.event_name == 'workflow_dispatch') ||
25
24
  (github.event.workflow_run.conclusion == 'success' &&
26
25
  github.event.workflow_run.event == 'push' &&
27
- github.event.workflow_run.head_branch == 'main' &&
28
- startsWith(github.event.workflow_run.head_commit.message, 'Merge pull request') &&
29
- contains(github.event.workflow_run.head_commit.message, '/dev') &&
30
- !contains(github.event.workflow_run.head_commit.message, '[skip ci]'))
26
+ !contains(github.event.workflow_run.head_commit.message, '[skip ci]') &&
27
+ (
28
+ (github.event.workflow_run.head_branch == 'main' &&
29
+ startsWith(github.event.workflow_run.head_commit.message, 'Merge pull request') &&
30
+ contains(github.event.workflow_run.head_commit.message, '/dev'))
31
+ ||
32
+ (github.event.workflow_run.head_branch == 'dev')
33
+ ))
31
34
 
32
35
  steps:
36
+ - name: Determine branch and version prefix
37
+ id: context
38
+ run: |
39
+ BRANCH="${{ github.event.workflow_run.head_branch || 'dev' }}"
40
+ if [ "$BRANCH" = "main" ]; then
41
+ echo "branch=dev" >> "$GITHUB_OUTPUT"
42
+ echo "prefix=3" >> "$GITHUB_OUTPUT"
43
+ echo "npm_tag=latest" >> "$GITHUB_OUTPUT"
44
+ else
45
+ echo "branch=dev" >> "$GITHUB_OUTPUT"
46
+ echo "prefix=4" >> "$GITHUB_OUTPUT"
47
+ echo "npm_tag=next" >> "$GITHUB_OUTPUT"
48
+ fi
49
+ echo "Resolved: branch=dev, prefix=$([ "$BRANCH" = "main" ] && echo 3 || echo 4)"
50
+
33
51
  - uses: actions/checkout@v4
34
52
  with:
35
- ref: dev
53
+ ref: ${{ steps.context.outputs.branch }}
36
54
  fetch-depth: 0
37
55
  token: ${{ secrets.GITHUB_TOKEN }}
38
56
 
@@ -51,10 +69,11 @@ jobs:
51
69
  - name: Derive version
52
70
  id: version
53
71
  run: |
72
+ PREFIX="${{ steps.context.outputs.prefix }}"
54
73
  TODAY=$(date -u +%y%m%d)
55
- EXISTING=$(git tag --list "v3.${TODAY}.*" | wc -l)
74
+ EXISTING=$(git tag --list "v${PREFIX}.${TODAY}.*" | wc -l)
56
75
  BUILD_NUMBER=$((EXISTING + 1))
57
- VERSION="3.${TODAY}.${BUILD_NUMBER}"
76
+ VERSION="${PREFIX}.${TODAY}.${BUILD_NUMBER}"
58
77
  echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
59
78
  echo "build_number=${BUILD_NUMBER}" >> "$GITHUB_OUTPUT"
60
79
  echo "Derived version: ${VERSION}"
@@ -71,6 +90,7 @@ jobs:
71
90
  - name: Commit and tag
72
91
  run: |
73
92
  VERSION="${{ steps.version.outputs.version }}"
93
+ BRANCH="${{ steps.context.outputs.branch }}"
74
94
 
75
95
  git add -A '*.json' 'src/lib/version.ts'
76
96
  if git diff --cached --quiet; then
@@ -80,7 +100,7 @@ jobs:
80
100
  fi
81
101
 
82
102
  git tag "v${VERSION}"
83
- git push --atomic origin HEAD:refs/heads/dev "refs/tags/v${VERSION}"
103
+ git push --atomic origin "HEAD:refs/heads/${BRANCH}" "refs/tags/v${VERSION}"
84
104
 
85
105
  - name: Build CLI
86
106
  run: bun run build
@@ -95,4 +115,4 @@ jobs:
95
115
  echo "⚠️ NPM_TOKEN not set — skipping dev publish"
96
116
  exit 0
97
117
  fi
98
- bun publish --access public --tag next
118
+ bun publish --access public --tag ${{ steps.context.outputs.npm_tag }}