learn-anything-cli 0.1.0

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 (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +96 -0
  3. package/README.zh-CN.md +96 -0
  4. package/bin/learn-anything.js +3 -0
  5. package/dist/cli/index.d.ts +2 -0
  6. package/dist/cli/index.js +88 -0
  7. package/dist/core/command-generation/adapters/claude.d.ts +3 -0
  8. package/dist/core/command-generation/adapters/claude.js +31 -0
  9. package/dist/core/command-generation/adapters/codex.d.ts +3 -0
  10. package/dist/core/command-generation/adapters/codex.js +26 -0
  11. package/dist/core/command-generation/adapters/cursor.d.ts +3 -0
  12. package/dist/core/command-generation/adapters/cursor.js +27 -0
  13. package/dist/core/command-generation/adapters/gemini.d.ts +3 -0
  14. package/dist/core/command-generation/adapters/gemini.js +23 -0
  15. package/dist/core/command-generation/adapters/index.d.ts +5 -0
  16. package/dist/core/command-generation/adapters/index.js +5 -0
  17. package/dist/core/command-generation/generator.d.ts +4 -0
  18. package/dist/core/command-generation/generator.js +10 -0
  19. package/dist/core/command-generation/index.d.ts +4 -0
  20. package/dist/core/command-generation/index.js +3 -0
  21. package/dist/core/command-generation/registry.d.ts +8 -0
  22. package/dist/core/command-generation/registry.js +20 -0
  23. package/dist/core/command-generation/types.d.ts +18 -0
  24. package/dist/core/command-generation/types.js +2 -0
  25. package/dist/core/config.d.ts +11 -0
  26. package/dist/core/config.js +33 -0
  27. package/dist/core/init.d.ts +22 -0
  28. package/dist/core/init.js +133 -0
  29. package/dist/core/shared/index.d.ts +3 -0
  30. package/dist/core/shared/index.js +2 -0
  31. package/dist/core/shared/skill-generation.d.ts +16 -0
  32. package/dist/core/shared/skill-generation.js +49 -0
  33. package/dist/core/templates/skill-templates.d.ts +7 -0
  34. package/dist/core/templates/skill-templates.js +6 -0
  35. package/dist/core/templates/types.d.ts +16 -0
  36. package/dist/core/templates/types.js +2 -0
  37. package/dist/core/templates/workflows/learn-explain.d.ts +4 -0
  38. package/dist/core/templates/workflows/learn-explain.js +203 -0
  39. package/dist/core/templates/workflows/learn-practice.d.ts +4 -0
  40. package/dist/core/templates/workflows/learn-practice.js +247 -0
  41. package/dist/core/templates/workflows/learn-review.d.ts +4 -0
  42. package/dist/core/templates/workflows/learn-review.js +167 -0
  43. package/dist/core/templates/workflows/learn-status.d.ts +4 -0
  44. package/dist/core/templates/workflows/learn-status.js +114 -0
  45. package/dist/core/templates/workflows/learn-topic.d.ts +4 -0
  46. package/dist/core/templates/workflows/learn-topic.js +191 -0
  47. package/dist/i18n/index.d.ts +6 -0
  48. package/dist/i18n/index.js +30 -0
  49. package/dist/i18n/locales/en.d.ts +3 -0
  50. package/dist/i18n/locales/en.js +28 -0
  51. package/dist/i18n/locales/zh-CN.d.ts +3 -0
  52. package/dist/i18n/locales/zh-CN.js +28 -0
  53. package/dist/i18n/types.d.ts +31 -0
  54. package/dist/i18n/types.js +2 -0
  55. package/dist/index.d.ts +6 -0
  56. package/dist/index.js +4 -0
  57. package/dist/utils/file-system.d.ts +8 -0
  58. package/dist/utils/file-system.js +38 -0
  59. package/dist/utils/interactive.d.ts +2 -0
  60. package/dist/utils/interactive.js +4 -0
  61. package/package.json +69 -0
@@ -0,0 +1,191 @@
1
+ const SKILL_NAME = 'learn-anything-topic';
2
+ const SKILL_DESCRIPTION = 'Initialize or load a learning topic. AI generates a knowledge map, tracks progress, and lets you choose your own learning path.';
3
+ const INSTRUCTIONS = `Always respond in the same language the user uses.
4
+ If the user speaks Chinese, explain all concepts, examples, and guidance in Chinese.
5
+
6
+ ---
7
+
8
+ You are Learn Anything's Knowledge Mentor. Your role is to help users systematically learn a technical topic.
9
+ Your teaching philosophy: First establish the knowledge landscape, then let the user choose their own learning path.
10
+
11
+ ## Your Guiding Principles
12
+
13
+ 1. **Patient Guidance, Not Lecturing** — You are a tour guide, not a textbook. Show the map, let the user choose the direction.
14
+ 2. **Adapt to Level** — Judge the user's proficiency from how they ask questions (precision of terminology, depth of inquiry) and adjust explanation complexity.
15
+ 3. **Systems Thinking** — Always place concepts in the context of the knowledge map, helping users see the "knowledge tree".
16
+
17
+ ---
18
+
19
+ ## Command: /learn <topic-name>
20
+
21
+ ### Step 1: Determine if the topic exists
22
+
23
+ Use the Bash tool to check if the directory ./.learn/topics/<topic-name>/ exists.
24
+
25
+ **If it does NOT exist → Follow the "New Topic" workflow (below)**
26
+ **If it EXISTS → Follow the "Load Existing Topic" workflow (below)**
27
+
28
+ ---
29
+
30
+ ## New Topic Workflow
31
+
32
+ ### Step 2: Create directory structure
33
+
34
+ Use Bash to create the following directories and files:
35
+
36
+ \`\`\`bash
37
+ mkdir -p ./.learn/topics/<topic-name>/sessions
38
+ \`\`\`
39
+
40
+ ### Step 3: Generate knowledge map (knowledge-map.md)
41
+
42
+ Based on your expert understanding of "<topic-name>", generate a hierarchical knowledge map.
43
+
44
+ **Knowledge map format requirements:**
45
+
46
+ \`\`\`markdown
47
+ # <Topic Name> Knowledge Map
48
+
49
+ ## <Domain 1>
50
+ - <Concept 1.1>
51
+ - <Concept 1.2>
52
+ - <Detail 1.2.1> (only when the concept is complex enough)
53
+ - <Detail 1.2.2>
54
+
55
+ ## <Domain 2>
56
+ - <Concept 2.1>
57
+ - <Concept 2.2>
58
+ \`\`\`
59
+
60
+ **Knowledge map generation rules:**
61
+ - Use Markdown \`##\` for top-level domains, \`-\` for second-level concepts, indented \`-\` for third-level details
62
+ - Keep depth to 2-3 levels, no more than 3
63
+ - Breadth over depth: establish the full picture before going into details
64
+ - For larger topics (e.g., "JavaScript"), include 15-25 core concepts
65
+ - For narrower topics (e.g., "React Hooks"), include 10-15 concepts with more granularity
66
+ - Name concepts precisely so they can be learned independently. E.g., use "Closures" not "Closure-related stuff"
67
+ - Each leaf node should be a concept the user can learn and understand in a single session
68
+
69
+ ### Step 4: Generate initial state.yaml
70
+
71
+ Use the Bash tool to write \`./.learn/topics/<topic-name>/state.yaml\`:
72
+
73
+ \`\`\`yaml
74
+ topic: <topic-name>
75
+ created: <current date YYYY-MM-DD>
76
+ concepts:
77
+ - path: "<Domain>/<Concept>"
78
+ status: unexplored
79
+ last_practiced: null
80
+ practice_count: 0
81
+ confidence: 0.0
82
+ - path: "<Domain>/<Concept>"
83
+ status: unexplored
84
+ ...
85
+ \`\`\`
86
+
87
+ The path format is "Domain/Concept", e.g., "Functions/Closures". Every leaf concept in the knowledge map corresponds to one path.
88
+
89
+ ### Step 5: Present and guide the user
90
+
91
+ Display the knowledge map as an ASCII tree:
92
+
93
+ \`\`\`
94
+ 🌟 JavaScript Knowledge Map
95
+
96
+ Language Basics Functions Objects & Prototypes
97
+ ├── Variables & Types ├── Declarations & Expr ├── Object Literals
98
+ ├── Operators ├── Scope & Closures ├── Constructors
99
+ ├── Control Flow ├── this Keyword ├── prototype & __proto__
100
+ └── Type Coercion ├── Arrow Functions └── Inheritance Patterns
101
+ └── Higher-Order Functions
102
+
103
+ Async Programming Tooling & Engineering
104
+ ├── Promise ├── Module System
105
+ ├── async/await ├── npm/Package Mgmt
106
+ └── Event Loop └── Build Tools
107
+ \`\`\`
108
+
109
+ Then say:
110
+
111
+ > This is the knowledge landscape for **JavaScript**. You can start learning by:
112
+ >
113
+ > - **Get an explanation**: \`/learn-explain closures\` — I'll walk you through a concept in depth
114
+ > - **Practice coding**: \`/learn-practice Promise\` — Master concepts by writing code
115
+ > - **Check progress**: \`/learn-status\` — View your learning progress anytime
116
+ >
117
+ > Where would you like to start? Or tell me what confuses you the most right now, and I can help you sort it out.
118
+
119
+ ---
120
+
121
+ ## Load Existing Topic Workflow
122
+
123
+ ### Step 2: Read existing data
124
+
125
+ 1. Use the Read tool to read \`./.learn/topics/<topic-name>/knowledge-map.md\`
126
+ 2. Use the Read tool to read \`./.learn/topics/<topic-name>/state.yaml\`
127
+
128
+ ### Step 3: Calculate and display progress
129
+
130
+ Calculate the following statistics:
131
+ - ✅ Concepts mastered
132
+ - 🔄 Concepts in progress
133
+ - ⚠️ Concepts needing practice
134
+ - ⬜ Concepts unexplored
135
+
136
+ Display the knowledge map with status markers.
137
+
138
+ ### Step 4: Give personalized recommendations
139
+
140
+ Based on the state.yaml analysis, provide recommendations by priority:
141
+
142
+ 1. **Concepts with needs_practice** → Prioritize practice for reinforcement
143
+ 2. **Concepts with in_progress** → Suggest continuing deeper learning
144
+ 3. **Unexplored related concepts** → Suggest expanding knowledge boundaries
145
+ 4. **Concepts with older last_practiced** → Recommend review based on spaced repetition
146
+
147
+ Example:
148
+
149
+ > 📊 Your progress: 3 mastered, 2 in progress, 1 needs practice, 12 unexplored
150
+ >
151
+ > 🎯 Suggested next steps:
152
+ > 1. ⚠️ **Prototypes** needs a practice session to solidify (last studied 3 days ago)
153
+ > 2. 🔄 Continue with **Event Loop** — you last covered macrotasks and microtasks
154
+ > 3. 📖 Explore new territory: **Module System** — this extends concepts you've already mastered
155
+ >
156
+ > Which would you like to pursue?
157
+
158
+ ---
159
+
160
+ ## Edge Cases
161
+
162
+ - **Empty topic name**: Prompt the user "Please specify the topic you want to learn, e.g.: \`/learn javascript\`"
163
+ - **Topic name with special characters**: Replace spaces and special characters with hyphens
164
+ - **Knowledge map too large**: If the topic requires more than 30 concepts, prompt the user "This is a very broad topic. I'd suggest breaking it into smaller sub-topics. For example: 'Frontend Development' could be split into 'React', 'CSS', 'Build Tools', etc. Would you like to split it, or continue anyway?"`;
165
+ const COMMAND_NAME = 'Learn: Topic';
166
+ const COMMAND_DESCRIPTION = 'Initialize or load a learning topic — view knowledge map, track progress, choose your path';
167
+ const COMMAND_CONTENT = `Use the learn-anything-topic skill to handle the user's /learn <topic-name> request.
168
+ Follow the workflow defined in the skill:
169
+ 1. Determine if the topic exists
170
+ 2. New topic: create directory structure → generate knowledge-map.md and state.yaml → present knowledge map and guide the user
171
+ 3. Existing topic: read data → calculate progress → give personalized recommendations`;
172
+ export function getLearnTopicSkillTemplate() {
173
+ return {
174
+ name: SKILL_NAME,
175
+ description: SKILL_DESCRIPTION,
176
+ instructions: INSTRUCTIONS,
177
+ license: 'MIT',
178
+ compatibility: 'Requires learn-anything CLI.',
179
+ metadata: { author: 'learn-anything', version: '1.0' },
180
+ };
181
+ }
182
+ export function getLearnTopicCommandTemplate() {
183
+ return {
184
+ name: COMMAND_NAME,
185
+ description: COMMAND_DESCRIPTION,
186
+ category: 'Learning',
187
+ tags: ['learning', 'topic', 'initialize'],
188
+ content: COMMAND_CONTENT,
189
+ };
190
+ }
191
+ //# sourceMappingURL=learn-topic.js.map
@@ -0,0 +1,6 @@
1
+ import type { SupportedLocale, LocaleMessages } from './types.js';
2
+ export declare function getMessages(locale: SupportedLocale): LocaleMessages;
3
+ export declare function detectSystemLocale(): SupportedLocale;
4
+ export declare function resolveLocale(cliFlag?: string): SupportedLocale;
5
+ export type { SupportedLocale, LocaleMessages } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { zhCN } from './locales/zh-CN.js';
2
+ import { en } from './locales/en.js';
3
+ const messages = {
4
+ 'zh-CN': zhCN,
5
+ en,
6
+ };
7
+ export function getMessages(locale) {
8
+ return messages[locale];
9
+ }
10
+ export function detectSystemLocale() {
11
+ const langEnv = process.env.LANG ||
12
+ process.env.LC_ALL ||
13
+ process.env.LANGUAGE ||
14
+ '';
15
+ if (/^zh[_-]/i.test(langEnv)) {
16
+ return 'zh-CN';
17
+ }
18
+ return 'en';
19
+ }
20
+ export function resolveLocale(cliFlag) {
21
+ if (cliFlag === 'zh-CN' || cliFlag === 'en') {
22
+ return cliFlag;
23
+ }
24
+ if (cliFlag) {
25
+ // Unknown locale flag — warn and fall back
26
+ console.warn(`Unknown locale "${cliFlag}", falling back to system default.`);
27
+ }
28
+ return detectSystemLocale();
29
+ }
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ import type { LocaleMessages } from '../types.js';
2
+ export declare const en: LocaleMessages;
3
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1,28 @@
1
+ export const en = {
2
+ cli: {
3
+ programDescription: 'AI-powered recursive learning system with Socratic method and TDD practice',
4
+ initCommandDescription: 'Initialize Learn Anything learning skills in the current project',
5
+ updateCommandDescription: 'Update Learn Anything skill files to latest version',
6
+ toolsOptionDescription: (ids) => `Specify AI tools (non-interactive mode). Use "all", "none", or comma-separated list: ${ids}`,
7
+ notDirectory: (path) => `Path "${path}" is not a directory`,
8
+ dirNotExist: (path) => `Directory "${path}" does not exist, it will be created automatically.`,
9
+ cannotAccess: (path, msg) => `Cannot access path "${path}": ${msg}`,
10
+ errorPrefix: (msg) => `Error: ${msg}`,
11
+ updateComplete: 'Learn Anything skill files have been updated.',
12
+ forceOption: 'Skip confirmation prompt',
13
+ langOption: 'Display language: zh-CN or en (default: system locale)',
14
+ },
15
+ init: {
16
+ header: '\n🧠 Learn Anything — AI-Powered Recursive Learning System\n',
17
+ noToolsSelected: 'No AI tools selected. Use --tools option to specify, or select in interactive mode.',
18
+ availableTools: (tools) => `Available tools: ${tools}`,
19
+ skillGenerated: (toolName) => ` ✓ ${toolName} — 5 skill files generated`,
20
+ initComplete: '🎉 Learn Anything initialization complete!\n',
21
+ globalDataPath: (dir) => ` Learning data stored at ${dir}/`,
22
+ startLearning: (example) => ` Run ${example} to start your first learning topic\n`,
23
+ availableCommands: 'Available learning commands:',
24
+ cmdLine: (cmd, desc) => ` ${cmd}${desc}`,
25
+ interactiveSelectPrompt: 'Select AI tools to generate skills for (space to select, enter to confirm):',
26
+ },
27
+ };
28
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1,3 @@
1
+ import type { LocaleMessages } from '../types.js';
2
+ export declare const zhCN: LocaleMessages;
3
+ //# sourceMappingURL=zh-CN.d.ts.map
@@ -0,0 +1,28 @@
1
+ export const zhCN = {
2
+ cli: {
3
+ programDescription: 'AI-powered recursive learning system with Socratic method and TDD practice',
4
+ initCommandDescription: '在当前项目初始化 Learn Anything 学习技能',
5
+ updateCommandDescription: '更新 Learn Anything 技能文件到最新版本',
6
+ toolsOptionDescription: (ids) => `指定 AI 工具(非交互模式)。使用 "all"、"none",或逗号分隔的工具列表:${ids}`,
7
+ notDirectory: (path) => `路径 "${path}" 不是一个目录`,
8
+ dirNotExist: (path) => `目录 "${path}" 不存在,将自动创建。`,
9
+ cannotAccess: (path, msg) => `无法访问路径 "${path}": ${msg}`,
10
+ errorPrefix: (msg) => `错误: ${msg}`,
11
+ updateComplete: 'Learn Anything 技能文件已更新。',
12
+ forceOption: '跳过确认提示',
13
+ langOption: '界面语言:zh-CN 或 en(默认读取系统语言设置)',
14
+ },
15
+ init: {
16
+ header: '\n🧠 Learn Anything — AI 驱动的递归学习系统\n',
17
+ noToolsSelected: '未选择任何 AI 工具。使用 --tools 参数指定,或在交互模式中选择。',
18
+ availableTools: (tools) => `可用的工具:${tools}`,
19
+ skillGenerated: (toolName) => ` ✓ ${toolName} — 5 个技能文件已生成`,
20
+ initComplete: '🎉 Learn Anything 初始化完成!\n',
21
+ globalDataPath: (dir) => ` 学习数据存储在 ${dir}/`,
22
+ startLearning: (example) => ` 运行 ${example} 开始你的第一个学习主题\n`,
23
+ availableCommands: '可用的学习命令:',
24
+ cmdLine: (cmd, desc) => ` ${cmd}${desc}`,
25
+ interactiveSelectPrompt: '选择要生成技能的 AI 工具(空格选择,回车确认):',
26
+ },
27
+ };
28
+ //# sourceMappingURL=zh-CN.js.map
@@ -0,0 +1,31 @@
1
+ export type SupportedLocale = 'zh-CN' | 'en';
2
+ export interface CLIMessages {
3
+ programDescription: string;
4
+ initCommandDescription: string;
5
+ updateCommandDescription: string;
6
+ toolsOptionDescription: (ids: string) => string;
7
+ notDirectory: (path: string) => string;
8
+ dirNotExist: (path: string) => string;
9
+ cannotAccess: (path: string, msg: string) => string;
10
+ errorPrefix: (msg: string) => string;
11
+ updateComplete: string;
12
+ forceOption: string;
13
+ langOption: string;
14
+ }
15
+ export interface InitMessages {
16
+ header: string;
17
+ noToolsSelected: string;
18
+ availableTools: (tools: string) => string;
19
+ skillGenerated: (toolName: string) => string;
20
+ initComplete: string;
21
+ globalDataPath: (dir: string) => string;
22
+ startLearning: (example: string) => string;
23
+ availableCommands: string;
24
+ cmdLine: (cmd: string, desc: string) => string;
25
+ interactiveSelectPrompt: string;
26
+ }
27
+ export interface LocaleMessages {
28
+ cli: CLIMessages;
29
+ init: InitMessages;
30
+ }
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,6 @@
1
+ export { InitCommand } from './core/init.js';
2
+ export { AI_TOOLS } from './core/config.js';
3
+ export type { AIToolOption } from './core/config.js';
4
+ export { getSkillTemplates, getCommandTemplates, getCommandContents, generateSkillContent, } from './core/shared/index.js';
5
+ export type { SkillTemplateEntry, CommandTemplateEntry } from './core/shared/index.js';
6
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { InitCommand } from './core/init.js';
2
+ export { AI_TOOLS } from './core/config.js';
3
+ export { getSkillTemplates, getCommandTemplates, getCommandContents, generateSkillContent, } from './core/shared/index.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,8 @@
1
+ export declare class FileSystemUtils {
2
+ static ensureDir(dirPath: string): Promise<void>;
3
+ static writeFile(filePath: string, content: string): Promise<void>;
4
+ static fileExists(filePath: string): Promise<boolean>;
5
+ static dirExists(dirPath: string): Promise<boolean>;
6
+ static removeDir(dirPath: string): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=file-system.d.ts.map
@@ -0,0 +1,38 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ export class FileSystemUtils {
4
+ static async ensureDir(dirPath) {
5
+ await fs.mkdir(dirPath, { recursive: true });
6
+ }
7
+ static async writeFile(filePath, content) {
8
+ await FileSystemUtils.ensureDir(path.dirname(filePath));
9
+ await fs.writeFile(filePath, content, 'utf-8');
10
+ }
11
+ static async fileExists(filePath) {
12
+ try {
13
+ await fs.access(filePath);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ static async dirExists(dirPath) {
21
+ try {
22
+ const stat = await fs.stat(dirPath);
23
+ return stat.isDirectory();
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ static async removeDir(dirPath) {
30
+ try {
31
+ await fs.rm(dirPath, { recursive: true, force: true });
32
+ }
33
+ catch {
34
+ // Ignore if directory doesn't exist
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=file-system.js.map
@@ -0,0 +1,2 @@
1
+ export declare function isInteractive(): boolean;
2
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1,4 @@
1
+ export function isInteractive() {
2
+ return process.stdin.isTTY && process.stdout.isTTY;
3
+ }
4
+ //# sourceMappingURL=interactive.js.map
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "learn-anything-cli",
3
+ "version": "0.1.0",
4
+ "description": "AI-powered recursive learning system with Socratic method and TDD practice",
5
+ "keywords": [
6
+ "learn-anything-cli",
7
+ "learn-anything",
8
+ "learning",
9
+ "cli",
10
+ "ai",
11
+ "education",
12
+ "socratic",
13
+ "tdd"
14
+ ],
15
+ "homepage": "https://github.com/ChenChenyaqi/learn-anything",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/ChenChenyaqi/learn-anything"
19
+ },
20
+ "license": "MIT",
21
+ "author": "yaqi chen",
22
+ "type": "module",
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "default": "./dist/index.js"
30
+ }
31
+ },
32
+ "bin": {
33
+ "learn-anything": "./bin/learn-anything.js"
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "bin",
38
+ "!dist/**/*.test.js",
39
+ "!dist/**/__tests__",
40
+ "!dist/**/*.map"
41
+ ],
42
+ "scripts": {
43
+ "build": "node build.js",
44
+ "dev": "tsc --watch",
45
+ "dev:cli": "pnpm build && node bin/learn-anything.js",
46
+ "test": "vitest run",
47
+ "test:watch": "vitest",
48
+ "lint": "eslint src/",
49
+ "prepublishOnly": "pnpm run build"
50
+ },
51
+ "engines": {
52
+ "node": ">=20.19.0"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^24.2.0",
56
+ "eslint": "^9.39.2",
57
+ "typescript": "^5.9.3",
58
+ "typescript-eslint": "^8.50.1",
59
+ "vitest": "^3.2.4"
60
+ },
61
+ "dependencies": {
62
+ "@inquirer/prompts": "^7.8.0",
63
+ "chalk": "^5.5.0",
64
+ "commander": "^14.0.0",
65
+ "fast-glob": "^3.3.3",
66
+ "yaml": "^2.8.2",
67
+ "zod": "^4.0.17"
68
+ }
69
+ }