@nepopsx/cli 0.0.24 → 0.0.26

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 (139) hide show
  1. package/dist/agents/remote-config.d.ts +12 -0
  2. package/dist/agents/remote-config.d.ts.map +1 -1
  3. package/dist/agents/remote-config.js +19 -0
  4. package/dist/agents/remote-config.js.map +1 -1
  5. package/dist/commands/guard.d.ts +10 -0
  6. package/dist/commands/guard.d.ts.map +1 -0
  7. package/dist/commands/guard.js +63 -0
  8. package/dist/commands/guard.js.map +1 -0
  9. package/dist/commands/import-agents.d.ts +17 -0
  10. package/dist/commands/import-agents.d.ts.map +1 -0
  11. package/dist/commands/import-agents.js +192 -0
  12. package/dist/commands/import-agents.js.map +1 -0
  13. package/dist/commands/import.d.ts +19 -0
  14. package/dist/commands/import.d.ts.map +1 -0
  15. package/dist/commands/import.js +182 -0
  16. package/dist/commands/import.js.map +1 -0
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +21 -13
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/install.d.ts.map +1 -1
  21. package/dist/commands/install.js +12 -1
  22. package/dist/commands/install.js.map +1 -1
  23. package/dist/commands/login.d.ts.map +1 -1
  24. package/dist/commands/login.js +15 -37
  25. package/dist/commands/login.js.map +1 -1
  26. package/dist/commands/push-learnings.d.ts.map +1 -1
  27. package/dist/commands/push-learnings.js +8 -1
  28. package/dist/commands/push-learnings.js.map +1 -1
  29. package/dist/commands/scan.d.ts.map +1 -1
  30. package/dist/commands/scan.js +17 -0
  31. package/dist/commands/scan.js.map +1 -1
  32. package/dist/commands/sync.d.ts.map +1 -1
  33. package/dist/commands/sync.js +29 -4
  34. package/dist/commands/sync.js.map +1 -1
  35. package/dist/commands/up.d.ts.map +1 -1
  36. package/dist/commands/up.js +92 -9
  37. package/dist/commands/up.js.map +1 -1
  38. package/dist/config/api-config.d.ts +5 -7
  39. package/dist/config/api-config.d.ts.map +1 -1
  40. package/dist/config/api-config.js +2 -3
  41. package/dist/config/api-config.js.map +1 -1
  42. package/dist/config/global-config.d.ts +52 -0
  43. package/dist/config/global-config.d.ts.map +1 -0
  44. package/dist/config/global-config.js +161 -0
  45. package/dist/config/global-config.js.map +1 -0
  46. package/dist/config/global-config.test.d.ts +2 -0
  47. package/dist/config/global-config.test.d.ts.map +1 -0
  48. package/dist/config/global-config.test.js +62 -0
  49. package/dist/config/global-config.test.js.map +1 -0
  50. package/dist/enrichment/workflow.d.ts.map +1 -1
  51. package/dist/enrichment/workflow.js +8 -1
  52. package/dist/enrichment/workflow.js.map +1 -1
  53. package/dist/guard/policy.d.ts +38 -0
  54. package/dist/guard/policy.d.ts.map +1 -0
  55. package/dist/guard/policy.js +62 -0
  56. package/dist/guard/policy.js.map +1 -0
  57. package/dist/guard/policy.test.d.ts +2 -0
  58. package/dist/guard/policy.test.d.ts.map +1 -0
  59. package/dist/guard/policy.test.js +47 -0
  60. package/dist/guard/policy.test.js.map +1 -0
  61. package/dist/hooks/capture-hooks.d.ts.map +1 -1
  62. package/dist/hooks/capture-hooks.js +36 -1
  63. package/dist/hooks/capture-hooks.js.map +1 -1
  64. package/dist/import/adapter.d.ts +82 -0
  65. package/dist/import/adapter.d.ts.map +1 -0
  66. package/dist/import/adapter.js +111 -0
  67. package/dist/import/adapter.js.map +1 -0
  68. package/dist/import/adapter.test.d.ts +2 -0
  69. package/dist/import/adapter.test.d.ts.map +1 -0
  70. package/dist/import/adapter.test.js +100 -0
  71. package/dist/import/adapter.test.js.map +1 -0
  72. package/dist/import/agents/agent-adapter.d.ts +83 -0
  73. package/dist/import/agents/agent-adapter.d.ts.map +1 -0
  74. package/dist/import/agents/agent-adapter.js +66 -0
  75. package/dist/import/agents/agent-adapter.js.map +1 -0
  76. package/dist/import/agents/agent-adapter.test.d.ts +2 -0
  77. package/dist/import/agents/agent-adapter.test.d.ts.map +1 -0
  78. package/dist/import/agents/agent-adapter.test.js +99 -0
  79. package/dist/import/agents/agent-adapter.test.js.map +1 -0
  80. package/dist/import/agents/artifact-parser.d.ts +26 -0
  81. package/dist/import/agents/artifact-parser.d.ts.map +1 -0
  82. package/dist/import/agents/artifact-parser.js +40 -0
  83. package/dist/import/agents/artifact-parser.js.map +1 -0
  84. package/dist/import/agents/assembler.d.ts +32 -0
  85. package/dist/import/agents/assembler.d.ts.map +1 -0
  86. package/dist/import/agents/assembler.js +0 -0
  87. package/dist/import/agents/assembler.js.map +1 -0
  88. package/dist/import/agents/assembler.test.d.ts +2 -0
  89. package/dist/import/agents/assembler.test.d.ts.map +1 -0
  90. package/dist/import/agents/assembler.test.js +115 -0
  91. package/dist/import/agents/assembler.test.js.map +1 -0
  92. package/dist/import/agents/claude-code-adapter.d.ts +11 -0
  93. package/dist/import/agents/claude-code-adapter.d.ts.map +1 -0
  94. package/dist/import/agents/claude-code-adapter.js +84 -0
  95. package/dist/import/agents/claude-code-adapter.js.map +1 -0
  96. package/dist/import/agents/copilot-agent-adapter.d.ts +12 -0
  97. package/dist/import/agents/copilot-agent-adapter.d.ts.map +1 -0
  98. package/dist/import/agents/copilot-agent-adapter.js +89 -0
  99. package/dist/import/agents/copilot-agent-adapter.js.map +1 -0
  100. package/dist/import/agents/scanner.d.ts +15 -0
  101. package/dist/import/agents/scanner.d.ts.map +1 -0
  102. package/dist/import/agents/scanner.js +87 -0
  103. package/dist/import/agents/scanner.js.map +1 -0
  104. package/dist/import/agents/secret-scan.d.ts +14 -0
  105. package/dist/import/agents/secret-scan.d.ts.map +1 -0
  106. package/dist/import/agents/secret-scan.js +64 -0
  107. package/dist/import/agents/secret-scan.js.map +1 -0
  108. package/dist/import/agents/secret-scan.test.d.ts +2 -0
  109. package/dist/import/agents/secret-scan.test.d.ts.map +1 -0
  110. package/dist/import/agents/secret-scan.test.js +41 -0
  111. package/dist/import/agents/secret-scan.test.js.map +1 -0
  112. package/dist/import/claude-memory-adapter.d.ts +20 -0
  113. package/dist/import/claude-memory-adapter.d.ts.map +1 -0
  114. package/dist/import/claude-memory-adapter.js +87 -0
  115. package/dist/import/claude-memory-adapter.js.map +1 -0
  116. package/dist/import/copilot-adapter.d.ts +13 -0
  117. package/dist/import/copilot-adapter.d.ts.map +1 -0
  118. package/dist/import/copilot-adapter.js +75 -0
  119. package/dist/import/copilot-adapter.js.map +1 -0
  120. package/dist/index.js +61 -2
  121. package/dist/index.js.map +1 -1
  122. package/dist/learnings/memory-index.d.ts +17 -0
  123. package/dist/learnings/memory-index.d.ts.map +1 -0
  124. package/dist/learnings/memory-index.js +73 -0
  125. package/dist/learnings/memory-index.js.map +1 -0
  126. package/dist/licensing/installer.d.ts.map +1 -1
  127. package/dist/licensing/installer.js +3 -5
  128. package/dist/licensing/installer.js.map +1 -1
  129. package/dist/licensing/license-manager.d.ts +6 -5
  130. package/dist/licensing/license-manager.d.ts.map +1 -1
  131. package/dist/licensing/license-manager.js +10 -8
  132. package/dist/licensing/license-manager.js.map +1 -1
  133. package/dist/licensing/workspace-name.d.ts +1 -1
  134. package/dist/licensing/workspace-name.js +1 -1
  135. package/dist/utils/fetch.d.ts +8 -0
  136. package/dist/utils/fetch.d.ts.map +1 -1
  137. package/dist/utils/fetch.js +35 -0
  138. package/dist/utils/fetch.js.map +1 -1
  139. package/package.json +2 -2
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Repo scanner — sweep both ecosystems for every comprehensible artifact in one pass.
3
+ *
4
+ * Runs all agent adapters, then discovers the Skills and commands an agent bundle can
5
+ * link to. (MCP/hooks/settings + `~/.claude`/`~/.copilot` user scopes land in slice 3.)
6
+ */
7
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
8
+ import { basename, join, relative } from 'node:path';
9
+ import { claudeCodeAgentAdapter } from './claude-code-adapter.js';
10
+ import { copilotAgentAdapter } from './copilot-agent-adapter.js';
11
+ import { parseSkill, parseCommand } from './artifact-parser.js';
12
+ const AGENT_ADAPTERS = [claudeCodeAgentAdapter, copilotAgentAdapter];
13
+ function rel(rootDir, p) {
14
+ return relative(rootDir, p).replace(/\\/g, '/');
15
+ }
16
+ /** Recursively list files under `dir` ending with `suffix` (commands can be namespaced). */
17
+ function walkFiles(dir, suffix) {
18
+ if (!existsSync(dir))
19
+ return [];
20
+ const out = [];
21
+ for (const entry of readdirSync(dir)) {
22
+ const full = join(dir, entry);
23
+ let st;
24
+ try {
25
+ st = statSync(full);
26
+ }
27
+ catch {
28
+ continue;
29
+ }
30
+ if (st.isDirectory())
31
+ out.push(...walkFiles(full, suffix));
32
+ else if (entry.endsWith(suffix))
33
+ out.push(full);
34
+ }
35
+ return out.sort();
36
+ }
37
+ /** List immediate subdirectories of `dir` that contain `fileName` (e.g. SKILL.md). */
38
+ function listSkillDirs(dir, fileName) {
39
+ if (!existsSync(dir))
40
+ return [];
41
+ const out = [];
42
+ for (const entry of readdirSync(dir)) {
43
+ const sub = join(dir, entry);
44
+ let st;
45
+ try {
46
+ st = statSync(sub);
47
+ }
48
+ catch {
49
+ continue;
50
+ }
51
+ if (!st.isDirectory())
52
+ continue;
53
+ const file = join(sub, fileName);
54
+ if (existsSync(file))
55
+ out.push({ dirName: basename(sub), file });
56
+ }
57
+ return out.sort((a, b) => a.dirName.localeCompare(b.dirName));
58
+ }
59
+ export function scanRepo(rootDir) {
60
+ const agents = [];
61
+ for (const adapter of AGENT_ADAPTERS) {
62
+ for (const file of adapter.detect(rootDir)) {
63
+ const parsed = adapter.parse(file, readFileSync(file, 'utf-8'), rootDir);
64
+ if (parsed)
65
+ agents.push(parsed);
66
+ }
67
+ }
68
+ const skills = [];
69
+ const skillRoots = [
70
+ ['claude-code', ['.claude', 'skills']],
71
+ ['github-copilot', ['.github', 'skills']],
72
+ ];
73
+ for (const [provider, parts] of skillRoots) {
74
+ for (const { dirName, file } of listSkillDirs(join(rootDir, ...parts), 'SKILL.md')) {
75
+ skills.push(parseSkill(readFileSync(file, 'utf-8'), dirName, provider, rel(rootDir, file)));
76
+ }
77
+ }
78
+ const commands = [];
79
+ for (const file of walkFiles(join(rootDir, '.claude', 'commands'), '.md')) {
80
+ commands.push(parseCommand(file, readFileSync(file, 'utf-8'), '.md', 'claude-code', rel(rootDir, file)));
81
+ }
82
+ for (const file of walkFiles(join(rootDir, '.github', 'prompts'), '.prompt.md')) {
83
+ commands.push(parseCommand(file, readFileSync(file, 'utf-8'), '.prompt.md', 'github-copilot', rel(rootDir, file)));
84
+ }
85
+ return { agents, skills, commands };
86
+ }
87
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/import/agents/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * CLI-side secret redaction — scrub credentials BEFORE a comprehended agent leaves
3
+ * the machine. Agent configs and prompts embed keys/tokens far more often than plain
4
+ * memory does, so this is the first line of defense; the backend re-scans as a gate.
5
+ */
6
+ export interface RedactionResult<T> {
7
+ value: T;
8
+ count: number;
9
+ }
10
+ /** Redact any secrets in a string, returning the scrubbed text + how many were hit. */
11
+ export declare function redactSecrets(text: string): RedactionResult<string>;
12
+ /** Recursively redact secrets in any JSON-ish value (e.g. MCP server env blocks). */
13
+ export declare function redactValue<T>(value: T): RedactionResult<T>;
14
+ //# sourceMappingURL=secret-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scan.d.ts","sourceRoot":"","sources":["../../../src/import/agents/secret-scan.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;CACf;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAenE;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAyB3D"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * CLI-side secret redaction — scrub credentials BEFORE a comprehended agent leaves
3
+ * the machine. Agent configs and prompts embed keys/tokens far more often than plain
4
+ * memory does, so this is the first line of defense; the backend re-scans as a gate.
5
+ */
6
+ const SECRET_PATTERNS = [
7
+ { re: /-----BEGIN[ A-Z]*PRIVATE KEY-----[\s\S]*?-----END[ A-Z]*PRIVATE KEY-----/g, label: 'private-key' },
8
+ { re: /AKIA[0-9A-Z]{16}/g, label: 'aws-access-key' },
9
+ { re: /gh[pousr]_[A-Za-z0-9]{36,}/g, label: 'github-token' },
10
+ { re: /sk-[A-Za-z0-9]{20,}/g, label: 'openai-key' },
11
+ { re: /xox[baprs]-[A-Za-z0-9-]{10,}/g, label: 'slack-token' },
12
+ { re: /eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g, label: 'jwt' },
13
+ // key = value / key: value assignments (redact only the value, keep the key)
14
+ {
15
+ re: /\b(?:api[_-]?key|secret|token|password|passwd|access[_-]?key|client[_-]?secret)\b\s*[:=]\s*["']?([A-Za-z0-9_\-/+]{16,})["']?/gi,
16
+ label: 'assigned-secret',
17
+ },
18
+ ];
19
+ /** Redact any secrets in a string, returning the scrubbed text + how many were hit. */
20
+ export function redactSecrets(text) {
21
+ if (!text)
22
+ return { value: text, count: 0 };
23
+ let count = 0;
24
+ let out = text;
25
+ for (const { re, label } of SECRET_PATTERNS) {
26
+ out = out.replace(re, (match, captured) => {
27
+ count++;
28
+ // For assigned-secret, blank only the captured value so the key stays readable.
29
+ if (captured && match.includes(captured)) {
30
+ return match.replace(captured, `[REDACTED:${label}]`);
31
+ }
32
+ return `[REDACTED:${label}]`;
33
+ });
34
+ }
35
+ return { value: out, count };
36
+ }
37
+ /** Recursively redact secrets in any JSON-ish value (e.g. MCP server env blocks). */
38
+ export function redactValue(value) {
39
+ if (typeof value === 'string') {
40
+ const r = redactSecrets(value);
41
+ return { value: r.value, count: r.count };
42
+ }
43
+ if (Array.isArray(value)) {
44
+ let count = 0;
45
+ const arr = value.map((v) => {
46
+ const r = redactValue(v);
47
+ count += r.count;
48
+ return r.value;
49
+ });
50
+ return { value: arr, count };
51
+ }
52
+ if (value && typeof value === 'object') {
53
+ let count = 0;
54
+ const out = {};
55
+ for (const [k, v] of Object.entries(value)) {
56
+ const r = redactValue(v);
57
+ count += r.count;
58
+ out[k] = r.value;
59
+ }
60
+ return { value: out, count };
61
+ }
62
+ return { value, count: 0 };
63
+ }
64
+ //# sourceMappingURL=secret-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scan.js","sourceRoot":"","sources":["../../../src/import/agents/secret-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=secret-scan.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scan.test.d.ts","sourceRoot":"","sources":["../../../src/import/agents/secret-scan.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { strict as assert } from 'node:assert';
2
+ import { describe, it } from 'node:test';
3
+ import { redactSecrets, redactValue } from './secret-scan.js';
4
+ describe('redactSecrets', () => {
5
+ it('redacts an AWS access key', () => {
6
+ const r = redactSecrets('use AKIAIOSFODNN7EXAMPLE in the config');
7
+ assert.equal(r.count, 1);
8
+ assert.match(r.value, /\[REDACTED:aws-access-key\]/);
9
+ assert.ok(!r.value.includes('AKIAIOSFODNN7EXAMPLE'));
10
+ });
11
+ it('redacts a private key block', () => {
12
+ const r = redactSecrets('-----BEGIN RSA PRIVATE KEY-----\nMIIabc123\n-----END RSA PRIVATE KEY-----');
13
+ assert.equal(r.count, 1);
14
+ assert.ok(!r.value.includes('MIIabc123'));
15
+ });
16
+ it('redacts an assigned secret value but keeps the key name', () => {
17
+ const r = redactSecrets('api_key: "abcd1234efgh5678ijkl"');
18
+ assert.ok(r.count >= 1);
19
+ assert.match(r.value, /api_key/);
20
+ assert.ok(!r.value.includes('abcd1234efgh5678ijkl'));
21
+ });
22
+ it('leaves clean text untouched', () => {
23
+ const clean = 'You are a careful code reviewer. Do not edit files.';
24
+ const r = redactSecrets(clean);
25
+ assert.equal(r.count, 0);
26
+ assert.equal(r.value, clean);
27
+ });
28
+ });
29
+ describe('redactValue (nested)', () => {
30
+ it('redacts secrets in nested object/array values (e.g. MCP env)', () => {
31
+ const r = redactValue({
32
+ mcpServers: [{ env: { GITHUB_TOKEN: `ghp_${'a'.repeat(36)}` } }],
33
+ note: 'nothing secret here',
34
+ });
35
+ assert.ok(r.count >= 1);
36
+ const json = JSON.stringify(r.value);
37
+ assert.ok(!json.includes('ghp_aaaa'));
38
+ assert.match(json, /REDACTED/);
39
+ });
40
+ });
41
+ //# sourceMappingURL=secret-scan.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scan.test.js","sourceRoot":"","sources":["../../../src/import/agents/secret-scan.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE9D,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,GAAG,aAAa,CAAC,wCAAwC,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,aAAa,CAAC,2EAA2E,CAAC,CAAC;QACrG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,GAAG,aAAa,CAAC,iCAAiC,CAAC,CAAC;QAC3D,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACxB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,KAAK,GAAG,qDAAqD,CAAC;QACpE,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,GAAG,WAAW,CAAC;YACpB,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAChE,IAAI,EAAE,qBAAqB;SAC5B,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Claude project-memory adapter.
3
+ *
4
+ * Source (machine store, per-developer):
5
+ * <claude-home>/projects/<slugified-cwd>/memory/*.md
6
+ *
7
+ * where <claude-home> is `CLAUDE_CONFIG_DIR` or `~/.claude`. The memory dir is
8
+ * derived from the CURRENT repo path, so this only ever reads THIS project's
9
+ * memory — there is no cross-project guessing (the plan's "skip + warn on slug
10
+ * mismatch" is satisfied by construction).
11
+ *
12
+ * These files carry structured frontmatter (`name`, `description`,
13
+ * `metadata.type`) that maps almost 1:1 to our learning schema — the highest
14
+ * fidelity source.
15
+ */
16
+ import { type MemoryAdapter } from './adapter.js';
17
+ /** The memory dir Claude Code keeps for a given project path. */
18
+ export declare function claudeMemoryDir(rootDir: string): string;
19
+ export declare const claudeMemoryAdapter: MemoryAdapter;
20
+ //# sourceMappingURL=claude-memory-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-memory-adapter.d.ts","sourceRoot":"","sources":["../../src/import/claude-memory-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAEL,KAAK,aAAa,EAKnB,MAAM,cAAc,CAAC;AAUtB,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,eAAO,MAAM,mBAAmB,EAAE,aAyDjC,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Claude project-memory adapter.
3
+ *
4
+ * Source (machine store, per-developer):
5
+ * <claude-home>/projects/<slugified-cwd>/memory/*.md
6
+ *
7
+ * where <claude-home> is `CLAUDE_CONFIG_DIR` or `~/.claude`. The memory dir is
8
+ * derived from the CURRENT repo path, so this only ever reads THIS project's
9
+ * memory — there is no cross-project guessing (the plan's "skip + warn on slug
10
+ * mismatch" is satisfied by construction).
11
+ *
12
+ * These files carry structured frontmatter (`name`, `description`,
13
+ * `metadata.type`) that maps almost 1:1 to our learning schema — the highest
14
+ * fidelity source.
15
+ */
16
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
17
+ import { homedir } from 'node:os';
18
+ import { basename, join } from 'node:path';
19
+ import { kebab, parseFrontmatter, slugifyPath, } from './adapter.js';
20
+ const SOURCE = 'import:claude-memory';
21
+ /** Resolve Claude Code's config home (honors CLAUDE_CONFIG_DIR, like Claude Code). */
22
+ function claudeHome() {
23
+ const override = process.env.CLAUDE_CONFIG_DIR;
24
+ return override && override.trim().length > 0 ? override : join(homedir(), '.claude');
25
+ }
26
+ /** The memory dir Claude Code keeps for a given project path. */
27
+ export function claudeMemoryDir(rootDir) {
28
+ return join(claudeHome(), 'projects', slugifyPath(rootDir), 'memory');
29
+ }
30
+ export const claudeMemoryAdapter = {
31
+ id: 'claude-memory',
32
+ label: 'Claude project memory',
33
+ detect(ctx) {
34
+ const dir = claudeMemoryDir(ctx.rootDir);
35
+ if (!existsSync(dir))
36
+ return [];
37
+ try {
38
+ return readdirSync(dir)
39
+ .filter((f) => f.endsWith('.md') && f !== 'MEMORY.md') // skip the index
40
+ .map((f) => join(dir, f))
41
+ .filter((p) => {
42
+ try {
43
+ return statSync(p).isFile();
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ })
49
+ .sort();
50
+ }
51
+ catch {
52
+ return [];
53
+ }
54
+ },
55
+ parse(filePath) {
56
+ let raw;
57
+ try {
58
+ raw = readFileSync(filePath, 'utf-8');
59
+ }
60
+ catch {
61
+ return [];
62
+ }
63
+ const { data, body } = parseFrontmatter(raw);
64
+ const content = body.trim();
65
+ if (!content)
66
+ return [];
67
+ const fileStem = basename(filePath).replace(/\.md$/, '');
68
+ const name = typeof data.name === 'string' && data.name.trim().length > 0 ? data.name.trim() : fileStem;
69
+ const description = typeof data.description === 'string' && data.description.trim().length > 0
70
+ ? data.description.trim()
71
+ : name.replace(/[-_]/g, ' ');
72
+ // `user`/`feedback`/`project`/`reference` memories are all prose guidance →
73
+ // custom_instruction. The backend classifier may still override.
74
+ return [
75
+ {
76
+ slug: kebab(name),
77
+ title: description,
78
+ content,
79
+ type: 'custom_instruction',
80
+ services: [], // project memory is workspace-wide, not service-scoped
81
+ source: SOURCE,
82
+ importedFrom: filePath,
83
+ },
84
+ ];
85
+ },
86
+ };
87
+ //# sourceMappingURL=claude-memory-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-memory-adapter.js","sourceRoot":"","sources":["../../src/import/claude-memory-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * GitHub Copilot custom-instructions adapter.
3
+ *
4
+ * Sources (repo-committed, the zero-config default):
5
+ * .github/copilot-instructions.md — repo-wide instructions (no frontmatter)
6
+ * .github/instructions/**\/*.instructions.md — path-scoped (optional `applyTo` frontmatter)
7
+ *
8
+ * Each H2/H3 section becomes a learning candidate; `applyTo` globs drive service
9
+ * scope inference. Type is left unset so the backend classifier decides.
10
+ */
11
+ import { type MemoryAdapter } from './adapter.js';
12
+ export declare const copilotAdapter: MemoryAdapter;
13
+ //# sourceMappingURL=copilot-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-adapter.d.ts","sourceRoot":"","sources":["../../src/import/copilot-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAEL,KAAK,aAAa,EAOnB,MAAM,cAAc,CAAC;AAItB,eAAO,MAAM,cAAc,EAAE,aA6D5B,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * GitHub Copilot custom-instructions adapter.
3
+ *
4
+ * Sources (repo-committed, the zero-config default):
5
+ * .github/copilot-instructions.md — repo-wide instructions (no frontmatter)
6
+ * .github/instructions/**\/*.instructions.md — path-scoped (optional `applyTo` frontmatter)
7
+ *
8
+ * Each H2/H3 section becomes a learning candidate; `applyTo` globs drive service
9
+ * scope inference. Type is left unset so the backend classifier decides.
10
+ */
11
+ import { existsSync, readFileSync, statSync } from 'node:fs';
12
+ import { basename, join, relative } from 'node:path';
13
+ import { sync as globSync } from 'glob';
14
+ import { inferServices, kebab, parseFrontmatter, splitByHeadings, toGlobList, } from './adapter.js';
15
+ const SOURCE = 'import:copilot';
16
+ export const copilotAdapter = {
17
+ id: 'copilot',
18
+ label: 'GitHub Copilot instructions',
19
+ detect(ctx) {
20
+ const found = [];
21
+ const repoWide = join(ctx.rootDir, '.github', 'copilot-instructions.md');
22
+ if (existsSync(repoWide) && statSync(repoWide).isFile())
23
+ found.push(repoWide);
24
+ // Path-scoped instruction files (recursive).
25
+ const scoped = globSync('.github/instructions/**/*.instructions.md', {
26
+ cwd: ctx.rootDir,
27
+ absolute: true,
28
+ nodir: true,
29
+ });
30
+ return [...found, ...scoped.sort()];
31
+ },
32
+ parse(filePath, ctx) {
33
+ let raw;
34
+ try {
35
+ raw = readFileSync(filePath, 'utf-8');
36
+ }
37
+ catch {
38
+ return [];
39
+ }
40
+ const { data, body } = parseFrontmatter(raw);
41
+ const applyTo = toGlobList(data.applyTo);
42
+ const services = inferServices(applyTo, ctx.services);
43
+ // Stem disambiguates slugs across files (4-tuple is org/workspace/agent/slug).
44
+ const stem = basename(filePath)
45
+ .replace(/\.instructions\.md$/, '')
46
+ .replace(/\.md$/, '');
47
+ const relPath = relative(ctx.rootDir, filePath);
48
+ const sections = splitByHeadings(body);
49
+ // A focused instructions file with no headings → treat the whole file as one.
50
+ if (sections.length === 0) {
51
+ const content = body.trim();
52
+ if (!content)
53
+ return [];
54
+ return [
55
+ {
56
+ slug: kebab(stem),
57
+ title: stem.replace(/[-_]/g, ' '),
58
+ content,
59
+ services,
60
+ source: SOURCE,
61
+ importedFrom: relPath,
62
+ },
63
+ ];
64
+ }
65
+ return sections.map((s) => ({
66
+ slug: kebab(`${stem} ${s.title}`),
67
+ title: s.title,
68
+ content: s.body,
69
+ services,
70
+ source: SOURCE,
71
+ importedFrom: relPath,
72
+ }));
73
+ },
74
+ };
75
+ //# sourceMappingURL=copilot-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-adapter.js","sourceRoot":"","sources":["../../src/import/copilot-adapter.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,7 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
1
3
  import { Command } from 'commander';
4
+ import chalk from 'chalk';
2
5
  import { initCommand } from './commands/init.js';
3
6
  import { upCommand } from './commands/up.js';
4
7
  import { syncCommand } from './commands/sync.js';
@@ -9,12 +12,16 @@ import { loginCommand } from './commands/login.js';
9
12
  import { scanCommand } from './commands/scan.js';
10
13
  import { pushLearningsCommand } from './commands/push-learnings.js';
11
14
  import { captureCommand } from './commands/capture.js';
15
+ import { importCommand } from './commands/import.js';
16
+ import { importAgentsCommand } from './commands/import-agents.js';
17
+ import { guardCommand } from './commands/guard.js';
12
18
  import { serverClearCommand, serverSetCommand, serverShowCommand, } from './commands/server.js';
19
+ const pkg = JSON.parse(readFileSync(fileURLToPath(new URL('../package.json', import.meta.url)), 'utf8'));
13
20
  const program = new Command();
14
21
  program
15
22
  .name('nepopsx')
16
23
  .description('NEPOPSX — AI Agent Platform for Engineering Teams')
17
- .version('0.0.19');
24
+ .version(pkg.version);
18
25
  program
19
26
  .command('up')
20
27
  .description('Guided onboarding: scaffold + resolve the entitled agent + tailor it via your own Copilot/Claude (no API keys) + render. Resumable — safe to re-run.')
@@ -99,6 +106,27 @@ program
99
106
  .option('--workspace <slug>', 'Workspace slug')
100
107
  .option('--agent <name>', 'Only capture learnings for a specific agent')
101
108
  .action(captureCommand);
109
+ program
110
+ .command('import')
111
+ .description('Ingest existing agent-memory files (GitHub Copilot instructions, Claude project memory) as pending learnings')
112
+ .option('-c, --config <path>', 'Path to workspace.yaml', '.nepopsx/workspace.yaml')
113
+ .option('--workspace <slug>', 'Workspace slug (auto-detected if omitted)')
114
+ .option('--source <source>', 'Which source to import: copilot | claude-memory | all', 'all')
115
+ .option('--agent <name>', 'Attribute imports to this agent (default: the source adapter id)')
116
+ .option('--dry-run', 'Preview candidates without sending anything')
117
+ .option('--force', 'Re-import files already recorded under .nepopsx/imported/')
118
+ .action(importCommand);
119
+ program
120
+ .command('import-agents')
121
+ .description('Comprehend existing custom agents (.claude/agents, .github/agents) into governed PENDING bundles')
122
+ .option('-c, --config <path>', 'Path to workspace.yaml', '.nepopsx/workspace.yaml')
123
+ .option('--workspace <slug>', 'Workspace slug (auto-detected if omitted)')
124
+ .option('--dry-run', 'Preview comprehended bundles + redaction + batch plan without sending')
125
+ .action(importAgentsCommand);
126
+ program
127
+ .command('guard')
128
+ .description('PreToolUse policy hook — blocks dangerous tool calls from .nepopsx/policy.json + built-in rules (reads the hook payload on stdin)')
129
+ .action(guardCommand);
102
130
  program
103
131
  .command('scan')
104
132
  .description('LLM-powered analysis — enrich workspace.yaml and installed agent configs')
@@ -117,5 +145,36 @@ program
117
145
  .option('--apply <path>', 'Apply a JSON response file from agent-assisted mode')
118
146
  .option('--resume', 'Resume a previously interrupted scan using cached service results')
119
147
  .action(scanCommand);
120
- program.parse();
148
+ /**
149
+ * Single fatal-error boundary for the whole CLI. Without this, a Ctrl-C at any
150
+ * @inquirer/prompts prompt throws an unhandled ExitPromptError and Node dumps a
151
+ * raw V8 stack trace at the user. Here we turn that into a clean cancel, and
152
+ * every other uncaught failure into one friendly line (full trace behind
153
+ * NEPOPSX_DEBUG=1).
154
+ */
155
+ function handleFatal(err) {
156
+ const debug = process.env.NEPOPSX_DEBUG === '1';
157
+ const name = err instanceof Error ? err.name : '';
158
+ const message = err instanceof Error ? err.message : String(err);
159
+ // User cancelled a prompt (Ctrl-C / Esc). Not an error — exit quietly.
160
+ if (name === 'ExitPromptError' || /force closed the prompt/i.test(message)) {
161
+ console.error(chalk.dim('\n Cancelled.'));
162
+ process.exit(130);
163
+ }
164
+ console.error(chalk.red(`\n ✗ ${message || 'Something went wrong.'}`));
165
+ if (debug && err instanceof Error && err.stack) {
166
+ console.error(chalk.dim(err.stack));
167
+ }
168
+ else {
169
+ console.error(chalk.dim(' Re-run with NEPOPSX_DEBUG=1 for the full stack trace.'));
170
+ }
171
+ process.exit(1);
172
+ }
173
+ // A bare Ctrl-C outside an active prompt would otherwise exit 0 silently.
174
+ process.on('SIGINT', () => {
175
+ console.error(chalk.dim('\n Cancelled.'));
176
+ process.exit(130);
177
+ });
178
+ process.on('unhandledRejection', handleFatal);
179
+ program.parseAsync().catch(handleFatal);
121
180
  //# sourceMappingURL=index.js.map
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,17 @@
1
+ /**
2
+ * `.nepopsx/MEMORY.md` — a generated, git-committed, human-scannable index of the
3
+ * local learning store, modeled on `~/.claude/MEMORY.md`.
4
+ *
5
+ * One line per learning (title → status → one-line hook → link), so the store is
6
+ * reviewable in a PR diff. Regenerated by `nepopsx import` and `nepopsx sync`. It
7
+ * scans both the hand-authored `learnings/` dir and the imported provenance dir.
8
+ */
9
+ /**
10
+ * Regenerate `<rootDir>/.nepopsx/MEMORY.md`. Returns the count of indexed learnings
11
+ * and the index path. Best-effort: never throws.
12
+ */
13
+ export declare function regenerateMemoryIndex(rootDir: string): {
14
+ count: number;
15
+ path: string;
16
+ };
17
+ //# sourceMappingURL=memory-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-index.d.ts","sourceRoot":"","sources":["../../src/learnings/memory-index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsBH;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA4CtF"}