@lmctl-ai/lmctl 0.1.158 → 0.1.160
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/dist/cli/index.js +694 -540
- package/examples/book-team.lmctl +12 -2
- package/examples/research-team.lmctl +12 -2
- package/examples/review-team.lmctl +12 -2
- package/package.json +1 -1
- package/dist/config/ai_test_templates/example-test.md.template +0 -50
- package/dist/config/ai_test_templates/index.md.template +0 -27
package/examples/book-team.lmctl
CHANGED
|
@@ -5,8 +5,18 @@
|
|
|
5
5
|
# checks. Keep chapter plans and decisions in durable-memory/ so refreshed
|
|
6
6
|
# sessions can recover the book state.
|
|
7
7
|
# Suggested flow:
|
|
8
|
-
# lmctl chat book-team.lmctl Lead "Draft chapter 1 from durable-memory/outline.md"
|
|
9
|
-
#
|
|
8
|
+
# lmctl chat book-team.lmctl Lead "Draft chapter 1 from durable-memory/outline.md"
|
|
9
|
+
#
|
|
10
|
+
# lmctl chat is synchronous but does not always wait for a reply: when the
|
|
11
|
+
# receiver is free the message is delivered and chat blocks for the reply; when
|
|
12
|
+
# the receiver is BUSY the message is enqueued and chat returns immediately.
|
|
13
|
+
# Both cases exit 0, so exit code alone cannot tell you a reply arrived.
|
|
14
|
+
# Check with --json: status="ok" is a delivered reply (with replyText),
|
|
15
|
+
# status="enqueued" means it was queued. lmctl status shows pending lanes.
|
|
16
|
+
#
|
|
17
|
+
# For async, lmctl is foreground/background agnostic: wrap the same command in
|
|
18
|
+
# your provider or host runtime's native background facility (e.g. Claude
|
|
19
|
+
# background Bash) rather than an lmctl flag.
|
|
10
20
|
|
|
11
21
|
_MEMBER_ alias=Lead provider=claude
|
|
12
22
|
_MEMBER_ alias=Outliner provider=claude
|
|
@@ -5,8 +5,18 @@
|
|
|
5
5
|
# ask Critic to identify weak evidence or contradictions, then have Synthesizer
|
|
6
6
|
# merge the strongest findings into a concise response.
|
|
7
7
|
# Suggested flow:
|
|
8
|
-
# lmctl chat research-team.lmctl Lead "Research <question>"
|
|
9
|
-
#
|
|
8
|
+
# lmctl chat research-team.lmctl Lead "Research <question>"
|
|
9
|
+
#
|
|
10
|
+
# lmctl chat is synchronous but does not always wait for a reply: when the
|
|
11
|
+
# receiver is free the message is delivered and chat blocks for the reply; when
|
|
12
|
+
# the receiver is BUSY the message is enqueued and chat returns immediately.
|
|
13
|
+
# Both cases exit 0, so exit code alone cannot tell you a reply arrived.
|
|
14
|
+
# Check with --json: status="ok" is a delivered reply (with replyText),
|
|
15
|
+
# status="enqueued" means it was queued. lmctl status shows pending lanes.
|
|
16
|
+
#
|
|
17
|
+
# For async, lmctl is foreground/background agnostic: wrap the same command in
|
|
18
|
+
# your provider or host runtime's native background facility (e.g. Claude
|
|
19
|
+
# background Bash) rather than an lmctl flag.
|
|
10
20
|
|
|
11
21
|
_MEMBER_ alias=Lead provider=claude
|
|
12
22
|
_MEMBER_ alias=Researcher1 provider=codex
|
|
@@ -5,8 +5,18 @@
|
|
|
5
5
|
# reviews, asks SecurityReviewer for trust-boundary concerns when relevant, and
|
|
6
6
|
# routes findings back to Author before final signoff.
|
|
7
7
|
# Suggested flow:
|
|
8
|
-
# lmctl chat review-team.lmctl Lead "Implement <task> and get review signoff"
|
|
9
|
-
#
|
|
8
|
+
# lmctl chat review-team.lmctl Lead "Implement <task> and get review signoff"
|
|
9
|
+
#
|
|
10
|
+
# lmctl chat is synchronous but does not always wait for a reply: when the
|
|
11
|
+
# receiver is free the message is delivered and chat blocks for the reply; when
|
|
12
|
+
# the receiver is BUSY the message is enqueued and chat returns immediately.
|
|
13
|
+
# Both cases exit 0, so exit code alone cannot tell you a reply arrived.
|
|
14
|
+
# Check with --json: status="ok" is a delivered reply (with replyText),
|
|
15
|
+
# status="enqueued" means it was queued. lmctl status shows pending lanes.
|
|
16
|
+
#
|
|
17
|
+
# For async, lmctl is foreground/background agnostic: wrap the same command in
|
|
18
|
+
# your provider or host runtime's native background facility (e.g. Claude
|
|
19
|
+
# background Bash) rather than an lmctl flag.
|
|
10
20
|
|
|
11
21
|
_MEMBER_ alias=Lead provider=claude
|
|
12
22
|
_MEMBER_ alias=Author provider=codex
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmctl-ai/lmctl",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.160",
|
|
4
4
|
"description": "A provider-agnostic control plane for teams of AI coding agents — across providers, with independent review and durable memory.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://lmctl.com",
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: example-test
|
|
3
|
-
description: Replace with a one-line description of what this test verifies
|
|
4
|
-
type: smoke
|
|
5
|
-
tags: [example]
|
|
6
|
-
last_run_at: never
|
|
7
|
-
last_run_status: unknown
|
|
8
|
-
last_run_id: 0
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Test: example
|
|
12
|
-
|
|
13
|
-
Replace this content with your real test case. The structure below is what the QA Tester agent expects.
|
|
14
|
-
|
|
15
|
-
## Setup
|
|
16
|
-
|
|
17
|
-
Describe what the system state must be before running this test. Examples:
|
|
18
|
-
- A project exists with a configured team
|
|
19
|
-
- An image fixture is present at a known path
|
|
20
|
-
- The serve daemon is running on $LMCTL_API_URL
|
|
21
|
-
|
|
22
|
-
Use shell-style commands (the Tester will execute them) or describe in prose if manual steps are needed.
|
|
23
|
-
|
|
24
|
-
## Action
|
|
25
|
-
|
|
26
|
-
What the test actually does. Be specific about commands, inputs, and expected intermediate observations.
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
# Example action
|
|
30
|
-
curl -X GET $LMCTL_API_URL/api/status \
|
|
31
|
-
-H "Authorization: Bearer $LMCTL_API_TOKEN"
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Expected
|
|
35
|
-
|
|
36
|
-
What "pass" looks like:
|
|
37
|
-
- HTTP 200 response
|
|
38
|
-
- JSON body contains key `jobs` with `total >= 0`
|
|
39
|
-
- Response time under 1 second
|
|
40
|
-
|
|
41
|
-
The Interpreter agent reads this section + the Action's actual observations to emit STANCE: pass / fail / inconclusive.
|
|
42
|
-
|
|
43
|
-
## Cleanup
|
|
44
|
-
|
|
45
|
-
Idempotent cleanup steps. Should be safe to run even if Setup or Action failed.
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
# Example cleanup
|
|
49
|
-
# (nothing to clean up for this read-only example)
|
|
50
|
-
```
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# AI Test Suite - index
|
|
2
|
-
|
|
3
|
-
This directory holds **AI-driven manual tests** for this project. Each chapter (`*.md`) describes one test case that an LLM agent (the QA Tester) executes; an Interpreter agent judges pass/fail.
|
|
4
|
-
|
|
5
|
-
**This is NOT for unit/integration tests** - those live in `tests/` and run via your test framework (e.g., `npm test`). `ai-test/` is for things that need LLM-quality judgment: vision quality, prompt-driven behavior, end-to-end scenarios that exercise the full stack.
|
|
6
|
-
|
|
7
|
-
## Conventions
|
|
8
|
-
|
|
9
|
-
- One test case per `.md` file
|
|
10
|
-
- YAML frontmatter (agent-writable: `last_run_*` fields)
|
|
11
|
-
- Markdown body sections: `## Setup`, `## Action`, `## Expected`, `## Cleanup`
|
|
12
|
-
- Issues found by qa-suite reference the chapter via `ai_test_path` (e.g. `ai-test/test-image-upload-basic.md`)
|
|
13
|
-
|
|
14
|
-
## Test cases
|
|
15
|
-
|
|
16
|
-
See individual chapters in this directory. Use `grep -l 'type: smoke' ai-test/*.md` (etc.) to filter.
|
|
17
|
-
|
|
18
|
-
## How to add a new test case
|
|
19
|
-
|
|
20
|
-
1. Copy a chapter as a template: `cp ai-test/example-test.md ai-test/test-my-new-case.md`
|
|
21
|
-
2. Edit frontmatter (name, description, type, tags)
|
|
22
|
-
3. Edit body (Setup, Action, Expected, Cleanup)
|
|
23
|
-
4. Commit alongside the code change that motivated the test
|
|
24
|
-
|
|
25
|
-
## Pointer to lmctl's own ai-test/ (canonical example)
|
|
26
|
-
|
|
27
|
-
See `<lmctl-repo>/ai-test/` for the test corpus used to verify lmctl itself.
|