@nepopsx/cli 0.0.18 → 0.0.20

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 (129) hide show
  1. package/dist/agents/catalog.d.ts +19 -0
  2. package/dist/agents/catalog.d.ts.map +1 -0
  3. package/dist/agents/catalog.js +45 -0
  4. package/dist/agents/catalog.js.map +1 -0
  5. package/dist/agents/configuration.d.ts +1 -0
  6. package/dist/agents/configuration.d.ts.map +1 -1
  7. package/dist/agents/configuration.js +36 -0
  8. package/dist/agents/configuration.js.map +1 -1
  9. package/dist/agents/configuration.test.d.ts +2 -0
  10. package/dist/agents/configuration.test.d.ts.map +1 -0
  11. package/dist/agents/configuration.test.js +32 -0
  12. package/dist/agents/configuration.test.js.map +1 -0
  13. package/dist/commands/capture.d.ts +19 -0
  14. package/dist/commands/capture.d.ts.map +1 -0
  15. package/dist/commands/capture.js +105 -0
  16. package/dist/commands/capture.js.map +1 -0
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +11 -30
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/install.d.ts +2 -0
  21. package/dist/commands/install.d.ts.map +1 -1
  22. package/dist/commands/install.js +86 -15
  23. package/dist/commands/install.js.map +1 -1
  24. package/dist/commands/login.d.ts +8 -1
  25. package/dist/commands/login.d.ts.map +1 -1
  26. package/dist/commands/login.js +169 -80
  27. package/dist/commands/login.js.map +1 -1
  28. package/dist/commands/push-learnings.d.ts.map +1 -1
  29. package/dist/commands/push-learnings.js +93 -62
  30. package/dist/commands/push-learnings.js.map +1 -1
  31. package/dist/commands/sync.d.ts +4 -0
  32. package/dist/commands/sync.d.ts.map +1 -1
  33. package/dist/commands/sync.js +120 -64
  34. package/dist/commands/sync.js.map +1 -1
  35. package/dist/commands/up.d.ts +23 -0
  36. package/dist/commands/up.d.ts.map +1 -0
  37. package/dist/commands/up.js +263 -0
  38. package/dist/commands/up.js.map +1 -0
  39. package/dist/enrichment/workflow.d.ts +1 -0
  40. package/dist/enrichment/workflow.d.ts.map +1 -1
  41. package/dist/enrichment/workflow.js +13 -0
  42. package/dist/enrichment/workflow.js.map +1 -1
  43. package/dist/generator/preview.d.ts +13 -0
  44. package/dist/generator/preview.d.ts.map +1 -0
  45. package/dist/generator/preview.js +242 -0
  46. package/dist/generator/preview.js.map +1 -0
  47. package/dist/generator/preview.test.d.ts +19 -0
  48. package/dist/generator/preview.test.d.ts.map +1 -0
  49. package/dist/generator/preview.test.js +289 -0
  50. package/dist/generator/preview.test.js.map +1 -0
  51. package/dist/generator/render.d.ts +2 -2
  52. package/dist/generator/render.d.ts.map +1 -1
  53. package/dist/generator/render.js +37 -18
  54. package/dist/generator/render.js.map +1 -1
  55. package/dist/generator/writer.d.ts +15 -1
  56. package/dist/generator/writer.d.ts.map +1 -1
  57. package/dist/generator/writer.js +41 -3
  58. package/dist/generator/writer.js.map +1 -1
  59. package/dist/hooks/capture-hooks.d.ts +9 -0
  60. package/dist/hooks/capture-hooks.d.ts.map +1 -0
  61. package/dist/hooks/capture-hooks.js +100 -0
  62. package/dist/hooks/capture-hooks.js.map +1 -0
  63. package/dist/hooks/capture-hooks.test.d.ts +2 -0
  64. package/dist/hooks/capture-hooks.test.d.ts.map +1 -0
  65. package/dist/hooks/capture-hooks.test.js +50 -0
  66. package/dist/hooks/capture-hooks.test.js.map +1 -0
  67. package/dist/index.js +27 -4
  68. package/dist/index.js.map +1 -1
  69. package/dist/learnings/yaml-learnings.d.ts +16 -2
  70. package/dist/learnings/yaml-learnings.d.ts.map +1 -1
  71. package/dist/learnings/yaml-learnings.js +43 -8
  72. package/dist/learnings/yaml-learnings.js.map +1 -1
  73. package/dist/learnings/yaml-learnings.test.d.ts +2 -0
  74. package/dist/learnings/yaml-learnings.test.d.ts.map +1 -0
  75. package/dist/learnings/yaml-learnings.test.js +39 -0
  76. package/dist/learnings/yaml-learnings.test.js.map +1 -0
  77. package/dist/licensing/installer.d.ts +2 -2
  78. package/dist/licensing/installer.d.ts.map +1 -1
  79. package/dist/licensing/installer.js +3 -1
  80. package/dist/licensing/installer.js.map +1 -1
  81. package/dist/licensing/template-fetch.d.ts +2 -2
  82. package/dist/licensing/template-fetch.d.ts.map +1 -1
  83. package/dist/licensing/template-fetch.js +4 -1
  84. package/dist/licensing/template-fetch.js.map +1 -1
  85. package/dist/mcp/config-generator.d.ts +42 -0
  86. package/dist/mcp/config-generator.d.ts.map +1 -0
  87. package/dist/mcp/config-generator.js +55 -0
  88. package/dist/mcp/config-generator.js.map +1 -0
  89. package/dist/mcp/config-generator.test.d.ts +7 -0
  90. package/dist/mcp/config-generator.test.d.ts.map +1 -0
  91. package/dist/mcp/config-generator.test.js +79 -0
  92. package/dist/mcp/config-generator.test.js.map +1 -0
  93. package/dist/ruflo/config-generator.d.ts +22 -0
  94. package/dist/ruflo/config-generator.d.ts.map +1 -0
  95. package/dist/ruflo/config-generator.js +89 -0
  96. package/dist/ruflo/config-generator.js.map +1 -0
  97. package/dist/ruflo/config-generator.test.d.ts +2 -0
  98. package/dist/ruflo/config-generator.test.d.ts.map +1 -0
  99. package/dist/ruflo/config-generator.test.js +18 -0
  100. package/dist/ruflo/config-generator.test.js.map +1 -0
  101. package/dist/ruflo/detect.d.ts +11 -0
  102. package/dist/ruflo/detect.d.ts.map +1 -0
  103. package/dist/ruflo/detect.js +30 -0
  104. package/dist/ruflo/detect.js.map +1 -0
  105. package/dist/ruflo/index.d.ts +3 -0
  106. package/dist/ruflo/index.d.ts.map +1 -0
  107. package/dist/ruflo/index.js +3 -0
  108. package/dist/ruflo/index.js.map +1 -0
  109. package/dist/security/index.d.ts +1 -1
  110. package/dist/security/index.d.ts.map +1 -1
  111. package/dist/security/index.js +1 -1
  112. package/dist/security/index.js.map +1 -1
  113. package/dist/security/integrity.d.ts +8 -0
  114. package/dist/security/integrity.d.ts.map +1 -1
  115. package/dist/security/integrity.js +28 -0
  116. package/dist/security/integrity.js.map +1 -1
  117. package/package.json +5 -3
  118. package/dist/generator/package-renderer.d.ts +0 -38
  119. package/dist/generator/package-renderer.d.ts.map +0 -1
  120. package/dist/generator/package-renderer.js +0 -181
  121. package/dist/generator/package-renderer.js.map +0 -1
  122. package/dist/generator/provider-transform.d.ts +0 -15
  123. package/dist/generator/provider-transform.d.ts.map +0 -1
  124. package/dist/generator/provider-transform.js +0 -163
  125. package/dist/generator/provider-transform.js.map +0 -1
  126. package/dist/licensing/fingerprint.test.d.ts +0 -2
  127. package/dist/licensing/fingerprint.test.d.ts.map +0 -1
  128. package/dist/licensing/fingerprint.test.js +0 -41
  129. package/dist/licensing/fingerprint.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"push-learnings.d.ts","sourceRoot":"","sources":["../../src/commands/push-learnings.ts"],"names":[],"mappings":"AAUA,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAeD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyJvF"}
1
+ {"version":3,"file":"push-learnings.d.ts","sourceRoot":"","sources":["../../src/commands/push-learnings.ts"],"names":[],"mappings":"AAUA,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAeD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAiOf"}
@@ -1,12 +1,12 @@
1
- import { existsSync, readFileSync, readdirSync } from 'node:fs';
2
- import { resolve, basename } from 'node:path';
3
- import { parse as parseYaml } from 'yaml';
4
- import chalk from 'chalk';
5
- import { resolveApiBase } from '../config/api-config.js';
6
- import { readLicense, isDevMode } from '../licensing/index.js';
7
- import { fetchWithTimeout } from '../utils/fetch.js';
8
- import { DOWNLOAD_TIMEOUT_MS } from '../constants.js';
9
- import { loadYamlLearnings } from '../learnings/yaml-learnings.js';
1
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
2
+ import { resolve, basename } from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ import chalk from "chalk";
5
+ import { resolveApiBase } from "../config/api-config.js";
6
+ import { readLicense, isDevMode } from "../licensing/index.js";
7
+ import { fetchWithTimeout } from "../utils/fetch.js";
8
+ import { DOWNLOAD_TIMEOUT_MS } from "../constants.js";
9
+ import { loadLearningFiles, setLearningStatus } from "../learnings/yaml-learnings.js";
10
10
  /**
11
11
  * Collect learnings from local `customs/auto/*.md` files and
12
12
  * `customs/auto/config-suggestion-*.md` files, then push them
@@ -16,39 +16,50 @@ export async function pushLearningsCommand(options) {
16
16
  const cwd = process.cwd();
17
17
  const configPath = resolve(cwd, options.config);
18
18
  const devMode = isDevMode();
19
- console.log(chalk.bold.cyan('\n📤 NEPOPSX Push Learnings\n'));
19
+ console.log(chalk.bold.cyan("\n📤 NEPOPSX Push Learnings\n"));
20
20
  if (devMode) {
21
- console.warn(chalk.yellow(' [dev mode — license checks bypassed]\n'));
21
+ console.warn(chalk.yellow(" [dev mode — license checks bypassed]\n"));
22
22
  }
23
23
  // Read workspace config to determine customs_dir and agents
24
24
  let config = {};
25
25
  if (existsSync(configPath)) {
26
- const raw = parseYaml(readFileSync(configPath, 'utf-8'));
27
- if (typeof raw === 'object' && raw !== null) {
26
+ const raw = parseYaml(readFileSync(configPath, "utf-8"));
27
+ if (typeof raw === "object" && raw !== null) {
28
28
  config = raw;
29
29
  }
30
30
  }
31
- const customsDir = resolve(cwd, config.customs_dir ?? 'customs');
32
- const autoDir = resolve(customsDir, 'auto');
33
- const learningFormat = config.learning_format ?? 'yaml';
34
- const learningsDir = resolve(cwd, config.learnings_dir ?? '.nepopsx/learnings');
31
+ const customsDir = resolve(cwd, config.customs_dir ?? "customs");
32
+ const autoDir = resolve(customsDir, "auto");
33
+ const learningFormat = config.learning_format ?? "yaml";
34
+ const learningsDir = resolve(cwd, config.learnings_dir ?? ".nepopsx/learnings");
35
35
  // Collect local learnings from both YAML (v2) and markdown (legacy) sources
36
36
  let learnings = [];
37
- if (learningFormat === 'yaml') {
38
- // Primary: YAML learning files
39
- const yamlLearnings = loadYamlLearnings(learningsDir, options.agent);
40
- learnings = yamlLearnings.map((yl) => ({
41
- type: yl.type,
42
- confidence: yl.confidence,
43
- slug: yl.slug,
44
- title: yl.slug.replace(/-/g, ' '),
45
- content: yl.content,
46
- agent: yl.agent,
47
- applies_to: yl.applies_to,
48
- evidence: Array.isArray(yl.evidence) ? yl.evidence.join('\n') : yl.evidence,
49
- config_path: yl.config_path,
50
- config_value: yl.config_value,
51
- }));
37
+ // slug source file, for YAML learnings, so we can stamp the server's verdict
38
+ // back onto the file after a successful push (idempotency).
39
+ const fileBySlug = new Map();
40
+ if (learningFormat === "yaml") {
41
+ // Primary: YAML learning files. Only push `status: local` (locally authored,
42
+ // not yet synced) — already-pushed learnings are skipped so re-running this
43
+ // command is idempotent and never inflates the backend's occurrence counts.
44
+ for (const { learning: yl, filePath } of loadLearningFiles(learningsDir, options.agent)) {
45
+ if (yl.status !== "local")
46
+ continue;
47
+ fileBySlug.set(yl.slug, filePath);
48
+ learnings.push({
49
+ type: yl.type,
50
+ confidence: yl.confidence,
51
+ slug: yl.slug,
52
+ title: yl.slug.replace(/-/g, " "),
53
+ content: yl.content,
54
+ agent: yl.agent,
55
+ applies_to: yl.applies_to,
56
+ evidence: Array.isArray(yl.evidence)
57
+ ? yl.evidence.join("\n")
58
+ : yl.evidence,
59
+ config_path: yl.config_path,
60
+ config_value: yl.config_value,
61
+ });
62
+ }
52
63
  // Also scan legacy directory for migration period
53
64
  const legacyLearnings = collectLocalLearnings(autoDir, options.agent);
54
65
  const yamlSlugs = new Set(learnings.map((l) => l.slug));
@@ -63,37 +74,40 @@ export async function pushLearningsCommand(options) {
63
74
  learnings = collectLocalLearnings(autoDir, options.agent);
64
75
  }
65
76
  if (learnings.length === 0) {
66
- console.log(chalk.dim(` No learnings found${learningFormat === 'yaml' ? ` in ${learningsDir}` : ' in customs/auto/'}.`));
67
- console.log(chalk.dim(' Run an agent with reflection enabled to generate learnings.\n'));
77
+ console.log(chalk.dim(` No new learnings to push${learningFormat === "yaml" ? ` in ${learningsDir}` : " in customs/auto/"}.`));
78
+ console.log(chalk.dim(" Already-synced learnings are skipped; run an agent with reflection enabled to capture new ones.\n"));
68
79
  return;
69
80
  }
70
- const sourceLabel = learningFormat === 'yaml' ? '.nepopsx/learnings/' : 'customs/auto/';
81
+ const sourceLabel = learningFormat === "yaml" ? ".nepopsx/learnings/" : "customs/auto/";
71
82
  console.log(chalk.dim(` Found ${learnings.length} learning(s) from ${sourceLabel}`));
72
83
  for (const l of learnings) {
73
- const badge = l.type === 'config_patch' ? '🔧' : l.type === 'skill' ? '📚' : '📝';
74
- console.log(chalk.dim(` ${badge} [${l.confidence}] ${l.slug} (${l.agent || 'unknown'})`));
84
+ const badge = l.type === "config_patch" ? "🔧" : l.type === "skill" ? "📚" : "📝";
85
+ console.log(chalk.dim(` ${badge} [${l.confidence}] ${l.slug} (${l.agent || "unknown"})`));
75
86
  }
76
87
  // Confirmation unless --yes
77
88
  if (!options.yes) {
78
- const readline = await import('node:readline');
79
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
89
+ const readline = await import("node:readline");
90
+ const rl = readline.createInterface({
91
+ input: process.stdin,
92
+ output: process.stdout,
93
+ });
80
94
  const answer = await new Promise((resolve) => {
81
95
  rl.question(chalk.yellow(`\n Push ${learnings.length} learning(s) to the platform? [y/N] `), resolve);
82
96
  });
83
97
  rl.close();
84
- if (answer.toLowerCase() !== 'y') {
85
- console.log(chalk.dim('\n Cancelled.\n'));
98
+ if (answer.toLowerCase() !== "y") {
99
+ console.log(chalk.dim("\n Cancelled.\n"));
86
100
  return;
87
101
  }
88
102
  }
89
103
  // Read license
90
104
  const license = readLicense(cwd);
91
105
  if (!license && !devMode) {
92
- console.error(chalk.red('\n No license found. Run nepopsx activate first.\n'));
106
+ console.error(chalk.red("\n No license found. Run nepopsx activate first.\n"));
93
107
  process.exit(1);
94
108
  }
95
109
  if (!license) {
96
- console.error(chalk.red('\n No license found even in dev mode.\n'));
110
+ console.error(chalk.red("\n No license found even in dev mode.\n"));
97
111
  process.exit(1);
98
112
  }
99
113
  // Push to backend
@@ -101,10 +115,10 @@ export async function pushLearningsCommand(options) {
101
115
  const workspace = options.workspace ?? license.workspace;
102
116
  console.log(chalk.dim(`\n Pushing to ${apiBase}/learnings...`));
103
117
  const response = await fetchWithTimeout(`${apiBase}/learnings`, {
104
- method: 'POST',
118
+ method: "POST",
105
119
  headers: {
106
120
  Authorization: `Bearer ${license.key}`,
107
- 'Content-Type': 'application/json',
121
+ "Content-Type": "application/json",
108
122
  },
109
123
  body: JSON.stringify({
110
124
  workspace,
@@ -123,19 +137,34 @@ export async function pushLearningsCommand(options) {
123
137
  }),
124
138
  }, DOWNLOAD_TIMEOUT_MS);
125
139
  if (!response.ok) {
126
- const body = await response.text().catch(() => '');
140
+ const body = await response.text().catch(() => "");
127
141
  console.error(chalk.red(`\n Backend returned ${response.status}: ${body}`));
128
142
  process.exit(1);
129
143
  }
130
- const result = await response.json();
144
+ const result = (await response.json());
131
145
  console.log(chalk.bold.green(`\n ✅ Pushed ${result.received} learning(s)`));
132
146
  console.log(chalk.dim(` Auto-applied: ${result.auto_applied}`));
133
- console.log(chalk.dim(` Suggested: ${result.suggested}`));
147
+ console.log(chalk.dim(` Pending review: ${result.pending}`));
134
148
  for (const r of result.results) {
135
- const icon = r.status === 'approved' ? '✅' : r.status === 'suggested' ? '💡' : '⏳';
149
+ const icon = r.status === "approved"
150
+ ? "✅"
151
+ : r.status === "pending"
152
+ ? "⏳"
153
+ : r.status === "suggested"
154
+ ? "💡"
155
+ : "❓";
136
156
  console.log(chalk.dim(` ${icon} ${r.slug} → ${r.status} (seen ${r.occurrences}×)`));
137
157
  }
138
- console.log(chalk.dim(`\n Teammates can pull these via: ${chalk.cyan('nepopsx sync --remote')}\n`));
158
+ // Stamp the server's verdict back onto each locally-authored YAML learning so
159
+ // it is no longer `status: local` and won't be re-pushed next run.
160
+ const SYNCED_STATUSES = new Set(["approved", "pending", "suggested", "reverted"]);
161
+ for (const r of result.results) {
162
+ const filePath = fileBySlug.get(r.slug);
163
+ if (filePath && SYNCED_STATUSES.has(r.status)) {
164
+ setLearningStatus(filePath, r.status);
165
+ }
166
+ }
167
+ console.log(chalk.dim(`\n Teammates can pull these via: ${chalk.cyan("nepopsx sync --remote")}\n`));
139
168
  }
140
169
  /**
141
170
  * Parse customs/auto/*.md files into structured learnings.
@@ -157,30 +186,30 @@ function collectLocalLearnings(autoDir, agentFilter) {
157
186
  if (!existsSync(autoDir))
158
187
  return [];
159
188
  const learnings = [];
160
- const files = readdirSync(autoDir).filter((f) => f.endsWith('.md'));
189
+ const files = readdirSync(autoDir).filter((f) => f.endsWith(".md"));
161
190
  for (const file of files) {
162
191
  const filePath = resolve(autoDir, file);
163
- const raw = readFileSync(filePath, 'utf-8');
192
+ const raw = readFileSync(filePath, "utf-8");
164
193
  const parsed = parseFrontmatter(raw);
165
194
  if (!parsed.frontmatter)
166
195
  continue;
167
196
  const fm = parsed.frontmatter;
168
- const isConfigSuggestion = file.startsWith('config-suggestion-');
169
- const slug = fm.name ?? basename(file, '.md');
197
+ const isConfigSuggestion = file.startsWith("config-suggestion-");
198
+ const slug = fm.name ?? basename(file, ".md");
170
199
  const type = isConfigSuggestion
171
- ? 'config_patch'
172
- : (fm.type ?? 'custom_instruction');
173
- const confidence = fm.confidence ?? 'medium';
200
+ ? "config_patch"
201
+ : (fm.type ?? "custom_instruction");
202
+ const confidence = fm.confidence ?? "medium";
174
203
  const appliesTo = Array.isArray(fm.applies_to)
175
204
  ? fm.applies_to
176
- : typeof fm.applies_to === 'string'
205
+ : typeof fm.applies_to === "string"
177
206
  ? [fm.applies_to]
178
207
  : [];
179
208
  // Infer agent from applies_to or frontmatter
180
- let agent = fm.agent ?? '';
209
+ let agent = fm.agent ?? "";
181
210
  if (!agent && appliesTo.length > 0) {
182
211
  // e.g. "qa-executor" → "qa-agent", "docs-writer" → "docs-agent"
183
- const prefix = appliesTo[0].split('-')[0];
212
+ const prefix = appliesTo[0].split("-")[0];
184
213
  agent = `${prefix}-agent`;
185
214
  }
186
215
  if (agentFilter && agent !== agentFilter)
@@ -189,7 +218,7 @@ function collectLocalLearnings(autoDir, agentFilter) {
189
218
  type: type,
190
219
  confidence: confidence,
191
220
  slug,
192
- title: fm.title ?? slug.replace(/-/g, ' '),
221
+ title: fm.title ?? slug.replace(/-/g, " "),
193
222
  content: parsed.body.trim(),
194
223
  agent,
195
224
  applies_to: appliesTo,
@@ -207,7 +236,9 @@ function parseFrontmatter(content) {
207
236
  try {
208
237
  const fm = parseYaml(match[1]);
209
238
  return {
210
- frontmatter: typeof fm === 'object' && fm !== null ? fm : null,
239
+ frontmatter: typeof fm === "object" && fm !== null
240
+ ? fm
241
+ : null,
211
242
  body: match[2],
212
243
  };
213
244
  }
@@ -1 +1 @@
1
- {"version":3,"file":"push-learnings.js","sourceRoot":"","sources":["../../src/commands/push-learnings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push-learnings.js","sourceRoot":"","sources":["../../src/commands/push-learnings.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,11 @@ interface SyncOptions {
3
3
  remote?: boolean;
4
4
  workspace?: string;
5
5
  dryRun?: boolean;
6
+ preview?: boolean;
7
+ exitOnChanges?: boolean;
6
8
  dev?: boolean;
9
+ /** Overwrite hand-edited files without backing them up to <file>.local first. */
10
+ force?: boolean;
7
11
  }
8
12
  export declare function syncCommand(options: SyncOptions): Promise<void>;
9
13
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AA8BA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4SrE"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAqDA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iFAAiF;IACjF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgWrE"}
@@ -1,16 +1,15 @@
1
- import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
1
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
2
2
  import { resolve } from 'node:path';
3
3
  import { parse, stringify } from 'yaml';
4
4
  import chalk from 'chalk';
5
5
  import { select } from '@inquirer/prompts';
6
- import { validateWorkspaceConfig, scanConfigSecrets, DEFAULT_PROVIDERS } from '@nepopsx/core';
6
+ import { validateWorkspaceConfig, scanConfigSecrets, DEFAULT_PROVIDERS, IMPLEMENTED_PROVIDERS } from '@nepopsx/core';
7
7
  import { DOWNLOAD_TIMEOUT_MS } from '../constants.js';
8
8
  import { renderTemplate, setPhilosophyBlock, setCustomInstructions, setWatermarkData, applyLicenseWatermark } from '../generator/render.js';
9
- import { renderAgentBundle } from '../generator/package-renderer.js';
10
9
  import { writeGeneratedFiles, printWriteResult } from '../generator/writer.js';
11
10
  import { getBuiltinTemplates } from '../generator/builtin-templates.js';
12
11
  import { philosophyToInstructions } from '../generator/philosophy.js';
13
- import { getAgentConfigPath, getAgentSupportOperations } from '../agents/configuration.js';
12
+ import { getAgentConfigPath, getAgentSupportOperations, bundleToOperations } from '../agents/configuration.js';
14
13
  import { fetchRemoteAgentConfigs, loadLocalAgentConfig, fetchApprovedLearnings, fetchRemoteEnrichmentState } from '../agents/remote-config.js';
15
14
  import { loadCustomInstructions } from '../customs/instructions.js';
16
15
  import { checkAgentEnrichmentGate, checkEnrichmentGate } from '../enrichment/workflow.js';
@@ -18,23 +17,46 @@ import { hashRecord, readLocalEnrichmentState, writeLocalEnrichmentState } from
18
17
  import { scanCustomInstructions, scanPhilosophyCustom, formatThreats, generateManifest } from '../security/index.js';
19
18
  import { validateLicense, enforceTierLimits, fetchRemoteTemplates, isDevMode, readLicense } from '../licensing/index.js';
20
19
  import { resolveApiBase } from '../config/api-config.js';
20
+ import { renderPreview, computeExitCode } from '../generator/preview.js';
21
21
  const VALID_PROVIDERS = new Set(['github-copilot', 'claude-code', 'cursor', 'windsurf', 'augment']);
22
22
  function resolveProviders(agentConfig) {
23
23
  const raw = agentConfig?.providers;
24
24
  if (!raw || raw.length === 0)
25
25
  return DEFAULT_PROVIDERS;
26
26
  const valid = raw.filter((p) => VALID_PROVIDERS.has(p));
27
- return valid.length > 0 ? valid : DEFAULT_PROVIDERS;
27
+ // Only send IMPLEMENTED providers to the backend. A declared-but-unimplemented
28
+ // provider (e.g. cursor) must NOT be forwarded — the server would then return a
29
+ // provider-NEUTRAL bundle that we'd write raw at source-prefixed paths.
30
+ const unimplemented = valid.filter((p) => !IMPLEMENTED_PROVIDERS.includes(p));
31
+ if (unimplemented.length > 0) {
32
+ console.warn(chalk.yellow(`⚠ Provider(s) not yet supported, skipping: ${unimplemented.join(', ')}. ` +
33
+ `Supported: ${IMPLEMENTED_PROVIDERS.join(', ')}.`));
34
+ }
35
+ const implemented = valid.filter((p) => IMPLEMENTED_PROVIDERS.includes(p));
36
+ return implemented.length > 0 ? implemented : DEFAULT_PROVIDERS;
37
+ }
38
+ /** Union of providers across all enabled agents — what the workspace targets. */
39
+ function collectWorkspaceProviders(config) {
40
+ const set = new Set();
41
+ for (const agentCfg of Object.values(config.agents ?? {})) {
42
+ if (!agentCfg.enabled)
43
+ continue;
44
+ for (const p of resolveProviders(agentCfg))
45
+ set.add(p);
46
+ }
47
+ return set.size > 0 ? [...set] : DEFAULT_PROVIDERS;
28
48
  }
29
49
  export async function syncCommand(options) {
30
50
  const cwd = process.cwd();
31
51
  const configPath = resolve(cwd, options.config);
32
- const dryRun = options.dryRun ?? false;
52
+ const preview = options.preview ?? options.dryRun ?? false;
53
+ if (options.dryRun && !options.preview) {
54
+ console.error(chalk.yellow('[deprecated] --dry-run is now an alias of --preview'));
55
+ }
33
56
  const devMode = options.dev ?? isDevMode();
34
- const bootstrapLicense = readLicense(cwd);
35
57
  console.log(chalk.bold.cyan('\n🔄 NEPOPSX Sync\n'));
36
- if (dryRun) {
37
- console.warn(chalk.yellow(' [dry-run mode — no files will be written]\n'));
58
+ if (preview) {
59
+ console.warn(chalk.yellow(' [preview mode — no files will be written]\n'));
38
60
  }
39
61
  if (devMode) {
40
62
  console.warn(chalk.yellow(' [dev mode — license checks bypassed]\n'));
@@ -43,12 +65,16 @@ export async function syncCommand(options) {
43
65
  if (options.remote) {
44
66
  console.log(chalk.dim('Fetching workspace config from backend...'));
45
67
  raw = await fetchRemoteConfig(cwd, options.workspace);
46
- const configDir = resolve(cwd, '.nepopsx');
47
- if (!existsSync(configDir))
48
- mkdirSync(configDir, { recursive: true });
49
- const { stringify } = await import('yaml');
50
- writeFileSync(configPath, stringify(raw), 'utf-8');
51
- console.log(chalk.dim(`Config saved to ${options.config}`));
68
+ if (!preview) {
69
+ const configDir = resolve(cwd, '.nepopsx');
70
+ if (!existsSync(configDir))
71
+ mkdirSync(configDir, { recursive: true });
72
+ writeFileSync(configPath, stringify(raw), 'utf-8');
73
+ console.log(chalk.dim(`Config saved to ${options.config}`));
74
+ }
75
+ else {
76
+ console.error(chalk.dim('(preview) skipping persistence of ' + options.config));
77
+ }
52
78
  }
53
79
  else {
54
80
  if (!existsSync(configPath)) {
@@ -102,6 +128,10 @@ export async function syncCommand(options) {
102
128
  // --remote mode bypasses enrichment entirely (backend config is already enriched)
103
129
  if (activeLicense && !options.remote) {
104
130
  const localStateBeforeGate = readLocalEnrichmentState(cwd);
131
+ if (preview && !localStateBeforeGate.workspace) {
132
+ console.error(chalk.red('\n🔍 Preview requires an enriched workspace — run `nepopsx scan` first.'));
133
+ process.exit(1);
134
+ }
105
135
  if (!localStateBeforeGate.workspace) {
106
136
  const remote = await fetchRemoteEnrichmentState(cwd, activeLicense.key, options.workspace);
107
137
  if (remote?.workspace?.status === 'enriched') {
@@ -208,14 +238,19 @@ export async function syncCommand(options) {
208
238
  if (customs.length > 0) {
209
239
  console.log(chalk.dim(`Custom instructions: ${customs.length} file(s) from ${config.customs_dir ?? 'customs/'}`));
210
240
  }
241
+ // Union of providers across enabled agents — the workspace-core bundle (and its
242
+ // server-materialized skills) is rendered for every provider the workspace targets.
243
+ const workspaceProviders = collectWorkspaceProviders(config);
211
244
  console.log(chalk.dim('\nRendering base templates...'));
212
245
  if (activeLicense) {
213
- const builtinBundle = await fetchRemoteTemplates(cwd, activeLicense, 'workspace-core', 'latest', customs);
246
+ // fetchRemoteTemplates is read-only (no disk cache) safe in preview mode (FR-2f)
247
+ const builtinBundle = await fetchRemoteTemplates(cwd, activeLicense, 'workspace-core', 'latest', customs, workspaceProviders);
214
248
  if (!builtinBundle) {
215
249
  console.error(chalk.red(' ✗ Builtin workspace bundle could not be fetched from the backend.'));
216
250
  process.exit(1);
217
251
  }
218
- operations.push(...renderAgentBundle(builtinBundle));
252
+ // Server returns FINAL per-provider files — just write them.
253
+ operations.push(...bundleToOperations(builtinBundle));
219
254
  }
220
255
  else {
221
256
  const builtins = getBuiltinTemplates(config);
@@ -240,44 +275,71 @@ export async function syncCommand(options) {
240
275
  operations.push(...agentOps);
241
276
  }
242
277
  }
278
+ // Pull approved team learnings for reporting + stale-artifact pruning. Approved
279
+ // `skill` learnings are now materialized as cross-provider SKILL.md SERVER-SIDE
280
+ // (in the workspace-core bundle above), so the CLI no longer renders them.
281
+ let approvedLearnings = null;
282
+ if (options.remote && activeLicense) {
283
+ try {
284
+ approvedLearnings = await fetchApprovedLearnings(cwd, activeLicense.key, options.workspace ?? activeLicense.workspace);
285
+ }
286
+ catch (err) {
287
+ // Non-fatal — learnings are optional during sync.
288
+ console.warn(chalk.yellow(` ⚠ Could not pull learnings: ${err instanceof Error ? err.message : String(err)}`));
289
+ }
290
+ }
243
291
  for (const operation of operations) {
292
+ // SKILL.md frontmatter must stay at line 1 — never prepend a watermark
293
+ // comment. Skills are written to both providers' trees (.claude/skills for
294
+ // Claude Code, .github/skills for Copilot), so skip watermarking both.
295
+ if (operation.path.startsWith('.claude/skills/') ||
296
+ operation.path.startsWith('.github/skills/')) {
297
+ continue;
298
+ }
244
299
  operation.content = applyLicenseWatermark(operation.content, operation.path);
245
300
  }
246
- console.log(chalk.dim(`\nWriting ${operations.length} file(s)...`));
247
- const result = writeGeneratedFiles(cwd, operations, dryRun);
248
- printWriteResult(result, dryRun);
249
- if (!dryRun) {
250
- const allFiles = operations.map((operation) => ({ path: operation.path, content: operation.content }));
251
- const manifest = generateManifest(cwd, allFiles);
252
- console.log(chalk.dim(`Integrity manifest: ${manifest.length} file(s) hashed → .nepopsx/manifest.sha256`));
253
- // Pull approved learnings from backend during --remote sync
254
- if (options.remote && activeLicense) {
255
- try {
256
- const learnings = await fetchApprovedLearnings(cwd, activeLicense.key, options.workspace ?? activeLicense.workspace);
257
- const staleArtifacts = pruneRemoteLearningArtifacts(cwd, config, learnings);
258
- const learningCount = Object.keys(learnings.customs ?? {}).length +
259
- Object.keys(learnings.skills ?? {}).length +
260
- Object.keys(learnings.config_patches ?? {}).length;
261
- // Report merged learnings count these are baked into agent bundles server-side
262
- const mergedCount = Object.values(learnings.merged_learnings ?? {})
263
- .reduce((sum, agentLearnings) => sum + Object.keys(agentLearnings).length, 0);
264
- if (learningCount > 0) {
265
- console.log(chalk.dim(`Team learnings: ${learningCount} approved learning(s) available on the backend`));
266
- }
267
- if (mergedCount > 0) {
268
- console.log(chalk.dim(`Merged learnings: ${mergedCount} learning(s) baked into agent bundles server-side`));
269
- }
270
- if (staleArtifacts > 0) {
271
- console.log(chalk.dim(`Pruned stale local learning artifacts: ${staleArtifacts}`));
272
- }
273
- }
274
- catch (err) {
275
- // Non-fatal learnings are optional during sync
276
- console.warn(chalk.yellow(` ⚠ Could not pull learnings: ${err instanceof Error ? err.message : String(err)}`));
277
- }
301
+ if (preview) {
302
+ const previewResult = renderPreview(cwd, operations, approvedLearnings);
303
+ process.stdout.write(previewResult.output);
304
+ process.exit(computeExitCode(previewResult, options.exitOnChanges ?? false));
305
+ }
306
+ if (!preview) {
307
+ console.log(chalk.dim(`\nWriting ${operations.length} file(s)...`));
308
+ }
309
+ const result = writeGeneratedFiles(cwd, operations, false, {
310
+ protect: true,
311
+ force: options.force,
312
+ });
313
+ printWriteResult(result, false);
314
+ const allFiles = operations.map((operation) => ({ path: operation.path, content: operation.content }));
315
+ const manifest = generateManifest(cwd, allFiles);
316
+ console.log(chalk.dim(`Integrity manifest: ${manifest.length} file(s) hashed .nepopsx/manifest.sha256`));
317
+ // Report + prune using the learnings already fetched (skills written above).
318
+ if (approvedLearnings) {
319
+ const staleArtifacts = pruneRemoteLearningArtifacts(cwd, config, approvedLearnings);
320
+ const skillCount = Object.keys(approvedLearnings.skills ?? {}).length;
321
+ const learningCount = Object.keys(approvedLearnings.customs ?? {}).length +
322
+ skillCount +
323
+ Object.keys(approvedLearnings.config_patches ?? {}).length;
324
+ // Report merged learnings count — these are baked into agent bundles server-side
325
+ const mergedCount = Object.values(approvedLearnings.merged_learnings ?? {})
326
+ .reduce((sum, agentLearnings) => sum + Object.keys(agentLearnings).length, 0);
327
+ if (learningCount > 0) {
328
+ console.log(chalk.dim(`Team learnings: ${learningCount} approved learning(s) available on the backend`));
329
+ }
330
+ if (skillCount > 0) {
331
+ const skillDirs = ['.claude/skills', '.github/skills'].filter((d) => operations.some((o) => o.path.startsWith(`${d}/`)));
332
+ const where = skillDirs.length > 0 ? skillDirs.join(', ') : '.claude/skills';
333
+ console.log(chalk.dim(`Skills: ${skillCount} approved skill(s) written to ${where}`));
334
+ }
335
+ if (mergedCount > 0) {
336
+ console.log(chalk.dim(`Merged learnings: ${mergedCount} learning(s) baked into agent bundles server-side`));
337
+ }
338
+ if (staleArtifacts > 0) {
339
+ console.log(chalk.dim(`Pruned stale local learning artifacts: ${staleArtifacts}`));
278
340
  }
279
- console.log(chalk.bold.green('\n✅ Sync complete.\n'));
280
341
  }
342
+ console.log(chalk.bold.green('\n✅ Sync complete.\n'));
281
343
  }
282
344
  async function loadAgentTemplates(rootDir, agentName, agentCfg, license, customs) {
283
345
  const requestedVersion = agentCfg.version ?? '0.0.1';
@@ -285,16 +347,19 @@ async function loadAgentTemplates(rootDir, agentName, agentCfg, license, customs
285
347
  console.error(chalk.red(` ✗ Agent "${agentName}" requires an active license. Run nepopsx activate first.`));
286
348
  return [];
287
349
  }
288
- const remoteBundle = await fetchRemoteTemplates(rootDir, license, agentName, requestedVersion, customs);
350
+ // fetchRemoteTemplates is read-only (no disk cache) safe in preview mode (FR-2f)
351
+ const remoteBundle = await fetchRemoteTemplates(rootDir, license, agentName, requestedVersion, customs, resolveProviders(agentCfg));
289
352
  if (!remoteBundle) {
290
353
  console.error(chalk.red(` ✗ Agent "${agentName}" — could not fetch template bundle from backend.`));
291
354
  console.log(chalk.dim(' Check that the NEPOPSX backend is reachable: nepopsx server show'));
292
355
  return [];
293
356
  }
294
357
  console.log(chalk.dim(` ↳ using remote template bundle (${remoteBundle.version})`));
358
+ // Server returns FINAL per-provider files; getAgentSupportOperations still reads
359
+ // the bundle's reserved metadata (package.yaml/config-defaults.yaml) for .nepopsx/.
295
360
  return [
296
361
  ...getAgentSupportOperations(rootDir, remoteBundle, agentName, agentCfg),
297
- ...renderAgentBundle(remoteBundle, resolveProviders(agentCfg)),
362
+ ...bundleToOperations(remoteBundle),
298
363
  ];
299
364
  }
300
365
  async function fetchRemoteConfig(rootDir, workspaceSlug) {
@@ -352,18 +417,9 @@ function pruneRemoteLearningArtifacts(rootDir, config, learnings) {
352
417
  removed += 1;
353
418
  }
354
419
  }
355
- for (const slug of Object.keys(learnings.skills ?? {})) {
356
- const legacySkillDir = resolve(rootDir, '.github', 'skills', slug);
357
- const legacySkillFile = resolve(legacySkillDir, 'SKILL.md');
358
- if (!existsSync(legacySkillFile)) {
359
- continue;
360
- }
361
- rmSync(legacySkillFile, { force: true });
362
- removed += 1;
363
- if (existsSync(legacySkillDir) && readdirSync(legacySkillDir).length === 0) {
364
- rmSync(legacySkillDir, { recursive: true, force: true });
365
- }
366
- }
420
+ // Note: .github/skills/<slug>/SKILL.md is now a first-class server-rendered
421
+ // output for the github-copilot provider (Copilot reads .github/skills natively),
422
+ // so it is NOT pruned here — it is written and preserved like .claude/skills.
367
423
  return removed;
368
424
  }
369
425
  //# sourceMappingURL=sync.js.map