@nepopsx/cli 0.0.3 → 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.
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +113 -24
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.d.ts +7 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +108 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/scan.d.ts +2 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +405 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/sync.d.ts +2 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +68 -120
- package/dist/commands/sync.js.map +1 -1
- package/dist/generator/builtin-templates.d.ts +2 -1
- package/dist/generator/builtin-templates.d.ts.map +1 -1
- package/dist/generator/builtin-templates.js +161 -2
- package/dist/generator/builtin-templates.js.map +1 -1
- package/dist/generator/package-renderer.d.ts +37 -0
- package/dist/generator/package-renderer.d.ts.map +1 -0
- package/dist/generator/package-renderer.js +143 -0
- package/dist/generator/package-renderer.js.map +1 -0
- package/dist/generator/render.d.ts +11 -54
- package/dist/generator/render.d.ts.map +1 -1
- package/dist/generator/render.js +18 -174
- package/dist/generator/render.js.map +1 -1
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -1
- package/dist/licensing/installer.d.ts +43 -0
- package/dist/licensing/installer.d.ts.map +1 -0
- package/dist/licensing/installer.js +98 -0
- package/dist/licensing/installer.js.map +1 -0
- package/dist/scan/__tests__/context-gatherer.test.d.ts +2 -0
- package/dist/scan/__tests__/context-gatherer.test.d.ts.map +1 -0
- package/dist/scan/__tests__/context-gatherer.test.js +111 -0
- package/dist/scan/__tests__/context-gatherer.test.js.map +1 -0
- package/dist/scan/__tests__/merge.test.d.ts +2 -0
- package/dist/scan/__tests__/merge.test.d.ts.map +1 -0
- package/dist/scan/__tests__/merge.test.js +163 -0
- package/dist/scan/__tests__/merge.test.js.map +1 -0
- package/dist/scan/config.d.ts +24 -0
- package/dist/scan/config.d.ts.map +1 -0
- package/dist/scan/config.js +77 -0
- package/dist/scan/config.js.map +1 -0
- package/dist/scan/context/gatherer.d.ts +13 -0
- package/dist/scan/context/gatherer.d.ts.map +1 -0
- package/dist/scan/context/gatherer.js +97 -0
- package/dist/scan/context/gatherer.js.map +1 -0
- package/dist/scan/context/gitignore.d.ts +9 -0
- package/dist/scan/context/gitignore.d.ts.map +1 -0
- package/dist/scan/context/gitignore.js +50 -0
- package/dist/scan/context/gitignore.js.map +1 -0
- package/dist/scan/context/patterns.d.ts +14 -0
- package/dist/scan/context/patterns.d.ts.map +1 -0
- package/dist/scan/context/patterns.js +159 -0
- package/dist/scan/context/patterns.js.map +1 -0
- package/dist/scan/customs/writer.d.ts +6 -0
- package/dist/scan/customs/writer.d.ts.map +1 -0
- package/dist/scan/customs/writer.js +149 -0
- package/dist/scan/customs/writer.js.map +1 -0
- package/dist/scan/llm/anthropic.d.ts +11 -0
- package/dist/scan/llm/anthropic.d.ts.map +1 -0
- package/dist/scan/llm/anthropic.js +98 -0
- package/dist/scan/llm/anthropic.js.map +1 -0
- package/dist/scan/llm/factory.d.ts +4 -0
- package/dist/scan/llm/factory.d.ts.map +1 -0
- package/dist/scan/llm/factory.js +20 -0
- package/dist/scan/llm/factory.js.map +1 -0
- package/dist/scan/llm/ollama.d.ts +11 -0
- package/dist/scan/llm/ollama.d.ts.map +1 -0
- package/dist/scan/llm/ollama.js +73 -0
- package/dist/scan/llm/ollama.js.map +1 -0
- package/dist/scan/llm/openai.d.ts +12 -0
- package/dist/scan/llm/openai.d.ts.map +1 -0
- package/dist/scan/llm/openai.js +87 -0
- package/dist/scan/llm/openai.js.map +1 -0
- package/dist/scan/llm/types.d.ts +23 -0
- package/dist/scan/llm/types.d.ts.map +1 -0
- package/dist/scan/llm/types.js +3 -0
- package/dist/scan/llm/types.js.map +1 -0
- package/dist/scan/merge/diff-display.d.ts +11 -0
- package/dist/scan/merge/diff-display.d.ts.map +1 -0
- package/dist/scan/merge/diff-display.js +72 -0
- package/dist/scan/merge/diff-display.js.map +1 -0
- package/dist/scan/prompt/agent.d.ts +23 -0
- package/dist/scan/prompt/agent.d.ts.map +1 -0
- package/dist/scan/prompt/agent.js +95 -0
- package/dist/scan/prompt/agent.js.map +1 -0
- package/dist/scan/prompt/builder.d.ts +16 -0
- package/dist/scan/prompt/builder.d.ts.map +1 -0
- package/dist/scan/prompt/builder.js +64 -0
- package/dist/scan/prompt/builder.js.map +1 -0
- package/dist/scan/prompt/schema.d.ts +7 -0
- package/dist/scan/prompt/schema.d.ts.map +1 -0
- package/dist/scan/prompt/schema.js +52 -0
- package/dist/scan/prompt/schema.js.map +1 -0
- package/dist/security/scanner.d.ts +3 -40
- package/dist/security/scanner.d.ts.map +1 -1
- package/dist/security/scanner.js +3 -169
- package/dist/security/scanner.js.map +1 -1
- package/package.json +15 -12
|
@@ -1,43 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
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
|
|
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
|
|
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"}
|
package/dist/security/scanner.js
CHANGED
|
@@ -1,172 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
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
|
-
|
|
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
|
|
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.
|
|
4
|
-
"description": "NEPOPSX CLI
|
|
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
|
-
"
|
|
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
|
+
}
|