pilotlynx 0.1.2 → 0.2.0
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/README.md +40 -40
- package/dist/agents/improve.agent.d.ts +42 -1
- package/dist/agents/improve.agent.js +102 -7
- package/dist/agents/improve.agent.js.map +1 -1
- package/dist/agents/run.agent.d.ts +0 -1
- package/dist/agents/run.agent.js +10 -7
- package/dist/agents/run.agent.js.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/audit.d.ts +2 -0
- package/dist/commands/audit.js +51 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/eval.d.ts +2 -0
- package/dist/commands/eval.js +47 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/improve.js +83 -5
- package/dist/commands/improve.js.map +1 -1
- package/dist/commands/init.js +17 -27
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/insights.js +63 -0
- package/dist/commands/insights.js.map +1 -1
- package/dist/commands/logs.d.ts +1 -0
- package/dist/commands/logs.js +23 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/relay.js +250 -124
- package/dist/commands/relay.js.map +1 -1
- package/dist/commands/run.js +21 -2
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/schedule.js +7 -1
- package/dist/commands/schedule.js.map +1 -1
- package/dist/commands/status.js +9 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/lib/agent-runner.d.ts +5 -1
- package/dist/lib/agent-runner.js +41 -1
- package/dist/lib/agent-runner.js.map +1 -1
- package/dist/lib/audit.d.ts +7 -0
- package/dist/lib/audit.js +63 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/callbacks.d.ts +12 -1
- package/dist/lib/callbacks.js +147 -19
- package/dist/lib/callbacks.js.map +1 -1
- package/dist/lib/command-ops/doctor-ops.js +41 -6
- package/dist/lib/command-ops/doctor-ops.js.map +1 -1
- package/dist/lib/command-ops/eval-ops.d.ts +7 -0
- package/dist/lib/command-ops/eval-ops.js +111 -0
- package/dist/lib/command-ops/eval-ops.js.map +1 -0
- package/dist/lib/command-ops/improve-ops.d.ts +14 -1
- package/dist/lib/command-ops/improve-ops.js +369 -17
- package/dist/lib/command-ops/improve-ops.js.map +1 -1
- package/dist/lib/command-ops/run-ops.d.ts +8 -1
- package/dist/lib/command-ops/run-ops.js +25 -4
- package/dist/lib/command-ops/run-ops.js.map +1 -1
- package/dist/lib/command-ops/secrets-migration-ops.js +1 -1
- package/dist/lib/command-ops/secrets-migration-ops.js.map +1 -1
- package/dist/lib/command-ops/status-ops.d.ts +1 -0
- package/dist/lib/command-ops/status-ops.js +19 -7
- package/dist/lib/command-ops/status-ops.js.map +1 -1
- package/dist/lib/config.js +3 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/cron.d.ts +1 -1
- package/dist/lib/cron.js +2 -2
- package/dist/lib/cron.js.map +1 -1
- package/dist/lib/global-config.js +1 -1
- package/dist/lib/global-config.js.map +1 -1
- package/dist/lib/observation.d.ts +60 -2
- package/dist/lib/observation.js +261 -13
- package/dist/lib/observation.js.map +1 -1
- package/dist/lib/registry.d.ts +0 -1
- package/dist/lib/registry.js +1 -1
- package/dist/lib/registry.js.map +1 -1
- package/dist/lib/relay/admin.d.ts +29 -0
- package/dist/lib/relay/admin.js +176 -0
- package/dist/lib/relay/admin.js.map +1 -0
- package/dist/lib/relay/bindings.d.ts +8 -0
- package/dist/lib/relay/bindings.js +50 -0
- package/dist/lib/relay/bindings.js.map +1 -0
- package/dist/lib/relay/config.d.ts +3 -3
- package/dist/lib/relay/config.js +18 -10
- package/dist/lib/relay/config.js.map +1 -1
- package/dist/lib/relay/context.d.ts +31 -0
- package/dist/lib/relay/context.js +118 -0
- package/dist/lib/relay/context.js.map +1 -0
- package/dist/lib/relay/db.d.ts +38 -0
- package/dist/lib/relay/db.js +252 -0
- package/dist/lib/relay/db.js.map +1 -0
- package/dist/lib/relay/executor.d.ts +2 -0
- package/dist/lib/relay/executor.js +108 -0
- package/dist/lib/relay/executor.js.map +1 -0
- package/dist/lib/relay/feedback.d.ts +29 -0
- package/dist/lib/relay/feedback.js +142 -0
- package/dist/lib/relay/feedback.js.map +1 -0
- package/dist/lib/relay/notifier.d.ts +30 -0
- package/dist/lib/relay/notifier.js +78 -0
- package/dist/lib/relay/notifier.js.map +1 -0
- package/dist/lib/relay/notify.d.ts +3 -4
- package/dist/lib/relay/notify.js +43 -159
- package/dist/lib/relay/notify.js.map +1 -1
- package/dist/lib/relay/platform.d.ts +52 -0
- package/dist/lib/relay/platform.js +5 -0
- package/dist/lib/relay/platform.js.map +1 -0
- package/dist/lib/relay/platforms/slack.d.ts +37 -0
- package/dist/lib/relay/platforms/slack.js +240 -0
- package/dist/lib/relay/platforms/slack.js.map +1 -0
- package/dist/lib/relay/platforms/telegram.d.ts +29 -0
- package/dist/lib/relay/platforms/telegram.js +193 -0
- package/dist/lib/relay/platforms/telegram.js.map +1 -0
- package/dist/lib/relay/poster.d.ts +24 -0
- package/dist/lib/relay/poster.js +136 -0
- package/dist/lib/relay/poster.js.map +1 -0
- package/dist/lib/relay/queue.d.ts +18 -0
- package/dist/lib/relay/queue.js +85 -0
- package/dist/lib/relay/queue.js.map +1 -0
- package/dist/lib/relay/router.d.ts +25 -2
- package/dist/lib/relay/router.js +259 -168
- package/dist/lib/relay/router.js.map +1 -1
- package/dist/lib/relay/service.d.ts +31 -7
- package/dist/lib/relay/service.js +281 -200
- package/dist/lib/relay/service.js.map +1 -1
- package/dist/lib/relay/types.d.ts +189 -34
- package/dist/lib/relay/types.js +68 -28
- package/dist/lib/relay/types.js.map +1 -1
- package/dist/lib/sandbox.d.ts +9 -1
- package/dist/lib/sandbox.js +17 -2
- package/dist/lib/sandbox.js.map +1 -1
- package/dist/lib/schedule.d.ts +4 -5
- package/dist/lib/schedule.js +7 -8
- package/dist/lib/schedule.js.map +1 -1
- package/dist/lib/secrets.js +11 -1
- package/dist/lib/secrets.js.map +1 -1
- package/dist/lib/types.d.ts +80 -0
- package/dist/lib/types.js +9 -1
- package/dist/lib/types.js.map +1 -1
- package/package.json +18 -18
- package/prompts/improve.yaml +114 -6
- package/prompts/relay.yaml +29 -0
- package/prompts/run.yaml +36 -2
- package/template/CLAUDE.md +34 -5
- package/template/RUNBOOK.md +5 -5
- package/template/evals/sample.json +16 -0
- package/template/memory/MEMORY.md +6 -0
- package/template/memory/procedures/.gitkeep +0 -0
- package/template/schedule.yaml +1 -1
- package/template/workflows/daily_feedback.ts +78 -2
- package/template/workflows/project_review.ts +51 -2
- package/prompts/relay-chat.yaml +0 -24
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ Three features that don't exist in other AI workflow tools:
|
|
|
13
13
|
|
|
14
14
|
### Cron Ping
|
|
15
15
|
|
|
16
|
-
Define cron schedules per project. PilotLynx uses tick-based scheduling — no daemon, no background process. You run `
|
|
16
|
+
Define cron schedules per project. PilotLynx uses tick-based scheduling — no daemon, no background process. You run `pilotlynx schedule tick` from a system cron entry and it figures out what's due.
|
|
17
17
|
|
|
18
18
|
**`schedule.yaml`** (in each project):
|
|
19
19
|
|
|
@@ -42,15 +42,15 @@ schedules:
|
|
|
42
42
|
|
|
43
43
|
Missed runs older than **7 days** are always discarded regardless of policy.
|
|
44
44
|
|
|
45
|
-
`
|
|
45
|
+
`pilotlynx init` auto-installs a system cron entry (`*/15 * * * *`) so scheduling works out of the box. Each tick also runs the self-improvement loop automatically (once per 24h, configurable).
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
|
-
|
|
48
|
+
pilotlynx schedule status myproject # see what's scheduled, last/next runs
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
### Self-Improvement Loop
|
|
52
52
|
|
|
53
|
-
`
|
|
53
|
+
`pilotlynx improve` triggers a two-phase cycle that makes projects learn from their own run history:
|
|
54
54
|
|
|
55
55
|
**Phase 1 — Observation (Lynx-owned, read-only):** Reads conversation logs, user feedback, and run outcomes across all projects. Produces per-project summaries and cross-project insights (stored in `pilotlynx/shared/insights/`).
|
|
56
56
|
|
|
@@ -58,7 +58,7 @@ plynx schedule status myproject # see what's scheduled, last/next runs
|
|
|
58
58
|
|
|
59
59
|
Key design constraint: **Lynx never writes project files.** The orchestrator observes and triggers; only the project's own agent modifies its files.
|
|
60
60
|
|
|
61
|
-
Auto-runs via `schedule tick` once per 24h. Manual trigger anytime with `
|
|
61
|
+
Auto-runs via `schedule tick` once per 24h. Manual trigger anytime with `pilotlynx improve`. Toggle in `pilotlynx.yaml`:
|
|
62
62
|
|
|
63
63
|
```yaml
|
|
64
64
|
autoImprove:
|
|
@@ -66,8 +66,8 @@ autoImprove:
|
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
pilotlynx insights # view cross-project insights
|
|
70
|
+
pilotlynx insights --since 2025-01-10 # filter by date
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
### Shared Env
|
|
@@ -97,13 +97,13 @@ projects:
|
|
|
97
97
|
**Inspect and export:**
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
100
|
+
pilotlynx env myproject # dotenv format
|
|
101
|
+
pilotlynx env myproject --export # export KEY=value (eval-able)
|
|
102
|
+
pilotlynx env myproject --json # {"KEY": "value"}
|
|
103
|
+
pilotlynx link myproject --direnv # generate .envrc for MCP server ${VAR} expansion
|
|
104
104
|
```
|
|
105
105
|
|
|
106
|
-
**Auto-migration:** When you adopt an existing project with `
|
|
106
|
+
**Auto-migration:** When you adopt an existing project with `pilotlynx project add`, PilotLynx detects secrets in the project's `.env` and `.mcp.json` literals, consolidates them into the central store, and updates the policy — no manual copy-paste.
|
|
107
107
|
|
|
108
108
|
**Default is deny-all.** No policy file = zero secrets injected. See [`docs/secrets-and-mcp.md`](docs/secrets-and-mcp.md) for the full guide.
|
|
109
109
|
|
|
@@ -155,7 +155,7 @@ npm install -g pilotlynx
|
|
|
155
155
|
|
|
156
156
|
```bash
|
|
157
157
|
mkdir my-agents && cd my-agents
|
|
158
|
-
|
|
158
|
+
pilotlynx init --name my-agents
|
|
159
159
|
```
|
|
160
160
|
|
|
161
161
|
This creates:
|
|
@@ -163,7 +163,7 @@ This creates:
|
|
|
163
163
|
```
|
|
164
164
|
my-agents/
|
|
165
165
|
pilotlynx/ # config directory
|
|
166
|
-
|
|
166
|
+
pilotlynx.yaml # workspace marker
|
|
167
167
|
projects.yaml # project registry (name → path)
|
|
168
168
|
template/ # project scaffold template
|
|
169
169
|
shared/policies/ # secrets + tool access policies
|
|
@@ -172,16 +172,16 @@ my-agents/
|
|
|
172
172
|
.gitignore
|
|
173
173
|
```
|
|
174
174
|
|
|
175
|
-
It also writes a global config at `~/.config/pilotlynx/config.yaml` (Linux) so the CLI works from any directory, and installs a cron entry for `
|
|
175
|
+
It also writes a global config at `~/.config/pilotlynx/config.yaml` (Linux) so the CLI works from any directory, and installs a cron entry for `pilotlynx schedule tick` every 15 minutes.
|
|
176
176
|
|
|
177
177
|
### 2. Create or add a project
|
|
178
178
|
|
|
179
179
|
```bash
|
|
180
180
|
# Create a new project from template
|
|
181
|
-
|
|
181
|
+
pilotlynx project create myproject
|
|
182
182
|
|
|
183
183
|
# Or adopt an existing directory (at any path)
|
|
184
|
-
|
|
184
|
+
pilotlynx project add myrepo --path /path/to/existing/repo
|
|
185
185
|
```
|
|
186
186
|
|
|
187
187
|
`create` scaffolds from the template into `myproject/` (at the workspace root) with:
|
|
@@ -198,7 +198,7 @@ Both commands register the project in `pilotlynx/projects.yaml` and prompt for s
|
|
|
198
198
|
### 3. Run a workflow
|
|
199
199
|
|
|
200
200
|
```bash
|
|
201
|
-
|
|
201
|
+
pilotlynx run myproject daily_feedback
|
|
202
202
|
```
|
|
203
203
|
|
|
204
204
|
Loads secrets from `.env` per the project's allowlist, then executes the workflow.
|
|
@@ -206,7 +206,7 @@ Loads secrets from `.env` per the project's allowlist, then executes the workflo
|
|
|
206
206
|
### 4. Check project structure
|
|
207
207
|
|
|
208
208
|
```bash
|
|
209
|
-
|
|
209
|
+
pilotlynx verify myproject
|
|
210
210
|
```
|
|
211
211
|
|
|
212
212
|
Reports missing files or directories.
|
|
@@ -215,21 +215,21 @@ Reports missing files or directories.
|
|
|
215
215
|
|
|
216
216
|
| Command | What it does |
|
|
217
217
|
|---------|-------------|
|
|
218
|
-
| `
|
|
219
|
-
| `
|
|
220
|
-
| `
|
|
221
|
-
| `
|
|
222
|
-
| `
|
|
223
|
-
| `
|
|
224
|
-
| `
|
|
225
|
-
| `
|
|
226
|
-
| `
|
|
227
|
-
| `
|
|
228
|
-
| `
|
|
229
|
-
| `
|
|
230
|
-
| `
|
|
231
|
-
| `
|
|
232
|
-
| `
|
|
218
|
+
| `pilotlynx init` | Create a new workspace |
|
|
219
|
+
| `pilotlynx project create <name>` | Scaffold a project from template |
|
|
220
|
+
| `pilotlynx project add <name> --path <dir>` | Add an existing directory as a project |
|
|
221
|
+
| `pilotlynx projects list` | List all projects with paths |
|
|
222
|
+
| `pilotlynx run <project> <workflow>` | Run a workflow with secrets injection |
|
|
223
|
+
| `pilotlynx verify <project>` | Validate project structure |
|
|
224
|
+
| `pilotlynx improve` | Run self-improvement loop across projects |
|
|
225
|
+
| `pilotlynx schedule tick` | Run due scheduled workflows |
|
|
226
|
+
| `pilotlynx schedule status <project>` | Show schedules, last/next run times, auto-improve state |
|
|
227
|
+
| `pilotlynx logs <project>` | View recent run logs (`--last`, `--workflow`, `--failures`) |
|
|
228
|
+
| `pilotlynx insights` | View cross-project insights (`--last`, `--since`) |
|
|
229
|
+
| `pilotlynx sync template <project>` | Apply template updates to a project |
|
|
230
|
+
| `pilotlynx env <project>` | Output policy-filtered secrets (`--export`, `--json`, `--envrc`) |
|
|
231
|
+
| `pilotlynx link <project>` | Configure a project for direct access (`--direnv` for `.envrc`) |
|
|
232
|
+
| `pilotlynx unlink <project>` | Remove direct-access configuration |
|
|
233
233
|
|
|
234
234
|
## Other Features
|
|
235
235
|
|
|
@@ -243,11 +243,11 @@ Reports missing files or directories.
|
|
|
243
243
|
|
|
244
244
|
## Architecture: CLI = Agent SDK
|
|
245
245
|
|
|
246
|
-
The CLI is a thin wrapper around Claude Agent SDK agents. Every `
|
|
246
|
+
The CLI is a thin wrapper around Claude Agent SDK agents. Every `pilotlynx` command invokes a dedicated agent, making the CLI a convenience layer rather than the primary execution surface.
|
|
247
247
|
|
|
248
|
-
- **Each command = one agent.** `
|
|
248
|
+
- **Each command = one agent.** `pilotlynx project create foo` runs a "project-create" agent that scaffolds the directory from the template.
|
|
249
249
|
- **Most CLI commands have corresponding Claude Code skills** for use inside projects.
|
|
250
|
-
- **Business logic lives in agents.** Exception: `
|
|
250
|
+
- **Business logic lives in agents.** Exception: `pilotlynx init` scaffolds the workspace directly since no workspace exists yet for agent context.
|
|
251
251
|
|
|
252
252
|
## Working Directly in a Project
|
|
253
253
|
|
|
@@ -256,7 +256,7 @@ PilotLynx stores its config location in a global file (`~/.config/pilotlynx/conf
|
|
|
256
256
|
For MCP servers that need secrets via `${VAR}` expansion, use [direnv](https://direnv.net/):
|
|
257
257
|
|
|
258
258
|
```bash
|
|
259
|
-
|
|
259
|
+
pilotlynx link myproject --direnv # generates .envrc with policy-filtered secrets
|
|
260
260
|
cd myproject && direnv allow # activate
|
|
261
261
|
```
|
|
262
262
|
|
|
@@ -328,8 +328,8 @@ Each project should support these baseline workflows:
|
|
|
328
328
|
## Claude Code Compatibility
|
|
329
329
|
|
|
330
330
|
- The workspace can be opened directly in Claude Code.
|
|
331
|
-
- `
|
|
332
|
-
- `
|
|
331
|
+
- `pilotlynx` works from the workspace root, from project directories (via global config), and from any other location.
|
|
332
|
+
- `pilotlynx link --direnv` generates `.envrc` for MCP servers that need secrets via `${VAR}` expansion.
|
|
333
333
|
- Each CLI command maps to a Claude Code skill — same agent, same behavior.
|
|
334
334
|
|
|
335
335
|
## Design Decisions
|
|
@@ -1,2 +1,43 @@
|
|
|
1
1
|
import type { AgentConfig } from '../lib/types.js';
|
|
2
|
-
export
|
|
2
|
+
export interface ProjectFeedback {
|
|
3
|
+
summary: string;
|
|
4
|
+
priority: 'high' | 'medium' | 'low';
|
|
5
|
+
actionItems: string[];
|
|
6
|
+
suggestedSkills?: Array<{
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
}>;
|
|
10
|
+
suggestedRules?: Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
content: string;
|
|
13
|
+
}>;
|
|
14
|
+
modifyClaude?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface ImproveInsight {
|
|
17
|
+
id: string;
|
|
18
|
+
category: string;
|
|
19
|
+
insight: string;
|
|
20
|
+
actionable: boolean;
|
|
21
|
+
evidence: string;
|
|
22
|
+
supersedes?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ImproveAntiPattern {
|
|
25
|
+
pattern: string;
|
|
26
|
+
reason: string;
|
|
27
|
+
evidence: string;
|
|
28
|
+
applicableTo?: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface ImproveSharedPattern {
|
|
31
|
+
name: string;
|
|
32
|
+
content: string;
|
|
33
|
+
observations: number;
|
|
34
|
+
applicableTo: string[];
|
|
35
|
+
confidence: 'high' | 'medium' | 'low';
|
|
36
|
+
}
|
|
37
|
+
export interface ImproveOutput {
|
|
38
|
+
projectFeedback: Record<string, ProjectFeedback>;
|
|
39
|
+
crossProjectInsights: ImproveInsight[];
|
|
40
|
+
antiPatterns?: ImproveAntiPattern[];
|
|
41
|
+
sharedPatterns?: ImproveSharedPattern[];
|
|
42
|
+
}
|
|
43
|
+
export declare function getImproveAgentConfig(logSummaries: Record<string, string>, previousInsights?: string): AgentConfig;
|
|
@@ -18,18 +18,24 @@ function improveToolCallback() {
|
|
|
18
18
|
return { behavior: 'allow', updatedInput: input };
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
|
-
export function getImproveAgentConfig(logSummaries) {
|
|
21
|
+
export function getImproveAgentConfig(logSummaries, previousInsights) {
|
|
22
22
|
const summaryText = Object.entries(logSummaries)
|
|
23
23
|
.map(([project, summary]) => `## ${project}\n${summary}`)
|
|
24
24
|
.join('\n\n');
|
|
25
|
+
const vars = {
|
|
26
|
+
summaryText,
|
|
27
|
+
previousInsights: previousInsights
|
|
28
|
+
? `### Previous Insights (external verification — check if still applicable)\n${previousInsights}`
|
|
29
|
+
: '',
|
|
30
|
+
};
|
|
25
31
|
return {
|
|
26
|
-
prompt: loadPrompt('improve', 'improve_analyze',
|
|
32
|
+
prompt: loadPrompt('improve', 'improve_analyze', vars),
|
|
27
33
|
cwd: getConfigRoot(),
|
|
28
34
|
allowedTools: ['Read', 'Glob', 'Grep'],
|
|
29
35
|
// Intentional: uses string systemPrompt (not preset 'claude_code') because
|
|
30
36
|
// this agent is read-only and doesn't need CLAUDE.md context or Claude Code tools.
|
|
31
37
|
systemPrompt: loadSystemPrompt('improve', 'improve_analyze'),
|
|
32
|
-
maxTurns:
|
|
38
|
+
maxTurns: 15,
|
|
33
39
|
canUseTool: improveToolCallback(),
|
|
34
40
|
outputFormat: {
|
|
35
41
|
type: 'json_schema',
|
|
@@ -38,12 +44,101 @@ export function getImproveAgentConfig(logSummaries) {
|
|
|
38
44
|
properties: {
|
|
39
45
|
projectFeedback: {
|
|
40
46
|
type: 'object',
|
|
41
|
-
description: 'Map of project name to feedback
|
|
42
|
-
additionalProperties: {
|
|
47
|
+
description: 'Map of project name to structured feedback',
|
|
48
|
+
additionalProperties: {
|
|
49
|
+
type: 'object',
|
|
50
|
+
properties: {
|
|
51
|
+
summary: { type: 'string', description: '2-3 sentence overview of key findings' },
|
|
52
|
+
priority: { type: 'string', enum: ['high', 'medium', 'low'] },
|
|
53
|
+
actionItems: {
|
|
54
|
+
type: 'array',
|
|
55
|
+
items: { type: 'string' },
|
|
56
|
+
description: 'Specific, executable improvement instructions',
|
|
57
|
+
},
|
|
58
|
+
suggestedSkills: {
|
|
59
|
+
type: 'array',
|
|
60
|
+
items: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
properties: {
|
|
63
|
+
name: { type: 'string' },
|
|
64
|
+
description: { type: 'string' },
|
|
65
|
+
},
|
|
66
|
+
required: ['name', 'description'],
|
|
67
|
+
},
|
|
68
|
+
description: 'Skills to create from repeating patterns (max 3)',
|
|
69
|
+
},
|
|
70
|
+
suggestedRules: {
|
|
71
|
+
type: 'array',
|
|
72
|
+
items: {
|
|
73
|
+
type: 'object',
|
|
74
|
+
properties: {
|
|
75
|
+
name: { type: 'string' },
|
|
76
|
+
content: { type: 'string' },
|
|
77
|
+
},
|
|
78
|
+
required: ['name', 'content'],
|
|
79
|
+
},
|
|
80
|
+
description: 'Rules to add for discovered conventions',
|
|
81
|
+
},
|
|
82
|
+
modifyClaude: {
|
|
83
|
+
type: 'boolean',
|
|
84
|
+
description: 'Set to true ONLY if CLAUDE.md has a specific gap that needs addressing',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
required: ['summary', 'priority', 'actionItems'],
|
|
88
|
+
},
|
|
43
89
|
},
|
|
44
90
|
crossProjectInsights: {
|
|
45
|
-
type: '
|
|
46
|
-
|
|
91
|
+
type: 'array',
|
|
92
|
+
items: {
|
|
93
|
+
type: 'object',
|
|
94
|
+
properties: {
|
|
95
|
+
id: { type: 'string', description: 'Unique insight ID (e.g., ins-YYYYMMDD-NNN)' },
|
|
96
|
+
category: { type: 'string', description: 'performance, reliability, cost, patterns' },
|
|
97
|
+
insight: { type: 'string', description: 'Abstract insight, no project names or secrets' },
|
|
98
|
+
actionable: { type: 'boolean' },
|
|
99
|
+
evidence: { type: 'string', description: 'What data supports this insight' },
|
|
100
|
+
supersedes: { type: 'string', description: 'ID of insight this replaces, if any' },
|
|
101
|
+
},
|
|
102
|
+
required: ['id', 'category', 'insight', 'actionable', 'evidence'],
|
|
103
|
+
},
|
|
104
|
+
description: 'Cross-project learnings that are abstract and context-free',
|
|
105
|
+
},
|
|
106
|
+
antiPatterns: {
|
|
107
|
+
type: 'array',
|
|
108
|
+
items: {
|
|
109
|
+
type: 'object',
|
|
110
|
+
properties: {
|
|
111
|
+
pattern: { type: 'string', description: 'What the anti-pattern is' },
|
|
112
|
+
reason: { type: 'string', description: 'Why it is harmful' },
|
|
113
|
+
evidence: { type: 'string', description: 'What data shows this' },
|
|
114
|
+
applicableTo: {
|
|
115
|
+
type: 'array',
|
|
116
|
+
items: { type: 'string' },
|
|
117
|
+
description: 'Context tags (e.g., api-integration, data-processing)',
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
required: ['pattern', 'reason', 'evidence'],
|
|
121
|
+
},
|
|
122
|
+
description: 'Recurring failures to track as anti-patterns',
|
|
123
|
+
},
|
|
124
|
+
sharedPatterns: {
|
|
125
|
+
type: 'array',
|
|
126
|
+
items: {
|
|
127
|
+
type: 'object',
|
|
128
|
+
properties: {
|
|
129
|
+
name: { type: 'string', description: 'Short descriptive name for the pattern' },
|
|
130
|
+
content: { type: 'string', description: 'Description of the successful pattern' },
|
|
131
|
+
observations: { type: 'number', description: 'Number of independent observations (minimum 3 to promote)' },
|
|
132
|
+
applicableTo: {
|
|
133
|
+
type: 'array',
|
|
134
|
+
items: { type: 'string' },
|
|
135
|
+
description: 'Context tags for when this pattern applies',
|
|
136
|
+
},
|
|
137
|
+
confidence: { type: 'string', enum: ['high', 'medium', 'low'] },
|
|
138
|
+
},
|
|
139
|
+
required: ['name', 'content', 'observations', 'applicableTo', 'confidence'],
|
|
140
|
+
},
|
|
141
|
+
description: 'Successful patterns to promote as shared knowledge (require 3+ observations)',
|
|
47
142
|
},
|
|
48
143
|
},
|
|
49
144
|
required: ['projectFeedback', 'crossProjectInsights'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"improve.agent.js","sourceRoot":"","sources":["../../src/agents/improve.agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAc,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,SAAS,mBAAmB;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,KAAK,EAAE,QAAgB,EAAE,KAAc,EAA6B,EAAE;QAC3E,MAAM,QAAQ,GAAI,KAAa,EAAE,SAAS,IAAK,KAAa,EAAE,IAAI,CAAC;QACnE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,2CAA2C;YAC3C,IAAI,QAAQ,KAAK,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChE,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"improve.agent.js","sourceRoot":"","sources":["../../src/agents/improve.agent.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/run.agent.js
CHANGED
|
@@ -2,8 +2,7 @@ import { getProjectDir, SHARED_DOCS_DIR, INSIGHTS_DIR } from '../lib/config.js';
|
|
|
2
2
|
import { buildProjectTools } from '../lib/tools.js';
|
|
3
3
|
import { loadPrompt } from '../lib/prompts.js';
|
|
4
4
|
import { detectSandbox } from '../lib/sandbox.js';
|
|
5
|
-
import { pathEnforcementCallback } from '../lib/callbacks.js';
|
|
6
|
-
export { pathEnforcementCallback } from '../lib/callbacks.js';
|
|
5
|
+
import { pathEnforcementCallback, feedbackPathEnforcementCallback } from '../lib/callbacks.js';
|
|
7
6
|
export function getRunAgentConfig(project, workflow, projectEnv, feedbackPrompt) {
|
|
8
7
|
const projectDir = getProjectDir(project);
|
|
9
8
|
const toolPolicy = buildProjectTools(project);
|
|
@@ -14,15 +13,17 @@ export function getRunAgentConfig(project, workflow, projectEnv, feedbackPrompt)
|
|
|
14
13
|
const prompt = loadPrompt('run', promptName, vars);
|
|
15
14
|
const sandbox = detectSandbox();
|
|
16
15
|
if (sandbox.level === 'kernel') {
|
|
17
|
-
console.error(`[
|
|
16
|
+
console.error(`[pilotlynx] Filesystem sandbox: ${sandbox.mechanism} (kernel-level isolation)`);
|
|
18
17
|
}
|
|
19
18
|
else {
|
|
20
|
-
console.error('[
|
|
19
|
+
console.error('[pilotlynx] Filesystem sandbox: regex-only (bwrap not available)');
|
|
21
20
|
}
|
|
21
|
+
const isFeedbackRun = !!feedbackPrompt;
|
|
22
|
+
const additionalDirs = [SHARED_DOCS_DIR(), INSIGHTS_DIR()];
|
|
22
23
|
return {
|
|
23
24
|
prompt,
|
|
24
25
|
cwd: projectDir,
|
|
25
|
-
additionalDirectories:
|
|
26
|
+
additionalDirectories: additionalDirs,
|
|
26
27
|
env: projectEnv,
|
|
27
28
|
allowedTools: toolPolicy.allowedTools.length > 0 ? toolPolicy.allowedTools : undefined,
|
|
28
29
|
disallowedTools: toolPolicy.disallowedTools.length > 0 ? toolPolicy.disallowedTools : undefined,
|
|
@@ -30,8 +31,10 @@ export function getRunAgentConfig(project, workflow, projectEnv, feedbackPrompt)
|
|
|
30
31
|
systemPrompt: { type: 'preset', preset: 'claude_code' },
|
|
31
32
|
permissionMode: 'bypassPermissions',
|
|
32
33
|
allowDangerouslySkipPermissions: true,
|
|
33
|
-
maxTurns: 50,
|
|
34
|
-
canUseTool:
|
|
34
|
+
maxTurns: isFeedbackRun ? 20 : 50,
|
|
35
|
+
canUseTool: isFeedbackRun
|
|
36
|
+
? feedbackPathEnforcementCallback(projectDir, additionalDirs)
|
|
37
|
+
: pathEnforcementCallback(projectDir, additionalDirs),
|
|
35
38
|
};
|
|
36
39
|
}
|
|
37
40
|
//# sourceMappingURL=run.agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.agent.js","sourceRoot":"","sources":["../../src/agents/run.agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,
|
|
1
|
+
{"version":3,"file":"run.agent.js","sourceRoot":"","sources":["../../src/agents/run.agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAE/F,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,QAAgB,EAChB,UAAkC,EAClC,cAAuB;IAEvB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,aAAa,CAAC;IACxE,MAAM,IAAI,GAA2B,EAAE,QAAQ,EAAE,CAAC;IAClD,IAAI,cAAc;QAAE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,mCAAmC,OAAO,CAAC,SAAS,2BAA2B,CAAC,CAAC;IACjG,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,CAAC,cAAc,CAAC;IACvC,MAAM,cAAc,GAAG,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAE3D,OAAO;QACL,MAAM;QACN,GAAG,EAAE,UAAU;QACf,qBAAqB,EAAE,cAAc;QACrC,GAAG,EAAE,UAAU;QACf,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;QACtF,eAAe,EAAE,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;QAC/F,cAAc,EAAE,CAAC,SAAS,CAAC;QAC3B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE;QACvD,cAAc,EAAE,mBAAmB;QACnC,+BAA+B,EAAE,IAAI;QACrC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACjC,UAAU,EAAE,aAAa;YACvB,CAAC,CAAC,+BAA+B,CAAC,UAAU,EAAE,cAAc,CAAC;YAC7D,CAAC,CAAC,uBAAuB,CAAC,UAAU,EAAE,cAAc,CAAC;KACxD,CAAC;AACJ,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -12,15 +12,17 @@ import { makeInitCommand } from './commands/init.js';
|
|
|
12
12
|
import { makeEnvCommand } from './commands/env.js';
|
|
13
13
|
import { makeLinkCommand } from './commands/link.js';
|
|
14
14
|
import { makeUnlinkCommand } from './commands/unlink.js';
|
|
15
|
-
import { makeLogsCommand } from './commands/logs.js';
|
|
15
|
+
import { makeLogsCommand, makeLogsPruneCommand } from './commands/logs.js';
|
|
16
16
|
import { makeInsightsCommand } from './commands/insights.js';
|
|
17
17
|
import { makeRelayCommand } from './commands/relay.js';
|
|
18
18
|
import { makeStatusCommand } from './commands/status.js';
|
|
19
19
|
import { makeCostCommand } from './commands/cost.js';
|
|
20
20
|
import { makeDoctorCommand } from './commands/doctor.js';
|
|
21
|
+
import { makeEvalCommand } from './commands/eval.js';
|
|
22
|
+
import { makeAuditCommand } from './commands/audit.js';
|
|
21
23
|
const program = new Command();
|
|
22
24
|
program
|
|
23
|
-
.name('
|
|
25
|
+
.name('pilotlynx')
|
|
24
26
|
.description('PilotLynx — local monorepo orchestration for Claude Agent SDK workflows')
|
|
25
27
|
.version(getVersion())
|
|
26
28
|
.exitOverride()
|
|
@@ -28,7 +30,7 @@ program
|
|
|
28
30
|
program.option('--verbose', 'enable verbose output');
|
|
29
31
|
// Commands that work without a workspace
|
|
30
32
|
program.addCommand(makeInitCommand());
|
|
31
|
-
// Project management (top-level —
|
|
33
|
+
// Project management (top-level — pilotlynx manages projects by default)
|
|
32
34
|
program.addCommand(makeCreateCommand());
|
|
33
35
|
program.addCommand(makeAddCommand());
|
|
34
36
|
program.addCommand(makeRemoveCommand());
|
|
@@ -43,11 +45,14 @@ program.addCommand(makeEnvCommand());
|
|
|
43
45
|
program.addCommand(makeLinkCommand());
|
|
44
46
|
program.addCommand(makeUnlinkCommand());
|
|
45
47
|
program.addCommand(makeLogsCommand());
|
|
48
|
+
program.addCommand(makeLogsPruneCommand());
|
|
46
49
|
program.addCommand(makeInsightsCommand());
|
|
47
50
|
program.addCommand(makeRelayCommand());
|
|
48
51
|
program.addCommand(makeStatusCommand());
|
|
49
52
|
program.addCommand(makeCostCommand());
|
|
50
53
|
program.addCommand(makeDoctorCommand());
|
|
54
|
+
program.addCommand(makeEvalCommand());
|
|
55
|
+
program.addCommand(makeAuditCommand());
|
|
51
56
|
try {
|
|
52
57
|
await program.parseAsync(process.argv);
|
|
53
58
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import Table from 'cli-table3';
|
|
4
|
+
import { readAuditEntries, formatAuditCSV } from '../lib/audit.js';
|
|
5
|
+
export function makeAuditCommand() {
|
|
6
|
+
const cmd = new Command('audit')
|
|
7
|
+
.description('View and export audit trail for a project')
|
|
8
|
+
.argument('<project>', 'project name')
|
|
9
|
+
.option('--days <n>', 'number of days to include', '30')
|
|
10
|
+
.option('--workflow <name>', 'filter by workflow')
|
|
11
|
+
.option('--format <fmt>', 'output format: table, json, csv', 'table')
|
|
12
|
+
.action(async (project, opts) => {
|
|
13
|
+
const days = parseInt(opts.days, 10) || 30;
|
|
14
|
+
const entries = readAuditEntries(project, { days, workflow: opts.workflow });
|
|
15
|
+
if (entries.length === 0) {
|
|
16
|
+
console.log(chalk.dim('No audit entries found.'));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
switch (opts.format) {
|
|
20
|
+
case 'json':
|
|
21
|
+
console.log(JSON.stringify(entries, null, 2));
|
|
22
|
+
break;
|
|
23
|
+
case 'csv':
|
|
24
|
+
console.log(formatAuditCSV(entries));
|
|
25
|
+
break;
|
|
26
|
+
default: {
|
|
27
|
+
console.log(chalk.blue(`Audit trail for ${project} (last ${days} days)\n`));
|
|
28
|
+
const table = new Table({
|
|
29
|
+
head: ['Time', 'Workflow', 'Trigger', 'Status', 'Cost', 'Duration', 'Tools'],
|
|
30
|
+
style: { head: [], border: [] },
|
|
31
|
+
});
|
|
32
|
+
for (const e of entries.slice(-20)) {
|
|
33
|
+
const time = e.timestamp.replace('T', ' ').slice(0, 19);
|
|
34
|
+
table.push([
|
|
35
|
+
time,
|
|
36
|
+
e.workflow,
|
|
37
|
+
e.triggeredBy,
|
|
38
|
+
e.success ? chalk.green('OK') : chalk.red('FAIL'),
|
|
39
|
+
`$${e.costUsd.toFixed(3)}`,
|
|
40
|
+
`${(e.durationMs / 1000).toFixed(0)}s`,
|
|
41
|
+
e.toolInvocations.length.toString(),
|
|
42
|
+
]);
|
|
43
|
+
}
|
|
44
|
+
console.log(table.toString());
|
|
45
|
+
console.log(chalk.dim(`\n${entries.length} entries total.`));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return cmd;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import Table from 'cli-table3';
|
|
4
|
+
import { executeEval } from '../lib/command-ops/eval-ops.js';
|
|
5
|
+
export function makeEvalCommand() {
|
|
6
|
+
const cmd = new Command('eval')
|
|
7
|
+
.description('Run evaluation test cases against a project workflow')
|
|
8
|
+
.argument('<project>', 'project name')
|
|
9
|
+
.option('--workflow <name>', 'filter by workflow name')
|
|
10
|
+
.option('--tag <tag>', 'filter by tag')
|
|
11
|
+
.option('--budget <usd>', 'max budget in USD', parseFloat)
|
|
12
|
+
.action(async (project, opts) => {
|
|
13
|
+
console.log(chalk.blue(`Running evals for ${project}...\n`));
|
|
14
|
+
try {
|
|
15
|
+
const summary = await executeEval(project, {
|
|
16
|
+
workflow: opts.workflow,
|
|
17
|
+
tag: opts.tag,
|
|
18
|
+
budget: opts.budget,
|
|
19
|
+
});
|
|
20
|
+
const table = new Table({
|
|
21
|
+
head: ['Test Case', 'Workflow', 'Status', 'Score', 'Cost', 'Reasoning'],
|
|
22
|
+
style: { head: [], border: [] },
|
|
23
|
+
});
|
|
24
|
+
for (const r of summary.results) {
|
|
25
|
+
table.push([
|
|
26
|
+
r.testCase,
|
|
27
|
+
r.workflow,
|
|
28
|
+
r.passed ? chalk.green('PASS') : chalk.red('FAIL'),
|
|
29
|
+
`${(r.score * 100).toFixed(0)}%`,
|
|
30
|
+
`$${r.costUsd.toFixed(4)}`,
|
|
31
|
+
r.reasoning.slice(0, 40),
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
console.log(table.toString());
|
|
35
|
+
console.log(`\n${chalk.bold('Summary:')} ${summary.passed}/${summary.totalCases} passed, avg score: ${(summary.avgScore * 100).toFixed(0)}%`);
|
|
36
|
+
if (summary.failed > 0) {
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return cmd;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAC5B,WAAW,CAAC,sDAAsD,CAAC;SACnE,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;SACrC,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC;SACtC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAI,EAAE,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,OAAO,OAAO,CAAC,CAAC,CAAC;QAE7D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE;gBACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;gBACtB,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC;gBACvE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;aAChC,CAAC,CAAC;YAEH,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC;oBACT,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;oBAClD,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;oBAChC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAC1B,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;iBACzB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,uBAAuB,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAE9I,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|