@codespar/cli 0.12.1 → 0.14.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 +54 -1
- package/dist/api.js +1 -3
- package/dist/api.js.map +1 -1
- package/dist/commands/agent.js +260 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/init.js +91 -23
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mandate-revoke.js +30 -0
- package/dist/commands/mandate-revoke.js.map +1 -0
- package/dist/config.js +8 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +36 -3
- package/dist/index.js.map +1 -1
- package/dist/surface.js +1 -1
- package/dist/surface.js.map +1 -1
- package/package.json +3 -1
- package/templates/bills-agent/LICENSE +21 -0
- package/templates/bills-agent/README.md +21 -0
- package/templates/bills-agent/_gitignore +10 -0
- package/templates/bills-agent/agents/bills-agent/.env.example +7 -0
- package/templates/bills-agent/agents/bills-agent/AGENTS.md +16 -0
- package/templates/bills-agent/agents/bills-agent/CLAUDE.md +16 -0
- package/templates/bills-agent/agents/bills-agent/README.md +89 -0
- package/templates/bills-agent/agents/bills-agent/SYSTEM_PROMPT.md +23 -0
- package/templates/bills-agent/agents/bills-agent/agent.yaml +26 -0
- package/templates/bills-agent/agents/bills-agent/channels/terminal/index.ts +108 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/beneficiary-swap-mandate.json +9 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/beneficiary-swap.json +10 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/beneficiary-swap.transcript.jsonl +2 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/exfiltration.json +13 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/exfiltration.transcript.jsonl +3 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/false-authority.json +9 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/false-authority.transcript.jsonl +3 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/fractioning.json +15 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/fractioning.transcript.jsonl +6 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/model-total.json +10 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/model-total.transcript.jsonl +2 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/prompt-injection.json +9 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/prompt-injection.transcript.jsonl +2 -0
- package/templates/bills-agent/agents/bills-agent/evals/adversarial/webhook-replay.json +9 -0
- package/templates/bills-agent/agents/bills-agent/evals/eval.yaml +9 -0
- package/templates/bills-agent/agents/bills-agent/guardrails.json +15 -0
- package/templates/bills-agent/agents/bills-agent/mandate.example.json +46 -0
- package/templates/bills-agent/agents/bills-agent/package.json +24 -0
- package/templates/bills-agent/agents/bills-agent/runbook.md +19 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/beneficiary-not-allowed.json +14 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/beneficiary-not-allowed.transcript.jsonl +2 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/cap-exceeded.json +12 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/cap-exceeded.transcript.jsonl +2 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/escalated-above-threshold.json +20 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/escalated-above-threshold.transcript.jsonl +7 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/happy-path.json +14 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/happy-path.transcript.jsonl +3 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/mandate-revoked.json +21 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/mandate-revoked.transcript.jsonl +9 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/prompt-injection.json +12 -0
- package/templates/bills-agent/agents/bills-agent/scenarios/prompt-injection.transcript.jsonl +2 -0
- package/templates/bills-agent/agents/bills-agent/src/adversarial.ts +177 -0
- package/templates/bills-agent/agents/bills-agent/src/bills.ts +28 -0
- package/templates/bills-agent/agents/bills-agent/src/commands/approve.ts +9 -0
- package/templates/bills-agent/agents/bills-agent/src/commands/check.ts +13 -0
- package/templates/bills-agent/agents/bills-agent/src/commands/consent.ts +26 -0
- package/templates/bills-agent/agents/bills-agent/src/commands/decide.ts +45 -0
- package/templates/bills-agent/agents/bills-agent/src/commands/deny.ts +7 -0
- package/templates/bills-agent/agents/bills-agent/src/commands/eval.ts +37 -0
- package/templates/bills-agent/agents/bills-agent/src/commands/reconcile.ts +38 -0
- package/templates/bills-agent/agents/bills-agent/src/commands/rerun.ts +65 -0
- package/templates/bills-agent/agents/bills-agent/src/commands/resume.ts +30 -0
- package/templates/bills-agent/agents/bills-agent/src/main.ts +185 -0
- package/templates/bills-agent/agents/bills-agent/src/modules/embedded-consent.ts +125 -0
- package/templates/bills-agent/agents/bills-agent/src/modules/pix-out.ts +73 -0
- package/templates/bills-agent/agents/bills-agent/src/scenarios.ts +196 -0
- package/templates/bills-agent/agents/bills-agent/src/setup.ts +207 -0
- package/templates/bills-agent/agents/bills-agent/test/adversarial.test.ts +40 -0
- package/templates/bills-agent/agents/bills-agent/test/check.test.ts +85 -0
- package/templates/bills-agent/agents/bills-agent/test/cli.test.ts +177 -0
- package/templates/bills-agent/agents/bills-agent/test/scenarios.test.ts +73 -0
- package/templates/bills-agent/agents/bills-agent/tools.json +51 -0
- package/templates/bills-agent/agents/bills-agent/tsconfig.json +11 -0
- package/templates/bills-agent/package.json +34 -0
- package/templates/bills-agent/packages/agent-core/README.md +19 -0
- package/templates/bills-agent/packages/agent-core/package.json +24 -0
- package/templates/bills-agent/packages/agent-core/src/agent.ts +125 -0
- package/templates/bills-agent/packages/agent-core/src/api/charge-rail.ts +154 -0
- package/templates/bills-agent/packages/agent-core/src/api/client.ts +53 -0
- package/templates/bills-agent/packages/agent-core/src/api/mandate-status.ts +58 -0
- package/templates/bills-agent/packages/agent-core/src/api/rail.ts +101 -0
- package/templates/bills-agent/packages/agent-core/src/api/sandbox-payer.ts +45 -0
- package/templates/bills-agent/packages/agent-core/src/approval.ts +109 -0
- package/templates/bills-agent/packages/agent-core/src/bundle.ts +113 -0
- package/templates/bills-agent/packages/agent-core/src/check.ts +171 -0
- package/templates/bills-agent/packages/agent-core/src/engine.ts +784 -0
- package/templates/bills-agent/packages/agent-core/src/escalate.ts +85 -0
- package/templates/bills-agent/packages/agent-core/src/events.ts +40 -0
- package/templates/bills-agent/packages/agent-core/src/guardrails.ts +45 -0
- package/templates/bills-agent/packages/agent-core/src/hash.ts +49 -0
- package/templates/bills-agent/packages/agent-core/src/ids.ts +10 -0
- package/templates/bills-agent/packages/agent-core/src/index.ts +29 -0
- package/templates/bills-agent/packages/agent-core/src/mandate.ts +100 -0
- package/templates/bills-agent/packages/agent-core/src/manifest.ts +76 -0
- package/templates/bills-agent/packages/agent-core/src/providers/anthropic.ts +76 -0
- package/templates/bills-agent/packages/agent-core/src/providers/replay.ts +63 -0
- package/templates/bills-agent/packages/agent-core/src/providers/types.ts +39 -0
- package/templates/bills-agent/packages/agent-core/src/rail.ts +87 -0
- package/templates/bills-agent/packages/agent-core/src/revocation.ts +30 -0
- package/templates/bills-agent/packages/agent-core/src/secrets.ts +30 -0
- package/templates/bills-agent/packages/agent-core/src/state/store.ts +307 -0
- package/templates/bills-agent/packages/agent-core/src/state-machine.ts +146 -0
- package/templates/bills-agent/packages/agent-core/src/stubs/charge-rail.ts +193 -0
- package/templates/bills-agent/packages/agent-core/src/stubs/mandate-status.ts +57 -0
- package/templates/bills-agent/packages/agent-core/src/stubs/rail.ts +124 -0
- package/templates/bills-agent/packages/agent-core/src/tools.ts +55 -0
- package/templates/bills-agent/packages/agent-core/src/types.ts +106 -0
- package/templates/bills-agent/packages/agent-core/test/approval.test.ts +83 -0
- package/templates/bills-agent/packages/agent-core/test/engine.test.ts +524 -0
- package/templates/bills-agent/packages/agent-core/test/escalate.test.ts +42 -0
- package/templates/bills-agent/packages/agent-core/test/helpers.ts +139 -0
- package/templates/bills-agent/packages/agent-core/test/mandate-status.test.ts +153 -0
- package/templates/bills-agent/packages/agent-core/test/manifest.test.ts +45 -0
- package/templates/bills-agent/packages/agent-core/test/receivables.test.ts +265 -0
- package/templates/bills-agent/packages/agent-core/test/secrets.test.ts +28 -0
- package/templates/bills-agent/packages/agent-core/test/state-machine.test.ts +67 -0
- package/templates/bills-agent/packages/agent-core/test/transitions.type-test.ts +59 -0
- package/templates/bills-agent/packages/agent-core/tsconfig.json +10 -0
- package/templates/bills-agent/tsconfig.base.json +16 -0
- package/templates/bills-agent/vitest.config.ts +12 -0
- package/templates/collections-agent/LICENSE +21 -0
- package/templates/collections-agent/README.md +20 -0
- package/templates/collections-agent/_gitignore +10 -0
- package/templates/collections-agent/agents/collections-agent/.env.example +4 -0
- package/templates/collections-agent/agents/collections-agent/AGENTS.md +19 -0
- package/templates/collections-agent/agents/collections-agent/CLAUDE.md +19 -0
- package/templates/collections-agent/agents/collections-agent/README.md +94 -0
- package/templates/collections-agent/agents/collections-agent/SYSTEM_PROMPT.md +31 -0
- package/templates/collections-agent/agents/collections-agent/agent.yaml +28 -0
- package/templates/collections-agent/agents/collections-agent/channels/terminal/index.ts +178 -0
- package/templates/collections-agent/agents/collections-agent/channels/webhook/index.ts +131 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/beneficiary-swap-mandate.json +11 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/beneficiary-swap.json +12 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/beneficiary-swap.transcript.jsonl +2 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/exfiltration.json +19 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/exfiltration.transcript.jsonl +3 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/false-authority.json +11 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/false-authority.transcript.jsonl +2 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/fractioning.json +12 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/fractioning.transcript.jsonl +4 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/model-total.json +13 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/model-total.transcript.jsonl +2 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/prompt-injection.json +12 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/prompt-injection.transcript.jsonl +2 -0
- package/templates/collections-agent/agents/collections-agent/evals/adversarial/webhook-replay.json +11 -0
- package/templates/collections-agent/agents/collections-agent/evals/eval.yaml +11 -0
- package/templates/collections-agent/agents/collections-agent/guardrails.json +20 -0
- package/templates/collections-agent/agents/collections-agent/mandate.example.json +40 -0
- package/templates/collections-agent/agents/collections-agent/package.json +29 -0
- package/templates/collections-agent/agents/collections-agent/runbook.md +27 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/beneficiary-not-allowed.json +42 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/beneficiary-not-allowed.transcript.jsonl +3 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/cap-exceeded.json +27 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/cap-exceeded.transcript.jsonl +3 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/charge-expired.json +36 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/charge-expired.transcript.jsonl +4 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/escalated-above-threshold.json +49 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/escalated-above-threshold.transcript.jsonl +5 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/happy-path.json +60 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/happy-path.transcript.jsonl +4 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/instalments.json +49 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/instalments.transcript.jsonl +4 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/mandate-revoked.json +42 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/mandate-revoked.transcript.jsonl +6 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/prompt-injection.json +27 -0
- package/templates/collections-agent/agents/collections-agent/scenarios/prompt-injection.transcript.jsonl +2 -0
- package/templates/collections-agent/agents/collections-agent/src/adversarial.ts +190 -0
- package/templates/collections-agent/agents/collections-agent/src/agreements.ts +45 -0
- package/templates/collections-agent/agents/collections-agent/src/commands/approve.ts +10 -0
- package/templates/collections-agent/agents/collections-agent/src/commands/check.ts +13 -0
- package/templates/collections-agent/agents/collections-agent/src/commands/decide.ts +48 -0
- package/templates/collections-agent/agents/collections-agent/src/commands/deny.ts +7 -0
- package/templates/collections-agent/agents/collections-agent/src/commands/eval.ts +39 -0
- package/templates/collections-agent/agents/collections-agent/src/commands/poll.ts +35 -0
- package/templates/collections-agent/agents/collections-agent/src/commands/reconcile.ts +38 -0
- package/templates/collections-agent/agents/collections-agent/src/commands/rerun.ts +55 -0
- package/templates/collections-agent/agents/collections-agent/src/commands/resume.ts +30 -0
- package/templates/collections-agent/agents/collections-agent/src/commands/webhook.ts +36 -0
- package/templates/collections-agent/agents/collections-agent/src/envelope.ts +103 -0
- package/templates/collections-agent/agents/collections-agent/src/main.ts +193 -0
- package/templates/collections-agent/agents/collections-agent/src/modules/bolepix-receivables.ts +105 -0
- package/templates/collections-agent/agents/collections-agent/src/poll.ts +94 -0
- package/templates/collections-agent/agents/collections-agent/src/scenarios.ts +252 -0
- package/templates/collections-agent/agents/collections-agent/src/setup.ts +250 -0
- package/templates/collections-agent/agents/collections-agent/test/adversarial.test.ts +45 -0
- package/templates/collections-agent/agents/collections-agent/test/check.test.ts +51 -0
- package/templates/collections-agent/agents/collections-agent/test/cli.test.ts +172 -0
- package/templates/collections-agent/agents/collections-agent/test/envelope.test.ts +53 -0
- package/templates/collections-agent/agents/collections-agent/test/fixtures/accept-1042.transcript.jsonl +2 -0
- package/templates/collections-agent/agents/collections-agent/test/fixtures/accept-1103.transcript.jsonl +2 -0
- package/templates/collections-agent/agents/collections-agent/test/scenarios.test.ts +95 -0
- package/templates/collections-agent/agents/collections-agent/test/webhook.test.ts +100 -0
- package/templates/collections-agent/agents/collections-agent/tools.json +40 -0
- package/templates/collections-agent/agents/collections-agent/tsconfig.json +11 -0
- package/templates/collections-agent/package.json +35 -0
- package/templates/collections-agent/packages/agent-core/README.md +19 -0
- package/templates/collections-agent/packages/agent-core/package.json +24 -0
- package/templates/collections-agent/packages/agent-core/src/agent.ts +125 -0
- package/templates/collections-agent/packages/agent-core/src/api/charge-rail.ts +154 -0
- package/templates/collections-agent/packages/agent-core/src/api/client.ts +53 -0
- package/templates/collections-agent/packages/agent-core/src/api/mandate-status.ts +58 -0
- package/templates/collections-agent/packages/agent-core/src/api/rail.ts +101 -0
- package/templates/collections-agent/packages/agent-core/src/api/sandbox-payer.ts +45 -0
- package/templates/collections-agent/packages/agent-core/src/approval.ts +109 -0
- package/templates/collections-agent/packages/agent-core/src/bundle.ts +113 -0
- package/templates/collections-agent/packages/agent-core/src/check.ts +171 -0
- package/templates/collections-agent/packages/agent-core/src/engine.ts +784 -0
- package/templates/collections-agent/packages/agent-core/src/escalate.ts +85 -0
- package/templates/collections-agent/packages/agent-core/src/events.ts +40 -0
- package/templates/collections-agent/packages/agent-core/src/guardrails.ts +45 -0
- package/templates/collections-agent/packages/agent-core/src/hash.ts +49 -0
- package/templates/collections-agent/packages/agent-core/src/ids.ts +10 -0
- package/templates/collections-agent/packages/agent-core/src/index.ts +29 -0
- package/templates/collections-agent/packages/agent-core/src/mandate.ts +100 -0
- package/templates/collections-agent/packages/agent-core/src/manifest.ts +76 -0
- package/templates/collections-agent/packages/agent-core/src/providers/anthropic.ts +76 -0
- package/templates/collections-agent/packages/agent-core/src/providers/replay.ts +63 -0
- package/templates/collections-agent/packages/agent-core/src/providers/types.ts +39 -0
- package/templates/collections-agent/packages/agent-core/src/rail.ts +87 -0
- package/templates/collections-agent/packages/agent-core/src/revocation.ts +30 -0
- package/templates/collections-agent/packages/agent-core/src/secrets.ts +30 -0
- package/templates/collections-agent/packages/agent-core/src/state/store.ts +307 -0
- package/templates/collections-agent/packages/agent-core/src/state-machine.ts +146 -0
- package/templates/collections-agent/packages/agent-core/src/stubs/charge-rail.ts +193 -0
- package/templates/collections-agent/packages/agent-core/src/stubs/mandate-status.ts +57 -0
- package/templates/collections-agent/packages/agent-core/src/stubs/rail.ts +124 -0
- package/templates/collections-agent/packages/agent-core/src/tools.ts +55 -0
- package/templates/collections-agent/packages/agent-core/src/types.ts +106 -0
- package/templates/collections-agent/packages/agent-core/test/approval.test.ts +83 -0
- package/templates/collections-agent/packages/agent-core/test/engine.test.ts +524 -0
- package/templates/collections-agent/packages/agent-core/test/escalate.test.ts +42 -0
- package/templates/collections-agent/packages/agent-core/test/helpers.ts +139 -0
- package/templates/collections-agent/packages/agent-core/test/mandate-status.test.ts +153 -0
- package/templates/collections-agent/packages/agent-core/test/manifest.test.ts +45 -0
- package/templates/collections-agent/packages/agent-core/test/receivables.test.ts +265 -0
- package/templates/collections-agent/packages/agent-core/test/secrets.test.ts +28 -0
- package/templates/collections-agent/packages/agent-core/test/state-machine.test.ts +67 -0
- package/templates/collections-agent/packages/agent-core/test/transitions.type-test.ts +59 -0
- package/templates/collections-agent/packages/agent-core/tsconfig.json +10 -0
- package/templates/collections-agent/tsconfig.base.json +16 -0
- package/templates/collections-agent/vitest.config.ts +12 -0
- package/templates/kits.lock.json +41 -0
package/README.md
CHANGED
|
@@ -84,7 +84,10 @@ codespar init my-agent
|
|
|
84
84
|
| `triggers <sub>` | Triggers (webhooks): endpoints, deliveries, DLQ, secret rotation, redelivery |
|
|
85
85
|
| `execute <tool>` | Run a single tool call in a throwaway session |
|
|
86
86
|
| `discover <query>` | Search the catalog for tools matching a use case |
|
|
87
|
+
| `agent run <dir>` | Run one turn of an agent directory built on `@codespar/agent-core` (`--input`, `--approve`/`--deny`) through its own `npm start`; same output, same exit code |
|
|
88
|
+
| `eval <dir>` | Run the agent's `npm run check` + `npm run eval` (adversarial suite and scenarios), one line per case; exit 1 on any failure |
|
|
87
89
|
| `mandate create` | Create a consumer mandate — the agent's allowance. `--slot CURRENCY:METHOD:CAP:PER_TX` (repeatable, e.g. `BRL:pix:50000:1500`) for a unified multi-currency wallet; per-currency caps, no FX |
|
|
90
|
+
| `mandate revoke <id>` | Revoke a consumer mandate (`POST /v1/mandates/{id}/revoke`); active or paused → revoked, terminal. `--reason` goes to the evidence row |
|
|
88
91
|
| `wallet <consumer>` | Show the consumer's unified wallet, rolled up per currency |
|
|
89
92
|
| `transfer <consumer>` | Move value between wallet slots (`--from --to --amount [--execute]`); a cross-currency move is a real ramp trade at the real rate, no FX |
|
|
90
93
|
| `spend` | Execute an agentic spend against a mandate (x402 / USDC / Pix, routed by payee) |
|
|
@@ -102,7 +105,7 @@ codespar init my-agent
|
|
|
102
105
|
| `connect start <server>` | Start an OAuth Connect Link flow (add `--open`) |
|
|
103
106
|
| `connect revoke <server>` | Revoke a connection |
|
|
104
107
|
| `logs tail` | Stream tool-call logs in real time (SSE) |
|
|
105
|
-
| `init <name
|
|
108
|
+
| `init <name> [--template <slug>]` | Scaffold a new commerce agent from a template; `init --list` shows them |
|
|
106
109
|
|
|
107
110
|
## Global flags
|
|
108
111
|
|
|
@@ -141,12 +144,62 @@ Resolution order (first match wins):
|
|
|
141
144
|
|
|
142
145
|
## Templates
|
|
143
146
|
|
|
147
|
+
`codespar init --list` prints this table from the package itself, with a
|
|
148
|
+
one-line description per template.
|
|
149
|
+
|
|
144
150
|
| Slug | Stack |
|
|
145
151
|
|------|-------|
|
|
146
152
|
| `pix-agent` | Node + OpenAI — minimal Pix charge + WhatsApp notify |
|
|
147
153
|
| `ecommerce-checkout` | Node + Claude — full Complete Loop |
|
|
148
154
|
| `streaming-chat` | Next.js + Vercel AI — token-by-token streaming |
|
|
149
155
|
| `multi-tenant` | Next.js + OpenAI — one API key, N tenants |
|
|
156
|
+
| `bills-agent` | Starter kit — the titular's agent pays the month's bills under a signed mandate (`@codespar/agent-core`) |
|
|
157
|
+
| `collections-agent` | Starter kit — the merchant's agent collects: bolepix per instalment, closes on paid/expired (`@codespar/agent-core`) |
|
|
158
|
+
|
|
159
|
+
### Starter-kit templates
|
|
160
|
+
|
|
161
|
+
`bills-agent` and `collections-agent` are the agents of
|
|
162
|
+
[codespar/agent-starter-kits](https://github.com/codespar/agent-starter-kits),
|
|
163
|
+
copied into this package at release time. `init` never fetches them: what it
|
|
164
|
+
scaffolds is what the published tarball carries, so it works offline and two
|
|
165
|
+
installs of the same CLI version scaffold the same bytes.
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
codespar init my-bills --template bills-agent
|
|
169
|
+
cd my-bills
|
|
170
|
+
cp agents/bills-agent/.env.example agents/bills-agent/.env # then fill in your keys
|
|
171
|
+
npm install
|
|
172
|
+
npm run consent -- --yes
|
|
173
|
+
npm start
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
The scaffold mirrors the kits repository: `agents/<name>/` and
|
|
177
|
+
`packages/agent-core/` are the kits' own files, byte for byte, under a
|
|
178
|
+
generated root `package.json` that links them as an npm workspace.
|
|
179
|
+
`@codespar/agent-core` is not published on npm yet, so it travels vendored,
|
|
180
|
+
and the agent's own `"@codespar/agent-core": "0.1.0"` pin resolves to that
|
|
181
|
+
copy exactly as it does in the kits repository. Nothing inside the kit is
|
|
182
|
+
rewritten: `agent.yaml` keeps the kits' `cli:` and `mcp:` pins, and every
|
|
183
|
+
relative path (`../../tsconfig.base.json`, the `.env` the agent reads from
|
|
184
|
+
its own directory, the paths its README names) keeps resolving.
|
|
185
|
+
|
|
186
|
+
`templates/kits.lock.json` records which kits ref was synced (tag or commit),
|
|
187
|
+
the commit it resolved to, and a content hash per template. The release gate
|
|
188
|
+
(`npm run check:kit-templates`, run in CI and in the publish workflow)
|
|
189
|
+
fetches that ref again, rebuilds the templates and fails if the packaged
|
|
190
|
+
trees differ from the lock by a byte — a hand-edited template or a lock
|
|
191
|
+
bumped without a sync does not ship.
|
|
192
|
+
|
|
193
|
+
**To bump the kits** to a new tag or commit, from `packages/cli`:
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
npm run sync:kit-templates -- --ref <tag-or-sha> # rewrites templates/<kit>/ and the lock
|
|
197
|
+
git add templates && git commit
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
then bump this package's version (new template content is at least a minor).
|
|
201
|
+
Without `--ref` the sync re-runs at the locked ref, which is the way to
|
|
202
|
+
regenerate the trees after a change to the sync script itself.
|
|
150
203
|
|
|
151
204
|
## Need more?
|
|
152
205
|
|
package/dist/api.js
CHANGED
|
@@ -16,13 +16,11 @@ import { VERSION } from "./version.js";
|
|
|
16
16
|
*/
|
|
17
17
|
export class HttpError extends CliError {
|
|
18
18
|
status;
|
|
19
|
-
code;
|
|
20
19
|
body;
|
|
21
20
|
constructor(message, opts) {
|
|
22
|
-
super(message);
|
|
21
|
+
super(message, { code: opts.code });
|
|
23
22
|
this.name = "HttpError";
|
|
24
23
|
this.status = opts.status;
|
|
25
|
-
this.code = opts.code;
|
|
26
24
|
this.body = opts.body;
|
|
27
25
|
}
|
|
28
26
|
}
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,SAAU,SAAQ,QAAQ;IAC5B,MAAM,CAAS;IACf,IAAI,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codespar agent run <dir>` and `codespar eval <dir>`: the CLI as the home
|
|
3
|
+
* of the agent commands (agent-starter-kits, spec v5.1.1 §14.4–14.5).
|
|
4
|
+
*
|
|
5
|
+
* Neither command re-implements the runtime. An agent directory carries its
|
|
6
|
+
* own entry (`npm start`) and its own gates (`npm run check`, `npm run
|
|
7
|
+
* eval`); the CLI resolves the directory's manifest, refuses what is not a
|
|
8
|
+
* `schema: 1` agent, and delegates to those scripts with the same arguments.
|
|
9
|
+
*
|
|
10
|
+
* NAO cite `@codespar/agent-core` no texto que o usuario le. O pacote nao
|
|
11
|
+
* esta publicado no npm: ele mora em `packages/agent-core` do repo
|
|
12
|
+
* `codespar/agent-starter-kits`, e `init --template` o VENDORIZA dentro do
|
|
13
|
+
* projeto gerado (#173). Mandar instalar um pacote que responde 404 e
|
|
14
|
+
* exatamente a falha que estas mensagens existem para evitar. O contrato e
|
|
15
|
+
* o `agent.yaml` mais o `npm start`, e e isso que elas dizem. That is what makes
|
|
16
|
+
* `codespar agent run <dir> --input X` and `npm start -- --input X` the same
|
|
17
|
+
* command: one process, one output.
|
|
18
|
+
*/
|
|
19
|
+
import { spawn } from "node:child_process";
|
|
20
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
21
|
+
import { join, resolve } from "node:path";
|
|
22
|
+
import { CliError } from "../config.js";
|
|
23
|
+
import { c, info, json } from "../output.js";
|
|
24
|
+
/** `agent.yaml` schema this CLI knows how to run. */
|
|
25
|
+
export const SUPPORTED_MANIFEST_SCHEMA = 1;
|
|
26
|
+
/**
|
|
27
|
+
* The top-level scalar fields of a YAML document: `key: value` lines at
|
|
28
|
+
* column zero, comments and quotes stripped.
|
|
29
|
+
*
|
|
30
|
+
* Deliberately not a YAML parser. The CLI needs three fields to decide
|
|
31
|
+
* whether a directory is an agent it can run — `schema`, `name`,
|
|
32
|
+
* `version` — and all three are top-level scalars by the manifest schema
|
|
33
|
+
* (`packages/agent-core/src/manifest.ts` in agent-starter-kits). Full
|
|
34
|
+
* validation of the manifest is `npm run check`'s job, which `codespar
|
|
35
|
+
* eval` runs; pulling a YAML dependency into the CLI to read three lines
|
|
36
|
+
* would be a runtime dependency for nothing.
|
|
37
|
+
*/
|
|
38
|
+
export function topLevelScalars(text) {
|
|
39
|
+
const out = {};
|
|
40
|
+
for (const line of text.split(/\r?\n/)) {
|
|
41
|
+
const m = /^([A-Za-z_][A-Za-z0-9_-]*):[ \t]*(.*)$/.exec(line);
|
|
42
|
+
if (!m)
|
|
43
|
+
continue;
|
|
44
|
+
let value = m[2];
|
|
45
|
+
// Strip a trailing comment. A `#` inside quotes is part of the value.
|
|
46
|
+
const quoted = /^(["'])(.*?)\1/.exec(value);
|
|
47
|
+
if (quoted)
|
|
48
|
+
value = quoted[2];
|
|
49
|
+
else
|
|
50
|
+
value = value.replace(/\s+#.*$/, "").replace(/^#.*$/, "").trim();
|
|
51
|
+
if (value !== "")
|
|
52
|
+
out[m[1]] = value;
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve an agent directory: it exists, it carries an `agent.yaml` that
|
|
58
|
+
* declares `schema: 1`, and it has a package.json with scripts to delegate
|
|
59
|
+
* to. Each refusal has a stable `code` so a script can tell "not an agent
|
|
60
|
+
* directory" from "an agent of a schema this CLI does not know".
|
|
61
|
+
*/
|
|
62
|
+
export function resolveAgentDir(input) {
|
|
63
|
+
const dir = resolve(input);
|
|
64
|
+
const manifestPath = join(dir, "agent.yaml");
|
|
65
|
+
if (!existsSync(manifestPath)) {
|
|
66
|
+
throw new CliError(`${dir} has no agent.yaml. \`codespar agent run\` and \`codespar eval\` take a directory that has an agent.yaml (schema: 1) and an \`npm start\`. \`codespar init --template bills-agent\` scaffolds one; the kits live in codespar/agent-starter-kits.`, { code: "agent_manifest_missing" });
|
|
67
|
+
}
|
|
68
|
+
const fields = topLevelScalars(readFileSync(manifestPath, "utf8"));
|
|
69
|
+
const schema = fields["schema"];
|
|
70
|
+
if (schema === undefined) {
|
|
71
|
+
throw new CliError(`${manifestPath} declares no \`schema\`; this CLI runs schema ${SUPPORTED_MANIFEST_SCHEMA}.`, {
|
|
72
|
+
code: "agent_manifest_schema_missing",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (Number(schema) !== SUPPORTED_MANIFEST_SCHEMA) {
|
|
76
|
+
throw new CliError(`${manifestPath} declares schema ${schema}; this CLI runs schema ${SUPPORTED_MANIFEST_SCHEMA}. Upgrade @codespar/cli, or pin the one agent.yaml names.`, { code: "agent_manifest_unsupported_schema" });
|
|
77
|
+
}
|
|
78
|
+
const packagePath = join(dir, "package.json");
|
|
79
|
+
if (!existsSync(packagePath)) {
|
|
80
|
+
throw new CliError(`${dir} has no package.json; the agent's entry is its \`npm start\`.`, {
|
|
81
|
+
code: "agent_package_missing",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
let scripts = {};
|
|
85
|
+
try {
|
|
86
|
+
const parsed = JSON.parse(readFileSync(packagePath, "utf8"));
|
|
87
|
+
scripts = parsed.scripts ?? {};
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
throw new CliError(`${packagePath} is not valid JSON.`, { code: "agent_package_invalid" });
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
dir,
|
|
94
|
+
manifestPath,
|
|
95
|
+
name: fields["name"] ?? null,
|
|
96
|
+
version: fields["version"] ?? null,
|
|
97
|
+
scripts,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function requireScript(agent, script) {
|
|
101
|
+
if (!agent.scripts[script]) {
|
|
102
|
+
throw new CliError(`${agent.dir}/package.json has no \`${script}\` script. An agent directory delegates to \`npm run ${script}\`; add the script, or point the command at a directory that has one (the kits in codespar/agent-starter-kits do).`, { code: "agent_script_missing" });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const NPM = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
106
|
+
/**
|
|
107
|
+
* `npm run <script> --silent -- <args>` in the agent directory.
|
|
108
|
+
*
|
|
109
|
+
* `--silent` matters for `--json`: without it npm prints its
|
|
110
|
+
* `> name@version start` banner on STDOUT, ahead of the agent's document,
|
|
111
|
+
* and the contract is valid JSON and nothing else there.
|
|
112
|
+
*/
|
|
113
|
+
function npmArgs(script, args) {
|
|
114
|
+
return ["run", script, "--silent", "--", ...args];
|
|
115
|
+
}
|
|
116
|
+
function spawnScript(agent, script, args, stdout) {
|
|
117
|
+
return new Promise((done, fail) => {
|
|
118
|
+
const child = spawn(NPM, npmArgs(script, args), {
|
|
119
|
+
cwd: agent.dir,
|
|
120
|
+
stdio: ["inherit", stdout, "inherit"],
|
|
121
|
+
shell: process.platform === "win32",
|
|
122
|
+
});
|
|
123
|
+
let captured = "";
|
|
124
|
+
child.stdout?.on("data", (chunk) => (captured += String(chunk)));
|
|
125
|
+
child.on("error", fail);
|
|
126
|
+
child.on("close", (status, signal) => done({ status, signal, stdout: captured }));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The argument list handed to the agent's entry: the CLI's flags in the
|
|
131
|
+
* spelling `src/main.ts` of a kit agent parses. Pure, so the mapping is
|
|
132
|
+
* testable without a process.
|
|
133
|
+
*/
|
|
134
|
+
export function agentRunArgs(opts) {
|
|
135
|
+
if (opts.approve && opts.deny) {
|
|
136
|
+
throw new CliError("--approve and --deny are mutually exclusive.", { code: "agent_decision_conflict" });
|
|
137
|
+
}
|
|
138
|
+
const args = [];
|
|
139
|
+
if (opts.input !== undefined)
|
|
140
|
+
args.push("--input", opts.input);
|
|
141
|
+
if (opts.approve)
|
|
142
|
+
args.push("--approve");
|
|
143
|
+
if (opts.deny)
|
|
144
|
+
args.push("--deny");
|
|
145
|
+
if (opts.json)
|
|
146
|
+
args.push("--json");
|
|
147
|
+
return args;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Run one turn (or the interactive terminal, without `--input`) of the
|
|
151
|
+
* agent in `dir`, through its own `npm start`. stdout and stderr are the
|
|
152
|
+
* child's, untouched: with `--json` the document on stdout is the agent's
|
|
153
|
+
* own, and the exit code is the agent's own (a kit agent answers 3 when an
|
|
154
|
+
* execution is still in flight).
|
|
155
|
+
*/
|
|
156
|
+
export async function agentRunCommand(dir, opts) {
|
|
157
|
+
const agent = resolveAgentDir(dir);
|
|
158
|
+
requireScript(agent, "start");
|
|
159
|
+
const args = agentRunArgs(opts);
|
|
160
|
+
if (!opts.json) {
|
|
161
|
+
info(`${agent.name ?? "agent"}${agent.version ? `@${agent.version}` : ""} — npm start${args.length ? ` -- ${args.join(" ")}` : ""}`);
|
|
162
|
+
}
|
|
163
|
+
const result = await spawnScript(agent, "start", args, "inherit");
|
|
164
|
+
if (result.status === null) {
|
|
165
|
+
throw new CliError(`the agent's \`npm start\` was terminated by ${result.signal ?? "a signal"}.`, {
|
|
166
|
+
code: "agent_terminated",
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return result.status;
|
|
170
|
+
}
|
|
171
|
+
function parseDocument(script, stdout) {
|
|
172
|
+
const text = stdout.trim();
|
|
173
|
+
if (text === "") {
|
|
174
|
+
throw new CliError(`\`npm run ${script} -- --json\` wrote nothing on stdout; expected one JSON document.`, {
|
|
175
|
+
code: "agent_eval_unreadable",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// The document is the LAST line: a script that also prints its human lines
|
|
179
|
+
// on stdout still ends with the machine one.
|
|
180
|
+
const last = text.split("\n").filter((line) => line.trim() !== "").at(-1);
|
|
181
|
+
try {
|
|
182
|
+
return JSON.parse(last);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
throw new CliError(`\`npm run ${script} -- --json\` did not end with a JSON document on stdout.`, {
|
|
186
|
+
code: "agent_eval_unreadable",
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Flatten the two documents into one case list. Pure: the process-free
|
|
192
|
+
* half of `codespar eval`, and the one the unit tests pin.
|
|
193
|
+
*
|
|
194
|
+
* The manifest check is ONE case, `check/<agent>`, whose failures are its
|
|
195
|
+
* error findings; warnings never fail it, matching `checkAgent`. A
|
|
196
|
+
* scenario runs once per mode it declares, and each run is its own case.
|
|
197
|
+
*/
|
|
198
|
+
export function summariseEval(check, evaluation) {
|
|
199
|
+
const checkDoc = (check ?? {});
|
|
200
|
+
const evalDoc = (evaluation ?? {});
|
|
201
|
+
const agent = checkDoc.agent ?? null;
|
|
202
|
+
const cases = [];
|
|
203
|
+
const errors = (checkDoc.findings ?? []).filter((f) => f.level === "error");
|
|
204
|
+
cases.push({
|
|
205
|
+
suite: "check",
|
|
206
|
+
name: agent ?? "agent.yaml",
|
|
207
|
+
ok: checkDoc.ok === true,
|
|
208
|
+
failures: errors.map((f) => `${f.code ?? "error"}: ${f.message ?? ""}`.trim()),
|
|
209
|
+
});
|
|
210
|
+
for (const r of evalDoc.adversarial ?? []) {
|
|
211
|
+
cases.push({ suite: "adversarial", name: r.name ?? "?", ok: r.ok === true, failures: r.failures ?? [] });
|
|
212
|
+
}
|
|
213
|
+
for (const r of evalDoc.scenarios ?? []) {
|
|
214
|
+
cases.push({
|
|
215
|
+
suite: "scenario",
|
|
216
|
+
name: r.name ?? "?",
|
|
217
|
+
...(r.mode === undefined ? {} : { mode: r.mode }),
|
|
218
|
+
ok: r.ok === true,
|
|
219
|
+
failures: r.failures ?? [],
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
// `ok` is the AND of the cases AND of the documents' own verdicts: a
|
|
223
|
+
// document that says `ok: false` with no listed failure is still a failure.
|
|
224
|
+
const ok = cases.every((k) => k.ok) && checkDoc.ok === true && evalDoc.ok === true;
|
|
225
|
+
return { ok, agent, cases, check, eval: evaluation };
|
|
226
|
+
}
|
|
227
|
+
function caseLabel(k) {
|
|
228
|
+
return `${k.suite}/${k.name}${k.mode ? ` [${k.mode}]` : ""}`;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Run the agent's manifest check and its eval suite (adversarial cases plus
|
|
232
|
+
* every scenario in every mode it declares), and report per case. Both
|
|
233
|
+
* scripts run even when the first fails, so one invocation shows the whole
|
|
234
|
+
* picture. Exit 1 on any failing case.
|
|
235
|
+
*/
|
|
236
|
+
export async function evalCommand(dir, opts) {
|
|
237
|
+
const agent = resolveAgentDir(dir);
|
|
238
|
+
requireScript(agent, "check");
|
|
239
|
+
requireScript(agent, "eval");
|
|
240
|
+
if (!opts.json)
|
|
241
|
+
info(`${agent.name ?? "agent"}${agent.version ? `@${agent.version}` : ""} — npm run check, npm run eval`);
|
|
242
|
+
const checkRun = await spawnScript(agent, "check", ["--json"], "pipe");
|
|
243
|
+
const evalRun = await spawnScript(agent, "eval", ["--json"], "pipe");
|
|
244
|
+
const report = summariseEval(parseDocument("check", checkRun.stdout), parseDocument("eval", evalRun.stdout));
|
|
245
|
+
if (opts.json) {
|
|
246
|
+
json(report);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
for (const k of report.cases) {
|
|
250
|
+
const mark = k.ok ? c.green("ok ") : c.red("FAIL");
|
|
251
|
+
process.stdout.write(`${mark} ${caseLabel(k)}${k.failures.length ? ` — ${k.failures.join("; ")}` : ""}\n`);
|
|
252
|
+
}
|
|
253
|
+
const failed = report.cases.filter((k) => !k.ok).length;
|
|
254
|
+
process.stdout.write(report.ok
|
|
255
|
+
? `${c.green("✓")} ${report.cases.length} case(s) passed\n`
|
|
256
|
+
: `${c.red("✗")} ${failed} of ${report.cases.length} case(s) failed\n`);
|
|
257
|
+
}
|
|
258
|
+
return report.ok ? 0 : 1;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,39 +1,96 @@
|
|
|
1
1
|
import { createInterface } from "node:readline/promises";
|
|
2
2
|
import { stdin, stdout } from "node:process";
|
|
3
3
|
import { mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
4
|
+
import { readFileSync } from "node:fs";
|
|
4
5
|
import { dirname, join, resolve } from "node:path";
|
|
5
6
|
import { fileURLToPath } from "node:url";
|
|
6
7
|
import { CliError } from "../config.js";
|
|
7
8
|
import { c, info, json, success } from "../output.js";
|
|
8
|
-
const
|
|
9
|
+
const FRAMEWORK_NEXT_STEPS = ["cp .env.example .env # then fill in your keys", "npm install", "npm run dev"];
|
|
10
|
+
const FRAMEWORK_TEMPLATES = [
|
|
9
11
|
{
|
|
10
12
|
slug: "pix-agent",
|
|
11
13
|
label: "Pix Payment Agent",
|
|
12
14
|
description: "Minimal Pix charge + WhatsApp notification via OpenAI",
|
|
13
15
|
framework: "OpenAI",
|
|
16
|
+
kind: "framework",
|
|
17
|
+
nextSteps: FRAMEWORK_NEXT_STEPS,
|
|
14
18
|
},
|
|
15
19
|
{
|
|
16
20
|
slug: "ecommerce-checkout",
|
|
17
21
|
label: "E-Commerce Checkout",
|
|
18
22
|
description: "Full Complete Loop: checkout → invoice → ship → notify (Claude)",
|
|
19
23
|
framework: "Claude",
|
|
24
|
+
kind: "framework",
|
|
25
|
+
nextSteps: FRAMEWORK_NEXT_STEPS,
|
|
20
26
|
},
|
|
21
27
|
{
|
|
22
28
|
slug: "streaming-chat",
|
|
23
29
|
label: "Streaming Chat",
|
|
24
30
|
description: "Next.js 15 + Vercel AI SDK with token-by-token streaming",
|
|
25
31
|
framework: "Next.js + Vercel AI",
|
|
32
|
+
kind: "framework",
|
|
33
|
+
nextSteps: FRAMEWORK_NEXT_STEPS,
|
|
26
34
|
},
|
|
27
35
|
{
|
|
28
36
|
slug: "multi-tenant",
|
|
29
37
|
label: "Multi-Tenant Agent",
|
|
30
38
|
description: "SaaS pattern — one API key, N tenants, per-tenant billing",
|
|
31
39
|
framework: "Next.js + OpenAI",
|
|
40
|
+
kind: "framework",
|
|
41
|
+
nextSteps: FRAMEWORK_NEXT_STEPS,
|
|
32
42
|
},
|
|
33
43
|
];
|
|
44
|
+
export const KITS_LOCK_BASENAME = "kits.lock.json";
|
|
45
|
+
/**
|
|
46
|
+
* The kit templates the packaged lock describes. A package without the lock
|
|
47
|
+
* simply has no kit templates: the framework ones must keep working from a
|
|
48
|
+
* tarball that predates the lock, and the release gate is what guarantees a
|
|
49
|
+
* tarball that has it also has every tree it names.
|
|
50
|
+
*/
|
|
51
|
+
export function loadKitTemplates(templatesRoot = resolveTemplatesDir()) {
|
|
52
|
+
let raw;
|
|
53
|
+
try {
|
|
54
|
+
raw = readFileSync(join(templatesRoot, KITS_LOCK_BASENAME), "utf8");
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
if (err.code === "ENOENT")
|
|
58
|
+
return [];
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
const lock = JSON.parse(raw);
|
|
62
|
+
if (lock.format !== 1) {
|
|
63
|
+
throw new CliError(`${KITS_LOCK_BASENAME} has format ${lock.format}; this CLI reads format 1. Is the package installation corrupted?`);
|
|
64
|
+
}
|
|
65
|
+
const shortCommit = lock.commit.slice(0, 7);
|
|
66
|
+
return Object.entries(lock.templates)
|
|
67
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
68
|
+
.map(([slug, entry]) => ({
|
|
69
|
+
slug,
|
|
70
|
+
label: `${slug} ${entry.version}`,
|
|
71
|
+
description: entry.description,
|
|
72
|
+
framework: `agent-starter-kits @ ${shortCommit}, agent-core vendored`,
|
|
73
|
+
kind: "kit",
|
|
74
|
+
nextSteps: entry.next_steps,
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
export function listTemplates(templatesRoot = resolveTemplatesDir()) {
|
|
78
|
+
const kits = loadKitTemplates(templatesRoot);
|
|
79
|
+
const taken = new Set(FRAMEWORK_TEMPLATES.map((t) => t.slug));
|
|
80
|
+
for (const kit of kits) {
|
|
81
|
+
if (taken.has(kit.slug)) {
|
|
82
|
+
throw new CliError(`Template slug "${kit.slug}" is both a framework template and a kit template. Is the package installation corrupted?`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return [...FRAMEWORK_TEMPLATES, ...kits];
|
|
86
|
+
}
|
|
34
87
|
export async function initCommand(name, opts) {
|
|
88
|
+
if (opts.list) {
|
|
89
|
+
printTemplateList(listTemplates(), Boolean(opts.json));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
35
92
|
if (!name)
|
|
36
|
-
throw new CliError("Project name is required. Example: `codespar init my-agent`");
|
|
93
|
+
throw new CliError("Project name is required. Example: `codespar init my-agent` (or `codespar init --list`)");
|
|
37
94
|
if (!/^[a-z0-9][a-z0-9-_]*$/i.test(name)) {
|
|
38
95
|
throw new CliError("Project name must start with a letter/number and contain only letters, digits, dashes, and underscores.");
|
|
39
96
|
}
|
|
@@ -49,7 +106,8 @@ export async function initCommand(name, opts) {
|
|
|
49
106
|
if (err.code !== "ENOENT")
|
|
50
107
|
throw err;
|
|
51
108
|
}
|
|
52
|
-
const
|
|
109
|
+
const templates = listTemplates();
|
|
110
|
+
const template = await pickTemplate(templates, opts);
|
|
53
111
|
info(`Creating ${c.bold(name)} using the ${c.bold(template.label)} template...`);
|
|
54
112
|
const templatesRoot = resolveTemplatesDir();
|
|
55
113
|
const source = join(templatesRoot, template.slug);
|
|
@@ -59,29 +117,34 @@ export async function initCommand(name, opts) {
|
|
|
59
117
|
// Sem isto, `codespar init x --json` escrevia um roteiro de proximos passos
|
|
60
118
|
// no stdout, que e justamente onde quem automatiza espera um documento.
|
|
61
119
|
if (opts.json) {
|
|
62
|
-
json({ created: name, template: template.slug, path: target });
|
|
120
|
+
json({ created: name, template: template.slug, kind: template.kind, path: target, next_steps: template.nextSteps });
|
|
63
121
|
return;
|
|
64
122
|
}
|
|
65
|
-
process.stdout.write([
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
123
|
+
process.stdout.write(["", "Next steps:", ` cd ${name}`, ...template.nextSteps.map((s) => ` ${s}`), ""].join("\n"));
|
|
124
|
+
}
|
|
125
|
+
function printTemplateList(templates, asJson) {
|
|
126
|
+
if (asJson) {
|
|
127
|
+
json({ templates: templates.map(({ slug, label, description, framework, kind }) => ({ slug, label, description, framework, kind })) });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const width = Math.max(...templates.map((t) => t.slug.length));
|
|
131
|
+
process.stdout.write(c.bold("Templates:\n\n"));
|
|
132
|
+
for (const t of templates) {
|
|
133
|
+
process.stdout.write(` ${c.bold(t.slug.padEnd(width))} ${t.label} ${c.dim(`(${t.framework})`)}\n`);
|
|
134
|
+
process.stdout.write(` ${"".padEnd(width)} ${c.dim(t.description)}\n\n`);
|
|
135
|
+
}
|
|
136
|
+
process.stdout.write(c.dim("codespar init <name> --template <slug>\n"));
|
|
74
137
|
}
|
|
75
|
-
async function pickTemplate(opts) {
|
|
138
|
+
async function pickTemplate(templates, opts) {
|
|
76
139
|
if (opts.template) {
|
|
77
|
-
const t =
|
|
140
|
+
const t = templates.find((x) => x.slug === opts.template);
|
|
78
141
|
if (!t) {
|
|
79
|
-
throw new CliError(`Unknown template "${opts.template}". Available: ${
|
|
142
|
+
throw new CliError(`Unknown template "${opts.template}". Available: ${templates.map((x) => x.slug).join(", ")} (see \`codespar init --list\`)`);
|
|
80
143
|
}
|
|
81
144
|
return t;
|
|
82
145
|
}
|
|
83
146
|
if (opts.yes)
|
|
84
|
-
return
|
|
147
|
+
return templates[0];
|
|
85
148
|
// Mesma armadilha do `login`: sem TTY o menu e impresso, a pergunta nunca
|
|
86
149
|
// volta e o processo sai 0 sem escrever um arquivo.
|
|
87
150
|
if (!stdin.isTTY) {
|
|
@@ -89,29 +152,34 @@ async function pickTemplate(opts) {
|
|
|
89
152
|
}
|
|
90
153
|
// Interactive pick
|
|
91
154
|
process.stdout.write(c.bold("Choose a template:\n\n"));
|
|
92
|
-
|
|
155
|
+
templates.forEach((t, i) => {
|
|
93
156
|
process.stdout.write(` ${c.blue(`${i + 1}.`)} ${c.bold(t.label)} ${c.dim(`(${t.framework})`)}\n`);
|
|
94
157
|
process.stdout.write(` ${c.dim(t.description)}\n\n`);
|
|
95
158
|
});
|
|
96
159
|
const rl = createInterface({ input: stdin, output: stdout });
|
|
97
160
|
try {
|
|
98
|
-
const answer = (await rl.question(`Pick a number [1-${
|
|
161
|
+
const answer = (await rl.question(`Pick a number [1-${templates.length}] (default 1): `)).trim();
|
|
99
162
|
const index = answer === "" ? 0 : Number.parseInt(answer, 10) - 1;
|
|
100
|
-
if (Number.isNaN(index) || index < 0 || index >=
|
|
163
|
+
if (Number.isNaN(index) || index < 0 || index >= templates.length) {
|
|
101
164
|
throw new CliError(`Invalid choice: ${answer}`);
|
|
102
165
|
}
|
|
103
|
-
return
|
|
166
|
+
return templates[index];
|
|
104
167
|
}
|
|
105
168
|
finally {
|
|
106
169
|
rl.close();
|
|
107
170
|
}
|
|
108
171
|
}
|
|
109
|
-
function resolveTemplatesDir() {
|
|
172
|
+
export function resolveTemplatesDir() {
|
|
110
173
|
// When running from dist/, __dirname is packages/cli/dist/commands.
|
|
111
174
|
// Templates live at packages/cli/templates, so go up two levels.
|
|
112
175
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
113
176
|
return resolve(here, "..", "..", "templates");
|
|
114
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* npm drops every `.gitignore` from a tarball, in any directory, so a
|
|
180
|
+
* template ships it as `_gitignore` and it is renamed back on the way out.
|
|
181
|
+
*/
|
|
182
|
+
const RENAME_ON_COPY = { _gitignore: ".gitignore" };
|
|
115
183
|
async function copyTemplate(source, target, vars) {
|
|
116
184
|
const stats = await stat(source).catch(() => null);
|
|
117
185
|
if (!stats)
|
|
@@ -121,7 +189,7 @@ async function copyTemplate(source, target, vars) {
|
|
|
121
189
|
for (const entry of entries) {
|
|
122
190
|
const srcPath = join(source, entry.name);
|
|
123
191
|
// Substitute placeholders in file names too (rare but cheap)
|
|
124
|
-
const outName = substituteAll(entry.name, vars);
|
|
192
|
+
const outName = substituteAll(RENAME_ON_COPY[entry.name] ?? entry.name, vars);
|
|
125
193
|
const dstPath = join(target, outName);
|
|
126
194
|
if (entry.isDirectory()) {
|
|
127
195
|
await copyTemplate(srcPath, dstPath, vars);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|