@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.
- package/.claude/settings.json +44 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.genie/qa/framework/cross-repo-specs.md +12 -0
- package/.genie/qa/framework/domain-discovery.md +14 -0
- package/.genie/qa/framework/results-isolation.md +13 -0
- package/.genie/qa/lifecycle/agent-lifecycle.md +13 -0
- package/.genie/qa/lifecycle/idle-detection.md +13 -0
- package/.genie/qa/messaging/mailbox-delivery.md +12 -0
- package/.genie/qa/messaging/multi-agent-comm.md +14 -0
- package/.genie/qa/messaging/round-trip-response.md +13 -0
- package/.genie/qa/messaging/send-full-id.md +12 -0
- package/.genie/qa/observability/log-filter-type.md +14 -0
- package/.genie/qa/observability/log-follow-events.md +13 -0
- package/.genie/qa/observability/log-static.md +13 -0
- package/.genie/qa/observability/nats-streaming.md +13 -0
- package/.github/workflows/version.yml +32 -12
- package/dist/genie.js +941 -148
- package/knip.json +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +7 -8
- package/plugins/genie/.claude-plugin/plugin.json +1 -1
- package/plugins/genie/agents/qa-runner/AGENTS.md +61 -0
- package/plugins/genie/agents/qa-runner.md +61 -0
- package/plugins/genie/package.json +1 -1
- package/scripts/version.ts +4 -4
- package/skills/brainstorm/SKILL.md +20 -0
- package/skills/council/SKILL.md +15 -0
- package/skills/dream/SKILL.md +40 -6
- package/skills/fix/SKILL.md +14 -0
- package/skills/genie/SKILL.md +68 -0
- package/skills/report/SKILL.md +22 -0
- package/skills/review/SKILL.md +12 -0
- package/skills/trace/SKILL.md +15 -0
- package/skills/wish/SKILL.md +29 -0
- package/skills/work/SKILL.md +38 -8
- package/src/__tests__/resume.test.ts +286 -0
- package/src/db/migrations/001_core.sql +176 -0
- package/src/db/migrations/002_task_lifecycle.sql +371 -0
- package/src/genie-commands/__tests__/session.test.ts +4 -4
- package/src/genie-commands/session.ts +70 -71
- package/src/genie.ts +106 -1
- package/src/hooks/handlers/auto-spawn.ts +1 -1
- package/src/hooks/handlers/nats-emit.ts +128 -0
- package/src/hooks/index.ts +27 -0
- package/src/lib/agent-directory.ts +3 -1
- package/src/lib/agent-registry.ts +41 -21
- package/src/lib/builtin-agents.test.ts +4 -4
- package/src/lib/cron.test.ts +113 -0
- package/src/lib/cron.ts +207 -0
- package/src/lib/db-migrations.ts +156 -0
- package/src/lib/db.ts +271 -0
- package/src/lib/mailbox.ts +48 -1
- package/src/lib/nats-client.test.ts +71 -0
- package/src/lib/nats-client.ts +244 -0
- package/src/lib/nats-integration.test.ts +255 -0
- package/src/lib/omni-registration.ts +167 -0
- package/src/lib/protocol-router-spawn.ts +140 -40
- package/src/lib/protocol-router.ts +49 -206
- package/src/lib/provider-adapters.ts +2 -2
- package/src/lib/qa-parser.ts +249 -0
- package/src/lib/qa-runner.test.ts +25 -0
- package/src/lib/qa-runner.ts +541 -0
- package/src/lib/qa-state.test.ts +319 -0
- package/src/lib/qa-state.ts +165 -0
- package/src/lib/run-spec.test.ts +177 -0
- package/src/lib/run-spec.ts +178 -0
- package/src/lib/scheduler-daemon.test.ts +1414 -0
- package/src/lib/scheduler-daemon.ts +1327 -0
- package/src/lib/spawn-command.test.ts +2 -2
- package/src/lib/spawn-command.ts +2 -2
- package/src/lib/task-service.test.ts +926 -0
- package/src/lib/task-service.ts +1419 -0
- package/src/lib/team-lead-command.ts +2 -2
- package/src/lib/team-manager.ts +8 -0
- package/src/lib/tmux.ts +27 -6
- package/src/lib/unified-log.test.ts +449 -0
- package/src/lib/unified-log.ts +373 -0
- package/src/lib/wish-state.test.ts +462 -346
- package/src/lib/wish-state.ts +349 -121
- package/src/term-commands/agents.ts +347 -27
- package/src/term-commands/daemon.test.ts +110 -0
- package/src/term-commands/daemon.ts +514 -0
- package/src/term-commands/db.ts +182 -0
- package/src/term-commands/dir.ts +96 -0
- package/src/term-commands/dispatch.ts +71 -63
- package/src/term-commands/log.test.ts +254 -0
- package/src/term-commands/log.ts +406 -0
- package/src/term-commands/msg.test.ts +2 -2
- package/src/term-commands/msg.ts +322 -160
- package/src/term-commands/notify.ts +132 -0
- package/src/term-commands/qa.ts +358 -0
- package/src/term-commands/release.ts +74 -0
- package/src/term-commands/schedule.test.ts +93 -0
- package/src/term-commands/schedule.ts +545 -0
- package/src/term-commands/state.test.ts +275 -0
- package/src/term-commands/state.ts +141 -3
- package/src/term-commands/tag.ts +77 -0
- package/src/term-commands/task.ts +614 -0
- package/src/term-commands/team.ts +67 -27
- package/src/term-commands/type.ts +178 -0
- package/src/types/genie-config.ts +9 -0
- package/src/types/pgserve.d.ts +28 -0
- package/.genie/state/v3-fixes-release.json +0 -26
- package/git-cliff/CHANGELOG.md +0 -7
- package/src/lib/batch-manager.test.ts +0 -565
- package/src/lib/batch-manager.ts +0 -358
- package/src/lib/genie-dir.ts +0 -67
- package/src/lib/local-tasks.test.ts +0 -361
- package/src/lib/local-tasks.ts +0 -296
- package/src/lib/protocol-router-session.test.ts +0 -631
package/.claude/settings.json
CHANGED
|
@@ -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": "
|
|
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
|
-
|
|
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.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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:
|
|
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 "
|
|
74
|
+
EXISTING=$(git tag --list "v${PREFIX}.${TODAY}.*" | wc -l)
|
|
56
75
|
BUILD_NUMBER=$((EXISTING + 1))
|
|
57
|
-
VERSION="
|
|
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
|
|
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
|
|
118
|
+
bun publish --access public --tag ${{ steps.context.outputs.npm_tag }}
|