nativeapptemplate-agent 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,7 +17,7 @@ Coherent across all three, in under an hour.
17
17
  npx nativeapptemplate-agent "a walk-in clinic queue for small veterinary practices" --project-name="VetClinic"
18
18
  ```
19
19
 
20
- > **Status: 0.3.1 stable.** First built during [Built with Opus 4.7: a Claude Code Hackathon](https://cerebralvalley.ai/e/built-with-4-7-hackathon) (April 21–27, 2026); shipped to npm post-hackathon. Verified end-to-end on the three demo specs below from a fresh `/tmp/` cwd — the full 3-spec × 2-edition × 2-platform matrix is green at `NATIVEAPPTEMPLATE_VISUAL=2` (see the [matrix](#demo)). Stage 2 (scripted-CRUD walk-through via `mobile-mcp` against a live Rails server) and paid-edition parity validation landed post-launch. Active development continues — see the [roadmap](./ROADMAP.md) for what's next.
20
+ > **Status: 0.3.2 stable.** First built during [Built with Opus 4.7: a Claude Code Hackathon](https://cerebralvalley.ai/e/built-with-4-7-hackathon) (April 21–27, 2026); shipped to npm post-hackathon. Verified end-to-end on the three demo specs below from a fresh `/tmp/` cwd — the full 3-spec × 2-edition × 2-platform matrix is green at `NATIVEAPPTEMPLATE_VISUAL=2` (see the [matrix](#demo)). Stage 2 (scripted-CRUD walk-through via `mobile-mcp` against a live Rails server) and paid-edition parity validation landed post-launch. Active development continues — see the [roadmap](./ROADMAP.md) for what's next.
21
21
 
22
22
  ---
23
23
 
@@ -123,15 +123,22 @@ Both screenshots are real captures from the booted iOS Simulator and Android emu
123
123
 
124
124
  End-to-end wall-clock per run, measured from `report.json`'s `meta.durationMs` on a 2021 M1 Max with both simulators pre-booted:
125
125
 
126
- | `NATIVEAPPTEMPLATE_VISUAL` | What runs | Observed time | Approx cost |
126
+ | `NATIVEAPPTEMPLATE_VISUAL` | What runs | Observed time | Approx cost (Opus 5.5, 2026-10-15) |
127
127
  |---|---|---|---|
128
- | `0` (default) | Layer 1 (ripgrep) + Layer 2 *fast* (Rails boot probe, iOS/Android type-check) + reviewer | ~2–3 min | ~$0.05 |
129
- | `1` | + full `xcodebuild build` + `./gradlew assembleDebug` + home-screen capture + Stage 1 vision judge | ~2.5 min (barbershop-queue · 2026-05-24) | — |
130
- | `2` | + Rails server boot + scripted-CRUD walk via `mobile-mcp` + Stage 2 vision judge | ~7–8 min (sentova / sushi / task-tracker · 2026-05-23) | — |
128
+ | `0` (default) | Layer 1 (ripgrep) + Layer 2 *fast* (Rails boot probe, iOS/Android type-check) + reviewer | ~2–3 min | ~$0.02 (planner only, measured) |
129
+ | `1` | + full `xcodebuild build` + `./gradlew assembleDebug` + home-screen capture + Stage 1 vision judge | ~2.5 min (barbershop-queue · 2026-05-24) | ~$0.13 (derived) |
130
+ | `2` | + Rails server boot + scripted-CRUD walk via `mobile-mcp` + Stage 2 vision judge | ~7–8 min (sentova / sushi / task-tracker · 2026-05-23) | ~$0.24 (derived) |
131
131
 
132
132
  Cold builds, first-run cocoapods/gradle dependency resolution, or unbooted simulators add a one-time minute or two. The self-repair loop (opt-in, hard-capped at 5 iterations) can extend a failing run substantially — budget for it if you set `NATIVEAPPTEMPLATE_REPAIR=on`.
133
133
 
134
- **Cost** scales with model usage, not wall-clock. The agent makes real `claude-opus-5-5` API calls (the planner, the Layer 3 vision judge, and the opt-in self-repair agent) and a single VISUAL=2 run consumes tens of thousands of tokens across multiple sub-agents. Set a workspace spend cap (see [Security](#security)) as a backstop — the agent exits non-zero on validation failure, but doesn't gate on spend itself.
134
+ **Cost.** The agent makes real `claude-opus-5-5` API calls ($4 / $20 per million input / output tokens; 5-minute cache writes $5, cache reads $0.40; rates in [`src/models.ts`](./src/models.ts)). How the numbers above were made, on 2026-10-15:
135
+
136
+ - **Measured, per call:** the planner ("a walk-in queue for a barbershop") used 2,722 in / 446 out = **$0.020**. The vision judge caches the screenshot: its first call writes the cache (~150 in / ~110 out / ~4,400 cache-write tokens = **~$0.025**), then the remaining samples run in parallel and read it (~160 in / ~90–260 out / ~4,400 cache-read tokens = **~$0.006** each).
137
+ - **Measured, per platform:** a judge pass is 2 criteria × 3 samples = 6 calls: **$0.054** for Stage 1 (iOS home screen). Stage 2 sends the same shape of request on a list screen; before the cache warm-up it measured the same as Stage 1 ($0.15 each), so it is taken as ~$0.054 too.
138
+ - **Derived, per run:** VISUAL=1 = planner + Stage 1 on iOS and Android ≈ $0.13; VISUAL=2 adds Stage 2 on both ≈ $0.24. A judge retry after a transient render failure adds ~$0.05 per retried platform.
139
+ - **Self-repair** (`NATIVEAPPTEMPLATE_REPAIR`): a toy fix converged in 3 turns for ~$0.10 (measured). A real Compose/Hilt build fix can take many more turns (up to 40); estimate ~$0.10–$1 per attempt, at most 5 attempts per run. Re-validation after a repair does not re-run the judge.
140
+
141
+ **Check your own spend:** clear `tmp/trace/`, run the agent, then `npm run cost` prints per-agent tokens (including cache writes/reads) and estimated USD; repair uses the Agent SDK's own `total_cost_usd`. For billed amounts, see usage per API key in the Claude Console, and set a workspace spend cap (see [Security](#security)) as a backstop — the agent exits non-zero on validation failure, but doesn't gate on spend itself.
135
142
 
136
143
  ## Architecture
137
144
 
@@ -1,5 +1,6 @@
1
1
  import { type Options } from "@anthropic-ai/claude-agent-sdk";
2
2
  import type { DomainSpec, Platform } from "./types.js";
3
+ import { type TokenUsage } from "../structured-output.js";
3
4
  export type RepairLayer = "layer1" | "layer2";
4
5
  export type RepairTarget = {
5
6
  platform: Platform;
@@ -12,5 +13,9 @@ export type RepairOutcome = {
12
13
  action: string;
13
14
  };
14
15
  export declare function runRepair(target: RepairTarget, domain: DomainSpec): Promise<RepairOutcome>;
16
+ export declare function repairCostLine(result: {
17
+ total_cost_usd: number;
18
+ usage: TokenUsage;
19
+ }): string;
15
20
  export declare function buildRepairOptions(target: RepairTarget, apiKey: string, allowedTools: string[]): Options;
16
21
  //# sourceMappingURL=repair.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/agents/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOvD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,QAAQ,CAAC;IAGnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IAGnB,MAAM,EAAE,MAAM,CAAC;IAEf,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAI1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAKF,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAuChG;AAKD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAgBxG"}
1
+ {"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/agents/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAMvE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,QAAQ,CAAC;IAGnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IAGnB,MAAM,EAAE,MAAM,CAAC;IAEf,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAI1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAKF,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAuChG;AAMD,wBAAgB,cAAc,CAAC,MAAM,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,MAAM,CAE5F;AAKD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAgBxG"}
@@ -2,6 +2,7 @@ import { query } from "@anthropic-ai/claude-agent-sdk";
2
2
  import { trace } from "../trace.js";
3
3
  import { isStub } from "../stub.js";
4
4
  import { REPAIR_EFFORT, REPAIR_MODEL } from "../models.js";
5
+ import { tokenCounts } from "../structured-output.js";
5
6
  // One repair pass over a single failing platform. Drives the Claude Agent
6
7
  // SDK's agentic loop (Read/Edit/Bash) scoped to the generated project, then
7
8
  // returns a summary. The caller re-validates and records resolved/unresolved.
@@ -28,7 +29,7 @@ export async function runRepair(target, domain) {
28
29
  for await (const message of response) {
29
30
  if (message.type === "result") {
30
31
  turns = message.num_turns;
31
- cost = ` ($${message.total_cost_usd.toFixed(4)}, ${message.usage.input_tokens} in / ${message.usage.output_tokens} out)`;
32
+ cost = `, ${repairCostLine(message)}`;
32
33
  if (message.subtype === "success" && !message.is_error) {
33
34
  action = firstLine(message.result) || action;
34
35
  }
@@ -40,6 +41,13 @@ export async function runRepair(target, domain) {
40
41
  trace("repair", `${target.platform}/${target.layer}: ${turns} turns${cost} — ${action}`);
41
42
  return { action };
42
43
  }
44
+ // The Agent SDK prices its own multi-turn loop (cache reads dominate) and
45
+ // reports it as total_cost_usd. scripts/cost.sh takes that figure as is
46
+ // rather than re-pricing the tokens, so this deliberately avoids the
47
+ // "usage:" prefix the planner/judge lines use.
48
+ export function repairCostLine(result) {
49
+ return `sdk-cost: $${result.total_cost_usd.toFixed(4)} (${tokenCounts(result.usage)})`;
50
+ }
43
51
  // Agent SDK options for one repair pass. Exported so tests can check them
44
52
  // without starting an agent. Thinking is left unset: Opus 5.5 always runs
45
53
  // adaptive thinking, and effort is the control.
@@ -1 +1 @@
1
- {"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/agents/repair.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/agents/repair.ts"],"names":[],"mappings":"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"}
package/dist/models.d.ts CHANGED
@@ -8,4 +8,10 @@ export declare const JUDGE_EFFORT: Effort;
8
8
  export declare const REPAIR_EFFORT: Effort;
9
9
  export declare const FALLBACK_BETA = "server-side-fallback-2026-07-01";
10
10
  export declare const FALLBACKS: "default";
11
+ export declare const OPUS_PRICE_PER_MTOK: {
12
+ readonly input: 4;
13
+ readonly output: 20;
14
+ readonly cacheWrite5m: 5;
15
+ readonly cacheRead: 0.4;
16
+ };
11
17
  //# sourceMappingURL=models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAE5C,eAAO,MAAM,aAAa,oBAAa,CAAC;AACxC,eAAO,MAAM,WAAW,oBAAa,CAAC;AACtC,eAAO,MAAM,YAAY,oBAAa,CAAC;AAEvC,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAajE,eAAO,MAAM,cAAc,EAAE,MAAe,CAAC;AAC7C,eAAO,MAAM,YAAY,EAAE,MAAiB,CAAC;AAC7C,eAAO,MAAM,aAAa,EAAE,MAAe,CAAC;AAM5C,eAAO,MAAM,aAAa,oCAAoC,CAAC;AAC/D,eAAO,MAAM,SAAS,EAAG,SAAkB,CAAC"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAE5C,eAAO,MAAM,aAAa,oBAAa,CAAC;AACxC,eAAO,MAAM,WAAW,oBAAa,CAAC;AACtC,eAAO,MAAM,YAAY,oBAAa,CAAC;AAEvC,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAajE,eAAO,MAAM,cAAc,EAAE,MAAe,CAAC;AAC7C,eAAO,MAAM,YAAY,EAAE,MAAiB,CAAC;AAC7C,eAAO,MAAM,aAAa,EAAE,MAAe,CAAC;AAM5C,eAAO,MAAM,aAAa,oCAAoC,CAAC;AAC/D,eAAO,MAAM,SAAS,EAAG,SAAkB,CAAC;AAO5C,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC"}
package/dist/models.js CHANGED
@@ -24,4 +24,15 @@ export const REPAIR_EFFORT = "high";
24
24
  // this beta header (the array form uses server-side-fallback-2026-06-01).
25
25
  export const FALLBACK_BETA = "server-side-fallback-2026-07-01";
26
26
  export const FALLBACKS = "default";
27
+ // Claude Opus 5.5 list prices, USD per million tokens (Anthropic pricing page,
28
+ // checked 2026-10-15). Cache writes use the 5-minute TTL rate (1.25x input),
29
+ // which is what the judge's `cache_control: { type: "ephemeral" }` gets;
30
+ // cache reads are 0.1x input. scripts/cost.sh repeats these as RATE_* and a
31
+ // test keeps the two in sync — update both on a model or price change.
32
+ export const OPUS_PRICE_PER_MTOK = {
33
+ input: 4,
34
+ output: 20,
35
+ cacheWrite5m: 5,
36
+ cacheRead: 0.4,
37
+ };
27
38
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yDAAyD;AAEzD,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AAIvC,6EAA6E;AAC7E,6DAA6D;AAC7D,EAAE;AACF,yEAAyE;AACzE,4EAA4E;AAC5E,uBAAuB;AACvB,8EAA8E;AAC9E,+EAA+E;AAC/E,0CAA0C;AAC1C,4EAA4E;AAC5E,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAW,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAW,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAW,MAAM,CAAC;AAE5C,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,aAAa,GAAG,iCAAiC,CAAC;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,SAAkB,CAAC"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yDAAyD;AAEzD,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AAIvC,6EAA6E;AAC7E,6DAA6D;AAC7D,EAAE;AACF,yEAAyE;AACzE,4EAA4E;AAC5E,uBAAuB;AACvB,8EAA8E;AAC9E,+EAA+E;AAC/E,0CAA0C;AAC1C,4EAA4E;AAC5E,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAW,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAW,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAW,MAAM,CAAC;AAE5C,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,aAAa,GAAG,iCAAiC,CAAC;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,SAAkB,CAAC;AAE5C,+EAA+E;AAC/E,6EAA6E;AAC7E,yEAAyE;AACzE,4EAA4E;AAC5E,uEAAuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,CAAC;IACf,SAAS,EAAE,GAAG;CACN,CAAC"}
@@ -2,5 +2,12 @@ import type Anthropic from "@anthropic-ai/sdk";
2
2
  type BetaMessage = Anthropic.Beta.Messages.BetaMessage;
3
3
  export declare function readStructuredJson(response: BetaMessage, label: string): unknown;
4
4
  export declare function usageLine(response: BetaMessage, requestedModel: string): string;
5
+ export type TokenUsage = {
6
+ input_tokens: number;
7
+ output_tokens: number;
8
+ cache_creation_input_tokens?: number | null;
9
+ cache_read_input_tokens?: number | null;
10
+ };
11
+ export declare function tokenCounts(usage: TokenUsage): string;
5
12
  export {};
6
13
  //# sourceMappingURL=structured-output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAE/C,KAAK,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;AAKvD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAqBhF;AAID,wBAAgB,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAG/E"}
1
+ {"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAE/C,KAAK,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;AAKvD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAqBhF;AAOD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAG/E;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC,CAAC;AAGF,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIrD"}
@@ -25,8 +25,17 @@ export function readStructuredJson(response, label) {
25
25
  }
26
26
  // One trace line per call: tokens, plus the model that actually answered
27
27
  // (differs from the requested one when a refusal fallback served it).
28
+ // Cache writes/reads are billed separately from input_tokens (the judge's
29
+ // screenshot is cached, so most of its tokens land there); scripts/cost.sh
30
+ // parses this exact shape, so keep all four fields even when zero.
28
31
  export function usageLine(response, requestedModel) {
29
32
  const servedBy = response.model !== requestedModel ? ` (served by ${response.model})` : "";
30
- return `usage: ${response.usage.input_tokens} in / ${response.usage.output_tokens} out${servedBy}`;
33
+ return `usage: ${tokenCounts(response.usage)}${servedBy}`;
34
+ }
35
+ // "<in> in / <out> out / <write> cache-write / <read> cache-read"
36
+ export function tokenCounts(usage) {
37
+ const write = usage.cache_creation_input_tokens ?? 0;
38
+ const read = usage.cache_read_input_tokens ?? 0;
39
+ return `${usage.input_tokens} in / ${usage.output_tokens} out / ${write} cache-write / ${read} cache-read`;
31
40
  }
32
41
  //# sourceMappingURL=structured-output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAIA,sEAAsE;AACtE,4EAA4E;AAC5E,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,QAAqB,EAAE,KAAa;IACrE,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,QAAQ,IAAI,SAAS,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yDAAyD,QAAQ,GAAG,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wDAAwD,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO;SAC1B,MAAM,CAAC,CAAC,CAAC,EAA8C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SAC5E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0CAA0C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iCAAiC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,sEAAsE;AACtE,MAAM,UAAU,SAAS,CAAC,QAAqB,EAAE,cAAsB;IACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,OAAO,UAAU,QAAQ,CAAC,KAAK,CAAC,YAAY,SAAS,QAAQ,CAAC,KAAK,CAAC,aAAa,OAAO,QAAQ,EAAE,CAAC;AACrG,CAAC"}
1
+ {"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAIA,sEAAsE;AACtE,4EAA4E;AAC5E,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,QAAqB,EAAE,KAAa;IACrE,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,QAAQ,IAAI,SAAS,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yDAAyD,QAAQ,GAAG,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wDAAwD,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO;SAC1B,MAAM,CAAC,CAAC,CAAC,EAA8C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SAC5E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0CAA0C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iCAAiC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,sEAAsE;AACtE,0EAA0E;AAC1E,2EAA2E;AAC3E,mEAAmE;AACnE,MAAM,UAAU,SAAS,CAAC,QAAqB,EAAE,cAAsB;IACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,OAAO,UAAU,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,QAAQ,EAAE,CAAC;AAC5D,CAAC;AASD,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC;IAChD,OAAO,GAAG,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,aAAa,UAAU,KAAK,kBAAkB,IAAI,aAAa,CAAC;AAC7G,CAAC"}
@@ -40,4 +40,5 @@ export declare function parseVerdict(response: Anthropic.Beta.Messages.BetaMessa
40
40
  rationale: string;
41
41
  };
42
42
  export declare function runLayer3(input: Layer3Input): Promise<Layer3Result>;
43
+ export declare function firstThenTogether<T, R>(items: readonly T[], run: (item: T) => Promise<R>): Promise<R[]>;
43
44
  //# sourceMappingURL=layer3.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layer3.d.ts","sourceRoot":"","sources":["../../src/validation/layer3.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAO1C,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAcF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAcjB,CAAC;AAIX,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,eAAe,GACzB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,+BAA+B,CA4BzD;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMhH;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAgCzE"}
1
+ {"version":3,"file":"layer3.d.ts","sourceRoot":"","sources":["../../src/validation/layer3.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAO1C,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAcF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAcjB,CAAC;AAIX,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,eAAe,GACzB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,+BAA+B,CA4BzD;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMhH;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAmCzE;AAID,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAK7G"}
@@ -78,8 +78,16 @@ export async function runLayer3(input) {
78
78
  const imageBase64 = png.toString("base64");
79
79
  const apiKey = process.env['NATIVEAPPTEMPLATE_AGENT_ANTHROPIC_KEY'] ?? process.env['ANTHROPIC_API_KEY'];
80
80
  const client = new Anthropic({ apiKey });
81
- const scores = await Promise.all(input.rubric.map(async (criterion) => {
82
- const samples = await Promise.all(Array.from({ length: samplesPerCriterion }, () => judgeOne(client, model, imageBase64, input.spec, criterion)));
81
+ // Every sample shares the cached prefix (system prompt + screenshot); only
82
+ // the criterion text after the breakpoint differs. Calls sent at the same
83
+ // time all miss the cache and each write it, so judge one sample first to
84
+ // write it, then send the rest together to read it (0.1× input instead of
85
+ // 1.25×).
86
+ const judge = (criterion) => judgeOne(client, model, imageBase64, input.spec, criterion);
87
+ const jobs = input.rubric.flatMap((criterion) => Array.from({ length: samplesPerCriterion }, () => criterion));
88
+ const verdicts = await firstThenTogether(jobs, judge);
89
+ const scores = input.rubric.map((criterion, index) => {
90
+ const samples = verdicts.slice(index * samplesPerCriterion, (index + 1) * samplesPerCriterion);
83
91
  const passCount = samples.filter((s) => s.pass).length;
84
92
  const median = passCount > samplesPerCriterion / 2;
85
93
  const winningSample = samples.find((s) => s.pass === median) ?? samples[0];
@@ -88,10 +96,19 @@ export async function runLayer3(input) {
88
96
  pass: median,
89
97
  rationale: winningSample.rationale,
90
98
  };
91
- }));
99
+ });
92
100
  const pass = scores.every((s) => s.pass);
93
101
  return { pass, scores };
94
102
  }
103
+ // Runs `run` on the first item alone, then on the rest at once; results keep
104
+ // the input order. Lets the first call write a prompt cache the others read.
105
+ export async function firstThenTogether(items, run) {
106
+ const [first, ...rest] = items;
107
+ if (first === undefined)
108
+ return [];
109
+ const head = await run(first);
110
+ return [head, ...(await Promise.all(rest.map(run)))];
111
+ }
95
112
  async function judgeOne(client, model, imageBase64, spec, criterion) {
96
113
  const response = await client.beta.messages.create(buildJudgeRequest(model, imageBase64, spec, criterion));
97
114
  trace("judge", `layer3 ${criterion.id}: ${usageLine(response, model)}`);
@@ -1 +1 @@
1
- {"version":3,"file":"layer3.js","sourceRoot":"","sources":["../../src/validation/layer3.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layer3.js","sourceRoot":"","sources":["../../src/validation/layer3.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AA0BxE,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,4EAA4E;AAC5E,2CAA2C;AAC3C,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,MAAM,aAAa,GAAG;;uJAEiI,CAAC;AAExJ,wEAAwE;AACxE,2EAA2E;AAC3E,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,2IAA2I;SACzJ;QACD,SAAS,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,qDAAqD;SACnE;KACF;IACD,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;IAC/B,oBAAoB,EAAE,KAAK;CACnB,CAAC;AAEX,6EAA6E;AAC7E,oCAAoC;AACpC,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,WAAmB,EACnB,IAAY,EACZ,SAA0B;IAE1B,OAAO;QACL,KAAK;QACL,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE;YACb,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,cAAoD,EAAE;SAC9F;QACD,KAAK,EAAE,CAAC,aAAa,CAAC;QACtB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE;wBACtE,aAAa,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;qBACrC;oBACD;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS,IAAI,kBAAkB,SAAS,CAAC,QAAQ,EAAE;qBAC1D;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,qBAAqB;AACrB,MAAM,UAAU,YAAY,CAAC,QAA6C;IACxE,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,cAAc,CAA0C,CAAC;IACtG,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAkB;IAChD,IAAI,MAAM,CAAC,OAAO,CAAC;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,mBAAmB,GAAG,KAAK,CAAC,mBAAmB,IAAI,eAAe,CAAC;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,WAAW,CAAC;IAEzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxG,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzC,2EAA2E;IAC3E,0EAA0E;IAC1E,0EAA0E;IAC1E,0EAA0E;IAC1E,UAAU;IACV,MAAM,KAAK,GAAG,CAAC,SAA0B,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1G,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/G,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAkB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,mBAAmB,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC;QAC/F,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACvD,MAAM,MAAM,GAAG,SAAS,GAAG,mBAAmB,GAAG,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC;QAC5E,OAAO;YACL,WAAW,EAAE,SAAS,CAAC,EAAE;YACzB,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,aAAa,CAAC,SAAS;SACnC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,6EAA6E;AAC7E,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAO,KAAmB,EAAE,GAA4B;IAC7F,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,MAAiB,EACjB,KAAa,EACb,WAAmB,EACnB,IAAY,EACZ,SAA0B;IAE1B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3G,KAAK,CAAC,OAAO,EAAE,UAAU,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,KAAkB;IAC7C,OAAO;QACL,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,WAAW,EAAE,CAAC,CAAC,EAAE;YACjB,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nativeapptemplate-agent",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "A Claude Code agent that turns a natural-language SaaS spec into a working three-platform implementation (Rails API + SwiftUI iOS + Jetpack Compose Android).",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",