@tangle-network/starter-foundry 0.5.3 → 0.5.4

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 (121) hide show
  1. package/README.md +49 -0
  2. package/corpus/ideasai-prompts.json +119 -58
  3. package/dist/cli.js +28 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/lib/agent-context.js +34 -22
  6. package/dist/lib/agent-context.js.map +1 -1
  7. package/dist/lib/build-plan.d.ts +18 -0
  8. package/dist/lib/build-plan.js +72 -0
  9. package/dist/lib/build-plan.js.map +1 -1
  10. package/dist/lib/buildout-traces.d.ts +113 -0
  11. package/dist/lib/buildout-traces.js +83 -0
  12. package/dist/lib/buildout-traces.js.map +1 -0
  13. package/dist/lib/capability-inferrer.d.ts +40 -0
  14. package/dist/lib/capability-inferrer.js +82 -0
  15. package/dist/lib/capability-inferrer.js.map +1 -0
  16. package/dist/lib/context-pack.d.ts +6 -1
  17. package/dist/lib/context-pack.js +9 -3
  18. package/dist/lib/context-pack.js.map +1 -1
  19. package/dist/lib/keywords.js +71 -18
  20. package/dist/lib/keywords.js.map +1 -1
  21. package/dist/lib/llm.d.ts +9 -0
  22. package/dist/lib/llm.js +70 -0
  23. package/dist/lib/llm.js.map +1 -0
  24. package/dist/lib/planner/contracts.d.ts +11 -0
  25. package/dist/lib/planner/contracts.js +119 -0
  26. package/dist/lib/planner/contracts.js.map +1 -0
  27. package/dist/lib/planner/detectors.d.ts +14 -0
  28. package/dist/lib/planner/detectors.js +195 -0
  29. package/dist/lib/planner/detectors.js.map +1 -0
  30. package/dist/lib/planner/helpers.d.ts +2 -0
  31. package/dist/lib/planner/helpers.js +135 -0
  32. package/dist/lib/planner/helpers.js.map +1 -0
  33. package/dist/lib/planner/implicit-caps.d.ts +1 -0
  34. package/dist/lib/planner/implicit-caps.js +91 -0
  35. package/dist/lib/planner/implicit-caps.js.map +1 -0
  36. package/dist/lib/planner/projects.d.ts +13 -0
  37. package/dist/lib/planner/projects.js +181 -0
  38. package/dist/lib/planner/projects.js.map +1 -0
  39. package/dist/lib/planner/signals.d.ts +17 -0
  40. package/dist/lib/planner/signals.js +324 -0
  41. package/dist/lib/planner/signals.js.map +1 -0
  42. package/dist/lib/product-brief.d.ts +25 -0
  43. package/dist/lib/product-brief.js +129 -0
  44. package/dist/lib/product-brief.js.map +1 -0
  45. package/dist/lib/prompt-planner.d.ts +5 -1
  46. package/dist/lib/prompt-planner.js +59 -622
  47. package/dist/lib/prompt-planner.js.map +1 -1
  48. package/dist/lib/prompt-rewriter.d.ts +21 -0
  49. package/dist/lib/prompt-rewriter.js +118 -0
  50. package/dist/lib/prompt-rewriter.js.map +1 -0
  51. package/dist/lib/selection.js +170 -36
  52. package/dist/lib/selection.js.map +1 -1
  53. package/dist/lib/telemetry.d.ts +0 -11
  54. package/dist/lib/telemetry.js +3 -3
  55. package/dist/lib/telemetry.js.map +1 -1
  56. package/dist/lib/vb-outcomes.d.ts +61 -0
  57. package/dist/lib/vb-outcomes.js +88 -0
  58. package/dist/lib/vb-outcomes.js.map +1 -0
  59. package/dist/training/variant_b/brief-loader.d.ts +5 -0
  60. package/dist/training/variant_b/brief-loader.js +263 -0
  61. package/dist/training/variant_b/brief-loader.js.map +1 -0
  62. package/dist/training/variant_b/flow.d.ts +56 -0
  63. package/dist/training/variant_b/flow.js +80 -0
  64. package/dist/training/variant_b/flow.js.map +1 -0
  65. package/dist/training/variant_b/generate.d.ts +7 -0
  66. package/dist/training/variant_b/generate.js +70 -0
  67. package/dist/training/variant_b/generate.js.map +1 -0
  68. package/dist/training/variant_b/judge.d.ts +8 -0
  69. package/dist/training/variant_b/judge.js +24 -0
  70. package/dist/training/variant_b/judge.js.map +1 -0
  71. package/dist/training/variant_b/nodes/collect.d.ts +31 -0
  72. package/dist/training/variant_b/nodes/collect.js +122 -0
  73. package/dist/training/variant_b/nodes/collect.js.map +1 -0
  74. package/dist/training/variant_b/nodes/generate.d.ts +22 -0
  75. package/dist/training/variant_b/nodes/generate.js +171 -0
  76. package/dist/training/variant_b/nodes/generate.js.map +1 -0
  77. package/dist/training/variant_b/nodes/judge.d.ts +26 -0
  78. package/dist/training/variant_b/nodes/judge.js +64 -0
  79. package/dist/training/variant_b/nodes/judge.js.map +1 -0
  80. package/dist/training/variant_b/nodes/promote.d.ts +15 -0
  81. package/dist/training/variant_b/nodes/promote.js +64 -0
  82. package/dist/training/variant_b/nodes/promote.js.map +1 -0
  83. package/dist/training/variant_b/nodes/rank.d.ts +12 -0
  84. package/dist/training/variant_b/nodes/rank.js +46 -0
  85. package/dist/training/variant_b/nodes/rank.js.map +1 -0
  86. package/dist/training/variant_b/nodes/train.d.ts +34 -0
  87. package/dist/training/variant_b/nodes/train.js +209 -0
  88. package/dist/training/variant_b/nodes/train.js.map +1 -0
  89. package/dist/training/variant_b/run-flow.d.ts +11 -0
  90. package/dist/training/variant_b/run-flow.js +21 -0
  91. package/dist/training/variant_b/run-flow.js.map +1 -0
  92. package/dist/training/variant_b/train.d.ts +15 -0
  93. package/dist/training/variant_b/train.js +37 -0
  94. package/dist/training/variant_b/train.js.map +1 -0
  95. package/dist/types.d.ts +16 -0
  96. package/package.json +6 -2
  97. package/registry/families/browser-extension-ts/files/package.json +4 -1
  98. package/registry/families/cli-ts/files/package.json +5 -0
  99. package/registry/families/electron-desktop-ts/files/package.json +3 -1
  100. package/registry/families/expo-react-native-ts/files/package.json +4 -0
  101. package/registry/families/fhenix-contracts/files/package.json +1 -1
  102. package/registry/families/fhevm-contracts/files/package.json +1 -1
  103. package/registry/families/fullstack-ts/files/package.json +3 -1
  104. package/registry/families/hardhat-contracts/files/package.json +3 -1
  105. package/registry/families/nextjs-ts/files/package.json +3 -1
  106. package/registry/families/react-vite-ts/files/package.json +11 -1
  107. package/registry/families/react-vite-ts/files/src/components/ui/badge.tsx +9 -0
  108. package/registry/families/react-vite-ts/files/src/components/ui/button.tsx +18 -0
  109. package/registry/families/react-vite-ts/files/src/components/ui/card.tsx +22 -0
  110. package/registry/families/react-vite-ts/manifest.json +14 -2
  111. package/registry/families/remix-ts/files/package.json +9 -1
  112. package/registry/families/sveltekit-ts/files/package.json +9 -1
  113. package/registry/families/tauri-desktop/files/package.json +3 -1
  114. package/registry/families/vue-ts/files/package.json +9 -1
  115. package/registry/layers/framework/expo-react-native-ts/files/tsconfig.json +2 -1
  116. package/registry/layers/framework/forge-foundation/files/foundry.toml +22 -1
  117. package/registry/layers/framework/fullstack-node-ts/files/personalize.json +5 -5
  118. package/registry/layers/framework/tangle-blueprint/files/TOOLCHAIN.md +16 -0
  119. package/registry/layers/framework/tangle-blueprint/files/rust-toolchain.toml +1 -1
  120. package/registry/layers/framework/tangle-blueprint/manifest.json +4 -0
  121. package/registry/package-to-capability.json +57 -0
@@ -0,0 +1,324 @@
1
+ // Signal constants used across the planner. Pure data — no behavior.
2
+ // Every list is a hasAny-style substring match; case handled by the caller.
3
+ //
4
+ // Grouped by where the signal fires in the pipeline:
5
+ // - Lane detection: FRONTEND_SIGNALS, API_SIGNALS, WORKER_SIGNALS,
6
+ // FULLSTACK_SIGNALS, WORKSPACE_SIGNALS, SINGLE_LANE_SIGNALS,
7
+ // FRAMEWORK_API_TERMS, STRONG_API_TERMS,
8
+ // EXPLICIT_WORKER_SIGNALS
9
+ // - Archetype inference: IMPLICIT_UI_FAMILIES, REACT_FAMILIES,
10
+ // CHAT_ARCHETYPE_SIGNALS, CHART_STRONG_SIGNALS,
11
+ // AI_PRODUCT_PHRASES, VIDEO_ARCHETYPE_SIGNALS,
12
+ // ADMIN_ARCHETYPE_SIGNALS, AUTH_ARCHETYPE_SIGNALS
13
+ // Families where implicit UI capability inference fires (archetype-based
14
+ // dashboard/chat/chart attachment). Moving it out of this set means losing
15
+ // the auto-attached React UI layers.
16
+ export const IMPLICIT_UI_FAMILIES = new Set(['react-vite-ts', 'nextjs-ts', 'fullstack-ts', 'remix-ts']);
17
+ // React families that get unconditional tailwind + shadcn attachment.
18
+ // Keep in sync with IMPLICIT_UI_FAMILIES — any addition here should also
19
+ // go there.
20
+ export const REACT_FAMILIES = new Set(['react-vite-ts', 'nextjs-ts', 'fullstack-ts', 'remix-ts']);
21
+ // Chat-first archetype: product's primary surface is a conversational thread,
22
+ // not a data-heavy dashboard. Matches phrases where the user interacts by
23
+ // talking to the AI (assistant / tutor / companion) or the product IS a chatbot.
24
+ export const CHAT_ARCHETYPE_SIGNALS = [
25
+ 'chatbot',
26
+ 'chat bot',
27
+ 'support bot',
28
+ 'ai assistant',
29
+ 'cooking assistant',
30
+ 'shopping assistant',
31
+ 'writing assistant',
32
+ 'personal assistant',
33
+ 'ai tutor',
34
+ 'language tutor',
35
+ 'homework help',
36
+ 'homework helper',
37
+ 'bedtime stor',
38
+ 'voice companion',
39
+ 'ai companion',
40
+ 'symptom checker',
41
+ 'describe what',
42
+ 'i describe',
43
+ 'conversations with',
44
+ 'conversation with me',
45
+ 'has conversations',
46
+ 'chat with me',
47
+ 'chats with me',
48
+ 'texts me',
49
+ 'explains concepts',
50
+ // dialogue-shape prompts: "I tell it...", "I ask it..."
51
+ 'tell it ',
52
+ 'ask it ',
53
+ 'tells me',
54
+ 'tells you',
55
+ ];
56
+ // STRONG chart signals — single match triggers chart-widget. Each is a
57
+ // near-certain indicator of a data-viz surface. Intentionally avoids single
58
+ // words like "track" / "patterns" / "trends" / "charts" which carry too many
59
+ // unrelated senses (seating charts, music tracks, movement patterns).
60
+ export const CHART_STRONG_SIGNALS = [
61
+ 'gantt',
62
+ 'burndown',
63
+ 'kpi',
64
+ 'analytics',
65
+ 'metrics',
66
+ 'churn',
67
+ 'sentiment analysis',
68
+ 'sentiment patterns',
69
+ 'sentiment over time',
70
+ 'see trends',
71
+ 'shows sentiment',
72
+ 'price changes',
73
+ 'price tracking',
74
+ 'tracks price',
75
+ 'tracks floor',
76
+ 'tracks mentions',
77
+ 'tracks what performs',
78
+ 'compensation trends',
79
+ 'salary ranges',
80
+ 'portfolio tracker',
81
+ 'portfolio value',
82
+ 'floor prices',
83
+ 'valuation',
84
+ 'sales reporting',
85
+ 'auto-generates esg',
86
+ 'sustainability reports',
87
+ 'status reports',
88
+ 'yield farming',
89
+ 'apys across',
90
+ 'competitive pricing',
91
+ 'competitor websites',
92
+ 'listing aggregator',
93
+ 'auto-compound',
94
+ 'neighborhood trends',
95
+ 'comparable sales',
96
+ 'deals below market',
97
+ 'churn metrics',
98
+ 'nps tracking',
99
+ 'low-stock alerts',
100
+ 'categorizes spending',
101
+ 'savings tips',
102
+ 'payment tracking',
103
+ "track what's paid",
104
+ 'coaching opportunities',
105
+ 'see stats',
106
+ 'see metrics',
107
+ 'dashboard to see',
108
+ 'performance tracking',
109
+ 'p&l',
110
+ 'revenue metrics',
111
+ ];
112
+ // AI product signals — literal phrases that indicate "the product is AI-powered"
113
+ // and likely ships a chat surface. Kept as a hasAny list (case-insensitive
114
+ // word-boundary match via matchesKeyword) rather than a wide regex.
115
+ export const AI_PRODUCT_PHRASES = [
116
+ 'ai app',
117
+ 'ai tool',
118
+ 'ai platform',
119
+ 'ai assistant',
120
+ 'ai agent',
121
+ 'ai bot',
122
+ 'ai advisor',
123
+ 'ai tutor',
124
+ 'ai companion',
125
+ 'ai writer',
126
+ 'ai scheduler',
127
+ 'ai analyzer',
128
+ 'ai optimizer',
129
+ 'ai planner',
130
+ 'ai generator',
131
+ 'ai helper',
132
+ 'ai reviewer',
133
+ 'ai builder',
134
+ 'ai engine',
135
+ 'ai system',
136
+ 'ai pipeline',
137
+ 'ai workflow',
138
+ 'ai manager',
139
+ 'ai screener',
140
+ 'ai screening',
141
+ 'ai coach',
142
+ 'ai copilot',
143
+ 'ai feature',
144
+ 'ai cooking',
145
+ 'ai personal',
146
+ 'ai language',
147
+ 'ai voice',
148
+ 'ai travel',
149
+ 'ai meal',
150
+ 'ai interior',
151
+ 'ai code',
152
+ 'ai recipe',
153
+ 'ai resume',
154
+ 'ai social',
155
+ 'ai customer',
156
+ 'ai legal',
157
+ 'ai medical',
158
+ 'ai homework',
159
+ 'ai newsletter',
160
+ 'ai podcast',
161
+ 'ai video',
162
+ 'ai property',
163
+ 'ai content',
164
+ 'ai data',
165
+ 'ai recruit',
166
+ 'ai symptom',
167
+ 'ai image',
168
+ 'ai photo',
169
+ 'ai audio',
170
+ 'ai chat',
171
+ 'ai email',
172
+ 'ai search',
173
+ 'ai-powered',
174
+ 'ai-driven',
175
+ 'generative ai',
176
+ 'artificial intelligence',
177
+ // "AI <verb>s ..." — "AI does X" in plain language
178
+ 'ai suggests',
179
+ 'ai turns',
180
+ 'ai generates',
181
+ 'ai highlights',
182
+ 'ai writes',
183
+ 'ai answers',
184
+ 'ai analyzes',
185
+ 'ai estimates',
186
+ 'ai categor',
187
+ 'ai identif',
188
+ 'ai creat',
189
+ 'ai cuts',
190
+ 'ai tailors',
191
+ 'ai adapts',
192
+ 'ai screens',
193
+ 'ai extracts',
194
+ 'ai explains',
195
+ 'ai reads',
196
+ 'ai understands',
197
+ 'ai processes',
198
+ 'ai translates',
199
+ 'ai summar',
200
+ 'ai detects',
201
+ 'ai recommends',
202
+ 'ai scores',
203
+ // "AI that/to/for ..." shapes
204
+ 'ai that',
205
+ 'ai to ',
206
+ 'ai which',
207
+ 'ai for',
208
+ // "build/make/create me an ai ..."
209
+ 'an ai ',
210
+ 'a ai ',
211
+ // Implicit-AI products (no literal "AI" but the capability is AI-dependent)
212
+ 'transcribes',
213
+ 'transcription',
214
+ 'gives me a summary',
215
+ 'summarizes',
216
+ 'auto-summar',
217
+ 'automatically generates',
218
+ 'automatically cuts',
219
+ ];
220
+ // Implicit video/call surface — natural prompts that describe video rooms,
221
+ // consultations, low-latency audio, or streaming without saying "webrtc".
222
+ export const VIDEO_ARCHETYPE_SIGNALS = [
223
+ 'video consultation',
224
+ 'video consultations',
225
+ 'video rooms',
226
+ 'video room',
227
+ 'video call',
228
+ 'video calls',
229
+ 'video updates',
230
+ 'video conferencing',
231
+ 'video conference',
232
+ 'virtual co-working',
233
+ 'virtual coworking',
234
+ 'low-latency audio',
235
+ 'persistent video',
236
+ 'video tutoring',
237
+ 'async video',
238
+ 'screen sharing',
239
+ 'shared whiteboard',
240
+ 'telehealth',
241
+ 'livekit',
242
+ 'peer-to-peer',
243
+ 'jam session',
244
+ ];
245
+ // Admin/operations archetypes — internal SaaS tools with bulk management,
246
+ // document workflows, role-based access, approval flows. These want layout-admin
247
+ // alongside layout-dashboard.
248
+ export const ADMIN_ARCHETYPE_SIGNALS = [
249
+ 'onboarding tool',
250
+ 'onboarding app',
251
+ 'employee onboarding',
252
+ 'vendor onboarding',
253
+ 'approval workflow',
254
+ 'approval flow',
255
+ 'back office',
256
+ 'content management',
257
+ 'data table',
258
+ 'crud operations',
259
+ 'role-based',
260
+ 'multi-step sign-off',
261
+ 'dues collection',
262
+ 'maintenance requests',
263
+ 'document storage',
264
+ 'collects documents',
265
+ 'auto-assign',
266
+ 'assigns tasks',
267
+ 'hr tool',
268
+ 'admin panel',
269
+ ];
270
+ // Auth/portal archetypes — client portals, tenant portals, customer-specific
271
+ // views with login flows.
272
+ export const AUTH_ARCHETYPE_SIGNALS = [
273
+ 'client portal',
274
+ 'customer portal',
275
+ 'tenant portal',
276
+ 'accounting firm',
277
+ 'document portal',
278
+ 'share tax returns',
279
+ 'patient portal',
280
+ 'secure login',
281
+ ];
282
+ // Single-surface families that never become workspaces.
283
+ export const SINGLE_LANE_SIGNALS = [
284
+ 'expo', 'react native', 'mobile app', 'ios app', 'android app',
285
+ 'browser extension', 'chrome extension', 'manifest v3',
286
+ 'electron', 'desktop app', 'desktop assistant',
287
+ 'command line', 'terminal tool',
288
+ 'streamlit', 'gradio', 'data app', 'tauri',
289
+ ];
290
+ export const FRONTEND_SIGNALS = [
291
+ 'frontend', 'ui', 'website', 'landing', 'dashboard', 'web app', 'app',
292
+ 'preview', 'next', 'react', 'platform', 'dapp', 'interface', 'portal',
293
+ // "X page" / "Y screen" — UI nouns. Buildout corpus showed prompts like
294
+ // "DEX swap page" / "NFT mint page" routing to forge-contracts only
295
+ // because no frontend signal matched.
296
+ 'page', 'screen', 'mint page', 'swap page', 'bridge page',
297
+ 'staking page', 'claim page',
298
+ ];
299
+ export const API_SIGNALS = [
300
+ 'api', 'backend', 'server', 'endpoint', 'service', 'webhook', 'health check',
301
+ 'cloudflare', 'durable object', 'edge api', 'edge function', 'payment webhook',
302
+ 'server wallet', 'rest api', 'graphql api',
303
+ ];
304
+ // Framework namespace "api" mentions that aren't REST APIs — disambiguate.
305
+ export const FRAMEWORK_API_TERMS = ['composition api', 'options api', 'signals api', 'context api', 'hooks api'];
306
+ export const STRONG_API_TERMS = ['backend', 'server', 'endpoint', 'webhook', 'rest api', 'graphql api', 'api service', 'api endpoint', 'health check'];
307
+ export const WORKER_SIGNALS = [
308
+ 'trading bot', 'background job', 'background worker', 'worker for', 'playwright worker',
309
+ 'automation worker', 'go worker', 'golang worker', 'queue', 'cron', 'market stream', 'bot',
310
+ ];
311
+ export const EXPLICIT_WORKER_SIGNALS = [
312
+ 'trading bot', 'background job', 'background worker', 'worker for', 'playwright worker',
313
+ 'automation worker', 'go worker', 'golang worker', 'queue', 'cron', 'market stream',
314
+ ];
315
+ export const FULLSTACK_SIGNALS = [
316
+ 'fullstack', 'full stack', 'dashboard with api', 'app with api', 'admin app', 'admin panel',
317
+ 'database-backed', 'dashboard and api', 'admin flows', 'saas', 'saas app', 'saas platform',
318
+ 'internal tool', 'back office', 'crud app',
319
+ ];
320
+ export const WORKSPACE_SIGNALS = [
321
+ 'workspace', 'monorepo', 'separate backend', 'separate api',
322
+ 'background worker', 'contract lane', 'contract lanes',
323
+ ];
324
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../../src/lib/planner/signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface ProductBrief {
2
+ canonicalPrompt: string;
3
+ vision: string;
4
+ taskChecklist: string[];
5
+ milestones: string[];
6
+ testingPlan: string[];
7
+ e2ePlan: string[];
8
+ securityConcerns: string[];
9
+ openQuestions: string[];
10
+ confidence: number;
11
+ }
12
+ export interface BriefArgs {
13
+ prompt: string;
14
+ partner?: string | null;
15
+ knownFamilies: string[];
16
+ knownCapabilities: string[];
17
+ }
18
+ export interface BriefResult {
19
+ brief: ProductBrief;
20
+ cacheHit: boolean;
21
+ latencyMs: number;
22
+ }
23
+ export type BriefFn = (args: BriefArgs) => Promise<BriefResult | null>;
24
+ export declare function __setTestBrief(fn: BriefFn | null): void;
25
+ export declare function generateProductBrief(args: BriefArgs): Promise<BriefResult | null>;
@@ -0,0 +1,129 @@
1
+ import { createHash } from 'node:crypto';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { performance } from 'node:perf_hooks';
5
+ import { ax } from '@ax-llm/ax';
6
+ import { createLLM, isLLMAvailable } from './llm.js';
7
+ const CACHE_DIR = '.evolve';
8
+ const CACHE_PATH = path.join(CACHE_DIR, 'product-brief-cache.json');
9
+ const MAX_LRU = 256;
10
+ const inMemLRU = new Map();
11
+ let diskCache = null;
12
+ let testOverride = null;
13
+ export function __setTestBrief(fn) {
14
+ testOverride = fn;
15
+ }
16
+ function hashKey(prompt, partner) {
17
+ return createHash('sha1').update(`brief::${prompt}::${partner ?? ''}`).digest('hex').slice(0, 16);
18
+ }
19
+ async function loadDiskCache() {
20
+ if (diskCache)
21
+ return diskCache;
22
+ try {
23
+ const raw = await fs.readFile(CACHE_PATH, 'utf8');
24
+ const obj = JSON.parse(raw);
25
+ diskCache = new Map(Object.entries(obj));
26
+ }
27
+ catch {
28
+ diskCache = new Map();
29
+ }
30
+ return diskCache;
31
+ }
32
+ async function persistDiskCache() {
33
+ if (!diskCache)
34
+ return;
35
+ await fs.mkdir(CACHE_DIR, { recursive: true });
36
+ const obj = {};
37
+ for (const [k, v] of diskCache)
38
+ obj[k] = v;
39
+ await fs.writeFile(CACHE_PATH, JSON.stringify(obj, null, 2));
40
+ }
41
+ // Rich brief generator: one LLM call yields everything the downstream pipeline
42
+ // needs — the canonical routing prompt AND the product plan. Signatures use
43
+ // ax's field-description syntax so the model knows what each field should
44
+ // contain without needing a prose system prompt.
45
+ const briefAgent = ax([
46
+ '"Turn a user product prompt into a structured product brief that drives a deterministic scaffold pipeline downstream. The canonicalPrompt must be a keyword-rich expansion that names concrete technologies drawn from knownFamilies (e.g. nextjs-ts, fullstack-ts, agent-service-ts, go-api, python-api, forge-contracts, solana-program) and concrete UI/infra capabilities drawn from knownCapabilities (e.g. capability:ai-chat-ui, capability:layout-dashboard, capability:saas-billing). It MUST be longer and more specific than the user prompt. Preserve the user intent exactly — do not invent features. The brief is for humans AND for AI agents that will build the project, so be concrete and specific. Each list field should have 3-8 items." ',
47
+ 'userPrompt:string, ',
48
+ 'knownFamilies:string[], ',
49
+ 'knownCapabilities:string[] ',
50
+ '-> ',
51
+ 'canonicalPrompt:string, ',
52
+ 'vision:string, ',
53
+ 'taskChecklist:string[], ',
54
+ 'milestones:string[], ',
55
+ 'testingPlan:string[], ',
56
+ 'e2ePlan:string[], ',
57
+ 'securityConcerns:string[], ',
58
+ 'openQuestions:string[], ',
59
+ 'confidence:number',
60
+ ].join(''));
61
+ function normalizeConfidence(value) {
62
+ if (typeof value !== 'number' || !Number.isFinite(value))
63
+ return 0.5;
64
+ if (value <= 0)
65
+ return 0;
66
+ if (value >= 1)
67
+ return 1;
68
+ return value;
69
+ }
70
+ function sanitizeList(value) {
71
+ if (!Array.isArray(value))
72
+ return [];
73
+ return value.map((v) => String(v).trim()).filter(Boolean);
74
+ }
75
+ async function generateProductBriefImpl({ prompt, partner = null, knownFamilies, knownCapabilities, }) {
76
+ const key = hashKey(prompt, partner);
77
+ const mem = inMemLRU.get(key);
78
+ if (mem)
79
+ return { brief: mem, cacheHit: true, latencyMs: 0 };
80
+ const disk = await loadDiskCache();
81
+ const cached = disk.get(key);
82
+ if (cached) {
83
+ inMemLRU.set(key, cached);
84
+ return { brief: cached, cacheHit: true, latencyMs: 0 };
85
+ }
86
+ if (!isLLMAvailable())
87
+ return null;
88
+ const llm = createLLM();
89
+ const t0 = performance.now();
90
+ let raw;
91
+ try {
92
+ raw = (await briefAgent.forward(llm, {
93
+ userPrompt: prompt,
94
+ knownFamilies,
95
+ knownCapabilities,
96
+ }, { stream: false }));
97
+ }
98
+ catch {
99
+ return null;
100
+ }
101
+ const latencyMs = performance.now() - t0;
102
+ const canonicalPrompt = (raw.canonicalPrompt ?? '').trim();
103
+ if (!canonicalPrompt)
104
+ return null;
105
+ const brief = {
106
+ canonicalPrompt,
107
+ vision: (raw.vision ?? '').trim(),
108
+ taskChecklist: sanitizeList(raw.taskChecklist),
109
+ milestones: sanitizeList(raw.milestones),
110
+ testingPlan: sanitizeList(raw.testingPlan),
111
+ e2ePlan: sanitizeList(raw.e2ePlan),
112
+ securityConcerns: sanitizeList(raw.securityConcerns),
113
+ openQuestions: sanitizeList(raw.openQuestions),
114
+ confidence: normalizeConfidence(raw.confidence),
115
+ };
116
+ inMemLRU.set(key, brief);
117
+ if (inMemLRU.size > MAX_LRU) {
118
+ const first = inMemLRU.keys().next().value;
119
+ if (typeof first === 'string')
120
+ inMemLRU.delete(first);
121
+ }
122
+ disk.set(key, brief);
123
+ persistDiskCache().catch(() => { });
124
+ return { brief, cacheHit: false, latencyMs };
125
+ }
126
+ export function generateProductBrief(args) {
127
+ return (testOverride ?? generateProductBriefImpl)(args);
128
+ }
129
+ //# sourceMappingURL=product-brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-brief.js","sourceRoot":"","sources":["../../src/lib/product-brief.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,13 @@
1
1
  import type { PromptPlan } from '../types.js';
2
- export declare function planPrompt({ prompt, partner, forceKind, familyHint, }: {
2
+ export declare function planPrompt({ prompt, partner, forceKind, familyHint, rewriter, brief, }: {
3
3
  prompt: string;
4
4
  partner?: string | null;
5
5
  /** Force the result to be 'starter' or 'workspace'. Used by scaffold-builder for curated templates. */
6
6
  forceKind?: 'starter' | 'workspace' | null;
7
7
  /** Hint the family directly. Skips family scoring, only detects capabilities + slots. */
8
8
  familyHint?: string | null;
9
+ /** Narrow rewriter: LLM produces a short canonical prompt for re-planning. Back-compat flag; prefer `brief`. */
10
+ rewriter?: boolean;
11
+ /** Rich product brief: one LLM call produces canonical prompt + vision + tasks + milestones + tests + e2e + security + openQuestions. Attached to the returned plan via .brief for downstream context-pack use. */
12
+ brief?: boolean;
9
13
  }): Promise<PromptPlan>;