@nepopsx/cli 0.0.19 → 0.0.21
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 +95 -63
- 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,CAkOf"}
|
|
@@ -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,48 +74,52 @@ 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
|
|
100
114
|
const apiBase = resolveApiBase(cwd);
|
|
101
|
-
const
|
|
115
|
+
const workspaceFromConfig = config.workspace?.name;
|
|
116
|
+
const workspace = options.workspace ?? workspaceFromConfig ?? license.workspace;
|
|
102
117
|
console.log(chalk.dim(`\n Pushing to ${apiBase}/learnings...`));
|
|
103
118
|
const response = await fetchWithTimeout(`${apiBase}/learnings`, {
|
|
104
|
-
method:
|
|
119
|
+
method: "POST",
|
|
105
120
|
headers: {
|
|
106
121
|
Authorization: `Bearer ${license.key}`,
|
|
107
|
-
|
|
122
|
+
"Content-Type": "application/json",
|
|
108
123
|
},
|
|
109
124
|
body: JSON.stringify({
|
|
110
125
|
workspace,
|
|
@@ -123,19 +138,34 @@ export async function pushLearningsCommand(options) {
|
|
|
123
138
|
}),
|
|
124
139
|
}, DOWNLOAD_TIMEOUT_MS);
|
|
125
140
|
if (!response.ok) {
|
|
126
|
-
const body = await response.text().catch(() =>
|
|
141
|
+
const body = await response.text().catch(() => "");
|
|
127
142
|
console.error(chalk.red(`\n Backend returned ${response.status}: ${body}`));
|
|
128
143
|
process.exit(1);
|
|
129
144
|
}
|
|
130
|
-
const result = await response.json();
|
|
145
|
+
const result = (await response.json());
|
|
131
146
|
console.log(chalk.bold.green(`\n ✅ Pushed ${result.received} learning(s)`));
|
|
132
147
|
console.log(chalk.dim(` Auto-applied: ${result.auto_applied}`));
|
|
133
|
-
console.log(chalk.dim(`
|
|
148
|
+
console.log(chalk.dim(` Pending review: ${result.pending}`));
|
|
134
149
|
for (const r of result.results) {
|
|
135
|
-
const icon = r.status ===
|
|
150
|
+
const icon = r.status === "approved"
|
|
151
|
+
? "✅"
|
|
152
|
+
: r.status === "pending"
|
|
153
|
+
? "⏳"
|
|
154
|
+
: r.status === "suggested"
|
|
155
|
+
? "💡"
|
|
156
|
+
: "❓";
|
|
136
157
|
console.log(chalk.dim(` ${icon} ${r.slug} → ${r.status} (seen ${r.occurrences}×)`));
|
|
137
158
|
}
|
|
138
|
-
|
|
159
|
+
// Stamp the server's verdict back onto each locally-authored YAML learning so
|
|
160
|
+
// it is no longer `status: local` and won't be re-pushed next run.
|
|
161
|
+
const SYNCED_STATUSES = new Set(["approved", "pending", "suggested", "reverted"]);
|
|
162
|
+
for (const r of result.results) {
|
|
163
|
+
const filePath = fileBySlug.get(r.slug);
|
|
164
|
+
if (filePath && SYNCED_STATUSES.has(r.status)) {
|
|
165
|
+
setLearningStatus(filePath, r.status);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
console.log(chalk.dim(`\n Teammates can pull these via: ${chalk.cyan("nepopsx sync --remote")}\n`));
|
|
139
169
|
}
|
|
140
170
|
/**
|
|
141
171
|
* Parse customs/auto/*.md files into structured learnings.
|
|
@@ -157,30 +187,30 @@ function collectLocalLearnings(autoDir, agentFilter) {
|
|
|
157
187
|
if (!existsSync(autoDir))
|
|
158
188
|
return [];
|
|
159
189
|
const learnings = [];
|
|
160
|
-
const files = readdirSync(autoDir).filter((f) => f.endsWith(
|
|
190
|
+
const files = readdirSync(autoDir).filter((f) => f.endsWith(".md"));
|
|
161
191
|
for (const file of files) {
|
|
162
192
|
const filePath = resolve(autoDir, file);
|
|
163
|
-
const raw = readFileSync(filePath,
|
|
193
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
164
194
|
const parsed = parseFrontmatter(raw);
|
|
165
195
|
if (!parsed.frontmatter)
|
|
166
196
|
continue;
|
|
167
197
|
const fm = parsed.frontmatter;
|
|
168
|
-
const isConfigSuggestion = file.startsWith(
|
|
169
|
-
const slug = fm.name ?? basename(file,
|
|
198
|
+
const isConfigSuggestion = file.startsWith("config-suggestion-");
|
|
199
|
+
const slug = fm.name ?? basename(file, ".md");
|
|
170
200
|
const type = isConfigSuggestion
|
|
171
|
-
?
|
|
172
|
-
: (fm.type ??
|
|
173
|
-
const confidence = fm.confidence ??
|
|
201
|
+
? "config_patch"
|
|
202
|
+
: (fm.type ?? "custom_instruction");
|
|
203
|
+
const confidence = fm.confidence ?? "medium";
|
|
174
204
|
const appliesTo = Array.isArray(fm.applies_to)
|
|
175
205
|
? fm.applies_to
|
|
176
|
-
: typeof fm.applies_to ===
|
|
206
|
+
: typeof fm.applies_to === "string"
|
|
177
207
|
? [fm.applies_to]
|
|
178
208
|
: [];
|
|
179
209
|
// Infer agent from applies_to or frontmatter
|
|
180
|
-
let agent = fm.agent ??
|
|
210
|
+
let agent = fm.agent ?? "";
|
|
181
211
|
if (!agent && appliesTo.length > 0) {
|
|
182
212
|
// e.g. "qa-executor" → "qa-agent", "docs-writer" → "docs-agent"
|
|
183
|
-
const prefix = appliesTo[0].split(
|
|
213
|
+
const prefix = appliesTo[0].split("-")[0];
|
|
184
214
|
agent = `${prefix}-agent`;
|
|
185
215
|
}
|
|
186
216
|
if (agentFilter && agent !== agentFilter)
|
|
@@ -189,7 +219,7 @@ function collectLocalLearnings(autoDir, agentFilter) {
|
|
|
189
219
|
type: type,
|
|
190
220
|
confidence: confidence,
|
|
191
221
|
slug,
|
|
192
|
-
title: fm.title ?? slug.replace(/-/g,
|
|
222
|
+
title: fm.title ?? slug.replace(/-/g, " "),
|
|
193
223
|
content: parsed.body.trim(),
|
|
194
224
|
agent,
|
|
195
225
|
applies_to: appliesTo,
|
|
@@ -207,7 +237,9 @@ function parseFrontmatter(content) {
|
|
|
207
237
|
try {
|
|
208
238
|
const fm = parseYaml(match[1]);
|
|
209
239
|
return {
|
|
210
|
-
frontmatter: typeof fm ===
|
|
240
|
+
frontmatter: typeof fm === "object" && fm !== null
|
|
241
|
+
? fm
|
|
242
|
+
: null,
|
|
211
243
|
body: match[2],
|
|
212
244
|
};
|
|
213
245
|
}
|
|
@@ -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
|