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.
Files changed (145) hide show
  1. package/README.md +40 -40
  2. package/dist/agents/improve.agent.d.ts +42 -1
  3. package/dist/agents/improve.agent.js +102 -7
  4. package/dist/agents/improve.agent.js.map +1 -1
  5. package/dist/agents/run.agent.d.ts +0 -1
  6. package/dist/agents/run.agent.js +10 -7
  7. package/dist/agents/run.agent.js.map +1 -1
  8. package/dist/cli.js +8 -3
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/audit.d.ts +2 -0
  11. package/dist/commands/audit.js +51 -0
  12. package/dist/commands/audit.js.map +1 -0
  13. package/dist/commands/eval.d.ts +2 -0
  14. package/dist/commands/eval.js +47 -0
  15. package/dist/commands/eval.js.map +1 -0
  16. package/dist/commands/improve.js +83 -5
  17. package/dist/commands/improve.js.map +1 -1
  18. package/dist/commands/init.js +17 -27
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/insights.js +63 -0
  21. package/dist/commands/insights.js.map +1 -1
  22. package/dist/commands/logs.d.ts +1 -0
  23. package/dist/commands/logs.js +23 -1
  24. package/dist/commands/logs.js.map +1 -1
  25. package/dist/commands/relay.js +250 -124
  26. package/dist/commands/relay.js.map +1 -1
  27. package/dist/commands/run.js +21 -2
  28. package/dist/commands/run.js.map +1 -1
  29. package/dist/commands/schedule.js +7 -1
  30. package/dist/commands/schedule.js.map +1 -1
  31. package/dist/commands/status.js +9 -2
  32. package/dist/commands/status.js.map +1 -1
  33. package/dist/lib/agent-runner.d.ts +5 -1
  34. package/dist/lib/agent-runner.js +41 -1
  35. package/dist/lib/agent-runner.js.map +1 -1
  36. package/dist/lib/audit.d.ts +7 -0
  37. package/dist/lib/audit.js +63 -0
  38. package/dist/lib/audit.js.map +1 -0
  39. package/dist/lib/callbacks.d.ts +12 -1
  40. package/dist/lib/callbacks.js +147 -19
  41. package/dist/lib/callbacks.js.map +1 -1
  42. package/dist/lib/command-ops/doctor-ops.js +41 -6
  43. package/dist/lib/command-ops/doctor-ops.js.map +1 -1
  44. package/dist/lib/command-ops/eval-ops.d.ts +7 -0
  45. package/dist/lib/command-ops/eval-ops.js +111 -0
  46. package/dist/lib/command-ops/eval-ops.js.map +1 -0
  47. package/dist/lib/command-ops/improve-ops.d.ts +14 -1
  48. package/dist/lib/command-ops/improve-ops.js +369 -17
  49. package/dist/lib/command-ops/improve-ops.js.map +1 -1
  50. package/dist/lib/command-ops/run-ops.d.ts +8 -1
  51. package/dist/lib/command-ops/run-ops.js +25 -4
  52. package/dist/lib/command-ops/run-ops.js.map +1 -1
  53. package/dist/lib/command-ops/secrets-migration-ops.js +1 -1
  54. package/dist/lib/command-ops/secrets-migration-ops.js.map +1 -1
  55. package/dist/lib/command-ops/status-ops.d.ts +1 -0
  56. package/dist/lib/command-ops/status-ops.js +19 -7
  57. package/dist/lib/command-ops/status-ops.js.map +1 -1
  58. package/dist/lib/config.js +3 -3
  59. package/dist/lib/config.js.map +1 -1
  60. package/dist/lib/cron.d.ts +1 -1
  61. package/dist/lib/cron.js +2 -2
  62. package/dist/lib/cron.js.map +1 -1
  63. package/dist/lib/global-config.js +1 -1
  64. package/dist/lib/global-config.js.map +1 -1
  65. package/dist/lib/observation.d.ts +60 -2
  66. package/dist/lib/observation.js +261 -13
  67. package/dist/lib/observation.js.map +1 -1
  68. package/dist/lib/registry.d.ts +0 -1
  69. package/dist/lib/registry.js +1 -1
  70. package/dist/lib/registry.js.map +1 -1
  71. package/dist/lib/relay/admin.d.ts +29 -0
  72. package/dist/lib/relay/admin.js +176 -0
  73. package/dist/lib/relay/admin.js.map +1 -0
  74. package/dist/lib/relay/bindings.d.ts +8 -0
  75. package/dist/lib/relay/bindings.js +50 -0
  76. package/dist/lib/relay/bindings.js.map +1 -0
  77. package/dist/lib/relay/config.d.ts +3 -3
  78. package/dist/lib/relay/config.js +18 -10
  79. package/dist/lib/relay/config.js.map +1 -1
  80. package/dist/lib/relay/context.d.ts +31 -0
  81. package/dist/lib/relay/context.js +118 -0
  82. package/dist/lib/relay/context.js.map +1 -0
  83. package/dist/lib/relay/db.d.ts +38 -0
  84. package/dist/lib/relay/db.js +252 -0
  85. package/dist/lib/relay/db.js.map +1 -0
  86. package/dist/lib/relay/executor.d.ts +2 -0
  87. package/dist/lib/relay/executor.js +108 -0
  88. package/dist/lib/relay/executor.js.map +1 -0
  89. package/dist/lib/relay/feedback.d.ts +29 -0
  90. package/dist/lib/relay/feedback.js +142 -0
  91. package/dist/lib/relay/feedback.js.map +1 -0
  92. package/dist/lib/relay/notifier.d.ts +30 -0
  93. package/dist/lib/relay/notifier.js +78 -0
  94. package/dist/lib/relay/notifier.js.map +1 -0
  95. package/dist/lib/relay/notify.d.ts +3 -4
  96. package/dist/lib/relay/notify.js +43 -159
  97. package/dist/lib/relay/notify.js.map +1 -1
  98. package/dist/lib/relay/platform.d.ts +52 -0
  99. package/dist/lib/relay/platform.js +5 -0
  100. package/dist/lib/relay/platform.js.map +1 -0
  101. package/dist/lib/relay/platforms/slack.d.ts +37 -0
  102. package/dist/lib/relay/platforms/slack.js +240 -0
  103. package/dist/lib/relay/platforms/slack.js.map +1 -0
  104. package/dist/lib/relay/platforms/telegram.d.ts +29 -0
  105. package/dist/lib/relay/platforms/telegram.js +193 -0
  106. package/dist/lib/relay/platforms/telegram.js.map +1 -0
  107. package/dist/lib/relay/poster.d.ts +24 -0
  108. package/dist/lib/relay/poster.js +136 -0
  109. package/dist/lib/relay/poster.js.map +1 -0
  110. package/dist/lib/relay/queue.d.ts +18 -0
  111. package/dist/lib/relay/queue.js +85 -0
  112. package/dist/lib/relay/queue.js.map +1 -0
  113. package/dist/lib/relay/router.d.ts +25 -2
  114. package/dist/lib/relay/router.js +259 -168
  115. package/dist/lib/relay/router.js.map +1 -1
  116. package/dist/lib/relay/service.d.ts +31 -7
  117. package/dist/lib/relay/service.js +281 -200
  118. package/dist/lib/relay/service.js.map +1 -1
  119. package/dist/lib/relay/types.d.ts +189 -34
  120. package/dist/lib/relay/types.js +68 -28
  121. package/dist/lib/relay/types.js.map +1 -1
  122. package/dist/lib/sandbox.d.ts +9 -1
  123. package/dist/lib/sandbox.js +17 -2
  124. package/dist/lib/sandbox.js.map +1 -1
  125. package/dist/lib/schedule.d.ts +4 -5
  126. package/dist/lib/schedule.js +7 -8
  127. package/dist/lib/schedule.js.map +1 -1
  128. package/dist/lib/secrets.js +11 -1
  129. package/dist/lib/secrets.js.map +1 -1
  130. package/dist/lib/types.d.ts +80 -0
  131. package/dist/lib/types.js +9 -1
  132. package/dist/lib/types.js.map +1 -1
  133. package/package.json +18 -18
  134. package/prompts/improve.yaml +114 -6
  135. package/prompts/relay.yaml +29 -0
  136. package/prompts/run.yaml +36 -2
  137. package/template/CLAUDE.md +34 -5
  138. package/template/RUNBOOK.md +5 -5
  139. package/template/evals/sample.json +16 -0
  140. package/template/memory/MEMORY.md +6 -0
  141. package/template/memory/procedures/.gitkeep +0 -0
  142. package/template/schedule.yaml +1 -1
  143. package/template/workflows/daily_feedback.ts +78 -2
  144. package/template/workflows/project_review.ts +51 -2
  145. 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 `plynx schedule tick` from a system cron entry and it figures out what's due.
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
- `plynx 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).
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
- plynx schedule status myproject # see what's scheduled, last/next runs
48
+ pilotlynx schedule status myproject # see what's scheduled, last/next runs
49
49
  ```
50
50
 
51
51
  ### Self-Improvement Loop
52
52
 
53
- `plynx improve` triggers a two-phase cycle that makes projects learn from their own run history:
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 `plynx improve`. Toggle in `plynx.yaml`:
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
- plynx insights # view cross-project insights
70
- plynx insights --since 2025-01-10 # filter by date
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
- plynx env myproject # dotenv format
101
- plynx env myproject --export # export KEY=value (eval-able)
102
- plynx env myproject --json # {"KEY": "value"}
103
- plynx link myproject --direnv # generate .envrc for MCP server ${VAR} expansion
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 `plynx 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.
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
- plynx init --name my-agents
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
- plynx.yaml # workspace marker
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 `plynx schedule tick` every 15 minutes.
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
- plynx project create myproject
181
+ pilotlynx project create myproject
182
182
 
183
183
  # Or adopt an existing directory (at any path)
184
- plynx project add myrepo --path /path/to/existing/repo
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
- plynx run myproject daily_feedback
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
- plynx verify myproject
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
- | `plynx init` | Create a new workspace |
219
- | `plynx project create <name>` | Scaffold a project from template |
220
- | `plynx project add <name> --path <dir>` | Add an existing directory as a project |
221
- | `plynx projects list` | List all projects with paths |
222
- | `plynx run <project> <workflow>` | Run a workflow with secrets injection |
223
- | `plynx verify <project>` | Validate project structure |
224
- | `plynx improve` | Run self-improvement loop across projects |
225
- | `plynx schedule tick` | Run due scheduled workflows |
226
- | `plynx schedule status <project>` | Show schedules, last/next run times, auto-improve state |
227
- | `plynx logs <project>` | View recent run logs (`--last`, `--workflow`, `--failures`) |
228
- | `plynx insights` | View cross-project insights (`--last`, `--since`) |
229
- | `plynx sync template <project>` | Apply template updates to a project |
230
- | `plynx env <project>` | Output policy-filtered secrets (`--export`, `--json`, `--envrc`) |
231
- | `plynx link <project>` | Configure a project for direct access (`--direnv` for `.envrc`) |
232
- | `plynx unlink <project>` | Remove direct-access configuration |
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 `plynx` command invokes a dedicated agent, making the CLI a convenience layer rather than the primary execution surface.
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.** `plynx project create foo` runs a "project-create" agent that scaffolds the directory from the template.
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: `plynx init` scaffolds the workspace directly since no workspace exists yet for agent context.
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
- plynx link myproject --direnv # generates .envrc with policy-filtered secrets
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
- - `plynx` works from the workspace root, from project directories (via global config), and from any other location.
332
- - `plynx link --direnv` generates `.envrc` for MCP servers that need secrets via `${VAR}` expansion.
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 declare function getImproveAgentConfig(logSummaries: Record<string, string>): AgentConfig;
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', { summaryText }),
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: 10,
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 string',
42
- additionalProperties: { type: 'string' },
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: 'string',
46
- description: 'Abstract cross-project learnings, no project names or secrets',
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;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoC;IACxE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,MAAM,OAAO,KAAK,OAAO,EAAE,CAAC;SACxD,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,WAAW,EAAE,CAAC;QACjE,GAAG,EAAE,aAAa,EAAE;QACpB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QACtC,2EAA2E;QAC3E,mFAAmF;QACnF,YAAY,EAAE,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,CAAE;QAC7D,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,mBAAmB,EAAE;QACjC,YAAY,EAAE;YACZ,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,eAAe,EAAE;wBACf,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,wCAAwC;wBACrD,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACzC;oBACD,oBAAoB,EAAE;wBACpB,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,+DAA+D;qBAC7E;iBACF;gBACD,QAAQ,EAAE,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;aACtD;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"improve.agent.js","sourceRoot":"","sources":["../../src/agents/improve.agent.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,2 @@
1
1
  import type { AgentConfig } from '../lib/types.js';
2
- export { pathEnforcementCallback } from '../lib/callbacks.js';
3
2
  export declare function getRunAgentConfig(project: string, workflow: string, projectEnv: Record<string, string>, feedbackPrompt?: string): AgentConfig;
@@ -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(`[plynx] Filesystem sandbox: ${sandbox.mechanism} (kernel-level isolation)`);
16
+ console.error(`[pilotlynx] Filesystem sandbox: ${sandbox.mechanism} (kernel-level isolation)`);
18
17
  }
19
18
  else {
20
- console.error('[plynx] Filesystem sandbox: regex-only (bwrap not available)');
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: [SHARED_DOCS_DIR(), INSIGHTS_DIR()],
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: pathEnforcementCallback(projectDir, [SHARED_DOCS_DIR(), INSIGHTS_DIR()]),
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,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,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,+BAA+B,OAAO,CAAC,SAAS,2BAA2B,CAAC,CAAC;IAC7F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAChF,CAAC;IAED,OAAO;QACL,MAAM;QACN,GAAG,EAAE,UAAU;QACf,qBAAqB,EAAE,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,CAAC;QAC1D,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,EAAE;QACZ,UAAU,EAAE,uBAAuB,CAAC,UAAU,EAAE,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;KACrF,CAAC;AACJ,CAAC"}
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('plynx')
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 — plynx manages projects by default)
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":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function makeAuditCommand(): Command;
@@ -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,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function makeEvalCommand(): Command;
@@ -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"}