primitive-admin 1.0.5 → 1.0.7
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/bin/primitive.js +9 -1
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/apps.js +2 -2
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/guides.js +353 -0
- package/dist/src/commands/guides.js.map +1 -0
- package/dist/src/commands/sync.js +67 -13
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.js +177 -0
- package/dist/src/commands/tokens.js.map +1 -0
- package/dist/src/commands/workflows.js +298 -2
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/api-client.js +25 -0
- package/dist/src/lib/api-client.js.map +1 -1
- package/package.json +1 -1
package/dist/bin/primitive.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from "commander";
|
|
3
|
+
import { readFileSync } from "fs";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import { dirname, resolve } from "path";
|
|
3
6
|
import { registerAuthCommands } from "../src/commands/auth.js";
|
|
4
7
|
import { registerAppsCommands } from "../src/commands/apps.js";
|
|
5
8
|
import { registerUsersCommands } from "../src/commands/users.js";
|
|
@@ -13,8 +16,12 @@ import { registerAnalyticsCommands } from "../src/commands/analytics.js";
|
|
|
13
16
|
import { registerSyncCommands } from "../src/commands/sync.js";
|
|
14
17
|
import { registerLlmCommands } from "../src/commands/llm.js";
|
|
15
18
|
import { registerComparisonsCommands } from "../src/commands/comparisons.js";
|
|
19
|
+
import { registerGuidesCommands } from "../src/commands/guides.js";
|
|
16
20
|
import { error } from "../src/lib/output.js";
|
|
17
21
|
import { ApiError } from "../src/lib/api-client.js";
|
|
22
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
23
|
+
const __dirname = dirname(__filename);
|
|
24
|
+
const pkg = JSON.parse(readFileSync(resolve(__dirname, "../../package.json"), "utf-8"));
|
|
18
25
|
const program = new Command();
|
|
19
26
|
program
|
|
20
27
|
.name("primitive")
|
|
@@ -22,7 +29,7 @@ program
|
|
|
22
29
|
|
|
23
30
|
Manage apps, users, integrations, prompts, workflows, and more from the command line.
|
|
24
31
|
Supports TOML-based configuration sync for version-controlled app settings.`)
|
|
25
|
-
.version(
|
|
32
|
+
.version(pkg.version)
|
|
26
33
|
.addHelpText("after", `
|
|
27
34
|
Examples:
|
|
28
35
|
$ primitive login # Authenticate via browser OAuth
|
|
@@ -55,6 +62,7 @@ registerAnalyticsCommands(program);
|
|
|
55
62
|
registerSyncCommands(program);
|
|
56
63
|
registerLlmCommands(program);
|
|
57
64
|
registerComparisonsCommands(program);
|
|
65
|
+
registerGuidesCommands(program);
|
|
58
66
|
// Global error handler
|
|
59
67
|
program.hook("preAction", () => {
|
|
60
68
|
// Reset API client state before each command
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../bin/primitive.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC;;;4EAG6D,CAAC;KAC1E,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../bin/primitive.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,9 +42,9 @@ Examples:
|
|
|
42
42
|
// Create app
|
|
43
43
|
apps
|
|
44
44
|
.command("create")
|
|
45
|
-
.description("Create a new app
|
|
45
|
+
.description("Create a new app")
|
|
46
46
|
.argument("<name>", "App name")
|
|
47
|
-
.option("--admin-email <email>", "Initial admin email (defaults to your email)")
|
|
47
|
+
.option("--admin-email <email>", "Initial admin email (super-admin only, defaults to your email)")
|
|
48
48
|
.option("--json", "Output as JSON")
|
|
49
49
|
.action(async (name, options) => {
|
|
50
50
|
const client = new ApiClient();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apps.js","sourceRoot":"","sources":["../../../src/commands/apps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAY,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,OAAO,EACP,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,QAAQ,EAGR,IAAI,EACJ,OAAO,GACR,MAAM,kBAAkB,CAAC;AAE1B,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yCAAyC,CAAC;SACtD,WAAW,CAAC,OAAO,EAAE;;;;;CAKzB,CAAC,CAAC;IAED,YAAY;IACZ,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;YAEnD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACf,OAAO;YACT,CAAC;YAED,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CACT,WAAW,CAAC,QAAQ,EAAE;gBACpB,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;gBAC7C,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;gBAC/B,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;aAChC,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,aAAa;IACb,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"apps.js","sourceRoot":"","sources":["../../../src/commands/apps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
2
|
+
import { homedir } from "os";
|
|
3
|
+
import { join, basename } from "path";
|
|
4
|
+
import { error, info, warn, formatTable, json, keyValue, } from "../lib/output.js";
|
|
5
|
+
const GUIDES_CACHE_DIR = process.env.PRIMITIVE_CONFIG_DIR
|
|
6
|
+
? join(process.env.PRIMITIVE_CONFIG_DIR, "guides")
|
|
7
|
+
: join(homedir(), ".primitive", "guides");
|
|
8
|
+
const CACHE_META_FILE = join(GUIDES_CACHE_DIR, "cache-meta.json");
|
|
9
|
+
const GITHUB_RAW_BASE = "https://raw.githubusercontent.com/Primitive-Labs/primitive-docs/main/guides";
|
|
10
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
11
|
+
const CLIENT_PACKAGE_NAME = "js-bao-wss-client";
|
|
12
|
+
function detectClientVersion() {
|
|
13
|
+
const clientPkgPath = join(process.cwd(), "node_modules", CLIENT_PACKAGE_NAME, "package.json");
|
|
14
|
+
try {
|
|
15
|
+
if (existsSync(clientPkgPath)) {
|
|
16
|
+
const pkg = JSON.parse(readFileSync(clientPkgPath, "utf-8"));
|
|
17
|
+
const version = pkg.version;
|
|
18
|
+
const major = parseInt(version.split(".")[0], 10);
|
|
19
|
+
if (!isNaN(major)) {
|
|
20
|
+
return { major, full: version };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Ignore errors
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
function resolveVersion(explicitVersion) {
|
|
30
|
+
const detected = detectClientVersion();
|
|
31
|
+
// 1. Explicit --version flag
|
|
32
|
+
if (explicitVersion !== undefined) {
|
|
33
|
+
const version = explicitVersion === "latest" ? "latest" : `v${explicitVersion}`;
|
|
34
|
+
return { version, source: "flag", clientVersion: detected?.full };
|
|
35
|
+
}
|
|
36
|
+
// 2. Detect from installed client
|
|
37
|
+
if (detected) {
|
|
38
|
+
return {
|
|
39
|
+
version: `v${detected.major}`,
|
|
40
|
+
source: "detected",
|
|
41
|
+
clientVersion: detected.full,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// 3. Default to latest (no client detected)
|
|
45
|
+
return {
|
|
46
|
+
version: "latest",
|
|
47
|
+
source: "default",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function formatClientVersion(info) {
|
|
51
|
+
if (info.clientVersion) {
|
|
52
|
+
return info.clientVersion;
|
|
53
|
+
}
|
|
54
|
+
return "not found";
|
|
55
|
+
}
|
|
56
|
+
function formatGuidesVersion(info) {
|
|
57
|
+
return info.version;
|
|
58
|
+
}
|
|
59
|
+
function getVersionCacheDir(version) {
|
|
60
|
+
return join(GUIDES_CACHE_DIR, version);
|
|
61
|
+
}
|
|
62
|
+
function getManifestPath(version) {
|
|
63
|
+
return join(getVersionCacheDir(version), "manifest.json");
|
|
64
|
+
}
|
|
65
|
+
function getGuidesCacheDir(version) {
|
|
66
|
+
return join(getVersionCacheDir(version), "guides");
|
|
67
|
+
}
|
|
68
|
+
function ensureCacheDir(version) {
|
|
69
|
+
const versionDir = getVersionCacheDir(version);
|
|
70
|
+
const guidesDir = getGuidesCacheDir(version);
|
|
71
|
+
if (!existsSync(versionDir)) {
|
|
72
|
+
mkdirSync(versionDir, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
if (!existsSync(guidesDir)) {
|
|
75
|
+
mkdirSync(guidesDir, { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function loadCacheMeta() {
|
|
79
|
+
try {
|
|
80
|
+
if (existsSync(CACHE_META_FILE)) {
|
|
81
|
+
return JSON.parse(readFileSync(CACHE_META_FILE, "utf-8"));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Ignore parse errors
|
|
86
|
+
}
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
function saveCacheMeta(meta) {
|
|
90
|
+
if (!existsSync(GUIDES_CACHE_DIR)) {
|
|
91
|
+
mkdirSync(GUIDES_CACHE_DIR, { recursive: true });
|
|
92
|
+
}
|
|
93
|
+
writeFileSync(CACHE_META_FILE, JSON.stringify(meta, null, 2));
|
|
94
|
+
}
|
|
95
|
+
function isCacheExpired(fetchedAt) {
|
|
96
|
+
if (!fetchedAt)
|
|
97
|
+
return true;
|
|
98
|
+
const fetchedTime = new Date(fetchedAt).getTime();
|
|
99
|
+
return Date.now() - fetchedTime > CACHE_TTL_MS;
|
|
100
|
+
}
|
|
101
|
+
function getManifestUrl(version) {
|
|
102
|
+
return `${GITHUB_RAW_BASE}/${version}/guides.json`;
|
|
103
|
+
}
|
|
104
|
+
function getGuideUrl(version, fileName) {
|
|
105
|
+
return `${GITHUB_RAW_BASE}/${version}/${fileName}`;
|
|
106
|
+
}
|
|
107
|
+
async function fetchWithTimeout(url, timeoutMs = 10000) {
|
|
108
|
+
const controller = new AbortController();
|
|
109
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
110
|
+
try {
|
|
111
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
112
|
+
return response;
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
clearTimeout(timeout);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function fetchManifestForVersion(version, forceRefresh = false) {
|
|
119
|
+
ensureCacheDir(version);
|
|
120
|
+
const meta = loadCacheMeta();
|
|
121
|
+
const manifestPath = getManifestPath(version);
|
|
122
|
+
const cacheExpired = isCacheExpired(meta.manifestFetchedAt?.[version]);
|
|
123
|
+
const hasCachedManifest = existsSync(manifestPath);
|
|
124
|
+
// If cache is valid and not forcing refresh, use it
|
|
125
|
+
if (!forceRefresh && !cacheExpired && hasCachedManifest) {
|
|
126
|
+
try {
|
|
127
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
|
|
128
|
+
return { manifest, fromCache: true, stale: false };
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Cache corrupted, will fetch fresh
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Try to fetch from network
|
|
135
|
+
const manifestUrl = getManifestUrl(version);
|
|
136
|
+
try {
|
|
137
|
+
const response = await fetchWithTimeout(manifestUrl);
|
|
138
|
+
if (response.status === 404) {
|
|
139
|
+
return null; // Version doesn't exist
|
|
140
|
+
}
|
|
141
|
+
if (!response.ok) {
|
|
142
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
143
|
+
}
|
|
144
|
+
const manifest = await response.json();
|
|
145
|
+
// Save to cache
|
|
146
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
147
|
+
meta.manifestFetchedAt = meta.manifestFetchedAt || {};
|
|
148
|
+
meta.manifestFetchedAt[version] = new Date().toISOString();
|
|
149
|
+
saveCacheMeta(meta);
|
|
150
|
+
return { manifest, fromCache: false, stale: false };
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
// Network failed, try stale cache
|
|
154
|
+
if (hasCachedManifest) {
|
|
155
|
+
try {
|
|
156
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
|
|
157
|
+
return { manifest, fromCache: true, stale: true };
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Cache corrupted
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
throw new Error(`Failed to fetch guides manifest: ${err.message}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async function fetchManifest(versionInfo, forceRefresh = false) {
|
|
167
|
+
// Try the requested version first
|
|
168
|
+
const result = await fetchManifestForVersion(versionInfo.version, forceRefresh);
|
|
169
|
+
if (result) {
|
|
170
|
+
return { ...result, versionInfo };
|
|
171
|
+
}
|
|
172
|
+
// Version not found, fall back to latest (unless already trying latest)
|
|
173
|
+
if (versionInfo.version !== "latest") {
|
|
174
|
+
const fallbackResult = await fetchManifestForVersion("latest", forceRefresh);
|
|
175
|
+
if (fallbackResult) {
|
|
176
|
+
const fallbackInfo = {
|
|
177
|
+
version: "latest",
|
|
178
|
+
source: versionInfo.source,
|
|
179
|
+
clientVersion: versionInfo.clientVersion,
|
|
180
|
+
fallbackFrom: versionInfo.version,
|
|
181
|
+
};
|
|
182
|
+
return { ...fallbackResult, versionInfo: fallbackInfo };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
throw new Error(`Failed to fetch guides manifest for ${versionInfo.version}`);
|
|
186
|
+
}
|
|
187
|
+
async function fetchGuide(guide, version, forceRefresh = false) {
|
|
188
|
+
ensureCacheDir(version);
|
|
189
|
+
const meta = loadCacheMeta();
|
|
190
|
+
const guideFileName = basename(guide.file);
|
|
191
|
+
const cachedPath = join(getGuidesCacheDir(version), guideFileName);
|
|
192
|
+
const fetchedAt = meta.guidesFetchedAt?.[version]?.[guide.topic];
|
|
193
|
+
const cacheExpired = isCacheExpired(fetchedAt);
|
|
194
|
+
const hasCachedGuide = existsSync(cachedPath);
|
|
195
|
+
// If cache is valid and not forcing refresh, use it
|
|
196
|
+
if (!forceRefresh && !cacheExpired && hasCachedGuide) {
|
|
197
|
+
try {
|
|
198
|
+
const content = readFileSync(cachedPath, "utf-8");
|
|
199
|
+
return { content, fromCache: true, stale: false };
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// Cache corrupted, will fetch fresh
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Try to fetch from network
|
|
206
|
+
const guideUrl = getGuideUrl(version, guide.file);
|
|
207
|
+
try {
|
|
208
|
+
const response = await fetchWithTimeout(guideUrl);
|
|
209
|
+
if (!response.ok) {
|
|
210
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
211
|
+
}
|
|
212
|
+
const content = await response.text();
|
|
213
|
+
// Save to cache
|
|
214
|
+
writeFileSync(cachedPath, content);
|
|
215
|
+
meta.guidesFetchedAt = meta.guidesFetchedAt || {};
|
|
216
|
+
meta.guidesFetchedAt[version] = meta.guidesFetchedAt[version] || {};
|
|
217
|
+
meta.guidesFetchedAt[version][guide.topic] = new Date().toISOString();
|
|
218
|
+
saveCacheMeta(meta);
|
|
219
|
+
return { content, fromCache: false, stale: false };
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
// Network failed, try stale cache
|
|
223
|
+
if (hasCachedGuide) {
|
|
224
|
+
try {
|
|
225
|
+
const content = readFileSync(cachedPath, "utf-8");
|
|
226
|
+
return { content, fromCache: true, stale: true };
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// Cache corrupted
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
throw new Error(`Failed to fetch guide "${guide.topic}": ${err.message}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export function registerGuidesCommands(program) {
|
|
236
|
+
const guides = program
|
|
237
|
+
.command("guides")
|
|
238
|
+
.description("Access Primitive how-to guides for building apps")
|
|
239
|
+
.addHelpText("after", `
|
|
240
|
+
Examples:
|
|
241
|
+
$ primitive guides list # List available guides
|
|
242
|
+
$ primitive guides list --json # List as JSON for programmatic use
|
|
243
|
+
$ primitive guides get documents # Fetch and display the documents guide
|
|
244
|
+
$ primitive guides get workflows # Fetch and display the workflows guide
|
|
245
|
+
$ primitive guides list --version 1 # List guides for client v1
|
|
246
|
+
|
|
247
|
+
Versioning:
|
|
248
|
+
By default, guides are fetched for the detected ${CLIENT_PACKAGE_NAME} version.
|
|
249
|
+
Use --version to explicitly request a specific major version.
|
|
250
|
+
Falls back to 'latest' if the version is not found.
|
|
251
|
+
|
|
252
|
+
Cache:
|
|
253
|
+
Guides are cached locally for 24 hours at ~/.primitive/guides/
|
|
254
|
+
Use the cache location to search guides locally with grep/ripgrep.
|
|
255
|
+
`);
|
|
256
|
+
// List guides
|
|
257
|
+
guides
|
|
258
|
+
.command("list")
|
|
259
|
+
.description("List available guides")
|
|
260
|
+
.option("--json", "Output as JSON")
|
|
261
|
+
.option("--refresh", "Force refresh from network")
|
|
262
|
+
.option("--version <version>", "Fetch guides for a specific major version (e.g., 1, 2, or 'latest')")
|
|
263
|
+
.action(async (options) => {
|
|
264
|
+
try {
|
|
265
|
+
const requestedVersion = resolveVersion(options.version);
|
|
266
|
+
const { manifest, stale, versionInfo } = await fetchManifest(requestedVersion, options.refresh);
|
|
267
|
+
if (stale) {
|
|
268
|
+
warn("Using stale cache (network unavailable)");
|
|
269
|
+
}
|
|
270
|
+
if (options.json) {
|
|
271
|
+
json({
|
|
272
|
+
version: versionInfo.version,
|
|
273
|
+
versionSource: versionInfo.source,
|
|
274
|
+
guides: manifest.guides.map((g) => ({
|
|
275
|
+
topic: g.topic,
|
|
276
|
+
description: g.description,
|
|
277
|
+
keywords: g.keywords,
|
|
278
|
+
useCases: g.useCases,
|
|
279
|
+
concepts: g.concepts,
|
|
280
|
+
prerequisites: g.prerequisites,
|
|
281
|
+
relatedGuides: g.relatedGuides,
|
|
282
|
+
})),
|
|
283
|
+
});
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
if (!manifest.guides || manifest.guides.length === 0) {
|
|
287
|
+
info("No guides available.");
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
keyValue("Client version", formatClientVersion(versionInfo));
|
|
291
|
+
keyValue("Guides version", formatGuidesVersion(versionInfo));
|
|
292
|
+
console.log("");
|
|
293
|
+
console.log(formatTable(manifest.guides, [
|
|
294
|
+
{ header: "TOPIC", key: "topic" },
|
|
295
|
+
{ header: "DESCRIPTION", key: "description", width: 60 },
|
|
296
|
+
]));
|
|
297
|
+
console.log("");
|
|
298
|
+
keyValue("Cache location", getVersionCacheDir(versionInfo.version));
|
|
299
|
+
info("Use 'primitive guides get <topic>' to fetch a guide.");
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
error(err.message);
|
|
303
|
+
process.exit(1);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
// Get a specific guide
|
|
307
|
+
guides
|
|
308
|
+
.command("get")
|
|
309
|
+
.description("Fetch and display a guide by topic")
|
|
310
|
+
.argument("<topic>", "Guide topic (e.g., documents, workflows, prompts)")
|
|
311
|
+
.option("--json", "Output metadata as JSON instead of content")
|
|
312
|
+
.option("--refresh", "Force refresh from network")
|
|
313
|
+
.option("--version <version>", "Fetch guides for a specific major version (e.g., 1, 2, or 'latest')")
|
|
314
|
+
.action(async (topic, options) => {
|
|
315
|
+
try {
|
|
316
|
+
const requestedVersion = resolveVersion(options.version);
|
|
317
|
+
const { manifest, stale: manifestStale, versionInfo } = await fetchManifest(requestedVersion, options.refresh);
|
|
318
|
+
const guide = manifest.guides.find((g) => g.topic.toLowerCase() === topic.toLowerCase());
|
|
319
|
+
if (!guide) {
|
|
320
|
+
const availableTopics = manifest.guides.map((g) => g.topic).join(", ");
|
|
321
|
+
error(`Guide "${topic}" not found. Available topics: ${availableTopics}`);
|
|
322
|
+
process.exit(1);
|
|
323
|
+
}
|
|
324
|
+
if (options.json) {
|
|
325
|
+
// Output just metadata
|
|
326
|
+
json({
|
|
327
|
+
version: versionInfo.version,
|
|
328
|
+
versionSource: versionInfo.source,
|
|
329
|
+
topic: guide.topic,
|
|
330
|
+
description: guide.description,
|
|
331
|
+
keywords: guide.keywords,
|
|
332
|
+
useCases: guide.useCases,
|
|
333
|
+
concepts: guide.concepts,
|
|
334
|
+
prerequisites: guide.prerequisites,
|
|
335
|
+
relatedGuides: guide.relatedGuides,
|
|
336
|
+
cacheLocation: join(getGuidesCacheDir(versionInfo.version), basename(guide.file)),
|
|
337
|
+
});
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const { content, stale: guideStale } = await fetchGuide(guide, versionInfo.version, options.refresh);
|
|
341
|
+
if (manifestStale || guideStale) {
|
|
342
|
+
warn("Using stale cache (network unavailable)");
|
|
343
|
+
}
|
|
344
|
+
// Print the guide content directly to stdout
|
|
345
|
+
console.log(content);
|
|
346
|
+
}
|
|
347
|
+
catch (err) {
|
|
348
|
+
error(err.message);
|
|
349
|
+
process.exit(1);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=guides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guides.js","sourceRoot":"","sources":["../../../src/commands/guides.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EACL,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAE1B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB;IACvD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,QAAQ,CAAC;IAClD,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAC5C,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;AAElE,MAAM,eAAe,GAAG,6EAA6E,CAAC;AACtG,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AACrD,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AA+BhD,SAAS,mBAAmB;IAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;IAC/F,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAiB,CAAC;YACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,eAAwB;IAC9C,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IAEvC,6BAA6B;IAC7B,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC;QAChF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACpE,CAAC;IAED,kCAAkC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,IAAI,QAAQ,CAAC,KAAK,EAAE;YAC7B,MAAM,EAAE,UAAU;YAClB,aAAa,EAAE,QAAQ,CAAC,IAAI;SAC7B,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAiB;IAC5C,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAiB;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,IAAe;IACpC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,cAAc,CAAC,SAA6B;IACnD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAClD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,GAAG,YAAY,CAAC;AACjD,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,GAAG,eAAe,IAAI,OAAO,cAAc,CAAC;AACrD,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,QAAgB;IACpD,OAAO,GAAG,eAAe,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,SAAS,GAAG,KAAK;IAC5D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AASD,KAAK,UAAU,uBAAuB,CACpC,OAAe,EACf,YAAY,GAAG,KAAK;IAEpB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,MAAM,iBAAiB,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAEnD,oDAAoD;IACpD,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,IAAI,iBAAiB,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YACjE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,CAAC,wBAAwB;QACvC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAc,CAAC;QAEnD,gBAAgB;QAChB,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3D,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kCAAkC;QAClC,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;gBACjE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;YACpB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,oCAAqC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,WAAwB,EACxB,YAAY,GAAG,KAAK;IAEpB,kCAAkC;IAClC,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEhF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC;IACpC,CAAC;IAED,wEAAwE;IACxE,IAAI,WAAW,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG,MAAM,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC7E,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,YAAY,GAAgB;gBAChC,OAAO,EAAE,QAAQ;gBACjB,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,aAAa,EAAE,WAAW,CAAC,aAAa;gBACxC,YAAY,EAAE,WAAW,CAAC,OAAO;aAClC,CAAC;YACF,OAAO,EAAE,GAAG,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,KAAY,EACZ,OAAe,EACf,YAAY,GAAG,KAAK;IAEpB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE9C,oDAAoD;IACpD,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,IAAI,cAAc,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEtC,gBAAgB;QAChB,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACpE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtE,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kCAAkC;QAClC,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAClD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;YACpB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,KAAK,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,WAAW,CAAC,OAAO,EAAE;;;;;;;;;oDAS0B,mBAAmB;;;;;;;CAOtE,CAAC,CAAC;IAED,cAAc;IACd,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,WAAW,EAAE,4BAA4B,CAAC;SACjD,MAAM,CAAC,qBAAqB,EAAE,qEAAqE,CAAC;SACpG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAEhG,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,yCAAyC,CAAC,CAAC;YAClD,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,OAAO,EAAE,WAAW,CAAC,OAAO;oBAC5B,aAAa,EAAE,WAAW,CAAC,MAAM;oBACjC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAClC,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,WAAW,EAAE,CAAC,CAAC,WAAW;wBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,aAAa,EAAE,CAAC,CAAC,aAAa;wBAC9B,aAAa,EAAE,CAAC,CAAC,aAAa;qBAC/B,CAAC,CAAC;iBACJ,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC7D,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,OAAO,CAAC,GAAG,CACT,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE;gBAC3B,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;gBACjC,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE;aACzD,CAAC,CACH,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,QAAQ,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,uBAAuB;IACvB,MAAM;SACH,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,oCAAoC,CAAC;SACjD,QAAQ,CAAC,SAAS,EAAE,mDAAmD,CAAC;SACxE,MAAM,CAAC,QAAQ,EAAE,4CAA4C,CAAC;SAC9D,MAAM,CAAC,WAAW,EAAE,4BAA4B,CAAC;SACjD,MAAM,CAAC,qBAAqB,EAAE,qEAAqE,CAAC;SACpG,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAE/G,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CACrD,CAAC;YAEF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvE,KAAK,CAAC,UAAU,KAAK,kCAAkC,eAAe,EAAE,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,uBAAuB;gBACvB,IAAI,CAAC;oBACH,OAAO,EAAE,WAAW,CAAC,OAAO;oBAC5B,aAAa,EAAE,WAAW,CAAC,MAAM;oBACjC,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,aAAa,EAAE,KAAK,CAAC,aAAa;oBAClC,aAAa,EAAE,KAAK,CAAC,aAAa;oBAClC,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iBAClF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAErG,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;gBAChC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YAClD,CAAC;YAED,6CAA6C;YAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -99,19 +99,38 @@ function serializePrompt(prompt) {
|
|
|
99
99
|
};
|
|
100
100
|
return TOML.stringify(data);
|
|
101
101
|
}
|
|
102
|
-
function serializeWorkflow(workflow, draft) {
|
|
102
|
+
function serializeWorkflow(workflow, draft, configs) {
|
|
103
|
+
// Find the active config or use the first one
|
|
104
|
+
const activeConfigId = workflow.activeConfigId;
|
|
105
|
+
const activeConfig = configs?.find((c) => c.configId === activeConfigId) || configs?.[0];
|
|
106
|
+
// Determine which steps to use (prefer config steps if non-empty, else draft steps)
|
|
107
|
+
const configSteps = activeConfig?.steps;
|
|
108
|
+
const draftSteps = draft?.steps;
|
|
109
|
+
const steps = (configSteps && configSteps.length > 0) ? configSteps : (draftSteps || []);
|
|
103
110
|
const data = {
|
|
104
111
|
workflow: {
|
|
105
112
|
key: workflow.workflowKey,
|
|
106
113
|
name: workflow.name,
|
|
107
114
|
description: workflow.description,
|
|
108
115
|
status: workflow.status,
|
|
116
|
+
activeConfigId: activeConfigId,
|
|
109
117
|
perUserMaxRunning: workflow.perUserMaxRunning,
|
|
110
118
|
perUserMaxQueued: workflow.perUserMaxQueued,
|
|
111
119
|
dequeueOrder: workflow.dequeueOrder,
|
|
112
|
-
|
|
120
|
+
// Schemas are at workflow level
|
|
121
|
+
inputSchema: workflow.inputSchema ? JSON.stringify(workflow.inputSchema) : undefined,
|
|
122
|
+
outputSchema: workflow.outputSchema ? JSON.stringify(workflow.outputSchema) : undefined,
|
|
113
123
|
},
|
|
114
|
-
|
|
124
|
+
// Use active config steps, fall back to draft
|
|
125
|
+
steps,
|
|
126
|
+
// Include all configurations
|
|
127
|
+
configs: configs?.map((config) => ({
|
|
128
|
+
id: config.configId,
|
|
129
|
+
name: config.configName,
|
|
130
|
+
description: config.description,
|
|
131
|
+
status: config.status,
|
|
132
|
+
isActive: config.configId === activeConfigId,
|
|
133
|
+
})) || [],
|
|
115
134
|
};
|
|
116
135
|
return TOML.stringify(data);
|
|
117
136
|
}
|
|
@@ -187,7 +206,27 @@ Directory Structure:
|
|
|
187
206
|
// Fetch details for each entity
|
|
188
207
|
const integrations = await Promise.all(integrationsResult.items.map((i) => client.getIntegration(resolvedAppId, i.integrationId)));
|
|
189
208
|
const prompts = await Promise.all(promptsResult.items.map((p) => client.getPrompt(resolvedAppId, p.promptId)));
|
|
190
|
-
const workflows = await Promise.all(workflowsResult.items.map((w) =>
|
|
209
|
+
const workflows = await Promise.all(workflowsResult.items.map(async (w) => {
|
|
210
|
+
const workflowData = await client.getWorkflow(resolvedAppId, w.workflowId);
|
|
211
|
+
// Fetch active config with steps if available
|
|
212
|
+
const activeConfigId = workflowData.workflow?.activeConfigId;
|
|
213
|
+
if (activeConfigId) {
|
|
214
|
+
try {
|
|
215
|
+
const activeConfig = await client.getWorkflowConfig(resolvedAppId, w.workflowId, activeConfigId);
|
|
216
|
+
// Replace the config in the configs array with the one that has steps
|
|
217
|
+
if (workflowData.configs && activeConfig) {
|
|
218
|
+
const configIndex = workflowData.configs.findIndex((c) => c.configId === activeConfigId);
|
|
219
|
+
if (configIndex >= 0) {
|
|
220
|
+
workflowData.configs[configIndex] = activeConfig;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// Ignore errors fetching config steps
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return workflowData;
|
|
229
|
+
}));
|
|
191
230
|
if (options.json) {
|
|
192
231
|
json({ settings, integrations, prompts, workflows });
|
|
193
232
|
return;
|
|
@@ -226,12 +265,13 @@ Directory Structure:
|
|
|
226
265
|
}
|
|
227
266
|
// Write workflows
|
|
228
267
|
const workflowEntities = {};
|
|
229
|
-
for (const { workflow, draft } of workflows) {
|
|
268
|
+
for (const { workflow, draft, configs } of workflows) {
|
|
230
269
|
const filename = `${workflow.workflowKey}.toml`;
|
|
231
|
-
writeFileSync(join(configDir, "workflows", filename), serializeWorkflow(workflow, draft));
|
|
270
|
+
writeFileSync(join(configDir, "workflows", filename), serializeWorkflow(workflow, draft, configs || []));
|
|
232
271
|
workflowEntities[workflow.workflowKey] = {
|
|
233
272
|
id: workflow.workflowId,
|
|
234
273
|
modifiedAt: workflow.modifiedAt || new Date().toISOString(),
|
|
274
|
+
activeConfigId: workflow.activeConfigId,
|
|
235
275
|
};
|
|
236
276
|
info(` Wrote workflows/${filename}`);
|
|
237
277
|
}
|
|
@@ -466,6 +506,7 @@ Directory Structure:
|
|
|
466
506
|
const key = workflow.key || basename(file, ".toml");
|
|
467
507
|
const steps = tomlData.steps || [];
|
|
468
508
|
const existingId = syncState?.entities?.workflows?.[key]?.id;
|
|
509
|
+
const existingActiveConfigId = syncState?.entities?.workflows?.[key]?.activeConfigId;
|
|
469
510
|
if (existingId) {
|
|
470
511
|
// Update existing workflow
|
|
471
512
|
changes.push({ type: "workflow", action: "update", key });
|
|
@@ -474,6 +515,7 @@ Directory Structure:
|
|
|
474
515
|
? undefined
|
|
475
516
|
: syncState?.entities?.workflows?.[key]?.modifiedAt;
|
|
476
517
|
try {
|
|
518
|
+
// Update workflow metadata and schemas
|
|
477
519
|
const updated = await client.updateWorkflow(resolvedAppId, existingId, {
|
|
478
520
|
name: workflow.name,
|
|
479
521
|
description: workflow.description,
|
|
@@ -481,12 +523,22 @@ Directory Structure:
|
|
|
481
523
|
perUserMaxRunning: workflow.perUserMaxRunning,
|
|
482
524
|
perUserMaxQueued: workflow.perUserMaxQueued,
|
|
483
525
|
dequeueOrder: workflow.dequeueOrder,
|
|
484
|
-
}, expectedModifiedAt);
|
|
485
|
-
// Update draft (no conflict detection - always overwrite)
|
|
486
|
-
await client.updateWorkflowDraft(resolvedAppId, existingId, {
|
|
487
|
-
steps,
|
|
488
526
|
inputSchema: workflow.inputSchema ? JSON.parse(workflow.inputSchema) : null,
|
|
489
|
-
|
|
527
|
+
outputSchema: workflow.outputSchema ? JSON.parse(workflow.outputSchema) : null,
|
|
528
|
+
}, expectedModifiedAt);
|
|
529
|
+
// Update active configuration steps (or draft for legacy)
|
|
530
|
+
if (existingActiveConfigId) {
|
|
531
|
+
await client.updateWorkflowConfig(resolvedAppId, existingId, existingActiveConfigId, {
|
|
532
|
+
steps,
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
// Fallback to draft update for legacy workflows
|
|
537
|
+
await client.updateWorkflowDraft(resolvedAppId, existingId, {
|
|
538
|
+
steps,
|
|
539
|
+
inputSchema: workflow.inputSchema ? JSON.parse(workflow.inputSchema) : null,
|
|
540
|
+
});
|
|
541
|
+
}
|
|
490
542
|
info(` Updated workflow: ${key}`);
|
|
491
543
|
// Update sync state with new modifiedAt
|
|
492
544
|
if (syncState?.entities?.workflows?.[key] && updated?.workflow?.modifiedAt) {
|
|
@@ -509,7 +561,7 @@ Directory Structure:
|
|
|
509
561
|
}
|
|
510
562
|
}
|
|
511
563
|
else {
|
|
512
|
-
// Create new workflow
|
|
564
|
+
// Create new workflow (automatically creates default config)
|
|
513
565
|
changes.push({ type: "workflow", action: "create", key });
|
|
514
566
|
if (!options.dryRun) {
|
|
515
567
|
const created = await client.createWorkflow(resolvedAppId, {
|
|
@@ -518,12 +570,13 @@ Directory Structure:
|
|
|
518
570
|
description: workflow.description,
|
|
519
571
|
steps,
|
|
520
572
|
inputSchema: workflow.inputSchema ? JSON.parse(workflow.inputSchema) : undefined,
|
|
573
|
+
outputSchema: workflow.outputSchema ? JSON.parse(workflow.outputSchema) : undefined,
|
|
521
574
|
perUserMaxRunning: workflow.perUserMaxRunning,
|
|
522
575
|
perUserMaxQueued: workflow.perUserMaxQueued,
|
|
523
576
|
dequeueOrder: workflow.dequeueOrder,
|
|
524
577
|
});
|
|
525
578
|
info(` Created workflow: ${key}`);
|
|
526
|
-
// Add new entity to sync state
|
|
579
|
+
// Add new entity to sync state (including activeConfigId)
|
|
527
580
|
if (syncState && created?.workflow?.workflowId && created?.workflow?.modifiedAt) {
|
|
528
581
|
if (!syncState.entities.workflows) {
|
|
529
582
|
syncState.entities.workflows = {};
|
|
@@ -531,6 +584,7 @@ Directory Structure:
|
|
|
531
584
|
syncState.entities.workflows[key] = {
|
|
532
585
|
id: created.workflow.workflowId,
|
|
533
586
|
modifiedAt: created.workflow.modifiedAt,
|
|
587
|
+
activeConfigId: created.workflow.activeConfigId,
|
|
534
588
|
};
|
|
535
589
|
}
|
|
536
590
|
}
|