@nepopsx/cli 0.0.19 → 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.
- package/dist/agents/catalog.d.ts +19 -0
- package/dist/agents/catalog.d.ts.map +1 -0
- package/dist/agents/catalog.js +45 -0
- package/dist/agents/catalog.js.map +1 -0
- package/dist/agents/configuration.d.ts +1 -0
- package/dist/agents/configuration.d.ts.map +1 -1
- package/dist/agents/configuration.js +36 -0
- package/dist/agents/configuration.js.map +1 -1
- package/dist/agents/configuration.test.d.ts +2 -0
- package/dist/agents/configuration.test.d.ts.map +1 -0
- package/dist/agents/configuration.test.js +32 -0
- package/dist/agents/configuration.test.js.map +1 -0
- package/dist/commands/capture.d.ts +19 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +105 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +11 -30
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +86 -15
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.d.ts +8 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +169 -80
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/push-learnings.d.ts.map +1 -1
- package/dist/commands/push-learnings.js +93 -62
- package/dist/commands/push-learnings.js.map +1 -1
- package/dist/commands/sync.d.ts +4 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +120 -64
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/up.d.ts +23 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +263 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/enrichment/workflow.d.ts +1 -0
- package/dist/enrichment/workflow.d.ts.map +1 -1
- package/dist/enrichment/workflow.js +13 -0
- package/dist/enrichment/workflow.js.map +1 -1
- package/dist/generator/preview.d.ts +13 -0
- package/dist/generator/preview.d.ts.map +1 -0
- package/dist/generator/preview.js +242 -0
- package/dist/generator/preview.js.map +1 -0
- package/dist/generator/preview.test.d.ts +19 -0
- package/dist/generator/preview.test.d.ts.map +1 -0
- package/dist/generator/preview.test.js +289 -0
- package/dist/generator/preview.test.js.map +1 -0
- package/dist/generator/render.d.ts +2 -2
- package/dist/generator/render.d.ts.map +1 -1
- package/dist/generator/render.js +37 -18
- package/dist/generator/render.js.map +1 -1
- package/dist/generator/writer.d.ts +15 -1
- package/dist/generator/writer.d.ts.map +1 -1
- package/dist/generator/writer.js +41 -3
- package/dist/generator/writer.js.map +1 -1
- package/dist/hooks/capture-hooks.d.ts +9 -0
- package/dist/hooks/capture-hooks.d.ts.map +1 -0
- package/dist/hooks/capture-hooks.js +100 -0
- package/dist/hooks/capture-hooks.js.map +1 -0
- package/dist/hooks/capture-hooks.test.d.ts +2 -0
- package/dist/hooks/capture-hooks.test.d.ts.map +1 -0
- package/dist/hooks/capture-hooks.test.js +50 -0
- package/dist/hooks/capture-hooks.test.js.map +1 -0
- package/dist/index.js +26 -3
- package/dist/index.js.map +1 -1
- package/dist/learnings/yaml-learnings.d.ts +16 -2
- package/dist/learnings/yaml-learnings.d.ts.map +1 -1
- package/dist/learnings/yaml-learnings.js +43 -8
- package/dist/learnings/yaml-learnings.js.map +1 -1
- package/dist/learnings/yaml-learnings.test.d.ts +2 -0
- package/dist/learnings/yaml-learnings.test.d.ts.map +1 -0
- package/dist/learnings/yaml-learnings.test.js +39 -0
- package/dist/learnings/yaml-learnings.test.js.map +1 -0
- package/dist/licensing/installer.d.ts +2 -2
- package/dist/licensing/installer.d.ts.map +1 -1
- package/dist/licensing/installer.js +3 -1
- package/dist/licensing/installer.js.map +1 -1
- package/dist/licensing/template-fetch.d.ts +2 -2
- package/dist/licensing/template-fetch.d.ts.map +1 -1
- package/dist/licensing/template-fetch.js +4 -1
- package/dist/licensing/template-fetch.js.map +1 -1
- package/dist/mcp/config-generator.d.ts +42 -0
- package/dist/mcp/config-generator.d.ts.map +1 -0
- package/dist/mcp/config-generator.js +55 -0
- package/dist/mcp/config-generator.js.map +1 -0
- package/dist/mcp/config-generator.test.d.ts +7 -0
- package/dist/mcp/config-generator.test.d.ts.map +1 -0
- package/dist/mcp/config-generator.test.js +79 -0
- package/dist/mcp/config-generator.test.js.map +1 -0
- package/dist/ruflo/config-generator.d.ts +22 -0
- package/dist/ruflo/config-generator.d.ts.map +1 -0
- package/dist/ruflo/config-generator.js +89 -0
- package/dist/ruflo/config-generator.js.map +1 -0
- package/dist/ruflo/config-generator.test.d.ts +2 -0
- package/dist/ruflo/config-generator.test.d.ts.map +1 -0
- package/dist/ruflo/config-generator.test.js +18 -0
- package/dist/ruflo/config-generator.test.js.map +1 -0
- package/dist/ruflo/detect.d.ts +11 -0
- package/dist/ruflo/detect.d.ts.map +1 -0
- package/dist/ruflo/detect.js +30 -0
- package/dist/ruflo/detect.js.map +1 -0
- package/dist/ruflo/index.d.ts +3 -0
- package/dist/ruflo/index.d.ts.map +1 -0
- package/dist/ruflo/index.js +3 -0
- package/dist/ruflo/index.js.map +1 -0
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1 -1
- package/dist/security/index.js.map +1 -1
- package/dist/security/integrity.d.ts +8 -0
- package/dist/security/integrity.d.ts.map +1 -1
- package/dist/security/integrity.js +28 -0
- package/dist/security/integrity.js.map +1 -1
- package/package.json +5 -3
- package/dist/generator/package-renderer.d.ts +0 -38
- package/dist/generator/package-renderer.d.ts.map +0 -1
- package/dist/generator/package-renderer.js +0 -181
- package/dist/generator/package-renderer.js.map +0 -1
- package/dist/generator/provider-transform.d.ts +0 -15
- package/dist/generator/provider-transform.d.ts.map +0 -1
- package/dist/generator/provider-transform.js +0 -163
- package/dist/generator/provider-transform.js.map +0 -1
- package/dist/licensing/fingerprint.test.d.ts +0 -2
- package/dist/licensing/fingerprint.test.d.ts.map +0 -1
- package/dist/licensing/fingerprint.test.js +0 -41
- 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,
|
|
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
|
|
2
|
-
import { resolve, basename } from
|
|
3
|
-
import { parse as parseYaml } from
|
|
4
|
-
import chalk from
|
|
5
|
-
import { resolveApiBase } from
|
|
6
|
-
import { readLicense, isDevMode } from
|
|
7
|
-
import { fetchWithTimeout } from
|
|
8
|
-
import { DOWNLOAD_TIMEOUT_MS } from
|
|
9
|
-
import {
|
|
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(
|
|
19
|
+
console.log(chalk.bold.cyan("\n📤 NEPOPSX Push Learnings\n"));
|
|
20
20
|
if (devMode) {
|
|
21
|
-
console.warn(chalk.yellow(
|
|
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,
|
|
27
|
-
if (typeof raw ===
|
|
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 ??
|
|
32
|
-
const autoDir = resolve(customsDir,
|
|
33
|
-
const learningFormat = config.learning_format ??
|
|
34
|
-
const learningsDir = resolve(cwd, config.learnings_dir ??
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
67
|
-
console.log(chalk.dim(
|
|
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 ===
|
|
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 ===
|
|
74
|
-
console.log(chalk.dim(` ${badge} [${l.confidence}] ${l.slug} (${l.agent ||
|
|
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(
|
|
79
|
-
const rl = readline.createInterface({
|
|
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() !==
|
|
85
|
-
console.log(chalk.dim(
|
|
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(
|
|
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(
|
|
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:
|
|
118
|
+
method: "POST",
|
|
105
119
|
headers: {
|
|
106
120
|
Authorization: `Bearer ${license.key}`,
|
|
107
|
-
|
|
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(`
|
|
147
|
+
console.log(chalk.dim(` Pending review: ${result.pending}`));
|
|
134
148
|
for (const r of result.results) {
|
|
135
|
-
const icon = r.status ===
|
|
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
|
-
|
|
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(
|
|
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,
|
|
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(
|
|
169
|
-
const slug = fm.name ?? basename(file,
|
|
197
|
+
const isConfigSuggestion = file.startsWith("config-suggestion-");
|
|
198
|
+
const slug = fm.name ?? basename(file, ".md");
|
|
170
199
|
const type = isConfigSuggestion
|
|
171
|
-
?
|
|
172
|
-
: (fm.type ??
|
|
173
|
-
const confidence = fm.confidence ??
|
|
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 ===
|
|
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(
|
|
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 ===
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"push-learnings.js","sourceRoot":"","sources":["../../src/commands/push-learnings.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/sync.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/commands/sync.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync,
|
|
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
|
-
|
|
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
|
|
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 (
|
|
37
|
-
console.warn(chalk.yellow(' [
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
console.log(chalk.dim(
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
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
|
-
|
|
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
|
-
...
|
|
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
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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
|