tryassay 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/api/server.d.ts +4 -0
  2. package/dist/api/server.js +145 -1
  3. package/dist/api/server.js.map +1 -1
  4. package/dist/cli.js +21 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/create.d.ts +18 -0
  7. package/dist/commands/create.js +135 -0
  8. package/dist/commands/create.js.map +1 -0
  9. package/dist/runtime/agents/code-agent.d.ts +1 -1
  10. package/dist/runtime/agents/code-agent.js +17 -7
  11. package/dist/runtime/agents/code-agent.js.map +1 -1
  12. package/dist/runtime/agents/coordinator-agent.js +2 -1
  13. package/dist/runtime/agents/coordinator-agent.js.map +1 -1
  14. package/dist/runtime/agents/planner-agent.d.ts +18 -0
  15. package/dist/runtime/agents/planner-agent.js +201 -0
  16. package/dist/runtime/agents/planner-agent.js.map +1 -0
  17. package/dist/runtime/app-create-orchestrator.d.ts +62 -0
  18. package/dist/runtime/app-create-orchestrator.js +923 -0
  19. package/dist/runtime/app-create-orchestrator.js.map +1 -0
  20. package/dist/runtime/build-verifier.d.ts +32 -0
  21. package/dist/runtime/build-verifier.js +508 -0
  22. package/dist/runtime/build-verifier.js.map +1 -0
  23. package/dist/runtime/composition-verifier.d.ts +46 -0
  24. package/dist/runtime/composition-verifier.js +278 -1
  25. package/dist/runtime/composition-verifier.js.map +1 -1
  26. package/dist/runtime/multi-agent-loop.d.ts +2 -0
  27. package/dist/runtime/multi-agent-loop.js +65 -1
  28. package/dist/runtime/multi-agent-loop.js.map +1 -1
  29. package/dist/runtime/specialized-agent.js +1 -1
  30. package/dist/runtime/specialized-agent.js.map +1 -1
  31. package/dist/runtime/types.d.ts +212 -2
  32. package/package.json +1 -1
@@ -0,0 +1,18 @@
1
+ import { SpecializedAgent, type TaskAssignmentPayload, type TaskResultPayload } from '../specialized-agent.js';
2
+ import type { AgentMessage } from '../types.js';
3
+ import type { MessageBus } from '../message-bus.js';
4
+ export declare class PlannerAgent extends SpecializedAgent {
5
+ constructor(messageBus: MessageBus, opts?: {
6
+ model?: string;
7
+ });
8
+ protected onMessage(_message: AgentMessage): void;
9
+ executeTask(task: TaskAssignmentPayload): Promise<TaskResultPayload>;
10
+ private parsePlanResponse;
11
+ /**
12
+ * Try multiple strategies to extract JSON from LLM response:
13
+ * 1. Direct parse
14
+ * 2. Strip markdown code fences
15
+ * 3. Find first { ... } balanced block
16
+ */
17
+ private extractJson;
18
+ }
@@ -0,0 +1,201 @@
1
+ // ============================================================
2
+ // Planner Agent — Designs application architecture
3
+ // Produces ArchitecturePlan artifacts with verifiable claims
4
+ // about schema completeness, API coverage, and dependency order.
5
+ // ============================================================
6
+ import { SpecializedAgent, } from '../specialized-agent.js';
7
+ export class PlannerAgent extends SpecializedAgent {
8
+ constructor(messageBus, opts) {
9
+ super('planner-agent', 'planner', [
10
+ { name: 'architecture_design', description: 'Design full application architecture', tools: [] },
11
+ { name: 'schema_design', description: 'Design database schemas with relations', tools: [] },
12
+ { name: 'feature_decomposition', description: 'Decompose features into buildable units with dependency order', tools: [] },
13
+ ], messageBus, { model: opts?.model, initialTrust: 'untrusted' });
14
+ }
15
+ onMessage(_message) {
16
+ // Planner receives context from coordinator or research agent
17
+ }
18
+ async executeTask(task) {
19
+ const contextSnippets = task.contextRefs
20
+ .map(ref => `Context: ${ref.summary}\n${ref.content ?? ''}`)
21
+ .join('\n\n');
22
+ const systemPrompt = `You are a Planning Agent — a specialized AI that designs application architectures.
23
+
24
+ Your job: Given an app description with tech stack, features, and constraints, produce a complete ArchitecturePlan.
25
+
26
+ The plan MUST include:
27
+ 1. Schema entities with fields, types, and relations
28
+ 2. API routes with methods, paths, auth requirements, and request/response types
29
+ 3. Pages with paths, components, and auth requirements
30
+ 4. Features decomposed into buildable units with dependency order
31
+ 5. Auth plan if authentication is required
32
+ 6. Deploy config for the target platform
33
+
34
+ Rules:
35
+ 1. The dependency order must be acyclic — features must be buildable in sequence.
36
+ 2. Auth features must come first in the dependency order.
37
+ 3. Every feature must reference its schema entities, API routes, and pages.
38
+ 4. Every schema entity must be referenced by at least one feature.
39
+ 5. Every API route must be referenced by at least one feature.
40
+ 6. State explicit claims about your plan's completeness — they will be verified.
41
+ 7. FEATURE GRANULARITY: Target 3-5 features total. Combine trivially related functionality into single features:
42
+ - Auth signup + login + logout + session management = one "authentication" feature
43
+ - All CRUD operations on a single entity = one feature (e.g., "todo-management")
44
+ - Landing page + layout + navigation = one "app-shell" feature
45
+ - A complexityEstimate of "trivial" is a code smell — merge trivial features into their parent feature.
46
+ 8. DEPENDENCY MINIMIZATION: If two features COULD be built independently, they SHOULD have empty dependsOn arrays. Maximize parallelism — only add dependencies when a feature literally cannot compile without another feature's output (e.g., todo-management depends on authentication because it needs the user session).
47
+
48
+ Respond with JSON:
49
+ {
50
+ "schema": [
51
+ {
52
+ "name": "...",
53
+ "fields": [{ "name": "...", "type": "...", "nullable": false, "primaryKey": true }],
54
+ "relations": [{ "target": "...", "type": "one-to-many", "foreignKey": "..." }]
55
+ }
56
+ ],
57
+ "apiRoutes": [
58
+ {
59
+ "method": "GET|POST|PUT|DELETE|PATCH",
60
+ "path": "/api/...",
61
+ "description": "...",
62
+ "auth": true,
63
+ "requestType": "...",
64
+ "responseType": "...",
65
+ "featureId": "..."
66
+ }
67
+ ],
68
+ "pages": [
69
+ {
70
+ "path": "/...",
71
+ "component": "...",
72
+ "auth": true,
73
+ "featureId": "...",
74
+ "description": "..."
75
+ }
76
+ ],
77
+ "features": [
78
+ {
79
+ "id": "feature-id",
80
+ "name": "...",
81
+ "dependsOn": ["other-feature-id"],
82
+ "schemaEntities": ["EntityName"],
83
+ "apiRoutes": ["/api/..."],
84
+ "pages": ["/..."],
85
+ "complexityEstimate": "trivial|small|medium|large"
86
+ }
87
+ ],
88
+ "dependencyOrder": ["feature-id-1", "feature-id-2", ...],
89
+ "authPlan": {
90
+ "provider": "...",
91
+ "methods": ["email", "google"],
92
+ "roles": ["user", "admin"],
93
+ "protectedRoutes": ["/dashboard", "/api/..."]
94
+ },
95
+ "deployConfig": {
96
+ "platform": "vercel",
97
+ "buildCommand": "npm run build",
98
+ "envVars": ["DATABASE_URL", "..."]
99
+ },
100
+ "summary": "...",
101
+ "claims": [
102
+ "Schema covers all N entities required by the features",
103
+ "API has M routes covering all CRUD operations",
104
+ "Dependency order is acyclic with auth first",
105
+ "Every feature references its schema entities and API routes"
106
+ ]
107
+ }`;
108
+ const userPrompt = `TASK: ${task.goal}
109
+
110
+ CONSTRAINTS:
111
+ ${task.constraints.map(c => `- ${c}`).join('\n')}
112
+
113
+ CONTEXT:
114
+ ${contextSnippets || 'No additional context provided.'}
115
+
116
+ Design the complete architecture now. Remember to state your claims explicitly.`;
117
+ try {
118
+ const { content } = await this.callClaude(systemPrompt, userPrompt);
119
+ const parsed = this.parsePlanResponse(content);
120
+ const features = Array.isArray(parsed.plan.features) ? parsed.plan.features : [];
121
+ const artifact = this.makeArtifact('architecture_plan', JSON.stringify(parsed.plan, null, 2), { metadata: { featureCount: features.length } });
122
+ return {
123
+ taskId: task.taskId,
124
+ status: 'completed',
125
+ artifacts: [artifact],
126
+ summary: parsed.summary,
127
+ claimsAboutArtifacts: parsed.claims,
128
+ };
129
+ }
130
+ catch (err) {
131
+ return {
132
+ taskId: task.taskId,
133
+ status: 'failed',
134
+ artifacts: [],
135
+ summary: `Architecture planning failed: ${err instanceof Error ? err.message : String(err)}`,
136
+ claimsAboutArtifacts: [],
137
+ blockers: [err instanceof Error ? err.message : String(err)],
138
+ };
139
+ }
140
+ }
141
+ parsePlanResponse(raw) {
142
+ const parsed = this.extractJson(raw);
143
+ if (parsed) {
144
+ return {
145
+ plan: {
146
+ schema: Array.isArray(parsed.schema) ? parsed.schema : [],
147
+ apiRoutes: Array.isArray(parsed.apiRoutes) ? parsed.apiRoutes : [],
148
+ pages: Array.isArray(parsed.pages) ? parsed.pages : [],
149
+ features: Array.isArray(parsed.features) ? parsed.features : [],
150
+ dependencyOrder: Array.isArray(parsed.dependencyOrder) ? parsed.dependencyOrder : [],
151
+ authPlan: parsed.authPlan ?? null,
152
+ deployConfig: parsed.deployConfig ?? null,
153
+ },
154
+ summary: typeof parsed.summary === 'string' ? parsed.summary : 'Architecture plan generated',
155
+ claims: Array.isArray(parsed.claims) ? parsed.claims : [],
156
+ };
157
+ }
158
+ return {
159
+ plan: { schema: [], apiRoutes: [], pages: [], features: [], dependencyOrder: [] },
160
+ summary: 'Failed to parse architecture plan response',
161
+ claims: [],
162
+ };
163
+ }
164
+ /**
165
+ * Try multiple strategies to extract JSON from LLM response:
166
+ * 1. Direct parse
167
+ * 2. Strip markdown code fences
168
+ * 3. Find first { ... } balanced block
169
+ */
170
+ extractJson(raw) {
171
+ const cleaned = raw.trim();
172
+ // Strategy 1: Direct parse
173
+ try {
174
+ return JSON.parse(cleaned);
175
+ }
176
+ catch { /* continue */ }
177
+ // Strategy 2: Strip outermost markdown code fences
178
+ if (cleaned.startsWith('```')) {
179
+ const firstNewline = cleaned.indexOf('\n');
180
+ const lastFence = cleaned.lastIndexOf('```');
181
+ if (firstNewline > 0 && lastFence > firstNewline) {
182
+ const inner = cleaned.slice(firstNewline + 1, lastFence).trim();
183
+ try {
184
+ return JSON.parse(inner);
185
+ }
186
+ catch { /* continue */ }
187
+ }
188
+ }
189
+ // Strategy 3: Find first { to last } and try parsing
190
+ const firstBrace = cleaned.indexOf('{');
191
+ const lastBrace = cleaned.lastIndexOf('}');
192
+ if (firstBrace >= 0 && lastBrace > firstBrace) {
193
+ try {
194
+ return JSON.parse(cleaned.slice(firstBrace, lastBrace + 1));
195
+ }
196
+ catch { /* continue */ }
197
+ }
198
+ return null;
199
+ }
200
+ }
201
+ //# sourceMappingURL=planner-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner-agent.js","sourceRoot":"","sources":["../../../src/runtime/agents/planner-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { AppDescription, AppCreateOptions, AppCreateResult } from './types.js';
3
+ export declare class AppCreateOrchestrator extends EventEmitter {
4
+ private description;
5
+ private options;
6
+ private auditTrail;
7
+ private startTime;
8
+ constructor(description: AppDescription, options: AppCreateOptions);
9
+ /** Run the full app creation pipeline. */
10
+ run(): Promise<AppCreateResult>;
11
+ private runPlanningPhase;
12
+ private verifyPlanStructure;
13
+ private isAcyclic;
14
+ private runScaffoldingPhase;
15
+ private buildFeature;
16
+ private runCrossVerification;
17
+ /**
18
+ * Group features into waves based on dependency graph.
19
+ * Wave 0: features with no dependencies
20
+ * Wave N: features whose deps are all in waves < N
21
+ */
22
+ private computeWaves;
23
+ /**
24
+ * Build a feature using a single CodeAgent call — bypasses MultiAgentLoop.
25
+ * Used for trivial/small features where full team coordination is overkill.
26
+ */
27
+ private buildFeatureDirect;
28
+ /** Whether to use direct generation (single CodeAgent) vs full MultiAgentLoop.
29
+ * For app creation (greenfield), direct mode is used for ALL features by default
30
+ * since there's no existing codebase to review against and the architecture plan
31
+ * already provides full context. Multi-agent mode adds overhead without proportional value. */
32
+ private shouldUseDirect;
33
+ /** Determine verification tier based on feature characteristics. */
34
+ private getVerificationTier;
35
+ /** Build the goal string for a feature (shared between buildFeature and buildFeatureDirect). */
36
+ private buildFeatureGoal;
37
+ /**
38
+ * Scan all generated source files for imports and ensure every
39
+ * external package is listed in package.json. Also merges any
40
+ * "package.additions.json" files that feature agents may have created.
41
+ */
42
+ private reconcileDependencies;
43
+ /**
44
+ * Generate .env.local from the architecture plan's deployConfig.envVars.
45
+ * Only creates the file if it doesn't already exist.
46
+ */
47
+ private generateEnvFile;
48
+ /** Return a sensible placeholder value for known env var patterns. */
49
+ private getEnvPlaceholder;
50
+ /** Recursively collect files with given extensions (or exact filename). */
51
+ private collectFiles;
52
+ private emitPhase;
53
+ private makeResult;
54
+ private audit;
55
+ private slugify;
56
+ /** Get framework-specific directory convention instruction for agent prompts. */
57
+ private getDirectoryConvention;
58
+ private routeToFilePath;
59
+ private pageToFilePath;
60
+ private fileExists;
61
+ private searchForSchemaEntity;
62
+ }