@nepopsx/cli 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/bin/opsx.mjs +2 -0
  2. package/dist/commands/activate.d.ts +6 -0
  3. package/dist/commands/activate.d.ts.map +1 -0
  4. package/dist/commands/activate.js +50 -0
  5. package/dist/commands/activate.js.map +1 -0
  6. package/dist/commands/decode.d.ts +2 -0
  7. package/dist/commands/decode.d.ts.map +1 -0
  8. package/dist/commands/decode.js +57 -0
  9. package/dist/commands/decode.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +6 -0
  11. package/dist/commands/doctor.d.ts.map +1 -0
  12. package/dist/commands/doctor.js +133 -0
  13. package/dist/commands/doctor.js.map +1 -0
  14. package/dist/commands/init.d.ts +6 -0
  15. package/dist/commands/init.d.ts.map +1 -0
  16. package/dist/commands/init.js +385 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/commands/install.d.ts +6 -0
  19. package/dist/commands/install.d.ts.map +1 -0
  20. package/dist/commands/install.js +29 -0
  21. package/dist/commands/install.js.map +1 -0
  22. package/dist/commands/server.d.ts +4 -0
  23. package/dist/commands/server.d.ts.map +1 -0
  24. package/dist/commands/server.js +35 -0
  25. package/dist/commands/server.js.map +1 -0
  26. package/dist/commands/sync.d.ts +8 -0
  27. package/dist/commands/sync.d.ts.map +1 -0
  28. package/dist/commands/sync.js +352 -0
  29. package/dist/commands/sync.js.map +1 -0
  30. package/dist/config/api-config.d.ts +12 -0
  31. package/dist/config/api-config.d.ts.map +1 -0
  32. package/dist/config/api-config.js +67 -0
  33. package/dist/config/api-config.js.map +1 -0
  34. package/dist/generator/builtin-templates.d.ts +12 -0
  35. package/dist/generator/builtin-templates.d.ts.map +1 -0
  36. package/dist/generator/builtin-templates.js +251 -0
  37. package/dist/generator/builtin-templates.js.map +1 -0
  38. package/dist/generator/philosophy.d.ts +12 -0
  39. package/dist/generator/philosophy.d.ts.map +1 -0
  40. package/dist/generator/philosophy.js +106 -0
  41. package/dist/generator/philosophy.js.map +1 -0
  42. package/dist/generator/render.d.ts +74 -0
  43. package/dist/generator/render.d.ts.map +1 -0
  44. package/dist/generator/render.js +229 -0
  45. package/dist/generator/render.js.map +1 -0
  46. package/dist/generator/writer.d.ts +19 -0
  47. package/dist/generator/writer.d.ts.map +1 -0
  48. package/dist/generator/writer.js +59 -0
  49. package/dist/generator/writer.js.map +1 -0
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +61 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/licensing/fingerprint.d.ts +48 -0
  55. package/dist/licensing/fingerprint.d.ts.map +1 -0
  56. package/dist/licensing/fingerprint.js +163 -0
  57. package/dist/licensing/fingerprint.js.map +1 -0
  58. package/dist/licensing/index.d.ts +7 -0
  59. package/dist/licensing/index.d.ts.map +1 -0
  60. package/dist/licensing/index.js +7 -0
  61. package/dist/licensing/index.js.map +1 -0
  62. package/dist/licensing/license-manager.d.ts +44 -0
  63. package/dist/licensing/license-manager.d.ts.map +1 -0
  64. package/dist/licensing/license-manager.js +311 -0
  65. package/dist/licensing/license-manager.js.map +1 -0
  66. package/dist/licensing/template-fetch.d.ts +31 -0
  67. package/dist/licensing/template-fetch.d.ts.map +1 -0
  68. package/dist/licensing/template-fetch.js +92 -0
  69. package/dist/licensing/template-fetch.js.map +1 -0
  70. package/dist/security/agent-validator.d.ts +20 -0
  71. package/dist/security/agent-validator.d.ts.map +1 -0
  72. package/dist/security/agent-validator.js +67 -0
  73. package/dist/security/agent-validator.js.map +1 -0
  74. package/dist/security/index.d.ts +7 -0
  75. package/dist/security/index.d.ts.map +1 -0
  76. package/dist/security/index.js +7 -0
  77. package/dist/security/index.js.map +1 -0
  78. package/dist/security/integrity.d.ts +28 -0
  79. package/dist/security/integrity.d.ts.map +1 -0
  80. package/dist/security/integrity.js +87 -0
  81. package/dist/security/integrity.js.map +1 -0
  82. package/dist/security/scanner.d.ts +43 -0
  83. package/dist/security/scanner.d.ts.map +1 -0
  84. package/dist/security/scanner.js +172 -0
  85. package/dist/security/scanner.js.map +1 -0
  86. package/dist/utils/detect.d.ts +7 -0
  87. package/dist/utils/detect.d.ts.map +1 -0
  88. package/dist/utils/detect.js +227 -0
  89. package/dist/utils/detect.js.map +1 -0
  90. package/package.json +44 -0
@@ -0,0 +1,352 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
2
+ import { resolve, join, relative } from 'node:path';
3
+ import { parse } from 'yaml';
4
+ import chalk from 'chalk';
5
+ import { validateWorkspaceConfig, scanConfigSecrets } from '@nepopsx/core';
6
+ import { renderTemplate, registerAgentPartialsFromMap, clearPartialNames, setPhilosophyBlock, setCustomInstructions, setWatermarkData, applyLicenseWatermark } from '../generator/render.js';
7
+ import { writeGeneratedFiles, printWriteResult } from '../generator/writer.js';
8
+ import { getBuiltinTemplates } from '../generator/builtin-templates.js';
9
+ import { philosophyToInstructions } from '../generator/philosophy.js';
10
+ import { scanCustomInstructions, scanPhilosophyCustom, formatThreats, generateManifest } from '../security/index.js';
11
+ import { validateLicense, enforceTierLimits, fetchRemoteTemplates, isDevMode, readLicense } from '../licensing/index.js';
12
+ export async function syncCommand(options) {
13
+ const cwd = process.cwd();
14
+ const configPath = resolve(cwd, options.config);
15
+ const dryRun = options.dryRun ?? false;
16
+ const devMode = options.dev ?? isDevMode();
17
+ console.log(chalk.bold.cyan('\n🔄 OPSX Sync\n'));
18
+ if (dryRun) {
19
+ console.log(chalk.yellow(' [dry-run mode — no files will be written]\n'));
20
+ }
21
+ if (devMode) {
22
+ console.log(chalk.yellow(' [dev mode — license checks bypassed]\n'));
23
+ }
24
+ // 1. Load and validate config
25
+ if (!existsSync(configPath)) {
26
+ console.log(chalk.red(`Config not found: ${options.config}`));
27
+ console.log(chalk.dim(`Run ${chalk.cyan('opsx init')} first.\n`));
28
+ process.exit(1);
29
+ }
30
+ const raw = parse(readFileSync(configPath, 'utf-8'));
31
+ const validation = validateWorkspaceConfig(raw);
32
+ if (!validation.valid) {
33
+ console.log(chalk.red('Invalid workspace config:'));
34
+ for (const err of validation.errors) {
35
+ console.log(chalk.red(` ✗ ${err}`));
36
+ }
37
+ console.log(chalk.dim(`\nRun ${chalk.cyan('opsx doctor')} for details.\n`));
38
+ process.exit(1);
39
+ }
40
+ const config = validation.config;
41
+ console.log(chalk.dim(`Workspace: ${config.workspace.name}`));
42
+ console.log(chalk.dim(`Services: ${config.services.map((s) => s.name).join(', ')}`));
43
+ let activeLicense = null;
44
+ // 1b. License validation (skip in dev mode)
45
+ if (!devMode) {
46
+ const licenseStatus = await validateLicense(cwd, config);
47
+ if (!licenseStatus.valid) {
48
+ console.log(chalk.red(`\n🔒 ${licenseStatus.message}`));
49
+ process.exit(1);
50
+ }
51
+ // Tier enforcement
52
+ const violations = enforceTierLimits(config, licenseStatus.tier);
53
+ if (violations.length > 0) {
54
+ console.log(chalk.red('\n🔒 Workspace exceeds license tier limits:'));
55
+ for (const v of violations) {
56
+ console.log(chalk.red(` ✗ ${v.feature}: ${v.actual} (limit: ${v.limit}, requires ${v.required_tier} tier)`));
57
+ }
58
+ console.log(chalk.dim(`\n Upgrade at opsx.dev to unlock more features.\n`));
59
+ process.exit(1);
60
+ }
61
+ console.log(chalk.dim(`License: ${licenseStatus.org} (${licenseStatus.tier}) — ${licenseStatus.days_remaining}d remaining`));
62
+ activeLicense = readLicense(cwd);
63
+ // Set up watermarking for all generated files
64
+ const watermarkData = {
65
+ version: '0.1.0',
66
+ org: licenseStatus.org,
67
+ plan: licenseStatus.tier,
68
+ valid_until: new Date(Date.now() + licenseStatus.days_remaining * 86400000).toISOString().split('T')[0],
69
+ fingerprint: licenseStatus.fingerprint,
70
+ };
71
+ setWatermarkData(watermarkData);
72
+ }
73
+ else {
74
+ setWatermarkData(null);
75
+ }
76
+ // 1c. Security: scan config for secrets
77
+ const secretWarnings = scanConfigSecrets(config);
78
+ if (secretWarnings.length > 0) {
79
+ console.log(chalk.yellow('\n⚠ Possible secrets detected in workspace config:'));
80
+ for (const w of secretWarnings) {
81
+ console.log(chalk.yellow(` • ${w}`));
82
+ }
83
+ console.log(chalk.dim(' Remove secrets from workspace.yaml — use environment variables instead.\n'));
84
+ }
85
+ // 2. Collect all write operations
86
+ const operations = [];
87
+ // 2a. Load philosophy + custom instructions
88
+ const philoBlock = philosophyToInstructions(config.philosophy);
89
+ setPhilosophyBlock(philoBlock);
90
+ if (philoBlock) {
91
+ console.log(chalk.dim(`Philosophy: ${Object.keys(config.philosophy ?? {}).filter((k) => k !== 'custom').length} axes configured`));
92
+ }
93
+ // 2a-security: scan philosophy.custom[] for injection
94
+ if (config.philosophy?.custom && config.philosophy.custom.length > 0) {
95
+ const philoScan = scanPhilosophyCustom(config.philosophy.custom);
96
+ if (!philoScan.safe) {
97
+ const hasCritical = philoScan.threats.some((t) => t.severity === 'critical');
98
+ console.log(chalk.red('\n🛡️ Security scan found threats in philosophy.custom[]:'));
99
+ console.log(formatThreats(philoScan.threats));
100
+ if (hasCritical) {
101
+ console.log(chalk.red('\n Critical threats found — aborting sync.'));
102
+ console.log(chalk.dim(' Remove or rewrite the flagged philosophy.custom entries.\n'));
103
+ process.exit(1);
104
+ }
105
+ console.log(chalk.yellow(' Proceeding with warnings — review the flagged entries.\n'));
106
+ }
107
+ }
108
+ const customsPath = resolve(cwd, config.customs_dir ?? 'customs');
109
+ const customs = loadCustomInstructions(customsPath);
110
+ // 2a-security: scan customs for injection + secrets
111
+ if (customs.length > 0) {
112
+ const customsScan = scanCustomInstructions(customs);
113
+ if (!customsScan.safe) {
114
+ const hasCritical = customsScan.threats.some((t) => t.severity === 'critical');
115
+ console.log(chalk.red('\n🛡️ Security scan found threats in custom instructions:'));
116
+ console.log(formatThreats(customsScan.threats));
117
+ if (hasCritical) {
118
+ console.log(chalk.red('\n Critical threats found — aborting sync.'));
119
+ console.log(chalk.dim(' Remove or rewrite the flagged customs/ files.\n'));
120
+ process.exit(1);
121
+ }
122
+ console.log(chalk.yellow(' Proceeding with warnings — review the flagged files.\n'));
123
+ }
124
+ }
125
+ setCustomInstructions(customs);
126
+ if (customs.length > 0) {
127
+ console.log(chalk.dim(`Custom instructions: ${customs.length} file(s) from ${config.customs_dir ?? 'customs/'}`));
128
+ }
129
+ // 2b. Builtin templates (copilot-instructions.md, AGENTS.md, Makefile)
130
+ console.log(chalk.dim('\nRendering base templates...'));
131
+ const builtins = getBuiltinTemplates();
132
+ for (const { outputPath, template, source } of builtins) {
133
+ const content = renderTemplate(template, config);
134
+ operations.push({ path: outputPath, content, source });
135
+ }
136
+ // 2c. Agent templates
137
+ if (config.agents) {
138
+ for (const [agentName, agentCfg] of Object.entries(config.agents)) {
139
+ if (!agentCfg.enabled)
140
+ continue;
141
+ console.log(chalk.dim(`Loading agent: ${agentName}...`));
142
+ // Security: validate agent package before loading
143
+ const agentOps = await loadAgentTemplates(cwd, agentName, agentCfg, config, activeLicense);
144
+ operations.push(...agentOps);
145
+ }
146
+ }
147
+ // 3. Apply license watermark + fingerprint to all generated files
148
+ for (const op of operations) {
149
+ op.content = applyLicenseWatermark(op.content);
150
+ }
151
+ // 4. Write files
152
+ console.log(chalk.dim(`\nWriting ${operations.length} file(s)...`));
153
+ const result = writeGeneratedFiles(cwd, operations, dryRun);
154
+ printWriteResult(result, dryRun);
155
+ // 5. Generate integrity manifest
156
+ if (!dryRun) {
157
+ const allFiles = operations.map((op) => ({ path: op.path, content: op.content }));
158
+ const manifest = generateManifest(cwd, allFiles);
159
+ console.log(chalk.dim(`Integrity manifest: ${manifest.length} file(s) hashed → .opsx/manifest.sha256`));
160
+ }
161
+ if (!dryRun) {
162
+ console.log(chalk.bold.green('\n✅ Sync complete.\n'));
163
+ }
164
+ }
165
+ /**
166
+ * Load and render templates from an agent package.
167
+ */
168
+ async function loadAgentTemplates(rootDir, agentName, agentCfg, config, license) {
169
+ const requestedVersion = agentCfg.version ?? '0.0.1';
170
+ const agentMeta = { name: agentName, version: requestedVersion };
171
+ if (!license) {
172
+ console.log(chalk.red(` ✗ Agent "${agentName}" requires an active license. Run opsx activate first.`));
173
+ return [];
174
+ }
175
+ const remoteBundle = await fetchRemoteTemplates(rootDir, license, agentName, requestedVersion);
176
+ if (!remoteBundle) {
177
+ console.log(chalk.red(` ✗ Agent "${agentName}" — could not fetch template bundle from backend.`));
178
+ console.log(chalk.dim(' Check that the OPSX backend is reachable: opsx server show'));
179
+ return [];
180
+ }
181
+ console.log(chalk.dim(` ↳ using remote template bundle (${remoteBundle.version})`));
182
+ return loadAgentTemplatesFromBundle(remoteBundle, config, {
183
+ name: agentName,
184
+ version: remoteBundle.version,
185
+ });
186
+ }
187
+ function loadAgentTemplatesFromBundle(bundle, config, agentMeta) {
188
+ const operations = [];
189
+ const partialNames = registerAgentPartialsFromMap(bundle.templates, config, agentMeta);
190
+ const templateDirs = [
191
+ { prefix: 'agents/', output: '.github/agents' },
192
+ { prefix: 'prompts/', output: '.github/prompts' },
193
+ { prefix: 'instructions/', output: '.github/instructions' },
194
+ ];
195
+ for (const { prefix, output } of templateDirs) {
196
+ for (const [relativePath, templateSource] of Object.entries(bundle.templates)) {
197
+ if (!relativePath.startsWith(prefix) || !relativePath.endsWith('.hbs'))
198
+ continue;
199
+ const outputFileName = relativePath.slice(prefix.length).replace(/\.hbs$/, '');
200
+ const content = renderTemplate(templateSource, config, agentMeta);
201
+ if (content.trim().length === 0)
202
+ continue;
203
+ operations.push({
204
+ path: join(output, outputFileName),
205
+ content,
206
+ source: `remote:${bundle.agent}/${relativePath}`,
207
+ });
208
+ }
209
+ }
210
+ copySchemaFilesFromBundle(bundle.templates, config, agentMeta, operations);
211
+ clearPartialNames(partialNames);
212
+ return operations;
213
+ }
214
+ function copySchemaFilesFromBundle(templateMap, config, agentMeta, operations) {
215
+ const schemaContent = templateMap['schemas/schema.yaml'];
216
+ if (schemaContent) {
217
+ operations.push({
218
+ path: `openspec/schemas/${agentMeta.name}/schema.yaml`,
219
+ content: renderTemplate(schemaContent, config, agentMeta),
220
+ source: `remote:${agentMeta.name}/schemas/schema.yaml`,
221
+ });
222
+ }
223
+ for (const [relativePath, rawContent] of Object.entries(templateMap)) {
224
+ if (!relativePath.startsWith('schemas/templates/'))
225
+ continue;
226
+ const outputName = relativePath.slice('schemas/templates/'.length).replace(/\.hbs$/, '');
227
+ const content = relativePath.endsWith('.hbs')
228
+ ? renderTemplate(rawContent, config, agentMeta)
229
+ : rawContent;
230
+ operations.push({
231
+ path: `openspec/schemas/${agentMeta.name}/templates/${outputName}`,
232
+ content,
233
+ source: `remote:${agentMeta.name}/${relativePath}`,
234
+ });
235
+ }
236
+ const configTemplate = `schema: {{agent.name}}
237
+ context: |
238
+ {{config.workspace.name}} platform services:
239
+ {{#each config.services}}
240
+ - {{name}} ({{language}}{{#if framework}}/{{framework}}{{/if}}) — {{path}}/ {{maturityBadge maturity}}
241
+ {{/each}}
242
+ {{#if config.execution_order}}
243
+ Change order: {{join config.execution_order " → "}}
244
+ {{/if}}
245
+ `;
246
+ operations.push({
247
+ path: 'openspec/config.yaml',
248
+ content: renderTemplate(configTemplate, config, agentMeta),
249
+ source: `remote:${agentMeta.name}/openspec-config`,
250
+ });
251
+ }
252
+ function copySchemaFiles(schemasDir, config, agentMeta, operations) {
253
+ // Copy schema.yaml
254
+ const schemaFile = join(schemasDir, 'schema.yaml');
255
+ if (existsSync(schemaFile)) {
256
+ const content = renderTemplate(readFileSync(schemaFile, 'utf-8'), config, agentMeta);
257
+ operations.push({
258
+ path: `openspec/schemas/${agentMeta.name}/schema.yaml`,
259
+ content,
260
+ source: `agent:${agentMeta.name}/schemas/schema.yaml`,
261
+ });
262
+ }
263
+ // Copy templates
264
+ const templatesDir = join(schemasDir, 'templates');
265
+ if (existsSync(templatesDir)) {
266
+ for (const file of readdirSync(templatesDir)) {
267
+ const src = join(templatesDir, file);
268
+ const isTemplate = file.endsWith('.hbs');
269
+ const outputName = isTemplate ? file.replace('.hbs', '') : file;
270
+ const content = isTemplate
271
+ ? renderTemplate(readFileSync(src, 'utf-8'), config, agentMeta)
272
+ : readFileSync(src, 'utf-8');
273
+ operations.push({
274
+ path: `openspec/schemas/${agentMeta.name}/templates/${outputName}`,
275
+ content,
276
+ source: `agent:${agentMeta.name}/schemas/templates/${file}`,
277
+ });
278
+ }
279
+ }
280
+ // Generate openspec/config.yaml
281
+ const configTemplate = `schema: {{agent.name}}
282
+ context: |
283
+ {{config.workspace.name}} platform services:
284
+ {{#each config.services}}
285
+ - {{name}} ({{language}}{{#if framework}}/{{framework}}{{/if}}) — {{path}}/ {{maturityBadge maturity}}
286
+ {{/each}}
287
+ {{#if config.execution_order}}
288
+ Change order: {{join config.execution_order " → "}}
289
+ {{/if}}
290
+ `;
291
+ operations.push({
292
+ path: 'openspec/config.yaml',
293
+ content: renderTemplate(configTemplate, config, agentMeta),
294
+ source: `agent:${agentMeta.name}/openspec-config`,
295
+ });
296
+ }
297
+ /**
298
+ * Load custom instruction files from the customs/ directory.
299
+ * Supports YAML frontmatter for scoping (applies_to, scope).
300
+ */
301
+ function loadCustomInstructions(customsDir) {
302
+ const instructions = [];
303
+ if (!existsSync(customsDir))
304
+ return instructions;
305
+ const scanDir = (dir) => {
306
+ for (const entry of readdirSync(dir)) {
307
+ const fullPath = join(dir, entry);
308
+ const stat = statSync(fullPath);
309
+ if (stat.isDirectory()) {
310
+ scanDir(fullPath); // recurse into auto/ and subdirectories
311
+ continue;
312
+ }
313
+ if (!entry.endsWith('.md') || entry === 'README.md')
314
+ continue;
315
+ const raw = readFileSync(fullPath, 'utf-8');
316
+ const parsed = parseFrontmatter(raw);
317
+ instructions.push({
318
+ content: parsed.content,
319
+ applies_to: parsed.frontmatter?.applies_to,
320
+ scope: parsed.frontmatter?.scope,
321
+ source: relative(customsDir, fullPath),
322
+ });
323
+ }
324
+ };
325
+ scanDir(customsDir);
326
+ return instructions;
327
+ }
328
+ /**
329
+ * Parse optional YAML frontmatter from a markdown file.
330
+ */
331
+ function parseFrontmatter(raw) {
332
+ const fmRegex = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/;
333
+ const match = raw.match(fmRegex);
334
+ if (!match) {
335
+ return { content: raw.trim() };
336
+ }
337
+ try {
338
+ const fm = parse(match[1]);
339
+ return {
340
+ content: match[2].trim(),
341
+ frontmatter: {
342
+ applies_to: Array.isArray(fm?.applies_to) ? fm.applies_to : undefined,
343
+ scope: typeof fm?.scope === 'string' ? fm.scope : undefined,
344
+ },
345
+ };
346
+ }
347
+ catch {
348
+ // Invalid frontmatter — treat entire file as content
349
+ return { content: raw.trim() };
350
+ }
351
+ }
352
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const DEFAULT_API_BASE = "https://api.opsx.dev/v1";
2
+ export interface LocalOpsxConfig {
3
+ api_url?: string;
4
+ }
5
+ export declare function getLocalConfigPath(rootDir: string): string;
6
+ export declare function readLocalConfig(rootDir: string): LocalOpsxConfig;
7
+ export declare function writeLocalConfig(rootDir: string, config: LocalOpsxConfig): void;
8
+ export declare function normalizeApiBase(rawUrl: string): string;
9
+ export declare function resolveApiBase(rootDir: string): string;
10
+ export declare function setApiBase(rootDir: string, rawUrl: string): string;
11
+ export declare function clearApiBase(rootDir: string): void;
12
+ //# sourceMappingURL=api-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-config.d.ts","sourceRoot":"","sources":["../../src/config/api-config.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAYhE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAI/E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWvD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYtD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASlE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CASlD"}
@@ -0,0 +1,67 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const OPSX_DIR = '.opsx';
4
+ const CONFIG_FILE = 'config.json';
5
+ export const DEFAULT_API_BASE = 'https://api.opsx.dev/v1';
6
+ export function getLocalConfigPath(rootDir) {
7
+ return join(rootDir, OPSX_DIR, CONFIG_FILE);
8
+ }
9
+ export function readLocalConfig(rootDir) {
10
+ const configPath = getLocalConfigPath(rootDir);
11
+ if (!existsSync(configPath)) {
12
+ return {};
13
+ }
14
+ try {
15
+ const raw = JSON.parse(readFileSync(configPath, 'utf-8'));
16
+ return typeof raw.api_url === 'string' ? { api_url: raw.api_url } : {};
17
+ }
18
+ catch {
19
+ return {};
20
+ }
21
+ }
22
+ export function writeLocalConfig(rootDir, config) {
23
+ const configPath = getLocalConfigPath(rootDir);
24
+ mkdirSync(join(rootDir, OPSX_DIR), { recursive: true });
25
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
26
+ }
27
+ export function normalizeApiBase(rawUrl) {
28
+ const parsed = new URL(rawUrl.trim());
29
+ const trimmedPath = parsed.pathname.replace(/\/+$/, '');
30
+ if (trimmedPath.length === 0) {
31
+ parsed.pathname = '/v1';
32
+ }
33
+ else {
34
+ parsed.pathname = trimmedPath;
35
+ }
36
+ return parsed.toString().replace(/\/$/, '');
37
+ }
38
+ export function resolveApiBase(rootDir) {
39
+ const envApiBase = process.env.OPSX_API_URL;
40
+ if (envApiBase) {
41
+ return normalizeApiBase(envApiBase);
42
+ }
43
+ const localConfig = readLocalConfig(rootDir);
44
+ if (localConfig.api_url) {
45
+ return normalizeApiBase(localConfig.api_url);
46
+ }
47
+ return DEFAULT_API_BASE;
48
+ }
49
+ export function setApiBase(rootDir, rawUrl) {
50
+ const normalized = normalizeApiBase(rawUrl);
51
+ const existing = readLocalConfig(rootDir);
52
+ writeLocalConfig(rootDir, {
53
+ ...existing,
54
+ api_url: normalized,
55
+ });
56
+ return normalized;
57
+ }
58
+ export function clearApiBase(rootDir) {
59
+ const existing = readLocalConfig(rootDir);
60
+ if (!existing.api_url) {
61
+ return;
62
+ }
63
+ const next = { ...existing };
64
+ delete next.api_url;
65
+ writeLocalConfig(rootDir, next);
66
+ }
67
+ //# sourceMappingURL=api-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-config.js","sourceRoot":"","sources":["../../src/config/api-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Builtin templates that are generated for every workspace regardless of agents.
3
+ * These provide the base workspace context files.
4
+ */
5
+ interface BuiltinTemplate {
6
+ outputPath: string;
7
+ template: string;
8
+ source: string;
9
+ }
10
+ export declare function getBuiltinTemplates(): BuiltinTemplate[];
11
+ export {};
12
+ //# sourceMappingURL=builtin-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-templates.d.ts","sourceRoot":"","sources":["../../src/generator/builtin-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAkBvD"}