@cotrrackpro-dev/sdk 0.1.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/CHANGELOG.md +51 -0
- package/LICENSE +21 -0
- package/README.md +111 -0
- package/dist/assistant/compliance.d.ts +24 -0
- package/dist/assistant/compliance.js +60 -0
- package/dist/assistant/compliance.js.map +1 -0
- package/dist/assistant/crisis.d.ts +31 -0
- package/dist/assistant/crisis.js +62 -0
- package/dist/assistant/crisis.js.map +1 -0
- package/dist/assistant/index.d.ts +15 -0
- package/dist/assistant/index.js +16 -0
- package/dist/assistant/index.js.map +1 -0
- package/dist/assistant/levels.d.ts +43 -0
- package/dist/assistant/levels.js +102 -0
- package/dist/assistant/levels.js.map +1 -0
- package/dist/assistant/prompt.d.ts +20 -0
- package/dist/assistant/prompt.js +96 -0
- package/dist/assistant/prompt.js.map +1 -0
- package/dist/assistant/rbac.d.ts +45 -0
- package/dist/assistant/rbac.js +75 -0
- package/dist/assistant/rbac.js.map +1 -0
- package/dist/assistant/readability.d.ts +28 -0
- package/dist/assistant/readability.js +70 -0
- package/dist/assistant/readability.js.map +1 -0
- package/dist/auth/broker.d.ts +32 -0
- package/dist/auth/broker.js +48 -0
- package/dist/auth/broker.js.map +1 -0
- package/dist/auth/deviceFlow.d.ts +26 -0
- package/dist/auth/deviceFlow.js +65 -0
- package/dist/auth/deviceFlow.js.map +1 -0
- package/dist/auth/provider.d.ts +32 -0
- package/dist/auth/provider.js +29 -0
- package/dist/auth/provider.js.map +1 -0
- package/dist/community/badges.d.ts +19 -0
- package/dist/community/badges.js +19 -0
- package/dist/community/badges.js.map +1 -0
- package/dist/community/events.d.ts +30 -0
- package/dist/community/events.js +31 -0
- package/dist/community/events.js.map +1 -0
- package/dist/community/identity.d.ts +28 -0
- package/dist/community/identity.js +2 -0
- package/dist/community/identity.js.map +1 -0
- package/dist/community/index.d.ts +7 -0
- package/dist/community/index.js +8 -0
- package/dist/community/index.js.map +1 -0
- package/dist/community/org.d.ts +46 -0
- package/dist/community/org.js +32 -0
- package/dist/community/org.js.map +1 -0
- package/dist/community/tiers.d.ts +8 -0
- package/dist/community/tiers.js +40 -0
- package/dist/community/tiers.js.map +1 -0
- package/dist/community/types.d.ts +26 -0
- package/dist/community/types.js +2 -0
- package/dist/community/types.js.map +1 -0
- package/dist/core/config.d.ts +22 -0
- package/dist/core/config.js +27 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +29 -0
- package/dist/core/errors.js +20 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/transport.d.ts +45 -0
- package/dist/core/transport.js +109 -0
- package/dist/core/transport.js.map +1 -0
- package/dist/diagram/core.d.ts +11 -0
- package/dist/diagram/core.js +12 -0
- package/dist/diagram/core.js.map +1 -0
- package/dist/diagram/extract.d.ts +17 -0
- package/dist/diagram/extract.js +213 -0
- package/dist/diagram/extract.js.map +1 -0
- package/dist/diagram/index.d.ts +2 -0
- package/dist/diagram/index.js +3 -0
- package/dist/diagram/index.js.map +1 -0
- package/dist/diagram/mermaid.d.ts +10 -0
- package/dist/diagram/mermaid.js +50 -0
- package/dist/diagram/mermaid.js.map +1 -0
- package/dist/diagram/prompt.d.ts +4 -0
- package/dist/diagram/prompt.js +16 -0
- package/dist/diagram/prompt.js.map +1 -0
- package/dist/diagram/types.d.ts +33 -0
- package/dist/diagram/types.js +2 -0
- package/dist/diagram/types.js.map +1 -0
- package/dist/diagram/validate.d.ts +13 -0
- package/dist/diagram/validate.js +48 -0
- package/dist/diagram/validate.js.map +1 -0
- package/dist/guide/compose.d.ts +10 -0
- package/dist/guide/compose.js +31 -0
- package/dist/guide/compose.js.map +1 -0
- package/dist/guide/core.d.ts +10 -0
- package/dist/guide/core.js +11 -0
- package/dist/guide/core.js.map +1 -0
- package/dist/guide/index.d.ts +2 -0
- package/dist/guide/index.js +3 -0
- package/dist/guide/index.js.map +1 -0
- package/dist/guide/prompt.d.ts +8 -0
- package/dist/guide/prompt.js +20 -0
- package/dist/guide/prompt.js.map +1 -0
- package/dist/guide/render.d.ts +9 -0
- package/dist/guide/render.js +180 -0
- package/dist/guide/render.js.map +1 -0
- package/dist/guide/types.d.ts +67 -0
- package/dist/guide/types.js +2 -0
- package/dist/guide/types.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/artifacts.generated.d.ts +19 -0
- package/dist/mcp/artifacts.generated.js +140 -0
- package/dist/mcp/artifacts.generated.js.map +1 -0
- package/dist/mcp/format.d.ts +10 -0
- package/dist/mcp/format.js +17 -0
- package/dist/mcp/format.js.map +1 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.js +18 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/knowledge.generated.d.ts +11 -0
- package/dist/mcp/knowledge.generated.js +12 -0
- package/dist/mcp/knowledge.generated.js.map +1 -0
- package/dist/mcp/prompt-modules.generated.d.ts +12 -0
- package/dist/mcp/prompt-modules.generated.js +19 -0
- package/dist/mcp/prompt-modules.generated.js.map +1 -0
- package/dist/mcp/roles.generated.d.ts +15 -0
- package/dist/mcp/roles.generated.js +25 -0
- package/dist/mcp/roles.generated.js.map +1 -0
- package/dist/mcp/safety.d.ts +35 -0
- package/dist/mcp/safety.js +76 -0
- package/dist/mcp/safety.js.map +1 -0
- package/dist/mcp/scenarios.generated.d.ts +13 -0
- package/dist/mcp/scenarios.generated.js +16 -0
- package/dist/mcp/scenarios.generated.js.map +1 -0
- package/dist/mcp/search.d.ts +13 -0
- package/dist/mcp/search.js +33 -0
- package/dist/mcp/search.js.map +1 -0
- package/dist/mcp/skills.generated.d.ts +17 -0
- package/dist/mcp/skills.generated.js +40 -0
- package/dist/mcp/skills.generated.js.map +1 -0
- package/dist/mcp/toolset.d.ts +31 -0
- package/dist/mcp/toolset.js +54 -0
- package/dist/mcp/toolset.js.map +1 -0
- package/dist/mcp/types.d.ts +96 -0
- package/dist/mcp/types.js +9 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/workflows.generated.d.ts +17 -0
- package/dist/mcp/workflows.generated.js +12 -0
- package/dist/mcp/workflows.generated.js.map +1 -0
- package/dist/nocode/core.d.ts +12 -0
- package/dist/nocode/core.js +13 -0
- package/dist/nocode/core.js.map +1 -0
- package/dist/nocode/examples.d.ts +28 -0
- package/dist/nocode/examples.js +218 -0
- package/dist/nocode/examples.js.map +1 -0
- package/dist/nocode/index.d.ts +2 -0
- package/dist/nocode/index.js +3 -0
- package/dist/nocode/index.js.map +1 -0
- package/dist/nocode/mermaid.d.ts +9 -0
- package/dist/nocode/mermaid.js +33 -0
- package/dist/nocode/mermaid.js.map +1 -0
- package/dist/nocode/prompt.d.ts +8 -0
- package/dist/nocode/prompt.js +46 -0
- package/dist/nocode/prompt.js.map +1 -0
- package/dist/nocode/runtime.d.ts +28 -0
- package/dist/nocode/runtime.js +113 -0
- package/dist/nocode/runtime.js.map +1 -0
- package/dist/nocode/simpleOps.d.ts +16 -0
- package/dist/nocode/simpleOps.js +137 -0
- package/dist/nocode/simpleOps.js.map +1 -0
- package/dist/nocode/types.d.ts +72 -0
- package/dist/nocode/types.js +12 -0
- package/dist/nocode/types.js.map +1 -0
- package/dist/nocode/validate.d.ts +17 -0
- package/dist/nocode/validate.js +136 -0
- package/dist/nocode/validate.js.map +1 -0
- package/dist/params/codegen.d.ts +8 -0
- package/dist/params/codegen.js +12 -0
- package/dist/params/codegen.js.map +1 -0
- package/dist/params/convert.d.ts +7 -0
- package/dist/params/convert.js +123 -0
- package/dist/params/convert.js.map +1 -0
- package/dist/params/core.d.ts +11 -0
- package/dist/params/core.js +12 -0
- package/dist/params/core.js.map +1 -0
- package/dist/params/fieldTypes.d.ts +26 -0
- package/dist/params/fieldTypes.js +29 -0
- package/dist/params/fieldTypes.js.map +1 -0
- package/dist/params/index.d.ts +3 -0
- package/dist/params/index.js +4 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/prompt.d.ts +4 -0
- package/dist/params/prompt.js +16 -0
- package/dist/params/prompt.js.map +1 -0
- package/dist/params/render.d.ts +5 -0
- package/dist/params/render.js +25 -0
- package/dist/params/render.js.map +1 -0
- package/dist/params/types.d.ts +76 -0
- package/dist/params/types.js +16 -0
- package/dist/params/types.js.map +1 -0
- package/dist/params/validate.d.ts +5 -0
- package/dist/params/validate.js +104 -0
- package/dist/params/validate.js.map +1 -0
- package/dist/resources/client.d.ts +58 -0
- package/dist/resources/client.js +79 -0
- package/dist/resources/client.js.map +1 -0
- package/dist/resources/types.d.ts +72 -0
- package/dist/resources/types.js +9 -0
- package/dist/resources/types.js.map +1 -0
- package/dist/workflow/assets.d.ts +8 -0
- package/dist/workflow/assets.js +16 -0
- package/dist/workflow/assets.js.map +1 -0
- package/dist/workflow/commands.d.ts +10 -0
- package/dist/workflow/commands.js +21 -0
- package/dist/workflow/commands.js.map +1 -0
- package/dist/workflow/core.d.ts +15 -0
- package/dist/workflow/core.js +16 -0
- package/dist/workflow/core.js.map +1 -0
- package/dist/workflow/index.d.ts +2 -0
- package/dist/workflow/index.js +3 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/stack.d.ts +11 -0
- package/dist/workflow/stack.js +40 -0
- package/dist/workflow/stack.js.map +1 -0
- package/dist/workflow/templates.d.ts +17 -0
- package/dist/workflow/templates.js +223 -0
- package/dist/workflow/templates.js.map +1 -0
- package/dist/workflow/types.d.ts +27 -0
- package/dist/workflow/types.js +2 -0
- package/dist/workflow/types.js.map +1 -0
- package/package.json +77 -0
- package/schemas/artifacts.index.json +1211 -0
- package/schemas/knowledge.index.json +49 -0
- package/schemas/prompt-modules.index.json +105 -0
- package/schemas/roles.index.json +431 -0
- package/schemas/scenarios.index.json +15 -0
- package/schemas/skills.index.json +670 -0
- package/schemas/workflows.index.json +462 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { FIELD_TYPES } from "./fieldTypes.js";
|
|
2
|
+
const KEY_RE = /^[a-zA-Z][a-zA-Z0-9_]*$/;
|
|
3
|
+
const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
4
|
+
const TIME_RE = /^\d{2}:\d{2}(:\d{2})?$/;
|
|
5
|
+
const SENSITIVITIES = ["public", "sensitive", "confidential"];
|
|
6
|
+
/** Validate a parameter-set DEFINITION (the schema the user authored). */
|
|
7
|
+
export function validateParamSet(def) {
|
|
8
|
+
const errors = [];
|
|
9
|
+
if (!def.title || !def.title.trim())
|
|
10
|
+
errors.push({ path: "title", message: "A title is required." });
|
|
11
|
+
if (!SENSITIVITIES.includes(def.dataSensitivity))
|
|
12
|
+
errors.push({ path: "dataSensitivity", message: "dataSensitivity must be public, sensitive, or confidential." });
|
|
13
|
+
if (!Array.isArray(def.fields) || def.fields.length === 0)
|
|
14
|
+
errors.push({ path: "fields", message: "Add at least one field." });
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
(def.fields ?? []).forEach((f, i) => {
|
|
17
|
+
const at = `fields[${i}]`;
|
|
18
|
+
if (!f.key || !KEY_RE.test(f.key))
|
|
19
|
+
errors.push({ path: `${at}.key`, message: `Invalid key '${f.key}'. Start with a letter; use letters, numbers, underscore.` });
|
|
20
|
+
else if (seen.has(f.key))
|
|
21
|
+
errors.push({ path: `${at}.key`, message: `Duplicate field key '${f.key}'.` });
|
|
22
|
+
else
|
|
23
|
+
seen.add(f.key);
|
|
24
|
+
if (!(f.type in FIELD_TYPES))
|
|
25
|
+
errors.push({ path: `${at}.type`, message: `Unknown field type '${f.type}'.` });
|
|
26
|
+
else if (FIELD_TYPES[f.type].hasOptions && (!f.options || f.options.length === 0))
|
|
27
|
+
errors.push({ path: `${at}.options`, message: `'${f.key || f.label}' needs at least one option.` });
|
|
28
|
+
});
|
|
29
|
+
return { valid: errors.length === 0, errors };
|
|
30
|
+
}
|
|
31
|
+
/** Validate VALUES entered for a parameter set against its field types. */
|
|
32
|
+
export function validateValues(set, values) {
|
|
33
|
+
const errors = [];
|
|
34
|
+
for (const f of set.fields) {
|
|
35
|
+
const v = values[f.key];
|
|
36
|
+
if (isEmpty(v)) {
|
|
37
|
+
if (f.required)
|
|
38
|
+
errors.push({ path: f.key, message: `${f.label || f.key} is required.` });
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const msg = checkValue(f, v);
|
|
42
|
+
if (msg)
|
|
43
|
+
errors.push({ path: f.key, message: msg });
|
|
44
|
+
}
|
|
45
|
+
for (const k of Object.keys(values)) {
|
|
46
|
+
if (!set.fields.some((f) => f.key === k))
|
|
47
|
+
errors.push({ path: k, message: `Unknown field '${k}'.` });
|
|
48
|
+
}
|
|
49
|
+
return { valid: errors.length === 0, errors };
|
|
50
|
+
}
|
|
51
|
+
function isEmpty(v) {
|
|
52
|
+
return v === undefined || v === null || v === "" || (Array.isArray(v) && v.length === 0);
|
|
53
|
+
}
|
|
54
|
+
function checkValue(f, v) {
|
|
55
|
+
const label = f.label || f.key;
|
|
56
|
+
switch (f.type) {
|
|
57
|
+
case "text":
|
|
58
|
+
case "longtext": {
|
|
59
|
+
if (typeof v !== "string")
|
|
60
|
+
return `${label} must be text.`;
|
|
61
|
+
if (f.minLength != null && v.length < f.minLength)
|
|
62
|
+
return `${label} must be at least ${f.minLength} characters.`;
|
|
63
|
+
if (f.maxLength != null && v.length > f.maxLength)
|
|
64
|
+
return `${label} must be at most ${f.maxLength} characters.`;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
case "number":
|
|
68
|
+
case "integer": {
|
|
69
|
+
if (typeof v !== "number" || Number.isNaN(v))
|
|
70
|
+
return `${label} must be a number.`;
|
|
71
|
+
if (f.type === "integer" && !Number.isInteger(v))
|
|
72
|
+
return `${label} must be a whole number.`;
|
|
73
|
+
if (f.min != null && v < f.min)
|
|
74
|
+
return `${label} must be ≥ ${f.min}.`;
|
|
75
|
+
if (f.max != null && v > f.max)
|
|
76
|
+
return `${label} must be ≤ ${f.max}.`;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
case "boolean":
|
|
80
|
+
return typeof v === "boolean" ? undefined : `${label} must be true or false.`;
|
|
81
|
+
case "date":
|
|
82
|
+
return typeof v === "string" && DATE_RE.test(v) ? undefined : `${label} must be a date (YYYY-MM-DD).`;
|
|
83
|
+
case "time":
|
|
84
|
+
return typeof v === "string" && TIME_RE.test(v) ? undefined : `${label} must be a time (HH:MM).`;
|
|
85
|
+
case "select":
|
|
86
|
+
if (typeof v !== "string" || !(f.options ?? []).includes(v))
|
|
87
|
+
return `${label} must be one of: ${(f.options ?? []).join(", ")}.`;
|
|
88
|
+
return;
|
|
89
|
+
case "multiselect": {
|
|
90
|
+
if (!Array.isArray(v))
|
|
91
|
+
return `${label} must be a list.`;
|
|
92
|
+
const bad = v.find((x) => typeof x !== "string" || !(f.options ?? []).includes(x));
|
|
93
|
+
return bad === undefined ? undefined : `${label} contains an invalid choice '${String(bad)}'.`;
|
|
94
|
+
}
|
|
95
|
+
case "list": {
|
|
96
|
+
if (!Array.isArray(v))
|
|
97
|
+
return `${label} must be a list.`;
|
|
98
|
+
return v.every((x) => typeof x === "string") ? undefined : `${label} must be a list of text.`;
|
|
99
|
+
}
|
|
100
|
+
default:
|
|
101
|
+
return `${label} has an unknown type.`;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/params/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type FetchLike } from "../core/transport.js";
|
|
2
|
+
import { type AuthProvider } from "../auth/provider.js";
|
|
3
|
+
import type { DeviceStart, DevicePoll, DownloadInfo, HealthStatus, OrgInfo, PackageMeta, PluginToken, PluginTokenRequest, PublishRequest, UploadInfo, WhoAmI } from "./types.js";
|
|
4
|
+
export interface ClientConfig {
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
/** Defaults to anonymous (only unauthenticated endpoints will work). */
|
|
7
|
+
auth?: AuthProvider;
|
|
8
|
+
/** Default org slug applied to requests that don't override it. */
|
|
9
|
+
org?: string | null;
|
|
10
|
+
fetch?: FetchLike;
|
|
11
|
+
basePath?: string;
|
|
12
|
+
retries?: number;
|
|
13
|
+
/** Per-request timeout in ms (`0` disables). Default 30000. */
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
}
|
|
16
|
+
interface ClientRequest {
|
|
17
|
+
path: string;
|
|
18
|
+
method?: string;
|
|
19
|
+
body?: unknown;
|
|
20
|
+
/** `undefined` → use the client's default org; `null` → force no org header. */
|
|
21
|
+
org?: string | null;
|
|
22
|
+
/** Require a token (default true). When true and none resolves, throws `unauthenticated`. */
|
|
23
|
+
auth?: boolean;
|
|
24
|
+
headers?: Record<string, string>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The high-level, typed CoTrackPro client. Owns an {@link AuthProvider} and a
|
|
28
|
+
* default org, resolves the bearer token per request, and exposes typed
|
|
29
|
+
* resource methods. This is the surface every consumer (CLI, web app, agent)
|
|
30
|
+
* builds on instead of hand-rolling fetch + auth + error handling.
|
|
31
|
+
*/
|
|
32
|
+
export declare class CotrackproClient {
|
|
33
|
+
private readonly transport;
|
|
34
|
+
private readonly auth;
|
|
35
|
+
private readonly defaultOrg;
|
|
36
|
+
constructor(cfg: ClientConfig);
|
|
37
|
+
/** Escape hatch for endpoints without a dedicated resource method. */
|
|
38
|
+
request<T>(req: ClientRequest): Promise<T>;
|
|
39
|
+
whoami(): Promise<WhoAmI>;
|
|
40
|
+
readonly orgs: {
|
|
41
|
+
list: () => Promise<OrgInfo[]>;
|
|
42
|
+
};
|
|
43
|
+
readonly packages: {
|
|
44
|
+
list: () => Promise<PackageMeta[]>;
|
|
45
|
+
get: (name: string, version: string) => Promise<DownloadInfo>;
|
|
46
|
+
publish: (name: string, version: string, body: PublishRequest) => Promise<UploadInfo>;
|
|
47
|
+
yank: (name: string, version: string) => Promise<void>;
|
|
48
|
+
};
|
|
49
|
+
readonly authEndpoints: {
|
|
50
|
+
deviceStart: () => Promise<DeviceStart>;
|
|
51
|
+
devicePoll: (deviceCode: string) => Promise<DevicePoll>;
|
|
52
|
+
pluginToken: (req: PluginTokenRequest) => Promise<PluginToken>;
|
|
53
|
+
};
|
|
54
|
+
health(): Promise<HealthStatus>;
|
|
55
|
+
}
|
|
56
|
+
/** Factory mirroring the documented `createClient({ baseUrl, auth, org, fetch })` API. */
|
|
57
|
+
export declare function createClient(cfg: ClientConfig): CotrackproClient;
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Transport } from "../core/transport.js";
|
|
2
|
+
import { CotrackproError } from "../core/errors.js";
|
|
3
|
+
import { AnonymousProvider } from "../auth/provider.js";
|
|
4
|
+
const enc = (s) => encodeURIComponent(s);
|
|
5
|
+
/**
|
|
6
|
+
* The high-level, typed CoTrackPro client. Owns an {@link AuthProvider} and a
|
|
7
|
+
* default org, resolves the bearer token per request, and exposes typed
|
|
8
|
+
* resource methods. This is the surface every consumer (CLI, web app, agent)
|
|
9
|
+
* builds on instead of hand-rolling fetch + auth + error handling.
|
|
10
|
+
*/
|
|
11
|
+
export class CotrackproClient {
|
|
12
|
+
transport;
|
|
13
|
+
auth;
|
|
14
|
+
defaultOrg;
|
|
15
|
+
constructor(cfg) {
|
|
16
|
+
this.transport = new Transport({
|
|
17
|
+
baseUrl: cfg.baseUrl,
|
|
18
|
+
basePath: cfg.basePath,
|
|
19
|
+
fetch: cfg.fetch,
|
|
20
|
+
retries: cfg.retries,
|
|
21
|
+
timeoutMs: cfg.timeoutMs,
|
|
22
|
+
});
|
|
23
|
+
this.auth = cfg.auth ?? new AnonymousProvider();
|
|
24
|
+
this.defaultOrg = cfg.org ?? null;
|
|
25
|
+
}
|
|
26
|
+
/** Escape hatch for endpoints without a dedicated resource method. */
|
|
27
|
+
async request(req) {
|
|
28
|
+
const needAuth = req.auth !== false;
|
|
29
|
+
let token = null;
|
|
30
|
+
if (needAuth) {
|
|
31
|
+
token = await this.auth.getToken();
|
|
32
|
+
if (!token) {
|
|
33
|
+
throw new CotrackproError({
|
|
34
|
+
code: "unauthenticated",
|
|
35
|
+
message: "Not authenticated. Run `cotrackpro login`.",
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const org = req.org === undefined ? this.defaultOrg : req.org;
|
|
40
|
+
return this.transport.request({
|
|
41
|
+
path: req.path,
|
|
42
|
+
method: req.method,
|
|
43
|
+
body: req.body,
|
|
44
|
+
org,
|
|
45
|
+
token,
|
|
46
|
+
headers: req.headers,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// --- Identity ---------------------------------------------------------
|
|
50
|
+
whoami() {
|
|
51
|
+
return this.request({ path: "/whoami" });
|
|
52
|
+
}
|
|
53
|
+
// --- Orgs -------------------------------------------------------------
|
|
54
|
+
orgs = {
|
|
55
|
+
list: () => this.request({ path: "/orgs", org: null }),
|
|
56
|
+
};
|
|
57
|
+
// --- Packages ---------------------------------------------------------
|
|
58
|
+
packages = {
|
|
59
|
+
list: () => this.request({ path: "/packages" }),
|
|
60
|
+
get: (name, version) => this.request({ path: `/packages/${enc(name)}/${enc(version)}` }),
|
|
61
|
+
publish: (name, version, body) => this.request({ path: `/packages/${enc(name)}/${enc(version)}`, method: "POST", body }),
|
|
62
|
+
yank: (name, version) => this.request({ path: `/packages/${enc(name)}/${enc(version)}`, method: "DELETE" }),
|
|
63
|
+
};
|
|
64
|
+
// --- Auth -------------------------------------------------------------
|
|
65
|
+
authEndpoints = {
|
|
66
|
+
deviceStart: () => this.request({ path: "/auth/device/start", method: "POST", auth: false }),
|
|
67
|
+
devicePoll: (deviceCode) => this.request({ path: "/auth/device/poll", method: "POST", auth: false, body: { deviceCode } }),
|
|
68
|
+
pluginToken: (req) => this.request({ path: "/auth/plugin-token", method: "POST", body: req }),
|
|
69
|
+
};
|
|
70
|
+
// --- Health -----------------------------------------------------------
|
|
71
|
+
health() {
|
|
72
|
+
return this.request({ path: "/health", auth: false });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Factory mirroring the documented `createClient({ baseUrl, auth, org, fetch })` API. */
|
|
76
|
+
export function createClient(cfg) {
|
|
77
|
+
return new CotrackproClient(cfg);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/resources/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical response/request types for the CoTrackPro API.
|
|
3
|
+
*
|
|
4
|
+
* These are the single source of truth that the CLI commands (and any other
|
|
5
|
+
* consumer repo) import, instead of re-declaring inline interfaces per file.
|
|
6
|
+
* Shapes mirror the live `/cli/v1` endpoints the CLI already calls.
|
|
7
|
+
*/
|
|
8
|
+
export type TokenType = "session_token" | "oauth_token" | "api_key";
|
|
9
|
+
export interface WhoAmI {
|
|
10
|
+
userId: string;
|
|
11
|
+
activeOrg: string | null;
|
|
12
|
+
role: string | null;
|
|
13
|
+
permissions: string[];
|
|
14
|
+
plan?: string;
|
|
15
|
+
expiresAt?: string;
|
|
16
|
+
/** Developer-community tier (Clerk `publicMetadata.tier`), when the backend resolves it. */
|
|
17
|
+
tier?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface OrgInfo {
|
|
20
|
+
slug: string;
|
|
21
|
+
name: string;
|
|
22
|
+
role: string | null;
|
|
23
|
+
}
|
|
24
|
+
export interface PackageRef {
|
|
25
|
+
name: string;
|
|
26
|
+
version: string;
|
|
27
|
+
}
|
|
28
|
+
export interface PackageMeta {
|
|
29
|
+
name: string;
|
|
30
|
+
version: string;
|
|
31
|
+
sizeBytes: number;
|
|
32
|
+
publishedAt: string;
|
|
33
|
+
yanked?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface DownloadInfo {
|
|
36
|
+
downloadUrl: string;
|
|
37
|
+
integrity: string;
|
|
38
|
+
sizeBytes: number;
|
|
39
|
+
}
|
|
40
|
+
export interface UploadInfo {
|
|
41
|
+
uploadUrl: string;
|
|
42
|
+
}
|
|
43
|
+
export interface PublishRequest {
|
|
44
|
+
integrity: string;
|
|
45
|
+
sizeBytes: number;
|
|
46
|
+
}
|
|
47
|
+
export interface DeviceStart {
|
|
48
|
+
verificationUrl: string;
|
|
49
|
+
deviceCode: string;
|
|
50
|
+
intervalSec: number;
|
|
51
|
+
expiresInSec: number;
|
|
52
|
+
}
|
|
53
|
+
export interface DevicePoll {
|
|
54
|
+
status: "pending" | "complete";
|
|
55
|
+
token?: string;
|
|
56
|
+
tokenType?: "oauth_token";
|
|
57
|
+
account?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface PluginTokenRequest {
|
|
60
|
+
scopes: string[];
|
|
61
|
+
ttlSec: number;
|
|
62
|
+
plugin: string;
|
|
63
|
+
}
|
|
64
|
+
export interface PluginToken {
|
|
65
|
+
token: string;
|
|
66
|
+
expiresInSec: number;
|
|
67
|
+
grantedScopes: string[];
|
|
68
|
+
}
|
|
69
|
+
export interface HealthStatus {
|
|
70
|
+
ok: boolean;
|
|
71
|
+
[k: string]: unknown;
|
|
72
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical response/request types for the CoTrackPro API.
|
|
3
|
+
*
|
|
4
|
+
* These are the single source of truth that the CLI commands (and any other
|
|
5
|
+
* consumer repo) import, instead of re-declaring inline interfaces per file.
|
|
6
|
+
* Shapes mirror the live `/cli/v1` endpoints the CLI already calls.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/resources/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The "assets" projection: the file tree a workflow scaffolds, as a pure
|
|
3
|
+
* `AssetFile[]`. The CLI writes these to disk; the Studio renders them as a tree
|
|
4
|
+
* — same builder, so they cannot diverge. Only blueprints scaffold a module;
|
|
5
|
+
* other source kinds return an empty manifest (the UI shows a note).
|
|
6
|
+
*/
|
|
7
|
+
import type { WorkflowSpec, AssetFile } from "./types.js";
|
|
8
|
+
export declare function toAssetManifest(spec: WorkflowSpec): AssetFile[];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { moduleTemplate, blueprintModule, blueprintReadme } from "./templates.js";
|
|
2
|
+
export function toAssetManifest(spec) {
|
|
3
|
+
if (spec.kind !== "blueprint")
|
|
4
|
+
return [];
|
|
5
|
+
const pkg = `@cotrackpro/${spec.id}`;
|
|
6
|
+
const files = {
|
|
7
|
+
...moduleTemplate(spec.id, pkg),
|
|
8
|
+
"src/blueprint.ts": blueprintModule(spec),
|
|
9
|
+
"README.md": blueprintReadme(spec, pkg),
|
|
10
|
+
};
|
|
11
|
+
return Object.entries(files)
|
|
12
|
+
.map(([path, contents]) => ({ path, contents }))
|
|
13
|
+
// Stable code-point sort (locale-independent) so CLI and portal always agree.
|
|
14
|
+
.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/workflow/assets.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAElF,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,eAAe,IAAI,CAAC,EAAE,EAAE,CAAC;IACrC,MAAM,KAAK,GAA2B;QACpC,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC;QAC/B,kBAAkB,EAAE,eAAe,CAAC,IAAI,CAAC;QACzC,WAAW,EAAE,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC;KACxC,CAAC;IACF,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChD,8EAA8E;SAC7E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The "developer" projection: a portable, runnable shell sequence that stands up
|
|
3
|
+
* the relevant slice of the cotrackpro stack for a workflow, using only existing
|
|
4
|
+
* CLI verbs — plus an "Open in Google Cloud Shell" deep link that wraps it.
|
|
5
|
+
*/
|
|
6
|
+
import type { WorkflowSpec, WorkflowCommandsOptions } from "./types.js";
|
|
7
|
+
/** A deterministic, copy-pasteable `sh` sequence for the spec. */
|
|
8
|
+
export declare function toCommands(spec: WorkflowSpec, opts?: WorkflowCommandsOptions): string;
|
|
9
|
+
/** An "Open in Google Cloud Shell" launch link (clones the CLI repo into Cloud Shell). */
|
|
10
|
+
export declare function toCloudShellUrl(_spec: WorkflowSpec): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { reposForSpec } from "./stack.js";
|
|
2
|
+
const CLI_REPO = "https://github.com/dougdevitre/cotrackpro-cli";
|
|
3
|
+
/** A deterministic, copy-pasteable `sh` sequence for the spec. */
|
|
4
|
+
export function toCommands(spec, opts = {}) {
|
|
5
|
+
const repos = opts.repos ?? reposForSpec(spec);
|
|
6
|
+
const guideOut = opts.guideOut ?? "docs/onboarding.md";
|
|
7
|
+
const steps = [];
|
|
8
|
+
if (repos.length)
|
|
9
|
+
steps.push(`cotrackpro workspace clone ${repos.join(" ")} --yes`);
|
|
10
|
+
steps.push("cotrackpro setup");
|
|
11
|
+
if (spec.kind === "blueprint")
|
|
12
|
+
steps.push(`cotrackpro project new ${spec.id}`);
|
|
13
|
+
steps.push(`cotrackpro guide new ${spec.id} --out ${guideOut}`);
|
|
14
|
+
const chain = opts.chain ?? true;
|
|
15
|
+
return chain ? steps.join(" \\\n && ") : steps.join("\n");
|
|
16
|
+
}
|
|
17
|
+
/** An "Open in Google Cloud Shell" launch link (clones the CLI repo into Cloud Shell). */
|
|
18
|
+
export function toCloudShellUrl(_spec) {
|
|
19
|
+
return `https://shell.cloud.google.com/cloudshell/open?cloudshell_git_repo=${encodeURIComponent(CLI_REPO)}`;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/workflow/commands.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,QAAQ,GAAG,+CAA+C,CAAC;AAEjE,kEAAkE;AAClE,MAAM,UAAU,UAAU,CAAC,IAAkB,EAAE,OAAgC,EAAE;IAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,oBAAoB,CAAC;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,8BAA8B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpF,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,EAAE,UAAU,QAAQ,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;IACjC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,eAAe,CAAC,KAAmB;IACjD,OAAO,sEAAsE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC9G,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe barrel for the workflow engine. Import-free by construction so
|
|
3
|
+
* the compiled output loads directly in the Studio builder — the CLI and the
|
|
4
|
+
* portal share the exact projection logic. Keep it that way (an SDK test enforces
|
|
5
|
+
* no runtime imports outside the workflow folder).
|
|
6
|
+
*
|
|
7
|
+
* The playbook (no-code markdown) projection is the guide engine's `toMarkdown`,
|
|
8
|
+
* composed by the callers from `@cotrackpro/sdk/guide`, so this leaf core stays
|
|
9
|
+
* pure and owns only the commands + assets projections.
|
|
10
|
+
*/
|
|
11
|
+
export * from "./types.js";
|
|
12
|
+
export * from "./templates.js";
|
|
13
|
+
export * from "./stack.js";
|
|
14
|
+
export * from "./commands.js";
|
|
15
|
+
export * from "./assets.js";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe barrel for the workflow engine. Import-free by construction so
|
|
3
|
+
* the compiled output loads directly in the Studio builder — the CLI and the
|
|
4
|
+
* portal share the exact projection logic. Keep it that way (an SDK test enforces
|
|
5
|
+
* no runtime imports outside the workflow folder).
|
|
6
|
+
*
|
|
7
|
+
* The playbook (no-code markdown) projection is the guide engine's `toMarkdown`,
|
|
8
|
+
* composed by the callers from `@cotrackpro/sdk/guide`, so this leaf core stays
|
|
9
|
+
* pure and owns only the commands + assets projections.
|
|
10
|
+
*/
|
|
11
|
+
export * from "./types.js";
|
|
12
|
+
export * from "./templates.js";
|
|
13
|
+
export * from "./stack.js";
|
|
14
|
+
export * from "./commands.js";
|
|
15
|
+
export * from "./assets.js";
|
|
16
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/workflow/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which slice of the cotrackpro stack a workflow needs — derived deterministically
|
|
3
|
+
* and OFFLINE from the spec's roles/disciplines. Curated literal maps (a small,
|
|
4
|
+
* reviewable surface) keep this import-free; the CLI lets `--repos` override and
|
|
5
|
+
* validates against the real `ECOSYSTEM` manifest.
|
|
6
|
+
*/
|
|
7
|
+
import type { WorkflowSpec } from "./types.js";
|
|
8
|
+
/** The minimum repos to stand anything up. */
|
|
9
|
+
export declare const CORE_REPOS: string[];
|
|
10
|
+
/** The deterministic, deduped repo slice for a spec (core + role/discipline matches). */
|
|
11
|
+
export declare function reposForSpec(spec: WorkflowSpec): string[];
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** The minimum repos to stand anything up. */
|
|
2
|
+
export const CORE_REPOS = ["cotrackpro", "cotrackpro-cli", "cotrackpro-mcp"];
|
|
3
|
+
/** Role id → the most relevant feature repo. */
|
|
4
|
+
const ROLE_TO_REPO = {
|
|
5
|
+
"cotrackpro-police": "cotrackpro-police",
|
|
6
|
+
"cotrackpro-gal": "cotrackpro-gal",
|
|
7
|
+
"cotrackpro-attorney": "cotrackpro-legal",
|
|
8
|
+
"cotrackpro-parent-pro-se": "cotrackpro-legal",
|
|
9
|
+
"cotrackpro-advocate": "cotrackpro-shield",
|
|
10
|
+
"cotrackpro-mediator": "cotrackpro-pact",
|
|
11
|
+
"cotrackpro-parenting-coordinator": "cotrackpro-pact",
|
|
12
|
+
"cotrackpro-coach": "cotrackpro-ptp",
|
|
13
|
+
"cotrackpro-supervisor": "cotrackpro-visitation",
|
|
14
|
+
};
|
|
15
|
+
/** Discipline → the most relevant feature repo. */
|
|
16
|
+
const DISCIPLINE_TO_REPO = {
|
|
17
|
+
Law: "cotrackpro-legal",
|
|
18
|
+
"Social work": "cotrackpro-casa",
|
|
19
|
+
Education: "cotrackpro-school",
|
|
20
|
+
"Public health": "cotrackpro-shield",
|
|
21
|
+
Psychology: "cotrackpro-ptp",
|
|
22
|
+
Ethics: "cotrackpro-integrity",
|
|
23
|
+
"Public administration": "cotrackpro-custody",
|
|
24
|
+
};
|
|
25
|
+
/** The deterministic, deduped repo slice for a spec (core + role/discipline matches). */
|
|
26
|
+
export function reposForSpec(spec) {
|
|
27
|
+
const repos = new Set(CORE_REPOS);
|
|
28
|
+
for (const r of spec.roles ?? []) {
|
|
29
|
+
const repo = ROLE_TO_REPO[r.id];
|
|
30
|
+
if (repo)
|
|
31
|
+
repos.add(repo);
|
|
32
|
+
}
|
|
33
|
+
for (const d of spec.disciplines ?? []) {
|
|
34
|
+
const repo = DISCIPLINE_TO_REPO[d];
|
|
35
|
+
if (repo)
|
|
36
|
+
repos.add(repo);
|
|
37
|
+
}
|
|
38
|
+
return [...repos];
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/workflow/stack.ts"],"names":[],"mappings":"AAQA,8CAA8C;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAa,CAAC,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;AAEvF,gDAAgD;AAChD,MAAM,YAAY,GAA2B;IAC3C,mBAAmB,EAAE,mBAAmB;IACxC,gBAAgB,EAAE,gBAAgB;IAClC,qBAAqB,EAAE,kBAAkB;IACzC,0BAA0B,EAAE,kBAAkB;IAC9C,qBAAqB,EAAE,mBAAmB;IAC1C,qBAAqB,EAAE,iBAAiB;IACxC,kCAAkC,EAAE,iBAAiB;IACrD,kBAAkB,EAAE,gBAAgB;IACpC,uBAAuB,EAAE,uBAAuB;CACjD,CAAC;AAEF,mDAAmD;AACnD,MAAM,kBAAkB,GAA2B;IACjD,GAAG,EAAE,kBAAkB;IACvB,aAAa,EAAE,iBAAiB;IAChC,SAAS,EAAE,mBAAmB;IAC9B,eAAe,EAAE,mBAAmB;IACpC,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,sBAAsB;IAC9B,uBAAuB,EAAE,oBAAoB;CAC9C,CAAC;AAEF,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,UAAU,CAAC,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure, browser-safe file templates — the path→contents builders shared by the
|
|
3
|
+
* CLI (which writes them to disk) and the Workflow Studio (which renders them as
|
|
4
|
+
* a file tree). Extracted verbatim from `src/commands/scaffold.ts` and
|
|
5
|
+
* `src/commands/project.ts` so there is ONE source for what a module looks like;
|
|
6
|
+
* re-parameterized to take the resolved `WorkflowSpec` (which already carries
|
|
7
|
+
* titles/labels) instead of raw registries, keeping this module import-free.
|
|
8
|
+
*/
|
|
9
|
+
import type { WorkflowSpec } from "./types.js";
|
|
10
|
+
/** Base module files, pre-wired to @cotrackpro/sdk. (Was scaffold.ts `template`.) */
|
|
11
|
+
export declare function moduleTemplate(name: string, pkg: string): Record<string, string>;
|
|
12
|
+
/** A local plugin that retrieves GATED data via a CLI-brokered token. (Was scaffold.ts `pluginTemplate`.) */
|
|
13
|
+
export declare function pluginTemplate(name: string, pkg: string, scopes: string[]): Record<string, string>;
|
|
14
|
+
/** A typed module pinning the exact catalog pieces a blueprint builds on. (Was project.ts `renderBlueprintModule`.) */
|
|
15
|
+
export declare function blueprintModule(spec: WorkflowSpec): string;
|
|
16
|
+
/** The blueprint module README. (Was project.ts `renderReadme`; guardrails listed by name.) */
|
|
17
|
+
export declare function blueprintReadme(spec: WorkflowSpec, pkg: string): string;
|