@nepopsx/cli 0.0.2 → 0.0.4

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 (106) hide show
  1. package/dist/commands/install.d.ts.map +1 -1
  2. package/dist/commands/install.js +113 -24
  3. package/dist/commands/install.js.map +1 -1
  4. package/dist/commands/login.d.ts +7 -0
  5. package/dist/commands/login.d.ts.map +1 -0
  6. package/dist/commands/login.js +108 -0
  7. package/dist/commands/login.js.map +1 -0
  8. package/dist/commands/scan.d.ts +2 -0
  9. package/dist/commands/scan.d.ts.map +1 -0
  10. package/dist/commands/scan.js +405 -0
  11. package/dist/commands/scan.js.map +1 -0
  12. package/dist/commands/sync.d.ts +2 -0
  13. package/dist/commands/sync.d.ts.map +1 -1
  14. package/dist/commands/sync.js +68 -120
  15. package/dist/commands/sync.js.map +1 -1
  16. package/dist/generator/builtin-templates.d.ts +2 -1
  17. package/dist/generator/builtin-templates.d.ts.map +1 -1
  18. package/dist/generator/builtin-templates.js +161 -2
  19. package/dist/generator/builtin-templates.js.map +1 -1
  20. package/dist/generator/package-renderer.d.ts +37 -0
  21. package/dist/generator/package-renderer.d.ts.map +1 -0
  22. package/dist/generator/package-renderer.js +143 -0
  23. package/dist/generator/package-renderer.js.map +1 -0
  24. package/dist/generator/render.d.ts +11 -54
  25. package/dist/generator/render.d.ts.map +1 -1
  26. package/dist/generator/render.js +18 -174
  27. package/dist/generator/render.js.map +1 -1
  28. package/dist/index.js +32 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/licensing/fingerprint.test.d.ts +2 -0
  31. package/dist/licensing/fingerprint.test.d.ts.map +1 -0
  32. package/dist/licensing/fingerprint.test.js +41 -0
  33. package/dist/licensing/fingerprint.test.js.map +1 -0
  34. package/dist/licensing/installer.d.ts +43 -0
  35. package/dist/licensing/installer.d.ts.map +1 -0
  36. package/dist/licensing/installer.js +98 -0
  37. package/dist/licensing/installer.js.map +1 -0
  38. package/dist/scan/__tests__/context-gatherer.test.d.ts +2 -0
  39. package/dist/scan/__tests__/context-gatherer.test.d.ts.map +1 -0
  40. package/dist/scan/__tests__/context-gatherer.test.js +111 -0
  41. package/dist/scan/__tests__/context-gatherer.test.js.map +1 -0
  42. package/dist/scan/__tests__/merge.test.d.ts +2 -0
  43. package/dist/scan/__tests__/merge.test.d.ts.map +1 -0
  44. package/dist/scan/__tests__/merge.test.js +163 -0
  45. package/dist/scan/__tests__/merge.test.js.map +1 -0
  46. package/dist/scan/config.d.ts +24 -0
  47. package/dist/scan/config.d.ts.map +1 -0
  48. package/dist/scan/config.js +77 -0
  49. package/dist/scan/config.js.map +1 -0
  50. package/dist/scan/context/gatherer.d.ts +13 -0
  51. package/dist/scan/context/gatherer.d.ts.map +1 -0
  52. package/dist/scan/context/gatherer.js +97 -0
  53. package/dist/scan/context/gatherer.js.map +1 -0
  54. package/dist/scan/context/gitignore.d.ts +9 -0
  55. package/dist/scan/context/gitignore.d.ts.map +1 -0
  56. package/dist/scan/context/gitignore.js +50 -0
  57. package/dist/scan/context/gitignore.js.map +1 -0
  58. package/dist/scan/context/patterns.d.ts +14 -0
  59. package/dist/scan/context/patterns.d.ts.map +1 -0
  60. package/dist/scan/context/patterns.js +159 -0
  61. package/dist/scan/context/patterns.js.map +1 -0
  62. package/dist/scan/customs/writer.d.ts +6 -0
  63. package/dist/scan/customs/writer.d.ts.map +1 -0
  64. package/dist/scan/customs/writer.js +149 -0
  65. package/dist/scan/customs/writer.js.map +1 -0
  66. package/dist/scan/llm/anthropic.d.ts +11 -0
  67. package/dist/scan/llm/anthropic.d.ts.map +1 -0
  68. package/dist/scan/llm/anthropic.js +98 -0
  69. package/dist/scan/llm/anthropic.js.map +1 -0
  70. package/dist/scan/llm/factory.d.ts +4 -0
  71. package/dist/scan/llm/factory.d.ts.map +1 -0
  72. package/dist/scan/llm/factory.js +20 -0
  73. package/dist/scan/llm/factory.js.map +1 -0
  74. package/dist/scan/llm/ollama.d.ts +11 -0
  75. package/dist/scan/llm/ollama.d.ts.map +1 -0
  76. package/dist/scan/llm/ollama.js +73 -0
  77. package/dist/scan/llm/ollama.js.map +1 -0
  78. package/dist/scan/llm/openai.d.ts +12 -0
  79. package/dist/scan/llm/openai.d.ts.map +1 -0
  80. package/dist/scan/llm/openai.js +87 -0
  81. package/dist/scan/llm/openai.js.map +1 -0
  82. package/dist/scan/llm/types.d.ts +23 -0
  83. package/dist/scan/llm/types.d.ts.map +1 -0
  84. package/dist/scan/llm/types.js +3 -0
  85. package/dist/scan/llm/types.js.map +1 -0
  86. package/dist/scan/merge/diff-display.d.ts +11 -0
  87. package/dist/scan/merge/diff-display.d.ts.map +1 -0
  88. package/dist/scan/merge/diff-display.js +72 -0
  89. package/dist/scan/merge/diff-display.js.map +1 -0
  90. package/dist/scan/prompt/agent.d.ts +23 -0
  91. package/dist/scan/prompt/agent.d.ts.map +1 -0
  92. package/dist/scan/prompt/agent.js +95 -0
  93. package/dist/scan/prompt/agent.js.map +1 -0
  94. package/dist/scan/prompt/builder.d.ts +16 -0
  95. package/dist/scan/prompt/builder.d.ts.map +1 -0
  96. package/dist/scan/prompt/builder.js +64 -0
  97. package/dist/scan/prompt/builder.js.map +1 -0
  98. package/dist/scan/prompt/schema.d.ts +7 -0
  99. package/dist/scan/prompt/schema.d.ts.map +1 -0
  100. package/dist/scan/prompt/schema.js +52 -0
  101. package/dist/scan/prompt/schema.js.map +1 -0
  102. package/dist/security/scanner.d.ts +3 -40
  103. package/dist/security/scanner.d.ts.map +1 -1
  104. package/dist/security/scanner.js +3 -169
  105. package/dist/security/scanner.js.map +1 -1
  106. package/package.json +15 -12
@@ -0,0 +1,52 @@
1
+ // @nepopsx/cli — Embed scan response JSON schema into prompts
2
+ import { readFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+ // Cache the schema after first load
7
+ let _schema = null;
8
+ function loadSchema() {
9
+ if (_schema)
10
+ return _schema;
11
+ // Resolve candidates from workspace-local paths (monorepo) and installed package paths
12
+ const candidates = [
13
+ join(__dirname, '..', '..', '..', '..', '..', 'core', 'dist', 'schema', 'scan-response.schema.json'),
14
+ join(__dirname, '..', '..', '..', '..', '..', 'core', 'src', 'schema', 'scan-response.schema.json'),
15
+ join(__dirname, '..', '..', '..', 'node_modules', '@nepopsx', 'core', 'dist', 'schema', 'scan-response.schema.json'),
16
+ ];
17
+ for (const p of candidates) {
18
+ try {
19
+ _schema = JSON.parse(readFileSync(p, 'utf-8'));
20
+ return _schema;
21
+ }
22
+ catch {
23
+ // Try next candidate
24
+ }
25
+ }
26
+ throw new Error('Could not locate scan-response.schema.json. Run `pnpm build` in @nepopsx/core first.');
27
+ }
28
+ /** Full ScanResponse JSON schema */
29
+ export function getScanResponseSchema() {
30
+ return loadSchema();
31
+ }
32
+ /** Per-service subset (ServiceScanResult) */
33
+ export function getServiceScanSchema() {
34
+ const full = loadSchema();
35
+ const defs = full.$defs;
36
+ return {
37
+ $schema: 'http://json-schema.org/draft-07/schema#',
38
+ ...(defs?.['ServiceScanResult'] ?? {}),
39
+ $defs: defs,
40
+ };
41
+ }
42
+ /** Cross-service subset (CrossServiceScanResult) */
43
+ export function getCrossServiceScanSchema() {
44
+ const full = loadSchema();
45
+ const defs = full.$defs;
46
+ return {
47
+ $schema: 'http://json-schema.org/draft-07/schema#',
48
+ ...(defs?.['CrossServiceScanResult'] ?? {}),
49
+ $defs: defs,
50
+ };
51
+ }
52
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/scan/prompt/schema.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,oCAAoC;AACpC,IAAI,OAAO,GAAmC,IAAI,CAAC;AAEnD,SAAS,UAAU;IACjB,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,uFAAuF;IACvF,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAA2B,CAAC;QACpG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,2BAA2B,CAAC;QACnG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAA2B,CAAC;KACrH,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAA4B,CAAC;YAC1E,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;AAC1G,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,qBAAqB;IACnC,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAA4C,CAAC;IAC/D,OAAO;QACL,OAAO,EAAE,yCAAyC;QAClD,GAAG,CAAE,IAAI,EAAE,CAAC,mBAAmB,CAA6B,IAAI,EAAE,CAAC;QACnE,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,yBAAyB;IACvC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAA4C,CAAC;IAC/D,OAAO;QACL,OAAO,EAAE,yCAAyC;QAClD,GAAG,CAAE,IAAI,EAAE,CAAC,wBAAwB,CAA6B,IAAI,EAAE,CAAC;QACxE,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC"}
@@ -1,43 +1,6 @@
1
1
  /**
2
- * Content scanner detects prompt injection and manipulation patterns
3
- * in custom instructions, philosophy.custom[], and user-supplied text
4
- * before it gets injected into agent templates.
2
+ * Re-exports security scanner from @nepopsx/core.
3
+ * Kept for backwards-compat across CLI imports.
5
4
  */
6
- export interface ScanThreat {
7
- pattern: string;
8
- match: string;
9
- source: string;
10
- severity: 'critical' | 'high' | 'medium';
11
- }
12
- export interface ScanResult {
13
- safe: boolean;
14
- threats: ScanThreat[];
15
- }
16
- /**
17
- * Scan a piece of text for prompt injection patterns.
18
- */
19
- export declare function scanForInjection(content: string, source: string): ScanThreat[];
20
- /**
21
- * Scan text for accidentally embedded secrets.
22
- */
23
- export declare function scanForSecrets(content: string, source: string): ScanThreat[];
24
- /**
25
- * Scan custom instructions files for injection + secrets.
26
- */
27
- export declare function scanCustomInstructions(customs: Array<{
28
- content: string;
29
- source: string;
30
- }>): ScanResult;
31
- /**
32
- * Scan philosophy.custom[] entries for injection + secrets.
33
- */
34
- export declare function scanPhilosophyCustom(customEntries: string[]): ScanResult;
35
- /**
36
- * Scan all string values in the workspace config for secrets.
37
- */
38
- export declare function scanConfigForSecrets(config: Record<string, unknown>, path?: string): ScanThreat[];
39
- /**
40
- * Format threats for console output.
41
- */
42
- export declare function formatThreats(threats: ScanThreat[]): string;
5
+ export { type ScanThreat, type ScanResult, scanForInjection, scanForSecrets, scanCustomInstructions, scanPhilosophyCustom, scanConfigForSecrets, formatThreats, } from "@nepopsx/core";
43
6
  //# sourceMappingURL=scanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/security/scanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAyDD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAgB9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAkB5E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAClD,UAAU,CASZ;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,EAAE,GACtB,UAAU,CAUZ;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,SAAW,GAAG,UAAU,EAAE,CAsBnG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAkC3D"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/security/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,KAAK,UAAU,EACf,KAAK,UAAU,EACf,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,GACd,MAAM,eAAe,CAAC"}
@@ -1,172 +1,6 @@
1
1
  /**
2
- * Content scanner detects prompt injection and manipulation patterns
3
- * in custom instructions, philosophy.custom[], and user-supplied text
4
- * before it gets injected into agent templates.
2
+ * Re-exports security scanner from @nepopsx/core.
3
+ * Kept for backwards-compat across CLI imports.
5
4
  */
6
- // ─── Prompt injection detection patterns ────────────────────
7
- const INJECTION_PATTERNS = [
8
- // Direct instruction override attempts
9
- { regex: /ignore\s+(all\s+)?(previous|prior|above|earlier)\s+(instructions|rules|guidelines|directives)/i, description: 'Instruction override attempt', severity: 'critical' },
10
- { regex: /disregard\s+(all\s+)?(previous|prior|above|earlier|your)\s+(instructions|rules|guidelines|directives)/i, description: 'Instruction disregard attempt', severity: 'critical' },
11
- { regex: /override\s+(the\s+)?(constitutional|safety|security|system)\s+(rules|instructions|prompt|guidelines)/i, description: 'Constitutional override attempt', severity: 'critical' },
12
- { regex: /forget\s+(all|everything|your)\s+(previous|prior|instructions|rules|training)/i, description: 'Memory wipe attempt', severity: 'critical' },
13
- // Role/identity hijacking
14
- { regex: /you\s+are\s+now\s+(a|an|the)\s+/i, description: 'Role hijacking attempt', severity: 'critical' },
15
- { regex: /pretend\s+(you\s+are|to\s+be|you're)\s+/i, description: 'Role-play injection', severity: 'high' },
16
- { regex: /act\s+as\s+(if\s+you\s+are|a|an|the)\s+/i, description: 'Role assumption injection', severity: 'high' },
17
- { regex: /from\s+now\s+on,?\s+(you|your|act|behave|respond)/i, description: 'Behavioral override attempt', severity: 'high' },
18
- // System prompt extraction
19
- { regex: /(?:show|reveal|display|output|print|repeat|echo)\s+(your|the)\s+(system|initial|original)\s+(prompt|instructions|message)/i, description: 'System prompt extraction attempt', severity: 'high' },
20
- { regex: /what\s+(are|is)\s+your\s+(system|initial|original)\s+(prompt|instructions|rules)/i, description: 'System prompt probing', severity: 'medium' },
21
- // Tool/permission escalation
22
- { regex: /(?:run|execute|invoke)\s+(?:any|all|unlimited)\s+(?:commands?|tools?|scripts?)/i, description: 'Permission escalation attempt', severity: 'critical' },
23
- { regex: /(?:disable|remove|skip|bypass)\s+(?:the\s+)?(?:safety|security|guard|check|validation|restriction)/i, description: 'Safety bypass attempt', severity: 'critical' },
24
- { regex: /--no-verify/i, description: 'Git safety bypass (--no-verify)', severity: 'high' },
25
- { regex: /--force\s*(?:push)?/i, description: 'Force operation pattern', severity: 'medium' },
26
- // Hidden instruction embedding
27
- { regex: /\[SYSTEM\]/i, description: 'Hidden system tag', severity: 'high' },
28
- { regex: /\[INST\]/i, description: 'Hidden instruction tag', severity: 'high' },
29
- { regex: /<\|im_start\|>system/i, description: 'ChatML injection attempt', severity: 'critical' },
30
- { regex: /Human:|Assistant:/i, description: 'Conversation role injection', severity: 'medium' },
31
- // Dangerous shell patterns in instruction text
32
- { regex: /rm\s+-rf\s+[/~]/i, description: 'Destructive rm -rf command in instructions', severity: 'critical' },
33
- { regex: /curl\s+.*\|\s*(?:bash|sh|zsh)/i, description: 'Pipe-to-shell pattern in instructions', severity: 'critical' },
34
- { regex: /wget\s+.*&&\s*(?:bash|sh|chmod)/i, description: 'Download-and-execute pattern', severity: 'critical' },
35
- { regex: /eval\s*\(\s*["'`]/i, description: 'Eval injection pattern', severity: 'high' },
36
- ];
37
- // ─── Secrets patterns (also scanned via this module) ────────
38
- const SECRET_PATTERNS = [
39
- { regex: /(?:^|[^a-zA-Z0-9])sk-[a-zA-Z0-9]{20,}/m, description: 'OpenAI API key' },
40
- { regex: /(?:^|[^a-zA-Z0-9])ghp_[a-zA-Z0-9]{36,}/m, description: 'GitHub personal access token' },
41
- { regex: /(?:^|[^a-zA-Z0-9])gho_[a-zA-Z0-9]{36,}/m, description: 'GitHub OAuth token' },
42
- { regex: /(?:^|[^a-zA-Z0-9])github_pat_[a-zA-Z0-9_]{22,}/m, description: 'GitHub fine-grained PAT' },
43
- { regex: /AKIA[0-9A-Z]{16}/m, description: 'AWS access key ID' },
44
- { regex: /(?:^|[^a-zA-Z0-9])Bearer\s+[a-zA-Z0-9._\-]{20,}/m, description: 'Bearer token' },
45
- { regex: /(?:password|passwd|secret|api_key|apikey|access_token)\s*[:=]\s*["'][^"']{6,}["']/i, description: 'Hardcoded credential' },
46
- { regex: /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/m, description: 'Private key' },
47
- { regex: /(?:^|[^a-zA-Z0-9])xox[bpors]-[a-zA-Z0-9\-]{10,}/m, description: 'Slack token' },
48
- { regex: /(?:^|[^a-zA-Z0-9])AIza[0-9A-Za-z\-_]{35}/m, description: 'Google API key' },
49
- ];
50
- // ─── Public API ─────────────────────────────────────────────
51
- /**
52
- * Scan a piece of text for prompt injection patterns.
53
- */
54
- export function scanForInjection(content, source) {
55
- const threats = [];
56
- for (const { regex, description, severity } of INJECTION_PATTERNS) {
57
- const match = content.match(regex);
58
- if (match) {
59
- threats.push({
60
- pattern: description,
61
- match: match[0].substring(0, 80), // truncate long matches
62
- source,
63
- severity,
64
- });
65
- }
66
- }
67
- return threats;
68
- }
69
- /**
70
- * Scan text for accidentally embedded secrets.
71
- */
72
- export function scanForSecrets(content, source) {
73
- const threats = [];
74
- for (const { regex, description } of SECRET_PATTERNS) {
75
- const match = content.match(regex);
76
- if (match) {
77
- // Redact the match — never show secrets in output
78
- const redacted = match[0].substring(0, 8) + '***REDACTED***';
79
- threats.push({
80
- pattern: description,
81
- match: redacted,
82
- source,
83
- severity: 'high',
84
- });
85
- }
86
- }
87
- return threats;
88
- }
89
- /**
90
- * Scan custom instructions files for injection + secrets.
91
- */
92
- export function scanCustomInstructions(customs) {
93
- const threats = [];
94
- for (const ci of customs) {
95
- threats.push(...scanForInjection(ci.content, `customs/${ci.source}`));
96
- threats.push(...scanForSecrets(ci.content, `customs/${ci.source}`));
97
- }
98
- return { safe: threats.length === 0, threats };
99
- }
100
- /**
101
- * Scan philosophy.custom[] entries for injection + secrets.
102
- */
103
- export function scanPhilosophyCustom(customEntries) {
104
- const threats = [];
105
- for (let i = 0; i < customEntries.length; i++) {
106
- const source = `philosophy.custom[${i}]`;
107
- threats.push(...scanForInjection(customEntries[i], source));
108
- threats.push(...scanForSecrets(customEntries[i], source));
109
- }
110
- return { safe: threats.length === 0, threats };
111
- }
112
- /**
113
- * Scan all string values in the workspace config for secrets.
114
- */
115
- export function scanConfigForSecrets(config, path = 'config') {
116
- const threats = [];
117
- for (const [key, value] of Object.entries(config)) {
118
- const currentPath = `${path}.${key}`;
119
- if (typeof value === 'string') {
120
- threats.push(...scanForSecrets(value, currentPath));
121
- }
122
- else if (Array.isArray(value)) {
123
- for (let i = 0; i < value.length; i++) {
124
- if (typeof value[i] === 'string') {
125
- threats.push(...scanForSecrets(value[i], `${currentPath}[${i}]`));
126
- }
127
- else if (typeof value[i] === 'object' && value[i] !== null) {
128
- threats.push(...scanConfigForSecrets(value[i], `${currentPath}[${i}]`));
129
- }
130
- }
131
- }
132
- else if (typeof value === 'object' && value !== null) {
133
- threats.push(...scanConfigForSecrets(value, currentPath));
134
- }
135
- }
136
- return threats;
137
- }
138
- /**
139
- * Format threats for console output.
140
- */
141
- export function formatThreats(threats) {
142
- if (threats.length === 0)
143
- return '';
144
- const lines = [];
145
- const bySeverity = {
146
- critical: threats.filter((t) => t.severity === 'critical'),
147
- high: threats.filter((t) => t.severity === 'high'),
148
- medium: threats.filter((t) => t.severity === 'medium'),
149
- };
150
- if (bySeverity.critical.length > 0) {
151
- lines.push(' 🔴 CRITICAL:');
152
- for (const t of bySeverity.critical) {
153
- lines.push(` ${t.pattern} in ${t.source}`);
154
- lines.push(` → "${t.match}"`);
155
- }
156
- }
157
- if (bySeverity.high.length > 0) {
158
- lines.push(' 🟠 HIGH:');
159
- for (const t of bySeverity.high) {
160
- lines.push(` ${t.pattern} in ${t.source}`);
161
- lines.push(` → "${t.match}"`);
162
- }
163
- }
164
- if (bySeverity.medium.length > 0) {
165
- lines.push(' 🟡 MEDIUM:');
166
- for (const t of bySeverity.medium) {
167
- lines.push(` ${t.pattern} in ${t.source}`);
168
- }
169
- }
170
- return lines.join('\n');
171
- }
5
+ export { scanForInjection, scanForSecrets, scanCustomInstructions, scanPhilosophyCustom, scanConfigForSecrets, formatThreats, } from "@nepopsx/core";
172
6
  //# sourceMappingURL=scanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/security/scanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,+DAA+D;AAE/D,MAAM,kBAAkB,GAAoF;IAC1G,uCAAuC;IACvC,EAAE,KAAK,EAAE,gGAAgG,EAAE,WAAW,EAAE,8BAA8B,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC9K,EAAE,KAAK,EAAE,wGAAwG,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,UAAU,EAAE;IACvL,EAAE,KAAK,EAAE,uGAAuG,EAAE,WAAW,EAAE,iCAAiC,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxL,EAAE,KAAK,EAAE,gFAAgF,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,UAAU,EAAE;IAErJ,0BAA0B;IAC1B,EAAE,KAAK,EAAE,kCAAkC,EAAE,WAAW,EAAE,wBAAwB,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC1G,EAAE,KAAK,EAAE,0CAA0C,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC3G,EAAE,KAAK,EAAE,0CAA0C,EAAE,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,EAAE;IACjH,EAAE,KAAK,EAAE,oDAAoD,EAAE,WAAW,EAAE,6BAA6B,EAAE,QAAQ,EAAE,MAAM,EAAE;IAE7H,2BAA2B;IAC3B,EAAE,KAAK,EAAE,4HAA4H,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC1M,EAAE,KAAK,EAAE,mFAAmF,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAExJ,6BAA6B;IAC7B,EAAE,KAAK,EAAE,iFAAiF,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,UAAU,EAAE;IAChK,EAAE,KAAK,EAAE,qGAAqG,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC5K,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,iCAAiC,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC3F,EAAE,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,yBAAyB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAE7F,+BAA+B;IAC/B,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC5E,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC/E,EAAE,KAAK,EAAE,uBAAuB,EAAE,WAAW,EAAE,0BAA0B,EAAE,QAAQ,EAAE,UAAU,EAAE;IACjG,EAAE,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,6BAA6B,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAE/F,+CAA+C;IAC/C,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,4CAA4C,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC9G,EAAE,KAAK,EAAE,gCAAgC,EAAE,WAAW,EAAE,uCAAuC,EAAE,QAAQ,EAAE,UAAU,EAAE;IACvH,EAAE,KAAK,EAAE,kCAAkC,EAAE,WAAW,EAAE,8BAA8B,EAAE,QAAQ,EAAE,UAAU,EAAE;IAChH,EAAE,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,EAAE;CACzF,CAAC;AAEF,+DAA+D;AAE/D,MAAM,eAAe,GAAkD;IACrE,EAAE,KAAK,EAAE,wCAAwC,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAClF,EAAE,KAAK,EAAE,yCAAyC,EAAE,WAAW,EAAE,8BAA8B,EAAE;IACjG,EAAE,KAAK,EAAE,yCAAyC,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACvF,EAAE,KAAK,EAAE,iDAAiD,EAAE,WAAW,EAAE,yBAAyB,EAAE;IACpG,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,mBAAmB,EAAE;IAChE,EAAE,KAAK,EAAE,kDAAkD,EAAE,WAAW,EAAE,cAAc,EAAE;IAC1F,EAAE,KAAK,EAAE,oFAAoF,EAAE,WAAW,EAAE,sBAAsB,EAAE;IACpI,EAAE,KAAK,EAAE,oDAAoD,EAAE,WAAW,EAAE,aAAa,EAAE;IAC3F,EAAE,KAAK,EAAE,kDAAkD,EAAE,WAAW,EAAE,aAAa,EAAE;IACzF,EAAE,KAAK,EAAE,2CAA2C,EAAE,WAAW,EAAE,gBAAgB,EAAE;CACtF,CAAC;AAEF,+DAA+D;AAE/D;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,MAAc;IAC9D,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,kBAAkB,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,WAAW;gBACpB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,wBAAwB;gBAC1D,MAAM;gBACN,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,MAAc;IAC5D,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,eAAe,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,kDAAkD;YAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,gBAAgB,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,WAAW;gBACpB,KAAK,EAAE,QAAQ;gBACf,MAAM;gBACN,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAmD;IAEnD,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,aAAuB;IAEvB,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA+B,EAAE,IAAI,GAAG,QAAQ;IACnF,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;QAErC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpE,CAAC;qBAAM,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAA4B,EAAE,GAAG,WAAW,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrG,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,KAAgC,EAAE,WAAW,CAAC,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG;QACjB,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC;QAC1D,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;QAClD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;KACvD,CAAC;IAEF,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/security/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAGL,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,GACd,MAAM,eAAe,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nepopsx/cli",
3
- "version": "0.0.2",
4
- "description": "NEPOPSX CLI \u2014 generate AI agent workspaces from configuration",
3
+ "version": "0.0.4",
4
+ "description": "NEPOPSX CLI generate AI agent workspaces from configuration",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
7
7
  "bin": {
@@ -12,33 +12,36 @@
12
12
  "publishConfig": {
13
13
  "access": "public"
14
14
  },
15
- "scripts": {
16
- "build": "tsc",
17
- "clean": "rm -rf dist",
18
- "dev": "tsc --watch",
19
- "lint": "tsc --noEmit",
20
- "test": "node --test dist/**/*.test.js"
21
- },
22
15
  "files": [
23
16
  "dist",
24
17
  "bin"
25
18
  ],
26
19
  "dependencies": {
27
20
  "@inquirer/prompts": "^8.4.1",
28
- "@nepopsx/core": "workspace:*",
21
+ "archiver": "^7.0.1",
29
22
  "chalk": "^5.4.1",
30
23
  "commander": "^13.1.0",
31
24
  "glob": "^11.0.1",
32
25
  "handlebars": "^4.7.8",
26
+ "ignore": "^7.0.0",
33
27
  "inquirer": "^12.3.2",
34
28
  "ora": "^8.2.0",
35
- "yaml": "^2.7.0"
29
+ "yaml": "^2.7.0",
30
+ "@nepopsx/core": "0.0.4"
36
31
  },
37
32
  "devDependencies": {
33
+ "@types/archiver": "^7.0.0",
38
34
  "@types/node": "^22.0.0",
39
35
  "typescript": "^5.7.0"
40
36
  },
41
37
  "engines": {
42
38
  "node": ">=20"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc",
42
+ "clean": "rm -rf dist",
43
+ "dev": "tsc --watch",
44
+ "lint": "tsc --noEmit",
45
+ "test": "node --test dist/**/*.test.js"
43
46
  }
44
- }
47
+ }