@nepopsx/cli 0.0.3 → 0.0.5

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 (168) hide show
  1. package/dist/agents/configuration.d.ts +9 -0
  2. package/dist/agents/configuration.d.ts.map +1 -0
  3. package/dist/agents/configuration.js +57 -0
  4. package/dist/agents/configuration.js.map +1 -0
  5. package/dist/agents/remote-config.d.ts +30 -0
  6. package/dist/agents/remote-config.d.ts.map +1 -0
  7. package/dist/agents/remote-config.js +102 -0
  8. package/dist/agents/remote-config.js.map +1 -0
  9. package/dist/commands/activate.d.ts.map +1 -1
  10. package/dist/commands/activate.js +4 -3
  11. package/dist/commands/activate.js.map +1 -1
  12. package/dist/commands/decode.js +2 -2
  13. package/dist/commands/decode.js.map +1 -1
  14. package/dist/commands/doctor.js +16 -16
  15. package/dist/commands/doctor.js.map +1 -1
  16. package/dist/commands/init.d.ts.map +1 -1
  17. package/dist/commands/init.js +353 -18
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/install.d.ts +1 -0
  20. package/dist/commands/install.d.ts.map +1 -1
  21. package/dist/commands/install.js +253 -25
  22. package/dist/commands/install.js.map +1 -1
  23. package/dist/commands/login.d.ts +6 -0
  24. package/dist/commands/login.d.ts.map +1 -0
  25. package/dist/commands/login.js +108 -0
  26. package/dist/commands/login.js.map +1 -0
  27. package/dist/commands/push-learnings.d.ts +14 -0
  28. package/dist/commands/push-learnings.d.ts.map +1 -0
  29. package/dist/commands/push-learnings.js +186 -0
  30. package/dist/commands/push-learnings.js.map +1 -0
  31. package/dist/commands/scan.d.ts +2 -0
  32. package/dist/commands/scan.d.ts.map +1 -0
  33. package/dist/commands/scan.js +520 -0
  34. package/dist/commands/scan.js.map +1 -0
  35. package/dist/commands/sync.d.ts +2 -0
  36. package/dist/commands/sync.d.ts.map +1 -1
  37. package/dist/commands/sync.js +203 -234
  38. package/dist/commands/sync.js.map +1 -1
  39. package/dist/config/api-config.d.ts.map +1 -1
  40. package/dist/config/api-config.js +4 -0
  41. package/dist/config/api-config.js.map +1 -1
  42. package/dist/constants.d.ts +7 -0
  43. package/dist/constants.d.ts.map +1 -0
  44. package/dist/constants.js +7 -0
  45. package/dist/constants.js.map +1 -0
  46. package/dist/customs/instructions.d.ts +3 -0
  47. package/dist/customs/instructions.d.ts.map +1 -0
  48. package/dist/customs/instructions.js +51 -0
  49. package/dist/customs/instructions.js.map +1 -0
  50. package/dist/enrichment/confirm.d.ts +17 -0
  51. package/dist/enrichment/confirm.d.ts.map +1 -0
  52. package/dist/enrichment/confirm.js +44 -0
  53. package/dist/enrichment/confirm.js.map +1 -0
  54. package/dist/enrichment/state.d.ts +8 -0
  55. package/dist/enrichment/state.d.ts.map +1 -0
  56. package/dist/enrichment/state.js +107 -0
  57. package/dist/enrichment/state.js.map +1 -0
  58. package/dist/enrichment/types.d.ts +13 -0
  59. package/dist/enrichment/types.d.ts.map +1 -0
  60. package/dist/enrichment/types.js +2 -0
  61. package/dist/enrichment/types.js.map +1 -0
  62. package/dist/enrichment/workflow.d.ts +35 -0
  63. package/dist/enrichment/workflow.d.ts.map +1 -0
  64. package/dist/enrichment/workflow.js +305 -0
  65. package/dist/enrichment/workflow.js.map +1 -0
  66. package/dist/generator/builtin-templates.d.ts +2 -1
  67. package/dist/generator/builtin-templates.d.ts.map +1 -1
  68. package/dist/generator/builtin-templates.js +161 -2
  69. package/dist/generator/builtin-templates.js.map +1 -1
  70. package/dist/generator/package-renderer.d.ts +29 -0
  71. package/dist/generator/package-renderer.d.ts.map +1 -0
  72. package/dist/generator/package-renderer.js +123 -0
  73. package/dist/generator/package-renderer.js.map +1 -0
  74. package/dist/generator/render.d.ts +14 -63
  75. package/dist/generator/render.d.ts.map +1 -1
  76. package/dist/generator/render.js +30 -176
  77. package/dist/generator/render.js.map +1 -1
  78. package/dist/index.js +42 -2
  79. package/dist/index.js.map +1 -1
  80. package/dist/licensing/installer.d.ts +51 -0
  81. package/dist/licensing/installer.d.ts.map +1 -0
  82. package/dist/licensing/installer.js +112 -0
  83. package/dist/licensing/installer.js.map +1 -0
  84. package/dist/licensing/license-manager.d.ts +6 -0
  85. package/dist/licensing/license-manager.d.ts.map +1 -1
  86. package/dist/licensing/license-manager.js +12 -35
  87. package/dist/licensing/license-manager.js.map +1 -1
  88. package/dist/licensing/template-fetch.d.ts +3 -2
  89. package/dist/licensing/template-fetch.d.ts.map +1 -1
  90. package/dist/licensing/template-fetch.js +10 -41
  91. package/dist/licensing/template-fetch.js.map +1 -1
  92. package/dist/scan/__tests__/context-gatherer.test.d.ts +2 -0
  93. package/dist/scan/__tests__/context-gatherer.test.d.ts.map +1 -0
  94. package/dist/scan/__tests__/context-gatherer.test.js +111 -0
  95. package/dist/scan/__tests__/context-gatherer.test.js.map +1 -0
  96. package/dist/scan/__tests__/merge.test.d.ts +2 -0
  97. package/dist/scan/__tests__/merge.test.d.ts.map +1 -0
  98. package/dist/scan/__tests__/merge.test.js +163 -0
  99. package/dist/scan/__tests__/merge.test.js.map +1 -0
  100. package/dist/scan/auto-bootstrap.d.ts +3 -0
  101. package/dist/scan/auto-bootstrap.d.ts.map +1 -0
  102. package/dist/scan/auto-bootstrap.js +30 -0
  103. package/dist/scan/auto-bootstrap.js.map +1 -0
  104. package/dist/scan/config.d.ts +24 -0
  105. package/dist/scan/config.d.ts.map +1 -0
  106. package/dist/scan/config.js +77 -0
  107. package/dist/scan/config.js.map +1 -0
  108. package/dist/scan/context/gatherer.d.ts +13 -0
  109. package/dist/scan/context/gatherer.d.ts.map +1 -0
  110. package/dist/scan/context/gatherer.js +97 -0
  111. package/dist/scan/context/gatherer.js.map +1 -0
  112. package/dist/scan/context/gitignore.d.ts +9 -0
  113. package/dist/scan/context/gitignore.d.ts.map +1 -0
  114. package/dist/scan/context/gitignore.js +50 -0
  115. package/dist/scan/context/gitignore.js.map +1 -0
  116. package/dist/scan/context/patterns.d.ts +14 -0
  117. package/dist/scan/context/patterns.d.ts.map +1 -0
  118. package/dist/scan/context/patterns.js +159 -0
  119. package/dist/scan/context/patterns.js.map +1 -0
  120. package/dist/scan/customs/writer.d.ts +6 -0
  121. package/dist/scan/customs/writer.d.ts.map +1 -0
  122. package/dist/scan/customs/writer.js +149 -0
  123. package/dist/scan/customs/writer.js.map +1 -0
  124. package/dist/scan/llm/anthropic.d.ts +11 -0
  125. package/dist/scan/llm/anthropic.d.ts.map +1 -0
  126. package/dist/scan/llm/anthropic.js +89 -0
  127. package/dist/scan/llm/anthropic.js.map +1 -0
  128. package/dist/scan/llm/factory.d.ts +4 -0
  129. package/dist/scan/llm/factory.d.ts.map +1 -0
  130. package/dist/scan/llm/factory.js +20 -0
  131. package/dist/scan/llm/factory.js.map +1 -0
  132. package/dist/scan/llm/ollama.d.ts +11 -0
  133. package/dist/scan/llm/ollama.d.ts.map +1 -0
  134. package/dist/scan/llm/ollama.js +64 -0
  135. package/dist/scan/llm/ollama.js.map +1 -0
  136. package/dist/scan/llm/openai.d.ts +12 -0
  137. package/dist/scan/llm/openai.d.ts.map +1 -0
  138. package/dist/scan/llm/openai.js +78 -0
  139. package/dist/scan/llm/openai.js.map +1 -0
  140. package/dist/scan/llm/types.d.ts +23 -0
  141. package/dist/scan/llm/types.d.ts.map +1 -0
  142. package/dist/scan/llm/types.js +3 -0
  143. package/dist/scan/llm/types.js.map +1 -0
  144. package/dist/scan/merge/diff-display.d.ts +11 -0
  145. package/dist/scan/merge/diff-display.d.ts.map +1 -0
  146. package/dist/scan/merge/diff-display.js +72 -0
  147. package/dist/scan/merge/diff-display.js.map +1 -0
  148. package/dist/scan/prompt/agent.d.ts +23 -0
  149. package/dist/scan/prompt/agent.d.ts.map +1 -0
  150. package/dist/scan/prompt/agent.js +95 -0
  151. package/dist/scan/prompt/agent.js.map +1 -0
  152. package/dist/scan/prompt/builder.d.ts +16 -0
  153. package/dist/scan/prompt/builder.d.ts.map +1 -0
  154. package/dist/scan/prompt/builder.js +64 -0
  155. package/dist/scan/prompt/builder.js.map +1 -0
  156. package/dist/scan/prompt/schema.d.ts +7 -0
  157. package/dist/scan/prompt/schema.d.ts.map +1 -0
  158. package/dist/scan/prompt/schema.js +52 -0
  159. package/dist/scan/prompt/schema.js.map +1 -0
  160. package/dist/security/scanner.d.ts +3 -40
  161. package/dist/security/scanner.d.ts.map +1 -1
  162. package/dist/security/scanner.js +3 -169
  163. package/dist/security/scanner.js.map +1 -1
  164. package/dist/utils/fetch.d.ts +9 -0
  165. package/dist/utils/fetch.d.ts.map +1 -0
  166. package/dist/utils/fetch.js +18 -0
  167. package/dist/utils/fetch.js.map +1 -0
  168. package/package.json +15 -12
@@ -0,0 +1,305 @@
1
+ // @nepopsx/cli — Enrichment workflow: gate check + single-agent enrichment
2
+ //
3
+ // Architecture:
4
+ // scan command → full workspace + agent enrichment (the only enrichment surface)
5
+ // install command → checkEnrichmentGate() + enrichSingleAgent() if workspace already done
6
+ // sync command → checkEnrichmentGate() only (fail fast if not enriched)
7
+ //
8
+ // This module exports:
9
+ // checkEnrichmentGate — read-only check, no LLM, no push
10
+ // checkAgentEnrichmentGate — per-agent read-only check
11
+ // enrichSingleAgent — enriches one agent when workspace is already enriched
12
+ // enrichAgentConfig — raw LLM enrichment (also used by scan)
13
+ // buildAgentEnrichmentPrompt — prompt builder (also used by scan)
14
+ // readWorkspaceConfig — shared helper
15
+ // writeAgentConfigFile — shared helper
16
+ // buildConfigSchema — shared helper
17
+ import chalk from 'chalk';
18
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
19
+ import { resolve } from 'node:path';
20
+ import { parse, stringify } from 'yaml';
21
+ import { confirm } from '@inquirer/prompts';
22
+ import { validateWorkspaceConfig, } from '@nepopsx/core';
23
+ import { getAgentConfigPath } from '../agents/configuration.js';
24
+ import { loadLocalAgentConfig, pushRemoteAgentConfig, } from '../agents/remote-config.js';
25
+ import { loadCustomInstructions } from '../customs/instructions.js';
26
+ import { createEnrichmentMetadata, hashRecord, readLocalEnrichmentState, writeLocalEnrichmentState, } from './state.js';
27
+ import { downloadBootstrapConfig } from '../licensing/installer.js';
28
+ import { resolveScanConfig } from '../scan/config.js';
29
+ import { createProvider } from '../scan/llm/factory.js';
30
+ const WORKSPACE_CONFIG_PATH = '.nepopsx/workspace.yaml';
31
+ // ─── checkEnrichmentGate ─────────────────────────────────────
32
+ // Read-only check. Never runs LLM. Never pushes to backend.
33
+ export function checkEnrichmentGate(rootDir) {
34
+ const localState = readLocalEnrichmentState(rootDir);
35
+ const config = readWorkspaceConfig(rootDir);
36
+ const currentHash = hashRecord(config);
37
+ const workspaceEnrichment = localState.workspace;
38
+ if (!workspaceEnrichment || workspaceEnrichment.status !== 'enriched') {
39
+ return {
40
+ ready: false,
41
+ reason: 'Workspace has not been scanned yet. Run `nepopsx scan` first.',
42
+ localState,
43
+ config,
44
+ workspaceEnrichment: null,
45
+ };
46
+ }
47
+ if (workspaceEnrichment.configHash !== currentHash) {
48
+ return {
49
+ ready: false,
50
+ reason: 'Workspace config has changed since the last scan. Run `nepopsx scan` to re-enrich.',
51
+ localState,
52
+ config,
53
+ workspaceEnrichment,
54
+ };
55
+ }
56
+ return {
57
+ ready: true,
58
+ localState,
59
+ config,
60
+ workspaceEnrichment,
61
+ };
62
+ }
63
+ export function checkAgentEnrichmentGate(localState, agentName, currentConfig) {
64
+ const saved = localState.agents[agentName];
65
+ if (!saved || saved.status !== 'enriched') {
66
+ return {
67
+ ready: false,
68
+ reason: `Agent "${agentName}" has not been enriched yet.`,
69
+ };
70
+ }
71
+ const currentHash = hashRecord(currentConfig);
72
+ if (saved.configHash !== currentHash) {
73
+ return {
74
+ ready: false,
75
+ reason: `Agent "${agentName}" config has changed since last enrichment. Re-run scan.`,
76
+ };
77
+ }
78
+ return { ready: true, enrichment: saved };
79
+ }
80
+ // ─── enrichSingleAgent ──────────────────────────────────────
81
+ // Called by `install` when workspace is already enriched but
82
+ // the specific agent hasn't been enriched yet. Asks for user
83
+ // confirmation before the LLM call and before the backend push.
84
+ export async function enrichSingleAgent(rootDir, license, agentName, requestedVersion, workspaceConfig, localState, workspaceEnrichment, options) {
85
+ const customInstructions = loadCustomInstructions(resolve(rootDir, workspaceConfig.customs_dir ?? 'customs'));
86
+ const bootstrap = await downloadBootstrapConfig(rootDir, license, agentName, requestedVersion, customInstructions);
87
+ const currentConfig = loadLocalAgentConfig(rootDir, agentName, workspaceConfig.agents?.[agentName]) ?? bootstrap.config;
88
+ const currentHash = hashRecord(currentConfig);
89
+ const defaultHash = hashRecord(bootstrap.config);
90
+ console.log(chalk.bold.cyan(`\n🧠 Enriching ${agentName} config with LLM...\n`));
91
+ if (!options.yes) {
92
+ const proceed = await confirm({
93
+ message: `Enrich ${agentName} config using your LLM provider?`,
94
+ default: true,
95
+ });
96
+ if (!proceed) {
97
+ throw new Error('Agent enrichment cancelled by user.');
98
+ }
99
+ }
100
+ const resolvedScanConfig = await resolveScanConfig({ yes: true }, rootDir);
101
+ const provider = createProvider(resolvedScanConfig);
102
+ const providerRuntime = {
103
+ model: resolvedScanConfig.model,
104
+ providerName: provider.name,
105
+ chat: provider.chat.bind(provider),
106
+ };
107
+ console.log(chalk.dim(` Using ${providerRuntime.providerName} (${providerRuntime.model})...`));
108
+ const enrichedConfig = await enrichAgentConfig(agentName, workspaceConfig, currentConfig, bootstrap.package, customInstructions, providerRuntime);
109
+ const enrichedHash = hashRecord(enrichedConfig);
110
+ if (enrichedHash === currentHash && currentHash === defaultHash) {
111
+ throw new Error(`${agentName} config is still at its default shape after enrichment. Cannot proceed.`);
112
+ }
113
+ const configPath = getAgentConfigPath(agentName, workspaceConfig.agents?.[agentName]);
114
+ writeAgentConfigFile(rootDir, configPath, enrichedConfig);
115
+ const enrichment = createEnrichmentMetadata(enrichedConfig, 'llm', new Date().toISOString(), providerRuntime.model);
116
+ localState.agents[agentName] = enrichment;
117
+ writeLocalEnrichmentState(rootDir, localState);
118
+ console.log(chalk.green(` ✓ ${agentName} config enriched and saved locally.`));
119
+ // Backend push with confirmation
120
+ if (!options.yes) {
121
+ console.log(chalk.bold.cyan('\n📤 Push enriched agent config to backend?\n'));
122
+ console.log(` • ${chalk.bold(agentName)} ` +
123
+ chalk.dim(`(model: ${enrichment.model ?? 'n/a'}, hash: ${enrichment.configHash.slice(0, 8)}…)`));
124
+ const pushOk = await confirm({
125
+ message: 'Push to backend?',
126
+ default: true,
127
+ });
128
+ if (!pushOk) {
129
+ console.warn(chalk.yellow(' Push skipped. Local enrichment is saved — you can push later with `scan`.'));
130
+ return { config: enrichedConfig, enrichment };
131
+ }
132
+ }
133
+ await pushRemoteAgentConfig(rootDir, license.key, agentName, enrichedConfig, license.workspace, enrichment);
134
+ console.log(chalk.green(` ✓ ${agentName} config pushed to backend.\n`));
135
+ return { config: enrichedConfig, enrichment };
136
+ }
137
+ // ─── enrichAgentConfig (shared with scan) ────────────────────
138
+ export async function enrichAgentConfig(agentName, workspaceConfig, currentConfig, packageManifest, customInstructions, provider) {
139
+ const schema = buildConfigSchema(currentConfig);
140
+ const response = await provider.chat({
141
+ systemPrompt: 'You are a senior AI agent configuration architect. Return ONLY valid JSON matching the provided schema exactly. Preserve the config structure, remove generic placeholders when they do not fit the repo, and specialize the config to the actual workspace.',
142
+ userPrompt: buildAgentEnrichmentPrompt(agentName, workspaceConfig, currentConfig, packageManifest, customInstructions),
143
+ jsonSchema: schema,
144
+ maxTokens: 4000,
145
+ temperature: 0.2,
146
+ });
147
+ let parsed;
148
+ try {
149
+ parsed = JSON.parse(stripCodeFences(response.content));
150
+ }
151
+ catch (error) {
152
+ throw new Error(`Agent config enrichment for ${agentName} returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`);
153
+ }
154
+ if (!isRecord(parsed)) {
155
+ throw new Error(`Agent config enrichment for ${agentName} returned a non-object payload.`);
156
+ }
157
+ const merged = mergeObjects(currentConfig, parsed);
158
+ ensureServiceScope(merged, workspaceConfig);
159
+ return merged;
160
+ }
161
+ // ─── Prompt builder (shared with scan) ───────────────────────
162
+ export function buildAgentEnrichmentPrompt(agentName, workspaceConfig, currentConfig, packageManifest, customInstructions) {
163
+ const serviceSummary = workspaceConfig.services
164
+ .map((service) => {
165
+ const commandSummary = service.commands
166
+ ? Object.entries(service.commands)
167
+ .map(([name, value]) => `${name}: ${value}`)
168
+ .join(', ')
169
+ : 'no commands declared';
170
+ return `- ${service.name} (${service.language}${service.framework ? `/${service.framework}` : ''}) at ${service.path}; maturity=${service.maturity}; port=${service.port ?? 'n/a'}; commands=${commandSummary}`;
171
+ })
172
+ .join('\n');
173
+ const customBlock = customInstructions.length === 0
174
+ ? 'None'
175
+ : customInstructions
176
+ .map((instruction) => {
177
+ const scope = instruction.scope ? ` scope=${instruction.scope}` : '';
178
+ const source = instruction.source ? ` source=${instruction.source}` : '';
179
+ return `- ${instruction.content}${scope}${source}`;
180
+ })
181
+ .join('\n');
182
+ return [
183
+ `Enrich the ${agentName} configuration for this workspace.`,
184
+ 'Goal: produce a repo-specific config, not a default starter config.',
185
+ 'Rules:',
186
+ '- Keep the same object shape and key structure as the current config.',
187
+ '- Use the actual workspace services, commands, maturity, ports, and conventions.',
188
+ '- Remove or replace generic placeholders when they are not justified by the workspace.',
189
+ '- Do not invent secrets, credentials, URLs, or commands that are not supported by the workspace context.',
190
+ '- If you cannot infer a field confidently, keep the current value rather than making up data.',
191
+ '- Prefer explicit scope.services over an empty list when the workspace already names services.',
192
+ '',
193
+ 'Workspace config:',
194
+ '```yaml',
195
+ stringify(workspaceConfig, { lineWidth: 120 }).trimEnd(),
196
+ '```',
197
+ '',
198
+ 'Service summary:',
199
+ serviceSummary,
200
+ '',
201
+ 'Package manifest:',
202
+ '```json',
203
+ JSON.stringify(packageManifest, null, 2),
204
+ '```',
205
+ '',
206
+ 'Current config:',
207
+ '```json',
208
+ JSON.stringify(currentConfig, null, 2),
209
+ '```',
210
+ '',
211
+ 'Active custom instructions:',
212
+ customBlock,
213
+ '',
214
+ 'Return the FULL enriched config as JSON only.',
215
+ ].join('\n');
216
+ }
217
+ // ─── Shared helpers ──────────────────────────────────────────
218
+ export function readWorkspaceConfig(rootDir) {
219
+ const configPath = resolve(rootDir, WORKSPACE_CONFIG_PATH);
220
+ const raw = parse(readFileSync(configPath, 'utf-8'));
221
+ const validation = validateWorkspaceConfig(raw);
222
+ if (!validation.valid || !validation.config) {
223
+ throw new Error(`Workspace config is invalid: ${validation.errors.join('; ')}`);
224
+ }
225
+ return validation.config;
226
+ }
227
+ export function writeAgentConfigFile(rootDir, relativePath, config) {
228
+ const filePath = resolve(rootDir, relativePath);
229
+ const dirPath = resolve(filePath, '..');
230
+ if (!existsSync(dirPath)) {
231
+ mkdirSync(dirPath, { recursive: true });
232
+ }
233
+ writeFileSync(filePath, stringify(config, { lineWidth: 120 }).trimEnd() + '\n', 'utf-8');
234
+ }
235
+ export function buildConfigSchema(sample) {
236
+ return {
237
+ $schema: 'http://json-schema.org/draft-07/schema#',
238
+ ...schemaFromValue(sample),
239
+ };
240
+ }
241
+ // ─── Internal helpers ────────────────────────────────────────
242
+ function isRecord(value) {
243
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
244
+ }
245
+ function stripCodeFences(content) {
246
+ return content.replace(/^```(?:json)?\s*/i, '').replace(/\s*```$/, '').trim();
247
+ }
248
+ function schemaFromValue(value) {
249
+ if (Array.isArray(value)) {
250
+ return {
251
+ type: 'array',
252
+ items: value.length > 0 ? schemaFromValue(value[0]) : {},
253
+ };
254
+ }
255
+ if (typeof value === 'string') {
256
+ return { type: 'string' };
257
+ }
258
+ if (typeof value === 'number') {
259
+ return { type: Number.isInteger(value) ? 'integer' : 'number' };
260
+ }
261
+ if (typeof value === 'boolean') {
262
+ return { type: 'boolean' };
263
+ }
264
+ if (!isRecord(value)) {
265
+ return {};
266
+ }
267
+ const properties = {};
268
+ const required = [];
269
+ for (const [key, nestedValue] of Object.entries(value)) {
270
+ properties[key] = schemaFromValue(nestedValue);
271
+ required.push(key);
272
+ }
273
+ return {
274
+ type: 'object',
275
+ additionalProperties: false,
276
+ properties,
277
+ required,
278
+ };
279
+ }
280
+ function mergeObjects(base, override) {
281
+ const merged = { ...base };
282
+ for (const [key, value] of Object.entries(override)) {
283
+ if (isRecord(value) && isRecord(merged[key])) {
284
+ merged[key] = mergeObjects(merged[key], value);
285
+ continue;
286
+ }
287
+ merged[key] = value;
288
+ }
289
+ return merged;
290
+ }
291
+ function ensureServiceScope(config, workspaceConfig) {
292
+ const scope = isRecord(config.scope) ? config.scope : null;
293
+ if (!scope) {
294
+ return;
295
+ }
296
+ const services = Array.isArray(scope.services)
297
+ ? scope.services.filter((service) => typeof service === 'string' && service.length > 0)
298
+ : [];
299
+ if (services.length > 0 || workspaceConfig.services.length === 0) {
300
+ return;
301
+ }
302
+ scope.services = workspaceConfig.services.map((service) => service.name);
303
+ config.scope = scope;
304
+ }
305
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/enrichment/workflow.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,12 @@
2
2
  * Builtin templates that are generated for every workspace regardless of agents.
3
3
  * These provide the base workspace context files.
4
4
  */
5
+ import type { WorkspaceConfig } from '@nepopsx/core';
5
6
  interface BuiltinTemplate {
6
7
  outputPath: string;
7
8
  template: string;
8
9
  source: string;
9
10
  }
10
- export declare function getBuiltinTemplates(): BuiltinTemplate[];
11
+ export declare function getBuiltinTemplates(config?: WorkspaceConfig): BuiltinTemplate[];
11
12
  export {};
12
13
  //# sourceMappingURL=builtin-templates.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"builtin-templates.d.ts","sourceRoot":"","sources":["../../src/generator/builtin-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,eAAe,EAAE,CAuC/E"}
@@ -2,8 +2,8 @@
2
2
  * Builtin templates that are generated for every workspace regardless of agents.
3
3
  * These provide the base workspace context files.
4
4
  */
5
- export function getBuiltinTemplates() {
6
- return [
5
+ export function getBuiltinTemplates(config) {
6
+ const templates = [
7
7
  {
8
8
  outputPath: '.github/copilot-instructions.md',
9
9
  template: COPILOT_INSTRUCTIONS_TEMPLATE,
@@ -14,12 +14,31 @@ export function getBuiltinTemplates() {
14
14
  template: AGENTS_MD_TEMPLATE,
15
15
  source: 'builtin:agents-md',
16
16
  },
17
+ {
18
+ outputPath: 'CLAUDE.md',
19
+ template: CLAUDE_MD_TEMPLATE,
20
+ source: 'builtin:claude-md',
21
+ },
17
22
  {
18
23
  outputPath: 'Makefile',
19
24
  template: MAKEFILE_TEMPLATE,
20
25
  source: 'builtin:makefile',
21
26
  },
22
27
  ];
28
+ // Per-language instruction files (only for languages present in workspace)
29
+ if (config?.services) {
30
+ const languages = new Set(config.services.map((s) => s.language));
31
+ for (const [lang, tpl] of Object.entries(LANGUAGE_INSTRUCTIONS)) {
32
+ if (languages.has(lang)) {
33
+ templates.push({
34
+ outputPath: `.github/instructions/${lang}.instructions.md`,
35
+ template: tpl,
36
+ source: `builtin:instructions-${lang}`,
37
+ });
38
+ }
39
+ }
40
+ }
41
+ return templates;
23
42
  }
24
43
  // ─── copilot-instructions.md ────────────────────────────────
25
44
  const COPILOT_INSTRUCTIONS_TEMPLATE = `# {{config.workspace.name}} — Copilot Instructions
@@ -41,6 +60,12 @@ const COPILOT_INSTRUCTIONS_TEMPLATE = `# {{config.workspace.name}} — Copilot I
41
60
  | {{name}} | {{language}} | {{#if framework}}{{framework}}{{else}}—{{/if}} | \`{{path}}/\` | {{maturityBadge maturity}} |
42
61
  {{/each}}
43
62
 
63
+ {{#each config.services}}
64
+ {{#if description}}
65
+ **{{name}}**: {{description}}{{#if databases}} Uses: {{#each databases}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}.{{/if}}
66
+ {{/if}}
67
+ {{/each}}
68
+
44
69
  {{#if config.execution_order}}
45
70
  ### Multi-Service Change Order
46
71
 
@@ -138,6 +163,16 @@ const AGENTS_MD_TEMPLATE = `# AI Agent Instructions — {{config.workspace.name}
138
163
  | {{name}} | {{language}} | {{#if framework}}{{framework}}{{else}}—{{/if}} | \`{{path}}/\` | {{#if port}}{{port}}{{else}}—{{/if}} | {{maturityBadge maturity}} |
139
164
  {{/each}}
140
165
 
166
+ {{#each config.services}}
167
+ {{#if description}}
168
+ ### {{name}}
169
+
170
+ {{description}}{{#if databases}}
171
+
172
+ **Databases:** {{#each databases}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}{{/if}}
173
+ {{/if}}
174
+ {{/each}}
175
+
141
176
  ## Common Commands
142
177
 
143
178
  {{#each config.services}}
@@ -161,6 +196,22 @@ cd {{path}}
161
196
  # Lint
162
197
  {{commands.lint}}
163
198
  {{/if}}
199
+ {{#if commands.format}}
200
+ # Format
201
+ {{commands.format}}
202
+ {{/if}}
203
+ {{#if commands.typecheck}}
204
+ # Typecheck
205
+ {{commands.typecheck}}
206
+ {{/if}}
207
+ {{#if commands.migrate}}
208
+ # Migrate
209
+ {{commands.migrate}}
210
+ {{/if}}
211
+ {{#if commands.seed}}
212
+ # Seed
213
+ {{commands.seed}}
214
+ {{/if}}
164
215
  \`\`\`
165
216
 
166
217
  {{/each}}
@@ -248,4 +299,112 @@ env-state: ## Check service ports
248
299
  {{/if}}
249
300
  {{/each}}
250
301
  `;
302
+ // ─── CLAUDE.md ──────────────────────────────────────────────
303
+ const CLAUDE_MD_TEMPLATE = `# CLAUDE.md — {{config.workspace.name}}
304
+
305
+ <!-- Auto-generated by NEPOPSX CLI ({{timestamp}}). Do not edit manually. -->
306
+ <!-- Regenerate with: npx @nepopsx/cli sync -->
307
+
308
+ @.github/copilot-instructions.md
309
+ @AGENTS.md
310
+
311
+ {{#if config.workspace.description}}
312
+ ## Overview
313
+
314
+ {{config.workspace.description}}
315
+ {{/if}}
316
+
317
+ ## Services
318
+
319
+ {{#each config.services}}
320
+ ### {{name}} ({{language}}{{#if framework}}/{{framework}}{{/if}}) — \`{{path}}/\`
321
+
322
+ {{#if description}}{{description}}{{/if}}
323
+
324
+ {{#if commands.dev}}Dev: \`cd {{path}} && {{commands.dev}}\`{{/if}}
325
+ {{#if commands.build}}Build: \`cd {{path}} && {{commands.build}}\`{{/if}}
326
+ {{#if commands.test}}Test: \`cd {{path}} && {{commands.test}}\`{{/if}}
327
+ {{#if commands.lint}}Lint: \`cd {{path}} && {{commands.lint}}\`{{/if}}
328
+ {{#if commands.typecheck}}Typecheck: \`cd {{path}} && {{commands.typecheck}}\`{{/if}}
329
+ {{#if commands.migrate}}Migrate: \`cd {{path}} && {{commands.migrate}}\`{{/if}}
330
+
331
+ {{/each}}
332
+
333
+ {{#if config.databases}}
334
+ ## Databases
335
+
336
+ {{#each config.databases}}
337
+ - **{{name}}** ({{type}}){{#if description}} — {{description}}{{/if}}
338
+ {{/each}}
339
+ {{/if}}
340
+
341
+ {{#if config.execution_order}}
342
+ ## Change Order
343
+
344
+ Modify services in this order: {{join config.execution_order " → "}}
345
+ {{/if}}
346
+ `;
347
+ // ─── Per-language instruction templates ─────────────────────
348
+ /* eslint-disable no-useless-escape */
349
+ function langTemplate(applyTo, lang, standards) {
350
+ return [
351
+ '---',
352
+ `applyTo: "${applyTo}"`,
353
+ '---',
354
+ `# ${lang} Instructions — {{config.workspace.name}}`,
355
+ '',
356
+ '<!-- Auto-generated by NEPOPSX CLI. Regenerate with: npx @nepopsx/cli sync -->',
357
+ '',
358
+ `## ${lang} Services`,
359
+ '',
360
+ `{{#servicesByLang config.services "${lang.toLowerCase()}"}}`,
361
+ '### {{name}}{{#if framework}} ({{framework}}){{/if}}',
362
+ '',
363
+ '{{#if description}}{{description}}{{/if}}',
364
+ '- Path: `{{path}}/`',
365
+ '{{#if commands.build}}- Build: `cd {{path}} && {{commands.build}}`{{/if}}',
366
+ '{{#if commands.test}}- Test: `cd {{path}} && {{commands.test}}`{{/if}}',
367
+ '{{#if commands.lint}}- Lint: `cd {{path}} && {{commands.lint}}`{{/if}}',
368
+ '{{#if commands.typecheck}}- Typecheck: `cd {{path}} && {{commands.typecheck}}`{{/if}}',
369
+ '{{#if commands.format}}- Format: `cd {{path}} && {{commands.format}}`{{/if}}',
370
+ '',
371
+ '{{/servicesByLang}}',
372
+ '',
373
+ '## Standards',
374
+ '',
375
+ standards,
376
+ ].join('\n');
377
+ }
378
+ const LANGUAGE_INSTRUCTIONS = {
379
+ typescript: langTemplate('**/*.ts,**/*.tsx', 'TypeScript', [
380
+ '- Strict TypeScript — explicit return types on exported functions',
381
+ '- Prefer `unknown` over `any`, narrow with type guards',
382
+ '- Use path aliases where configured (e.g., `@/`)',
383
+ '- Named exports only (no default exports)',
384
+ '- Functional patterns, const assertions, immutable by default',
385
+ ].join('\n')),
386
+ python: langTemplate('**/*.py', 'Python', [
387
+ '- Type hints on all public functions and methods',
388
+ '- Follow PEP 8, use project formatter (Black/Ruff)',
389
+ '- Prefer dataclasses or Pydantic models over raw dicts',
390
+ '- Use `pathlib.Path` over string paths',
391
+ ].join('\n')),
392
+ go: langTemplate('**/*.go', 'Go', [
393
+ '- Standard project layout: `cmd/`, `internal/`, `pkg/`',
394
+ '- Wrap errors with context (`fmt.Errorf("...: %w", err)`)',
395
+ '- Return errors, don\'t panic',
396
+ '- Table-driven tests',
397
+ '- Use `gofmt` / `goimports` before commit',
398
+ ].join('\n')),
399
+ java: langTemplate('**/*.java,**/*.kt', 'Java', [
400
+ '- Follow framework conventions (Spring Boot, etc.)',
401
+ '- Use dependency injection',
402
+ '- Prefer immutable types where possible',
403
+ ].join('\n')),
404
+ rust: langTemplate('**/*.rs', 'Rust', [
405
+ '- Use clippy for linting: `cargo clippy`',
406
+ '- Prefer `Result` over `unwrap()`/`expect()` in library code',
407
+ '- Use `thiserror` for error types',
408
+ ].join('\n')),
409
+ };
251
410
  //# sourceMappingURL=builtin-templates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-templates.js","sourceRoot":"","sources":["../../src/generator/builtin-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL;YACE,UAAU,EAAE,iCAAiC;YAC7C,QAAQ,EAAE,6BAA6B;YACvC,MAAM,EAAE,8BAA8B;SACvC;QACD;YACE,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE,kBAAkB;YAC5B,MAAM,EAAE,mBAAmB;SAC5B;QACD;YACE,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,iBAAiB;YAC3B,MAAM,EAAE,kBAAkB;SAC3B;KACF,CAAC;AACJ,CAAC;AAED,+DAA+D;AAE/D,MAAM,6BAA6B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsGrC,CAAC;AAEF,+DAA+D;AAE/D,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgE1B,CAAC;AAEF,+DAA+D;AAE/D,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDzB,CAAC"}
1
+ {"version":3,"file":"builtin-templates.js","sourceRoot":"","sources":["../../src/generator/builtin-templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Package renderer — maps already-rendered agent bundles into WriteOperations.
3
+ *
4
+ * Two rendering modes:
5
+ * renderBundleForInstall — all files land under .github/ (preserves bundle layout)
6
+ * renderAgentBundle — remaps schemas to openspec/ (used by sync)
7
+ *
8
+ * Backend bundles are already rendered server-side. The CLI only remaps paths.
9
+ */
10
+ import type { TemplateBundle } from '../licensing/index.js';
11
+ import type { WriteOperation } from './writer.js';
12
+ /**
13
+ * Render a downloaded agent bundle for `nepopsx install`.
14
+ *
15
+ * All files are written under `.github/<relativePath>` with .hbs stripped.
16
+ * This preserves the bundle's directory layout (agents/, prompts/, schemas/,
17
+ * partials/) exactly as the agent author designed.
18
+ *
19
+ * Decrypted .hbs source is kept in memory only — never touches disk.
20
+ */
21
+ export declare function renderBundleForInstall(bundle: TemplateBundle): WriteOperation[];
22
+ /**
23
+ * Render all templates from an agent bundle for `nepopsx sync`.
24
+ *
25
+ * Uses prefix-based remapping so schemas land in openspec/ and
26
+ * generated agent/prompt files land under .github/.
27
+ */
28
+ export declare function renderAgentBundle(bundle: TemplateBundle): WriteOperation[];
29
+ //# sourceMappingURL=package-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-renderer.d.ts","sourceRoot":"","sources":["../../src/generator/package-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,GACrB,cAAc,EAAE,CAqBlB;AAID;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,GACrB,cAAc,EAAE,CAmElB"}