@zauso-ai/capstan-core 0.1.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/dist/api.d.ts +19 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +49 -0
- package/dist/api.js.map +1 -0
- package/dist/approval.d.ts +41 -0
- package/dist/approval.d.ts.map +1 -0
- package/dist/approval.js +58 -0
- package/dist/approval.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +10 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +22 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware.d.ts +25 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +29 -0
- package/dist/middleware.js.map +1 -0
- package/dist/policy.d.ts +22 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +45 -0
- package/dist/policy.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +276 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +112 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +57 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +837 -0
- package/dist/verify.js.map +1 -0
- package/package.json +45 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { cors } from "hono/cors";
|
|
3
|
+
import { toJSONSchema } from "zod";
|
|
4
|
+
import { createContext } from "./context.js";
|
|
5
|
+
import { enforcePolicies } from "./policy.js";
|
|
6
|
+
import { createApproval, getApproval, listApprovals, resolveApproval, } from "./approval.js";
|
|
7
|
+
/**
|
|
8
|
+
* Build a RouteMetadata entry, omitting keys whose value would be undefined
|
|
9
|
+
* (required by exactOptionalPropertyTypes).
|
|
10
|
+
*/
|
|
11
|
+
function buildRouteMetadata(method, path, apiDef, inputSchema, outputSchema) {
|
|
12
|
+
const meta = { method, path };
|
|
13
|
+
if (apiDef.description !== undefined)
|
|
14
|
+
meta.description = apiDef.description;
|
|
15
|
+
if (apiDef.capability !== undefined)
|
|
16
|
+
meta.capability = apiDef.capability;
|
|
17
|
+
if (apiDef.resource !== undefined)
|
|
18
|
+
meta.resource = apiDef.resource;
|
|
19
|
+
if (apiDef.policy !== undefined)
|
|
20
|
+
meta.policy = apiDef.policy;
|
|
21
|
+
if (inputSchema !== undefined)
|
|
22
|
+
meta.inputSchema = inputSchema;
|
|
23
|
+
if (outputSchema !== undefined)
|
|
24
|
+
meta.outputSchema = outputSchema;
|
|
25
|
+
return meta;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a fully-wired Capstan application backed by a Hono server.
|
|
29
|
+
*
|
|
30
|
+
* The returned object contains:
|
|
31
|
+
* - `app` -- Hono instance ready to handle requests
|
|
32
|
+
* - `routeRegistry` -- array of route metadata for the agent manifest
|
|
33
|
+
* - `registerAPI()` -- helper to register an API definition as an HTTP route
|
|
34
|
+
*/
|
|
35
|
+
export function createCapstanApp(config) {
|
|
36
|
+
const app = new Hono();
|
|
37
|
+
const routeRegistry = [];
|
|
38
|
+
/**
|
|
39
|
+
* Handler registry keyed by "METHOD /path" so that approved requests can
|
|
40
|
+
* re-execute the original handler without going through the HTTP stack.
|
|
41
|
+
*/
|
|
42
|
+
const handlerRegistry = new Map();
|
|
43
|
+
// ------------------------------------------------------------------
|
|
44
|
+
// Global middleware
|
|
45
|
+
// ------------------------------------------------------------------
|
|
46
|
+
// CORS -- allow all origins by default (production apps override via config).
|
|
47
|
+
app.use("*", cors());
|
|
48
|
+
// Inject CapstanContext into every request so handlers can retrieve it.
|
|
49
|
+
app.use("*", async (c, next) => {
|
|
50
|
+
const ctx = createContext(c);
|
|
51
|
+
c.set("capstanCtx", ctx);
|
|
52
|
+
await next();
|
|
53
|
+
});
|
|
54
|
+
// ------------------------------------------------------------------
|
|
55
|
+
// registerAPI -- mount a route + track metadata
|
|
56
|
+
// ------------------------------------------------------------------
|
|
57
|
+
const registerAPI = (method, path, apiDef, policies) => {
|
|
58
|
+
// --- record metadata ------------------------------------------------
|
|
59
|
+
let inputSchema;
|
|
60
|
+
let outputSchema;
|
|
61
|
+
try {
|
|
62
|
+
if (apiDef.input) {
|
|
63
|
+
inputSchema = toJSONSchema(apiDef.input);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Schema conversion is best-effort; silently ignore failures.
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
if (apiDef.output) {
|
|
71
|
+
outputSchema = toJSONSchema(apiDef.output);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Best-effort.
|
|
76
|
+
}
|
|
77
|
+
routeRegistry.push(buildRouteMetadata(method, path, apiDef, inputSchema, outputSchema));
|
|
78
|
+
// Store the handler so approved requests can re-execute it.
|
|
79
|
+
const routeKey = `${method} ${path}`;
|
|
80
|
+
handlerRegistry.set(routeKey, async (input, ctx) => {
|
|
81
|
+
return apiDef.handler({ input, ctx });
|
|
82
|
+
});
|
|
83
|
+
// --- mount on Hono --------------------------------------------------
|
|
84
|
+
const honoHandler = async (c) => {
|
|
85
|
+
const ctx = createContext(c);
|
|
86
|
+
// Policy enforcement
|
|
87
|
+
if (policies && policies.length > 0) {
|
|
88
|
+
let rawInput;
|
|
89
|
+
try {
|
|
90
|
+
rawInput =
|
|
91
|
+
method === "GET"
|
|
92
|
+
? Object.fromEntries(new URL(c.req.url).searchParams)
|
|
93
|
+
: await c.req.json();
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
rawInput = undefined;
|
|
97
|
+
}
|
|
98
|
+
const policyResult = await enforcePolicies(policies, ctx, rawInput);
|
|
99
|
+
if (policyResult.effect === "deny") {
|
|
100
|
+
return c.json({ error: "Forbidden", reason: policyResult.reason ?? "Policy denied" }, 403);
|
|
101
|
+
}
|
|
102
|
+
if (policyResult.effect === "approve") {
|
|
103
|
+
const reason = policyResult.reason ?? "This action requires approval";
|
|
104
|
+
const approval = createApproval({
|
|
105
|
+
method,
|
|
106
|
+
path,
|
|
107
|
+
input: rawInput,
|
|
108
|
+
policy: policies.map((p) => p.key).join(", "),
|
|
109
|
+
reason,
|
|
110
|
+
});
|
|
111
|
+
return c.json({
|
|
112
|
+
status: "approval_required",
|
|
113
|
+
approvalId: approval.id,
|
|
114
|
+
reason,
|
|
115
|
+
pollUrl: `/capstan/approvals/${approval.id}`,
|
|
116
|
+
}, 202);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Parse input
|
|
120
|
+
let input;
|
|
121
|
+
try {
|
|
122
|
+
if (method === "GET") {
|
|
123
|
+
input = Object.fromEntries(new URL(c.req.url).searchParams);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const contentType = c.req.header("content-type") ?? "";
|
|
127
|
+
if (contentType.includes("application/json")) {
|
|
128
|
+
input = await c.req.json();
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
input = {};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
input = {};
|
|
137
|
+
}
|
|
138
|
+
// Run handler (which already includes input/output validation)
|
|
139
|
+
try {
|
|
140
|
+
const result = await apiDef.handler({ input, ctx });
|
|
141
|
+
return c.json(result);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
// Zod validation errors
|
|
145
|
+
if (err != null &&
|
|
146
|
+
typeof err === "object" &&
|
|
147
|
+
"issues" in err &&
|
|
148
|
+
Array.isArray(err.issues)) {
|
|
149
|
+
return c.json({
|
|
150
|
+
error: "Validation Error",
|
|
151
|
+
issues: err.issues,
|
|
152
|
+
}, 400);
|
|
153
|
+
}
|
|
154
|
+
// Generic errors
|
|
155
|
+
const message = err instanceof Error ? err.message : "Internal Server Error";
|
|
156
|
+
return c.json({ error: message }, 500);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
// Register the handler on the correct HTTP method.
|
|
160
|
+
const lowerMethod = method.toLowerCase();
|
|
161
|
+
app[lowerMethod](path, honoHandler);
|
|
162
|
+
};
|
|
163
|
+
// ------------------------------------------------------------------
|
|
164
|
+
// Approval management endpoints
|
|
165
|
+
// ------------------------------------------------------------------
|
|
166
|
+
/** List all approvals, optionally filtered by ?status=pending|approved|denied */
|
|
167
|
+
app.get("/capstan/approvals", (c) => {
|
|
168
|
+
const statusParam = new URL(c.req.url).searchParams.get("status");
|
|
169
|
+
const items = listApprovals(statusParam ?? undefined);
|
|
170
|
+
return c.json({ approvals: items });
|
|
171
|
+
});
|
|
172
|
+
/** Get a single approval by ID */
|
|
173
|
+
app.get("/capstan/approvals/:id", (c) => {
|
|
174
|
+
const id = c.req.param("id");
|
|
175
|
+
const approval = getApproval(id);
|
|
176
|
+
if (!approval) {
|
|
177
|
+
return c.json({ error: "Approval not found" }, 404);
|
|
178
|
+
}
|
|
179
|
+
return c.json(approval);
|
|
180
|
+
});
|
|
181
|
+
/** Approve a pending approval — re-executes the original handler */
|
|
182
|
+
app.post("/capstan/approvals/:id/approve", async (c) => {
|
|
183
|
+
const id = c.req.param("id");
|
|
184
|
+
const existing = getApproval(id);
|
|
185
|
+
if (!existing) {
|
|
186
|
+
return c.json({ error: "Approval not found" }, 404);
|
|
187
|
+
}
|
|
188
|
+
if (existing.status !== "pending") {
|
|
189
|
+
return c.json({ error: "Approval already resolved", status: existing.status }, 409);
|
|
190
|
+
}
|
|
191
|
+
// Parse optional body for resolvedBy
|
|
192
|
+
let resolvedBy;
|
|
193
|
+
try {
|
|
194
|
+
const body = await c.req.json();
|
|
195
|
+
if (typeof body.resolvedBy === "string") {
|
|
196
|
+
resolvedBy = body.resolvedBy;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// No body or invalid JSON — that's fine.
|
|
201
|
+
}
|
|
202
|
+
const approval = resolveApproval(id, "approved", resolvedBy);
|
|
203
|
+
if (!approval) {
|
|
204
|
+
return c.json({ error: "Approval not found" }, 404);
|
|
205
|
+
}
|
|
206
|
+
// Re-execute the original handler with the stored input.
|
|
207
|
+
const routeKey = `${approval.method} ${approval.path}`;
|
|
208
|
+
const handler = handlerRegistry.get(routeKey);
|
|
209
|
+
if (!handler) {
|
|
210
|
+
return c.json({ error: "Handler not found for route", route: routeKey }, 500);
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
// Build a synthetic context for the approver.
|
|
214
|
+
const ctx = createContext(c);
|
|
215
|
+
const result = await handler(approval.input, ctx);
|
|
216
|
+
approval.result = result;
|
|
217
|
+
return c.json({
|
|
218
|
+
status: "approved",
|
|
219
|
+
approvalId: approval.id,
|
|
220
|
+
result,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
const message = err instanceof Error ? err.message : "Handler execution failed";
|
|
225
|
+
return c.json({ error: message, approvalId: approval.id }, 500);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
/** Deny a pending approval */
|
|
229
|
+
app.post("/capstan/approvals/:id/deny", async (c) => {
|
|
230
|
+
const id = c.req.param("id");
|
|
231
|
+
const existing = getApproval(id);
|
|
232
|
+
if (!existing) {
|
|
233
|
+
return c.json({ error: "Approval not found" }, 404);
|
|
234
|
+
}
|
|
235
|
+
if (existing.status !== "pending") {
|
|
236
|
+
return c.json({ error: "Approval already resolved", status: existing.status }, 409);
|
|
237
|
+
}
|
|
238
|
+
let resolvedBy;
|
|
239
|
+
let reason;
|
|
240
|
+
try {
|
|
241
|
+
const body = await c.req.json();
|
|
242
|
+
if (typeof body.resolvedBy === "string") {
|
|
243
|
+
resolvedBy = body.resolvedBy;
|
|
244
|
+
}
|
|
245
|
+
if (typeof body.reason === "string") {
|
|
246
|
+
reason = body.reason;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// No body or invalid JSON — that's fine.
|
|
251
|
+
}
|
|
252
|
+
const approval = resolveApproval(id, "denied", resolvedBy);
|
|
253
|
+
if (!approval) {
|
|
254
|
+
return c.json({ error: "Approval not found" }, 404);
|
|
255
|
+
}
|
|
256
|
+
return c.json({
|
|
257
|
+
status: "denied",
|
|
258
|
+
approvalId: approval.id,
|
|
259
|
+
...(reason !== undefined ? { reason } : {}),
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
// ------------------------------------------------------------------
|
|
263
|
+
// Agent manifest endpoint
|
|
264
|
+
// ------------------------------------------------------------------
|
|
265
|
+
app.get("/.well-known/capstan.json", (c) => {
|
|
266
|
+
const manifest = {
|
|
267
|
+
name: config.app?.name ?? "capstan-app",
|
|
268
|
+
title: config.app?.title ?? config.app?.name ?? "Capstan App",
|
|
269
|
+
description: config.app?.description ?? "",
|
|
270
|
+
routes: routeRegistry,
|
|
271
|
+
};
|
|
272
|
+
return c.json(manifest);
|
|
273
|
+
});
|
|
274
|
+
return { app, routeRegistry, registerAPI };
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { Context as HonoContext } from "hono";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
/** Authentication context attached to every request. */
|
|
4
|
+
export interface CapstanAuthContext {
|
|
5
|
+
isAuthenticated: boolean;
|
|
6
|
+
type: "human" | "agent" | "anonymous";
|
|
7
|
+
userId?: string;
|
|
8
|
+
role?: string;
|
|
9
|
+
email?: string;
|
|
10
|
+
agentId?: string;
|
|
11
|
+
agentName?: string;
|
|
12
|
+
permissions?: string[];
|
|
13
|
+
}
|
|
14
|
+
/** Per-request context threaded through handlers, middleware, and policies. */
|
|
15
|
+
export interface CapstanContext {
|
|
16
|
+
auth: CapstanAuthContext;
|
|
17
|
+
request: Request;
|
|
18
|
+
env: Record<string, string | undefined>;
|
|
19
|
+
honoCtx: HonoContext;
|
|
20
|
+
}
|
|
21
|
+
export type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
|
|
22
|
+
/** The argument bag passed to an API handler. */
|
|
23
|
+
export interface APIHandlerInput<T = unknown> {
|
|
24
|
+
input: T;
|
|
25
|
+
ctx: CapstanContext;
|
|
26
|
+
}
|
|
27
|
+
/** Full definition object for a single API route. */
|
|
28
|
+
export interface APIDefinition<TInput = unknown, TOutput = unknown> {
|
|
29
|
+
input?: z.ZodType<TInput>;
|
|
30
|
+
output?: z.ZodType<TOutput>;
|
|
31
|
+
description?: string;
|
|
32
|
+
capability?: "read" | "write" | "external";
|
|
33
|
+
resource?: string;
|
|
34
|
+
policy?: string;
|
|
35
|
+
handler: (args: APIHandlerInput<TInput>) => Promise<TOutput>;
|
|
36
|
+
}
|
|
37
|
+
/** Definition object for middleware. */
|
|
38
|
+
export interface MiddlewareDefinition {
|
|
39
|
+
name?: string;
|
|
40
|
+
handler: (args: {
|
|
41
|
+
request: Request;
|
|
42
|
+
ctx: CapstanContext;
|
|
43
|
+
next: () => Promise<Response>;
|
|
44
|
+
}) => Promise<Response>;
|
|
45
|
+
}
|
|
46
|
+
export type PolicyEffect = "allow" | "deny" | "approve" | "redact";
|
|
47
|
+
/** Result of evaluating a single policy. */
|
|
48
|
+
export interface PolicyCheckResult {
|
|
49
|
+
effect: PolicyEffect;
|
|
50
|
+
reason?: string;
|
|
51
|
+
}
|
|
52
|
+
/** Definition object for a named permission policy. */
|
|
53
|
+
export interface PolicyDefinition {
|
|
54
|
+
key: string;
|
|
55
|
+
title: string;
|
|
56
|
+
effect: PolicyEffect;
|
|
57
|
+
check: (args: {
|
|
58
|
+
ctx: CapstanContext;
|
|
59
|
+
input?: unknown;
|
|
60
|
+
}) => Promise<PolicyCheckResult>;
|
|
61
|
+
}
|
|
62
|
+
/** App-level configuration for a Capstan application. */
|
|
63
|
+
export interface CapstanConfig {
|
|
64
|
+
app?: {
|
|
65
|
+
name?: string;
|
|
66
|
+
title?: string;
|
|
67
|
+
description?: string;
|
|
68
|
+
};
|
|
69
|
+
database?: {
|
|
70
|
+
provider?: "sqlite" | "postgres" | "mysql";
|
|
71
|
+
url?: string;
|
|
72
|
+
};
|
|
73
|
+
auth?: {
|
|
74
|
+
providers?: Array<{
|
|
75
|
+
type: string;
|
|
76
|
+
[key: string]: unknown;
|
|
77
|
+
}>;
|
|
78
|
+
session?: {
|
|
79
|
+
strategy?: "jwt" | "database";
|
|
80
|
+
secret?: string;
|
|
81
|
+
maxAge?: string;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
agent?: {
|
|
85
|
+
manifest?: boolean;
|
|
86
|
+
mcp?: boolean;
|
|
87
|
+
openapi?: boolean;
|
|
88
|
+
rateLimit?: {
|
|
89
|
+
default?: {
|
|
90
|
+
requests: number;
|
|
91
|
+
window: string;
|
|
92
|
+
};
|
|
93
|
+
perAgent?: boolean;
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
server?: {
|
|
97
|
+
port?: number;
|
|
98
|
+
host?: string;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** Route metadata for the agent manifest system. */
|
|
102
|
+
export interface RouteMetadata {
|
|
103
|
+
method: HttpMethod;
|
|
104
|
+
path: string;
|
|
105
|
+
description?: string;
|
|
106
|
+
capability?: "read" | "write" | "external";
|
|
107
|
+
resource?: string;
|
|
108
|
+
policy?: string;
|
|
109
|
+
inputSchema?: Record<string, unknown>;
|
|
110
|
+
outputSchema?: Record<string, unknown>;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/verify.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface VerifyDiagnostic {
|
|
2
|
+
code: string;
|
|
3
|
+
severity: "error" | "warning" | "info";
|
|
4
|
+
message: string;
|
|
5
|
+
hint?: string;
|
|
6
|
+
file?: string;
|
|
7
|
+
line?: number;
|
|
8
|
+
column?: number;
|
|
9
|
+
fixCategory?: "type_error" | "schema_mismatch" | "missing_file" | "policy_violation" | "contract_drift" | "missing_export";
|
|
10
|
+
autoFixable?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface VerifyStep {
|
|
13
|
+
name: string;
|
|
14
|
+
status: "passed" | "failed" | "skipped";
|
|
15
|
+
durationMs: number;
|
|
16
|
+
diagnostics: VerifyDiagnostic[];
|
|
17
|
+
}
|
|
18
|
+
export interface VerifyReport {
|
|
19
|
+
status: "passed" | "failed";
|
|
20
|
+
appRoot: string;
|
|
21
|
+
timestamp: string;
|
|
22
|
+
steps: VerifyStep[];
|
|
23
|
+
repairChecklist: Array<{
|
|
24
|
+
index: number;
|
|
25
|
+
step: string;
|
|
26
|
+
message: string;
|
|
27
|
+
file?: string;
|
|
28
|
+
line?: number;
|
|
29
|
+
hint?: string;
|
|
30
|
+
fixCategory?: string;
|
|
31
|
+
autoFixable?: boolean;
|
|
32
|
+
}>;
|
|
33
|
+
summary: {
|
|
34
|
+
totalSteps: number;
|
|
35
|
+
passedSteps: number;
|
|
36
|
+
failedSteps: number;
|
|
37
|
+
skippedSteps: number;
|
|
38
|
+
errorCount: number;
|
|
39
|
+
warningCount: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Verify a Capstan runtime application.
|
|
44
|
+
*
|
|
45
|
+
* Runs a cascade of checks: structure -> config -> routes -> models ->
|
|
46
|
+
* typecheck -> contracts -> manifest. If an early step fails, dependent
|
|
47
|
+
* steps are skipped. Returns a structured VerifyReport suitable for both
|
|
48
|
+
* human display and AI agent consumption.
|
|
49
|
+
*/
|
|
50
|
+
export declare function verifyCapstanApp(appRoot: string): Promise<VerifyReport>;
|
|
51
|
+
/**
|
|
52
|
+
* Render a VerifyReport as human-readable text output.
|
|
53
|
+
*
|
|
54
|
+
* Uses simple ASCII indicators: check mark for pass, x for fail, dash for skip.
|
|
55
|
+
*/
|
|
56
|
+
export declare function renderRuntimeVerifyText(report: VerifyReport): string;
|
|
57
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EACR,YAAY,GACZ,iBAAiB,GACjB,cAAc,GACd,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,eAAe,EAAE,KAAK,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC,CAAC;IACH,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAuyBD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAuE7E;AAMD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4CpE"}
|