@nepopsx/cli 0.0.11 → 0.0.13

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 (38) hide show
  1. package/dist/agents/remote-config.d.ts +20 -0
  2. package/dist/agents/remote-config.d.ts.map +1 -1
  3. package/dist/agents/remote-config.js +52 -0
  4. package/dist/agents/remote-config.js.map +1 -1
  5. package/dist/commands/install.d.ts +1 -0
  6. package/dist/commands/install.d.ts.map +1 -1
  7. package/dist/commands/install.js +77 -23
  8. package/dist/commands/install.js.map +1 -1
  9. package/dist/commands/push-learnings.d.ts.map +1 -1
  10. package/dist/commands/push-learnings.js +36 -4
  11. package/dist/commands/push-learnings.js.map +1 -1
  12. package/dist/commands/scan.d.ts.map +1 -1
  13. package/dist/commands/scan.js +88 -37
  14. package/dist/commands/scan.js.map +1 -1
  15. package/dist/commands/sync.d.ts.map +1 -1
  16. package/dist/commands/sync.js +97 -20
  17. package/dist/commands/sync.js.map +1 -1
  18. package/dist/generator/package-renderer.d.ts +16 -7
  19. package/dist/generator/package-renderer.d.ts.map +1 -1
  20. package/dist/generator/package-renderer.js +112 -56
  21. package/dist/generator/package-renderer.js.map +1 -1
  22. package/dist/generator/provider-transform.d.ts +15 -0
  23. package/dist/generator/provider-transform.d.ts.map +1 -0
  24. package/dist/generator/provider-transform.js +163 -0
  25. package/dist/generator/provider-transform.js.map +1 -0
  26. package/dist/index.js +2 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/learnings/yaml-learnings.d.ts +29 -0
  29. package/dist/learnings/yaml-learnings.d.ts.map +1 -0
  30. package/dist/learnings/yaml-learnings.js +132 -0
  31. package/dist/learnings/yaml-learnings.js.map +1 -0
  32. package/dist/scan/config.d.ts.map +1 -1
  33. package/dist/scan/config.js +144 -20
  34. package/dist/scan/config.js.map +1 -1
  35. package/dist/scan/prompt/agent.d.ts.map +1 -1
  36. package/dist/scan/prompt/agent.js +12 -5
  37. package/dist/scan/prompt/agent.js.map +1 -1
  38. package/package.json +11 -11
@@ -5,35 +5,53 @@
5
5
  * renderBundleForInstall — all files land under .github/ (preserves bundle layout)
6
6
  * renderAgentBundle — remaps schemas to openspec/ (used by sync)
7
7
  *
8
- * Backend bundles are already rendered server-side. The CLI only remaps paths.
8
+ * Multi-provider support:
9
+ * Both functions accept an optional `providers` array. For each provider:
10
+ * - github-copilot: agents/ → .github/agents/, prompts/ → .github/prompts/, etc.
11
+ * - claude-code: agents/ → .claude/agents/ (frontmatter transformed, orchestrators skipped),
12
+ * claude-commands/ → .claude/commands/ (purpose-built command files)
13
+ * - Other providers: TBD — currently no output.
14
+ *
15
+ * Backend bundles are already rendered server-side. The CLI remaps paths and
16
+ * transforms agent frontmatter per provider.
9
17
  */
10
- import { join } from 'node:path';
18
+ import { basename, join } from 'node:path';
19
+ import { DEFAULT_PROVIDERS } from '@nepopsx/core';
11
20
  import { isReservedBundleRootPath } from '../agents/configuration.js';
21
+ import { transformAgentForProvider } from './provider-transform.js';
12
22
  // ─── Install mode ───────────────────────────────────────────
13
23
  /**
14
24
  * Render a downloaded agent bundle for `nepopsx install`.
15
25
  *
16
- * All files are written under `.github/<relativePath>` with .hbs stripped.
17
- * This preserves the bundle's directory layout (agents/, prompts/, schemas/,
18
- * partials/) exactly as the agent author designed.
26
+ * For github-copilot: all files land under `.github/<relativePath>` with .hbs stripped.
27
+ * For claude-code: agent files are frontmatter-transformed → `.claude/agents/`,
28
+ * claude-commands/ `.claude/commands/`.
19
29
  *
20
30
  * Decrypted .hbs source is kept in memory only — never touches disk.
21
31
  */
22
- export function renderBundleForInstall(bundle) {
32
+ export function renderBundleForInstall(bundle, providers = DEFAULT_PROVIDERS) {
23
33
  const operations = [];
34
+ const providerSet = new Set(providers);
24
35
  for (const [relativePath, rawContent] of Object.entries(bundle.templates)) {
25
36
  if (isReservedBundleRootPath(relativePath))
26
37
  continue;
27
- const isHbs = relativePath.endsWith('.hbs');
28
- const outputPath = isHbs ? relativePath.replace(/\.hbs$/, '') : relativePath;
29
- const content = rawContent;
30
- if (content.trim().length === 0)
38
+ if (rawContent.trim().length === 0)
31
39
  continue;
32
- operations.push({
33
- path: join('.github', outputPath),
34
- content,
35
- source: `remote:${bundle.agent}/${relativePath}`,
36
- });
40
+ const isHbs = relativePath.endsWith('.hbs');
41
+ const cleanPath = isHbs ? relativePath.replace(/\.hbs$/, '') : relativePath;
42
+ // GitHub Copilot: everything under .github/
43
+ if (providerSet.has('github-copilot') && !relativePath.startsWith('claude-')) {
44
+ operations.push({
45
+ path: join('.github', cleanPath),
46
+ content: rawContent,
47
+ source: `remote:${bundle.agent}/${relativePath}`,
48
+ });
49
+ }
50
+ // Claude Code: transform agents, map commands
51
+ if (providerSet.has('claude-code')) {
52
+ const claudeOps = renderForClaudeCode(relativePath, rawContent, bundle.agent);
53
+ operations.push(...claudeOps);
54
+ }
37
55
  }
38
56
  return operations;
39
57
  }
@@ -42,68 +60,106 @@ export function renderBundleForInstall(bundle) {
42
60
  * Render all templates from an agent bundle for `nepopsx sync`.
43
61
  *
44
62
  * Uses prefix-based remapping so schemas land in openspec/ and
45
- * generated agent/prompt files land under .github/.
63
+ * generated agent/prompt files land under provider-specific directories.
46
64
  */
47
- export function renderAgentBundle(bundle) {
65
+ export function renderAgentBundle(bundle, providers = DEFAULT_PROVIDERS) {
48
66
  const operations = [];
49
67
  const handledPaths = new Set();
50
- const templateDirs = [
51
- { prefix: 'agents/', output: '.github/agents' },
52
- { prefix: 'prompts/', output: '.github/prompts' },
53
- { prefix: 'instructions/', output: '.github/instructions' },
54
- { prefix: 'skills/', output: '.github/skills' },
55
- ];
56
- for (const { prefix, output } of templateDirs) {
57
- for (const [relativePath, templateSource] of Object.entries(bundle.templates)) {
58
- if (!relativePath.startsWith(prefix))
59
- continue;
60
- const outputFileName = relativePath.slice(prefix.length).replace(/\.hbs$/, '');
61
- const content = templateSource;
62
- if (content.trim().length === 0)
63
- continue;
64
- handledPaths.add(relativePath);
65
- operations.push({
66
- path: join(output, outputFileName),
67
- content,
68
- source: `remote:${bundle.agent}/${relativePath}`,
69
- });
68
+ const providerSet = new Set(providers);
69
+ // GitHub Copilot prefix mappings
70
+ if (providerSet.has('github-copilot')) {
71
+ const copilotDirs = [
72
+ { prefix: 'agents/', output: '.github/agents' },
73
+ { prefix: 'prompts/', output: '.github/prompts' },
74
+ { prefix: 'instructions/', output: '.github/instructions' },
75
+ { prefix: 'skills/', output: '.github/skills' },
76
+ { prefix: 'partials/', output: '.github/partials' },
77
+ ];
78
+ for (const { prefix, output } of copilotDirs) {
79
+ for (const [relativePath, templateSource] of Object.entries(bundle.templates)) {
80
+ if (!relativePath.startsWith(prefix))
81
+ continue;
82
+ const outputFileName = relativePath.slice(prefix.length).replace(/\.hbs$/, '');
83
+ if (templateSource.trim().length === 0)
84
+ continue;
85
+ handledPaths.add(relativePath);
86
+ operations.push({
87
+ path: join(output, outputFileName),
88
+ content: templateSource,
89
+ source: `remote:${bundle.agent}/${relativePath}`,
90
+ });
91
+ }
70
92
  }
71
93
  }
72
- for (const [relativePath, rawContent] of Object.entries(bundle.templates)) {
73
- if (!relativePath.startsWith('partials/'))
74
- continue;
75
- const baseName = relativePath.slice('partials/'.length);
76
- const outputFileName = baseName.replace(/\.hbs$/, '');
77
- const content = rawContent;
78
- if (content.trim().length === 0)
79
- continue;
80
- handledPaths.add(relativePath);
81
- operations.push({
82
- path: join('.github/partials', outputFileName),
83
- content,
84
- source: `remote:${bundle.agent}/${relativePath}`,
85
- });
94
+ // Claude Code: transform agents + map commands
95
+ if (providerSet.has('claude-code')) {
96
+ for (const [relativePath, rawContent] of Object.entries(bundle.templates)) {
97
+ if (rawContent.trim().length === 0)
98
+ continue;
99
+ const claudeOps = renderForClaudeCode(relativePath, rawContent, bundle.agent);
100
+ if (claudeOps.length > 0) {
101
+ operations.push(...claudeOps);
102
+ handledPaths.add(relativePath);
103
+ }
104
+ }
86
105
  }
106
+ // Schema files always go to openspec/ regardless of provider
87
107
  copySyncSchemaFiles(bundle.templates, bundle.agent, operations);
108
+ // Remaining unhandled files (excluding schemas and provider-specific prefixes)
88
109
  for (const [relativePath, rawContent] of Object.entries(bundle.templates)) {
89
110
  if (handledPaths.has(relativePath) || isReservedBundleRootPath(relativePath)) {
90
111
  continue;
91
112
  }
92
- if (relativePath.startsWith('schemas/')) {
113
+ if (relativePath.startsWith('schemas/'))
114
+ continue;
115
+ if (relativePath.startsWith('claude-'))
93
116
  continue;
94
- }
95
117
  const outputPath = relativePath.replace(/\.hbs$/, '');
96
- const content = rawContent;
97
- if (content.trim().length === 0)
118
+ if (rawContent.trim().length === 0)
98
119
  continue;
99
120
  operations.push({
100
121
  path: outputPath,
101
- content,
122
+ content: rawContent,
102
123
  source: `remote:${bundle.agent}/${relativePath}`,
103
124
  });
104
125
  }
105
126
  return operations;
106
127
  }
128
+ // ─── Claude Code rendering ──────────────────────────────────
129
+ /**
130
+ * Render a single bundle file for Claude Code provider.
131
+ *
132
+ * - agents/ files: frontmatter transformed (model/tools/agents stripped, name/color added).
133
+ * Orchestrator agents (those with `agents:` in frontmatter) are skipped — they become commands.
134
+ * - claude-commands/ files: mapped directly to .claude/commands/
135
+ * - Other prefixes: ignored for Claude Code.
136
+ */
137
+ function renderForClaudeCode(relativePath, rawContent, agentName) {
138
+ const cleanPath = relativePath.replace(/\.hbs$/, '');
139
+ // Transform agent files
140
+ if (relativePath.startsWith('agents/')) {
141
+ const fileName = basename(cleanPath);
142
+ const transformed = transformAgentForProvider(rawContent, fileName, 'claude-code');
143
+ if (transformed === null)
144
+ return []; // Orchestrator — skipped
145
+ const outputFileName = cleanPath.slice('agents/'.length);
146
+ return [{
147
+ path: join('.claude/agents', outputFileName),
148
+ content: transformed,
149
+ source: `remote:${agentName}/${relativePath}`,
150
+ }];
151
+ }
152
+ // Claude-specific command files
153
+ if (relativePath.startsWith('claude-commands/')) {
154
+ const outputFileName = cleanPath.slice('claude-commands/'.length);
155
+ return [{
156
+ path: join('.claude/commands', outputFileName),
157
+ content: rawContent,
158
+ source: `remote:${agentName}/${relativePath}`,
159
+ }];
160
+ }
161
+ return [];
162
+ }
107
163
  // ─── Internals ──────────────────────────────────────────────
108
164
  function copySyncSchemaFiles(templateMap, agentName, operations) {
109
165
  for (const [relativePath, rawContent] of Object.entries(templateMap)) {
@@ -1 +1 @@
1
- {"version":3,"file":"package-renderer.js","sourceRoot":"","sources":["../../src/generator/package-renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"package-renderer.js","sourceRoot":"","sources":["../../src/generator/package-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Transforms agent markdown frontmatter for different AI editor providers.
3
+ *
4
+ * GitHub Copilot agents use full frontmatter (model, tools, agents, handoffs).
5
+ * Claude Code agents use minimal frontmatter (name, description, user-invocable, color).
6
+ * Other providers TBD — fall through with no transformation.
7
+ */
8
+ import type { OutputProvider } from '@nepopsx/core';
9
+ /**
10
+ * Transform an agent file's content for the target provider.
11
+ * Returns the transformed content, or null if the file should be skipped
12
+ * (e.g., orchestrators in Claude Code — they become commands).
13
+ */
14
+ export declare function transformAgentForProvider(content: string, fileName: string, provider: OutputProvider): string | null;
15
+ //# sourceMappingURL=provider-transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-transform.d.ts","sourceRoot":"","sources":["../../src/generator/provider-transform.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA8JpD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,GACvB,MAAM,GAAG,IAAI,CASf"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Transforms agent markdown frontmatter for different AI editor providers.
3
+ *
4
+ * GitHub Copilot agents use full frontmatter (model, tools, agents, handoffs).
5
+ * Claude Code agents use minimal frontmatter (name, description, user-invocable, color).
6
+ * Other providers TBD — fall through with no transformation.
7
+ */
8
+ const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/;
9
+ /**
10
+ * Parse YAML frontmatter from a markdown file.
11
+ * Returns null if no frontmatter block is found.
12
+ */
13
+ function parseFrontmatter(content) {
14
+ const match = content.match(FRONTMATTER_RE);
15
+ if (!match)
16
+ return null;
17
+ const [, yamlBlock, body] = match;
18
+ const frontmatter = {};
19
+ // Simple YAML key-value parser (handles strings, booleans, arrays)
20
+ let currentKey = null;
21
+ let currentArray = null;
22
+ for (const line of yamlBlock.split('\n')) {
23
+ const trimmed = line.trim();
24
+ // Array item
25
+ if (trimmed.startsWith('- ') && currentKey && currentArray !== null) {
26
+ currentArray.push(trimmed.slice(2).trim());
27
+ continue;
28
+ }
29
+ // Flush previous array
30
+ if (currentKey && currentArray !== null) {
31
+ frontmatter[currentKey] = currentArray;
32
+ currentArray = null;
33
+ currentKey = null;
34
+ }
35
+ // Key-value pair
36
+ const kvMatch = trimmed.match(/^([a-z_-]+):\s*(.*)$/i);
37
+ if (!kvMatch)
38
+ continue;
39
+ const [, key, value] = kvMatch;
40
+ if (value === '' || value === undefined) {
41
+ // Could be start of an array
42
+ currentKey = key;
43
+ currentArray = [];
44
+ }
45
+ else {
46
+ // Scalar value
47
+ let parsed = value;
48
+ if (value === 'true')
49
+ parsed = true;
50
+ else if (value === 'false')
51
+ parsed = false;
52
+ else if (/^\d+$/.test(value))
53
+ parsed = parseInt(value, 10);
54
+ else if (value.startsWith('"') && value.endsWith('"'))
55
+ parsed = value.slice(1, -1);
56
+ frontmatter[key] = parsed;
57
+ }
58
+ }
59
+ // Flush final array
60
+ if (currentKey && currentArray !== null) {
61
+ frontmatter[currentKey] = currentArray;
62
+ }
63
+ return { frontmatter, body, raw: content };
64
+ }
65
+ /**
66
+ * Serialize frontmatter back to YAML string.
67
+ */
68
+ function serializeFrontmatter(fm) {
69
+ const lines = [];
70
+ for (const [key, value] of Object.entries(fm)) {
71
+ if (value === undefined || value === null)
72
+ continue;
73
+ if (Array.isArray(value)) {
74
+ lines.push(`${key}:`);
75
+ for (const item of value) {
76
+ lines.push(` - ${item}`);
77
+ }
78
+ }
79
+ else if (typeof value === 'string' && (value.includes(':') || value.includes('"') || value.includes("'") || value.startsWith('[') || value.startsWith('{'))) {
80
+ lines.push(`${key}: "${value.replace(/"/g, '\\"')}"`);
81
+ }
82
+ else {
83
+ lines.push(`${key}: ${value}`);
84
+ }
85
+ }
86
+ return lines.join('\n');
87
+ }
88
+ /** Keys to strip from frontmatter when converting to Claude Code format. */
89
+ const COPILOT_ONLY_KEYS = new Set(['model', 'tools', 'agents', 'handoffs']);
90
+ /** Color assignment based on agent role patterns. */
91
+ function inferColor(name) {
92
+ if (name.includes('orchestrat'))
93
+ return 'green';
94
+ if (name.includes('planner') || name.includes('architect'))
95
+ return 'blue';
96
+ if (name.includes('executor') || name.includes('developer'))
97
+ return 'orange';
98
+ if (name.includes('reflector') || name.includes('reflect'))
99
+ return 'purple';
100
+ if (name.includes('reviewer'))
101
+ return 'yellow';
102
+ if (name.includes('scanner'))
103
+ return 'cyan';
104
+ if (name.includes('writer'))
105
+ return 'orange';
106
+ if (name.includes('qa'))
107
+ return 'red';
108
+ return 'blue';
109
+ }
110
+ /**
111
+ * Determine if an agent file represents an orchestrator.
112
+ * Orchestrators have `agents:` in their frontmatter (they dispatch to sub-agents).
113
+ * In Claude Code, orchestrators become commands, not agents.
114
+ */
115
+ function isOrchestratorAgent(fm) {
116
+ return Array.isArray(fm.agents) && fm.agents.length > 0;
117
+ }
118
+ /**
119
+ * Transform an agent markdown file for Claude Code provider.
120
+ *
121
+ * - Strips model, tools, agents, handoffs from frontmatter
122
+ * - Adds name (from filename) and color
123
+ * - Preserves description and user-invocable
124
+ * - Returns null for orchestrator agents (they become commands in Claude)
125
+ */
126
+ function transformForClaudeCode(content, fileName) {
127
+ const parsed = parseFrontmatter(content);
128
+ if (!parsed)
129
+ return content; // No frontmatter — pass through
130
+ // Orchestrators become commands, not agents
131
+ if (isOrchestratorAgent(parsed.frontmatter))
132
+ return null;
133
+ const agentName = fileName.replace(/\.agent\.md(\.hbs)?$/, '');
134
+ const claudeFm = {
135
+ name: agentName,
136
+ };
137
+ // Preserve description
138
+ if (parsed.frontmatter.description) {
139
+ claudeFm.description = parsed.frontmatter.description;
140
+ }
141
+ // Preserve user-invocable
142
+ if (parsed.frontmatter['user-invocable'] !== undefined) {
143
+ claudeFm['user-invocable'] = parsed.frontmatter['user-invocable'];
144
+ }
145
+ claudeFm.color = inferColor(agentName);
146
+ return `---\n${serializeFrontmatter(claudeFm)}\n---\n${parsed.body}`;
147
+ }
148
+ /**
149
+ * Transform an agent file's content for the target provider.
150
+ * Returns the transformed content, or null if the file should be skipped
151
+ * (e.g., orchestrators in Claude Code — they become commands).
152
+ */
153
+ export function transformAgentForProvider(content, fileName, provider) {
154
+ switch (provider) {
155
+ case 'claude-code':
156
+ return transformForClaudeCode(content, fileName);
157
+ case 'github-copilot':
158
+ return content; // No transformation needed
159
+ default:
160
+ return content; // Other providers TBD — pass through
161
+ }
162
+ }
163
+ //# sourceMappingURL=provider-transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-transform.js","sourceRoot":"","sources":["../../src/generator/provider-transform.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ const program = new Command();
13
13
  program
14
14
  .name('nepopsx')
15
15
  .description('NEPOPSX — AI Agent Platform for Engineering Teams')
16
- .version('0.0.11');
16
+ .version('0.0.13');
17
17
  program
18
18
  .command('init')
19
19
  .description('Initialize a new NEPOPSX workspace (interactive setup)')
@@ -35,6 +35,7 @@ program
35
35
  .option('--agent', 'Agent-assisted mode (generate prompt files for Copilot/Claude)')
36
36
  .option('--apply <path>', 'Apply a JSON response file from agent-assisted install mode')
37
37
  .option('-y, --yes', 'Skip confirmations when auto-enriching agent config')
38
+ .option('--providers <providers...>', 'AI editor providers to generate output for (e.g., github-copilot claude-code)')
38
39
  .action(installCommand);
39
40
  program
40
41
  .command('doctor')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * YAML learning file parser and writer.
3
+ *
4
+ * Reads/writes learning files from .nepopsx/learnings/*.yaml.
5
+ * These are the canonical local store for reflector-produced learnings.
6
+ */
7
+ import type { LearningYaml } from '@nepopsx/core';
8
+ /**
9
+ * Load all YAML learning files from a directory.
10
+ * Recursively scans subdirectories (e.g. team/).
11
+ */
12
+ export declare function loadYamlLearnings(learningsDir: string, agentFilter?: string): LearningYaml[];
13
+ /**
14
+ * Parse a single YAML learning file. Returns null if invalid.
15
+ */
16
+ export declare function parseYamlLearning(filePath: string): LearningYaml | null;
17
+ /**
18
+ * Write a LearningYaml to a .yaml file.
19
+ */
20
+ export declare function writeYamlLearning(dir: string, learning: LearningYaml): string;
21
+ /**
22
+ * Convert a legacy customs/auto/*.md learning to YAML format.
23
+ */
24
+ export declare function convertLegacyLearning(slug: string, content: string, agent: string, appliesTo: string[], confidence: string, type: string, extra?: {
25
+ evidence?: string;
26
+ config_path?: string;
27
+ config_value?: unknown;
28
+ }): LearningYaml;
29
+ //# sourceMappingURL=yaml-learnings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-learnings.d.ts","sourceRoot":"","sources":["../../src/learnings/yaml-learnings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAMlD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAM5F;AAkBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAoCvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAuB7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1E,YAAY,CAed"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * YAML learning file parser and writer.
3
+ *
4
+ * Reads/writes learning files from .nepopsx/learnings/*.yaml.
5
+ * These are the canonical local store for reflector-produced learnings.
6
+ */
7
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
8
+ import { basename, resolve } from 'node:path';
9
+ import { parse, stringify } from 'yaml';
10
+ const VALID_TYPES = new Set(['custom_instruction', 'config_patch', 'skill', 'scope_change']);
11
+ const VALID_CONFIDENCES = new Set(['high', 'medium', 'low']);
12
+ const VALID_STATUSES = new Set(['local', 'pending', 'approved', 'suggested', 'reverted']);
13
+ /**
14
+ * Load all YAML learning files from a directory.
15
+ * Recursively scans subdirectories (e.g. team/).
16
+ */
17
+ export function loadYamlLearnings(learningsDir, agentFilter) {
18
+ if (!existsSync(learningsDir))
19
+ return [];
20
+ const learnings = [];
21
+ scanDir(learningsDir, learnings, agentFilter);
22
+ return learnings;
23
+ }
24
+ function scanDir(dir, out, agentFilter) {
25
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
26
+ const fullPath = resolve(dir, entry.name);
27
+ if (entry.isDirectory()) {
28
+ scanDir(fullPath, out, agentFilter);
29
+ continue;
30
+ }
31
+ if (!entry.name.endsWith('.yaml') && !entry.name.endsWith('.yml'))
32
+ continue;
33
+ const learning = parseYamlLearning(fullPath);
34
+ if (!learning)
35
+ continue;
36
+ if (agentFilter && learning.agent !== agentFilter)
37
+ continue;
38
+ out.push(learning);
39
+ }
40
+ }
41
+ /**
42
+ * Parse a single YAML learning file. Returns null if invalid.
43
+ */
44
+ export function parseYamlLearning(filePath) {
45
+ try {
46
+ const raw = readFileSync(filePath, 'utf-8');
47
+ const parsed = parse(raw);
48
+ if (!parsed || typeof parsed !== 'object')
49
+ return null;
50
+ const slug = parsed.slug ?? basename(filePath).replace(/\.ya?ml$/, '');
51
+ const type = parsed.type;
52
+ const confidence = parsed.confidence ?? 'medium';
53
+ const agent = parsed.agent ?? '';
54
+ const status = parsed.status ?? 'local';
55
+ if (!VALID_TYPES.has(type))
56
+ return null;
57
+ if (!VALID_CONFIDENCES.has(confidence))
58
+ return null;
59
+ if (!VALID_STATUSES.has(status))
60
+ return null;
61
+ if (typeof parsed.content !== 'string' || parsed.content.trim() === '')
62
+ return null;
63
+ return {
64
+ slug,
65
+ type,
66
+ confidence,
67
+ agent,
68
+ applies_to: Array.isArray(parsed.applies_to) ? parsed.applies_to : [],
69
+ status,
70
+ content: parsed.content.trim(),
71
+ evidence: parsed.evidence ?? undefined,
72
+ created_at: parsed.created_at ?? undefined,
73
+ session_id: parsed.session_id ?? undefined,
74
+ source: parsed.source ?? 'reflector',
75
+ config_path: parsed.config_path ?? undefined,
76
+ config_value: parsed.config_value ?? undefined,
77
+ };
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ /**
84
+ * Write a LearningYaml to a .yaml file.
85
+ */
86
+ export function writeYamlLearning(dir, learning) {
87
+ mkdirSync(dir, { recursive: true });
88
+ const data = {
89
+ slug: learning.slug,
90
+ type: learning.type,
91
+ confidence: learning.confidence,
92
+ agent: learning.agent,
93
+ applies_to: learning.applies_to,
94
+ status: learning.status,
95
+ content: learning.content,
96
+ };
97
+ if (learning.evidence)
98
+ data.evidence = learning.evidence;
99
+ if (learning.created_at)
100
+ data.created_at = learning.created_at;
101
+ if (learning.session_id)
102
+ data.session_id = learning.session_id;
103
+ if (learning.source)
104
+ data.source = learning.source;
105
+ if (learning.config_path)
106
+ data.config_path = learning.config_path;
107
+ if (learning.config_value !== undefined)
108
+ data.config_value = learning.config_value;
109
+ const filePath = resolve(dir, `${learning.slug}.yaml`);
110
+ writeFileSync(filePath, stringify(data, { lineWidth: 120 }), 'utf-8');
111
+ return filePath;
112
+ }
113
+ /**
114
+ * Convert a legacy customs/auto/*.md learning to YAML format.
115
+ */
116
+ export function convertLegacyLearning(slug, content, agent, appliesTo, confidence, type, extra) {
117
+ return {
118
+ slug,
119
+ type: (VALID_TYPES.has(type) ? type : 'custom_instruction'),
120
+ confidence: (VALID_CONFIDENCES.has(confidence) ? confidence : 'medium'),
121
+ agent,
122
+ applies_to: appliesTo,
123
+ status: 'local',
124
+ content: content.trim(),
125
+ evidence: extra?.evidence,
126
+ source: 'reflector',
127
+ config_path: extra?.config_path,
128
+ config_value: extra?.config_value,
129
+ created_at: new Date().toISOString(),
130
+ };
131
+ }
132
+ //# sourceMappingURL=yaml-learnings.js.map