@fifine/aim-studio 0.0.2 → 0.0.3

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 (91) hide show
  1. package/dist/commands/init.d.ts.map +1 -1
  2. package/dist/commands/init.js +123 -101
  3. package/dist/commands/init.js.map +1 -1
  4. package/dist/configurators/workflow.d.ts.map +1 -1
  5. package/dist/configurators/workflow.js +91 -65
  6. package/dist/configurators/workflow.js.map +1 -1
  7. package/dist/templates/aim/scripts/common/paths.py +3 -2
  8. package/dist/templates/aim/scripts/export.py +427 -0
  9. package/dist/templates/claude/commands/aim/export.md +89 -115
  10. package/dist/templates/claude/commands/aim/onboard.md +10 -8
  11. package/dist/templates/claude/commands/aim/start.md +104 -37
  12. package/dist/templates/claude/hooks/inject-subagent-context.py +6 -10
  13. package/dist/templates/claude/hooks/session-start.py +134 -24
  14. package/dist/templates/markdown/index.d.ts +5 -0
  15. package/dist/templates/markdown/index.d.ts.map +1 -1
  16. package/dist/templates/markdown/index.js +6 -0
  17. package/dist/templates/markdown/index.js.map +1 -1
  18. package/dist/templates/markdown/spec/cli/directory-structure.md.txt +71 -0
  19. package/dist/templates/markdown/spec/cli/error-handling.md.txt +91 -0
  20. package/dist/templates/markdown/spec/cli/index.md.txt +37 -0
  21. package/dist/templates/markdown/spec/cli/options-flags.md.txt +71 -0
  22. package/dist/templates/markdown/spec/cli/output-formatting.md.txt +93 -0
  23. package/dist/utils/project-detector.d.ts +1 -1
  24. package/dist/utils/project-detector.d.ts.map +1 -1
  25. package/dist/utils/project-detector.js +20 -0
  26. package/dist/utils/project-detector.js.map +1 -1
  27. package/package.json +1 -1
  28. package/dist/templates/claude/commands/trellis/before-backend-dev.md +0 -13
  29. package/dist/templates/claude/commands/trellis/before-frontend-dev.md +0 -13
  30. package/dist/templates/claude/commands/trellis/break-loop.md +0 -125
  31. package/dist/templates/claude/commands/trellis/check-backend.md +0 -13
  32. package/dist/templates/claude/commands/trellis/check-cross-layer.md +0 -153
  33. package/dist/templates/claude/commands/trellis/check-frontend.md +0 -13
  34. package/dist/templates/claude/commands/trellis/create-command.md +0 -154
  35. package/dist/templates/claude/commands/trellis/finish-work.md +0 -129
  36. package/dist/templates/claude/commands/trellis/integrate-skill.md +0 -219
  37. package/dist/templates/claude/commands/trellis/onboard.md +0 -358
  38. package/dist/templates/claude/commands/trellis/parallel.md +0 -193
  39. package/dist/templates/claude/commands/trellis/record-session.md +0 -62
  40. package/dist/templates/claude/commands/trellis/start.md +0 -280
  41. package/dist/templates/claude/commands/trellis/update-spec.md +0 -285
  42. package/dist/templates/trellis/gitignore.txt +0 -29
  43. package/dist/templates/trellis/index.d.ts +0 -49
  44. package/dist/templates/trellis/index.d.ts.map +0 -1
  45. package/dist/templates/trellis/index.js +0 -92
  46. package/dist/templates/trellis/index.js.map +0 -1
  47. package/dist/templates/trellis/scripts/__init__.py +0 -5
  48. package/dist/templates/trellis/scripts/add_session.py +0 -392
  49. package/dist/templates/trellis/scripts/common/__init__.py +0 -80
  50. package/dist/templates/trellis/scripts/common/cli_adapter.py +0 -435
  51. package/dist/templates/trellis/scripts/common/developer.py +0 -190
  52. package/dist/templates/trellis/scripts/common/git_context.py +0 -383
  53. package/dist/templates/trellis/scripts/common/paths.py +0 -347
  54. package/dist/templates/trellis/scripts/common/phase.py +0 -253
  55. package/dist/templates/trellis/scripts/common/registry.py +0 -366
  56. package/dist/templates/trellis/scripts/common/task_queue.py +0 -255
  57. package/dist/templates/trellis/scripts/common/task_utils.py +0 -178
  58. package/dist/templates/trellis/scripts/common/worktree.py +0 -219
  59. package/dist/templates/trellis/scripts/create_bootstrap.py +0 -290
  60. package/dist/templates/trellis/scripts/get_context.py +0 -16
  61. package/dist/templates/trellis/scripts/get_developer.py +0 -26
  62. package/dist/templates/trellis/scripts/init_developer.py +0 -51
  63. package/dist/templates/trellis/scripts/multi_agent/__init__.py +0 -5
  64. package/dist/templates/trellis/scripts/multi_agent/cleanup.py +0 -403
  65. package/dist/templates/trellis/scripts/multi_agent/create_pr.py +0 -329
  66. package/dist/templates/trellis/scripts/multi_agent/plan.py +0 -233
  67. package/dist/templates/trellis/scripts/multi_agent/start.py +0 -461
  68. package/dist/templates/trellis/scripts/multi_agent/status.py +0 -817
  69. package/dist/templates/trellis/scripts/task.py +0 -1056
  70. package/dist/templates/trellis/scripts-shell-archive/add-session.sh +0 -384
  71. package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +0 -129
  72. package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +0 -263
  73. package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +0 -208
  74. package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +0 -150
  75. package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +0 -247
  76. package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +0 -142
  77. package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +0 -151
  78. package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +0 -128
  79. package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +0 -299
  80. package/dist/templates/trellis/scripts-shell-archive/get-context.sh +0 -7
  81. package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +0 -15
  82. package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +0 -34
  83. package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +0 -396
  84. package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +0 -241
  85. package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +0 -207
  86. package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +0 -317
  87. package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +0 -828
  88. package/dist/templates/trellis/scripts-shell-archive/task.sh +0 -1204
  89. package/dist/templates/trellis/tasks/.gitkeep +0 -0
  90. package/dist/templates/trellis/workflow.md +0 -416
  91. package/dist/templates/trellis/worktree.yaml +0 -47
@@ -41,7 +41,7 @@ Every AI session starts with a blank slate. Unlike human engineers who accumulat
41
41
 
42
42
  **The Problem**: Without memory, AI asks the same questions repeatedly, makes the same mistakes, and can't build on previous work.
43
43
 
44
- **The Solution**: The `.aim-studio/workspace/` system captures what happened in each session - what was done, what was learned, what problems were solved. The `/aim:start` command reads this history at session start, giving AI "artificial memory."
44
+ **The Solution**: The `aim-workspace/` system captures what happened in each session - what was done, what was learned, what problems were solved. The `/aim:start` command reads this history at session start, giving AI "artificial memory."
45
45
 
46
46
  ### Challenge 2: AI Has Generic Knowledge, Not Project-Specific Knowledge
47
47
 
@@ -67,11 +67,13 @@ Even after injecting guidelines, AI has limited context window. As conversation
67
67
  .aim-studio/
68
68
  |-- .developer # Your identity (gitignored)
69
69
  |-- workflow.md # Complete workflow documentation
70
- |-- workspace/ # "AI Memory" - session history
71
- | |-- index.md # All developers' progress
72
- | +-- {developer}/ # Per-developer directory
73
- | |-- index.md # Personal progress index
74
- | +-- journal-N.md # Session records (max 2000 lines)
70
+ |-- tasks/ # Task tracking (unified)
71
+
72
+ aim-workspace/ # "AI Memory" - session history (directly visible)
73
+ |-- index.md # All developers' progress
74
+ +-- {developer}/ # Per-developer directory
75
+ |-- index.md # Personal progress index
76
+ +-- journal-N.md # Session records (max 2000 lines)
75
77
  |-- tasks/ # Task tracking (unified)
76
78
  | +-- {MM}-{DD}-{slug}/ # Task directory
77
79
  | |-- task.json # Task metadata
@@ -116,7 +118,7 @@ AI needs the same onboarding - but compressed into seconds at session start.
116
118
  **WHAT IT ACTUALLY DOES**:
117
119
  1. Reads developer identity (who am I in this project?)
118
120
  2. Checks git status (what branch? uncommitted changes?)
119
- 3. Reads recent session history from `workspace/` (what happened before?)
121
+ 3. Reads recent session history from `aim-workspace/` (what happened before?)
120
122
  4. Identifies active features (what's in progress?)
121
123
  5. Understands current project state before making any changes
122
124
 
@@ -199,7 +201,7 @@ The `/check-*` commands focus on code quality within a single layer. But real ch
199
201
  All the context AI built during this session will be lost when session ends. The next session's `/aim:start` needs this information.
200
202
 
201
203
  **WHAT IT ACTUALLY DOES**:
202
- 1. Records session summary to `workspace/{developer}/journal-N.md`
204
+ 1. Records session summary to `aim-workspace/{developer}/journal-N.md`
203
205
  2. Captures what was done, learned, and what's remaining
204
206
  3. Updates index files for quick lookup
205
207
 
@@ -1,25 +1,25 @@
1
1
  ---
2
2
  name: start
3
- description: 开始 AIM Studio 创作会话
3
+ description: 开始 AIM Studio 开发会话
4
4
  ---
5
5
 
6
6
  # 开始会话
7
7
 
8
- 初始化 AIM Studio 漫剧创作会话,开始你的创作之旅。
8
+ 初始化 AIM Studio 开发会话,开始你的开发工作。
9
9
 
10
10
  ---
11
11
 
12
12
  ## 适用场景
13
13
 
14
- - 首次开始漫剧创作
15
- - 开始新的创作会话
14
+ - 首次开始项目开发
15
+ - 开始新的开发会话
16
16
  - 想要了解当前项目状态
17
17
 
18
18
  ---
19
19
 
20
20
  ## 使用步骤
21
21
 
22
- ### 步骤 1:理解创作工作流
22
+ ### 步骤 1:理解工作流
23
23
 
24
24
  首先阅读工作流指南:
25
25
 
@@ -30,28 +30,74 @@ cat .aim-studio/workflow.md
30
30
  **遵循 workflow.md 中的指导**,包含:
31
31
  - 核心原则(先读后写、遵循规范等)
32
32
  - 文件系统结构
33
- - 创作流程
33
+ - 开发流程
34
34
  - 最佳实践
35
35
 
36
36
  ### 步骤 2:获取当前上下文
37
37
 
38
38
  ```bash
39
- aim status
39
+ python3 .aim-studio/scripts/get_context.py
40
+ ```
41
+
42
+ 或者查看项目状态:
43
+
44
+ ```bash
45
+ python3 .aim-studio/scripts/task.py status
40
46
  ```
41
47
 
42
48
  显示:项目状态、当前任务(如有)、活跃任务列表。
43
49
 
44
- ### 步骤 3:阅读创作规范
50
+ ### 步骤 3:阅读开发规范
51
+
52
+ 根据项目类型,阅读相应的规范:
45
53
 
54
+ **如果是 CLI 项目**:
46
55
  ```bash
47
- cat .aim-studio/spec/story/script.md # 剧本与分镜规范
48
- cat .aim-studio/spec/story/character.md # 角色设定规范
49
- cat .aim-studio/spec/story/world.md # 世界观设定规范
56
+ cat .aim-studio/spec/cli/index.md # CLI 开发规范
57
+ cat .aim-studio/spec/cli/directory-structure.md
50
58
  ```
51
59
 
52
- ### 步骤 4:开始创作
60
+ **如果是前端项目**:
61
+ ```bash
62
+ cat .aim-studio/spec/frontend/index.md # 前端开发规范
63
+ cat .aim-studio/spec/frontend/component-guidelines.md
64
+ ```
53
65
 
54
- 报告你了解到的内容,询问用户:"您想要创作什么内容?"
66
+ **如果是后端项目**:
67
+ ```bash
68
+ cat .aim-studio/spec/backend/index.md # 后端开发规范
69
+ cat .aim-studio/spec/backend/directory-structure.md
70
+ ```
71
+
72
+ **如果是全栈项目**:
73
+ ```bash
74
+ cat .aim-studio/spec/frontend/index.md
75
+ cat .aim-studio/spec/backend/index.md
76
+ ```
77
+
78
+ **如果是漫剧创作项目**:
79
+ ```bash
80
+ cat .aim-studio/spec/story/script.md # 剧本与分镜规范
81
+ cat .aim-studio/spec/story/character.md # 角色设定规范
82
+ cat .aim-studio/spec/story/world.md # 世界观设定规范
83
+ ```
84
+
85
+ ### 步骤 4:检查当前任务
86
+
87
+ 查看是否有待完成的任务:
88
+
89
+ ```bash
90
+ python3 .aim-studio/scripts/task.py list
91
+ ```
92
+
93
+ 如果有任务,查看任务详情:
94
+ ```bash
95
+ python3 .aim-studio/scripts/task.py show <任务名>
96
+ ```
97
+
98
+ ### 步骤 5:开始工作
99
+
100
+ 报告你了解到的内容,询问用户:"您好!请问今天需要做什么?"
55
101
 
56
102
  ---
57
103
 
@@ -61,31 +107,46 @@ cat .aim-studio/spec/story/world.md # 世界观设定规范
61
107
 
62
108
  | 类型 | 标准 | 处理方式 |
63
109
  |------|------|----------|
64
- | 问题 | 用户询问关于创作、角色、世界观的问题 | 直接回答 |
65
- | 简单修改 | 修改角色设定、世界观设定等 | 直接编辑 |
66
- | 创作任务 | 创作新剧集、场次、角色等 | 使用 `/aim:story` 创作工作流 |
110
+ | 问题 | 用户询问关于项目的问题 | 直接回答 |
111
+ | 简单修改 | 小改动 | 直接处理 |
112
+ | 开发任务 | 需要多步骤完成的任务 | 创建任务并执行 |
113
+ | 漫剧创作 | 创作新故事、角色等(仅限 story 项目) | 使用 `/aim:story` |
114
+
115
+ ---
116
+
117
+ ## 项目类型检测
118
+
119
+ 根据项目结构自动识别项目类型:
120
+
121
+ | 项目类型 | 特征 | 规范目录 |
122
+ |----------|------|----------|
123
+ | CLI 工具 | 有 `bin/` 目录 | `spec/cli/` |
124
+ | 前端 | 有 `package.json`、前端框架 | `spec/frontend/` |
125
+ | 后端 | 有 `requirements.txt`、`go.mod` 等 | `spec/backend/` |
126
+ | 全栈 | 既有前端又有后端 | `spec/frontend/` + `spec/backend/` |
127
+ | 漫剧创作 | 有 `spec/story/` | `spec/story/` |
67
128
 
68
129
  ---
69
130
 
70
131
  ## 组合使用方案
71
132
 
72
- ### 方案一:全新项目启动
133
+ ### 方案一:日常开发
73
134
 
74
135
  ```
75
136
  1. /aim:start → 阅读工作流和项目状态
76
- 2. /aim:story → 开始创作新项目
77
- 3. /aim:portrait <角色名> 生成角色肖像
78
- 4. /aim:visualize → 生成图片提示词
79
- 5. /aim:finish-work → 完成工作
137
+ 2. 讨论需求...
138
+ 3. /aim:finish-work 完成工作并记录
80
139
  ```
81
140
 
82
- ### 方案二:继续现有创作
141
+ ### 方案二:漫剧创作(仅限 story 项目)
83
142
 
84
143
  ```
85
- 1. /aim:start → 查看当前进度
86
- 2. /aim:check-story 检查剧情一致性
87
- 3. 继续创作...
88
- 4. /aim:finish-work 完成工作
144
+ 1. /aim:start → 了解项目状态
145
+ 2. /aim:story 开始创作
146
+ 3. /aim:portrait <角色名> → 创建角色肖像
147
+ 4. /aim:visualize 生成图片提示词
148
+ 5. /aim:check-story → 检查剧情一致性
149
+ 6. /aim:finish-work → 完成工作并记录
89
150
  ```
90
151
 
91
152
  ---
@@ -94,19 +155,25 @@ cat .aim-studio/spec/story/world.md # 世界观设定规范
94
155
 
95
156
  > **规范是注入的,不是记忆的。**
96
157
  >
97
- > 创作工作流确保 AI 接收相关规范。这比希望 AI "记住"规范更可靠。
158
+ > 开发工作流确保 AI 接收相关规范。这比希望 AI "记住"规范更可靠。
98
159
 
99
- > **Seedance 2.0 六要素必须完整。**
100
- >
101
- > 每个场次文件必须包含:
102
- > 【主体描述】+【动作/表演】+【环境/氛围】+【镜头语言】+【音频设计】+【风格影调】
160
+ ---
161
+
162
+ ## 相关命令(根据项目类型使用)
163
+
164
+ | 命令 | 用途 | 适用项目 |
165
+ |------|------|----------|
166
+ | `/aim:start` | 开始会话 | 所有 |
167
+ | `/aim:story` | 漫剧创作模式 | story |
168
+ | `/aim:portrait` | 生成角色肖像 | story |
169
+ | `/aim:visualize` | 生成图片提示词 | story |
170
+ | `/aim:check-story` | 检查剧情一致性 | story |
171
+ | `/aim:finish-work` | 完成工作并生成日志 | 所有 |
103
172
 
104
173
  ---
105
174
 
106
- ## 相关命令
175
+ ## 注意事项
107
176
 
108
- | 命令 | 用途 |
109
- |------|------|
110
- | `/aim:story` | 漫剧创作模式 |
111
- | `/aim:check-story` | 剧情逻辑检查 |
112
- | `/aim:finish-work` | 完成工作并生成日志 |
177
+ 1. **漫剧命令仅限 story 项目**:如果项目不是漫剧创作类型,`/aim:story` 等命令不可用
178
+ 2. **遵循项目规范**:开发前务必阅读 `spec/` 目录下的规范文件
179
+ 3. **记录工作进度**:完成工作后使用 `/aim:finish-work` 记录
@@ -45,7 +45,7 @@ if sys.platform == "win32":
45
45
  # =============================================================================
46
46
 
47
47
  DIR_WORKFLOW = ".aim-studio"
48
- DIR_WORKSPACE = "workspace"
48
+ DIR_WORKSPACE = "aim-workspace"
49
49
  DIR_TASKS = "tasks"
50
50
  DIR_SPEC = "spec"
51
51
  FILE_CURRENT_TASK = ".current-task"
@@ -337,10 +337,8 @@ def get_check_context(repo_root: str, task_dir: str) -> str:
337
337
  else:
338
338
  # Fallback: use hardcoded check files + spec.jsonl
339
339
  check_files = [
340
- (".claude/commands/trellis/finish-work.md", "Finish work checklist"),
341
- (".claude/commands/trellis/check-cross-layer.md", "Cross-layer check spec"),
342
- (".claude/commands/trellis/check-backend.md", "Backend check spec"),
343
- (".claude/commands/trellis/check-frontend.md", "Frontend check spec"),
340
+ (".claude/commands/aim/finish-work.md", "Finish work checklist"),
341
+ (".claude/commands/aim/check-story.md", "Story check spec"),
344
342
  ]
345
343
  for file_path, description in check_files:
346
344
  content = read_file_content(repo_root, file_path)
@@ -382,11 +380,11 @@ def get_finish_context(repo_root: str, task_dir: str) -> str:
382
380
  else:
383
381
  # Fallback: only finish-work.md (lightweight)
384
382
  finish_work = read_file_content(
385
- repo_root, ".claude/commands/trellis/finish-work.md"
383
+ repo_root, ".claude/commands/aim/finish-work.md"
386
384
  )
387
385
  if finish_work:
388
386
  context_parts.append(
389
- f"=== .claude/commands/trellis/finish-work.md (Finish checklist) ===\n{finish_work}"
387
+ f"=== .claude/commands/aim/finish-work.md (Finish checklist) ===\n{finish_work}"
390
388
  )
391
389
 
392
390
  # 2. Requirements document (for verifying requirements are met)
@@ -422,9 +420,7 @@ def get_debug_context(repo_root: str, task_dir: str) -> str:
422
420
  context_parts.append(f"=== {file_path} (Dev spec) ===\n{content}")
423
421
 
424
422
  check_files = [
425
- (".claude/commands/trellis/check-backend.md", "Backend check spec"),
426
- (".claude/commands/trellis/check-frontend.md", "Frontend check spec"),
427
- (".claude/commands/trellis/check-cross-layer.md", "Cross-layer check spec"),
423
+ (".claude/commands/aim/check-story.md", "Story check spec"),
428
424
  ]
429
425
  for file_path, description in check_files:
430
426
  content = read_file_content(repo_root, file_path)
@@ -65,6 +65,49 @@ def run_script(script_path: Path) -> str:
65
65
  return "No context available"
66
66
 
67
67
 
68
+ def detect_project_type(project_dir: Path) -> str:
69
+ """Detect project type based on directory structure."""
70
+
71
+ # Check for bin/ directory (CLI tool)
72
+ if (project_dir / "bin").is_dir():
73
+ return "cli"
74
+
75
+ # Check for story project (has spec/story/)
76
+ if (project_dir / ".aim-studio" / "spec" / "story").is_dir():
77
+ return "story"
78
+
79
+ # Check for frontend indicators
80
+ frontend_indicators = [
81
+ "package.json",
82
+ "vite.config.ts",
83
+ "vite.config.js",
84
+ "next.config.js",
85
+ "next.config.ts",
86
+ "nuxt.config.ts",
87
+ ]
88
+ has_frontend = any((project_dir / f).exists() for f in frontend_indicators)
89
+
90
+ # Check for backend indicators
91
+ backend_indicators = [
92
+ "requirements.txt",
93
+ "pyproject.toml",
94
+ "go.mod",
95
+ "Cargo.toml",
96
+ "pom.xml",
97
+ "composer.json",
98
+ ]
99
+ has_backend = any((project_dir / f).exists() for f in backend_indicators)
100
+
101
+ if has_frontend and has_backend:
102
+ return "fullstack"
103
+ elif has_frontend:
104
+ return "frontend"
105
+ elif has_backend:
106
+ return "backend"
107
+
108
+ return "unknown"
109
+
110
+
68
111
  def main():
69
112
  if should_skip_injection():
70
113
  sys.exit(0)
@@ -73,58 +116,125 @@ def main():
73
116
  trellis_dir = project_dir / ".aim-studio"
74
117
  claude_dir = project_dir / ".claude"
75
118
 
119
+ # Detect project type
120
+ project_type = detect_project_type(project_dir)
121
+
76
122
  output = StringIO()
77
123
 
78
- output.write("""<session-context>
79
- You are starting a new session in a Trellis-managed project.
80
- Read and follow all instructions below carefully.
81
- </session-context>
124
+ # 根据项目类型显示不同的欢迎信息
125
+ welcome_messages = {
126
+ "cli": "AIM Studio CLI 项目",
127
+ "frontend": "AIM Studio 前端项目",
128
+ "backend": "AIM Studio 后端项目",
129
+ "fullstack": "AIM Studio 全栈项目",
130
+ "story": "AIM Studio 漫剧创作项目",
131
+ "unknown": "AIM Studio 项目",
132
+ }
133
+
134
+ output.write(f"""<session-context>
135
+ 您正在启动一个 {welcome_messages.get(project_type, 'AIM Studio')} 会话。
136
+ 请仔细阅读以下说明并遵循执行。
137
+
138
+ 项目类型: {project_type}
82
139
 
83
140
  """)
84
141
 
142
+ # Get current context
85
143
  output.write("<current-state>\n")
86
144
  context_script = trellis_dir / "scripts" / "get_context.py"
87
145
  output.write(run_script(context_script))
88
146
  output.write("\n</current-state>\n\n")
89
147
 
148
+ # Workflow
90
149
  output.write("<workflow>\n")
91
- workflow_content = read_file(trellis_dir / "workflow.md", "No workflow.md found")
150
+ workflow_content = read_file(trellis_dir / "workflow.md", "未找到 workflow.md")
92
151
  output.write(workflow_content)
93
152
  output.write("\n</workflow>\n\n")
94
153
 
154
+ # Guidelines - 根据项目类型注入相应的规范
95
155
  output.write("<guidelines>\n")
96
156
 
97
- output.write("## Frontend\n")
98
- frontend_index = read_file(
99
- trellis_dir / "spec" / "frontend" / "index.md", "Not configured"
100
- )
101
- output.write(frontend_index)
102
- output.write("\n\n")
103
-
104
- output.write("## Backend\n")
105
- backend_index = read_file(
106
- trellis_dir / "spec" / "backend" / "index.md", "Not configured"
107
- )
108
- output.write(backend_index)
109
- output.write("\n\n")
157
+ # CLI 项目
158
+ if project_type == "cli":
159
+ output.write("## CLI 开发规范\n")
160
+ cli_index = read_file(
161
+ trellis_dir / "spec" / "cli" / "index.md", "未配置 CLI 规范"
162
+ )
163
+ output.write(cli_index)
164
+ output.write("\n\n")
165
+
166
+ # Frontend 项目
167
+ if project_type in ("frontend", "fullstack"):
168
+ output.write("## 前端开发规范\n")
169
+ frontend_index = read_file(
170
+ trellis_dir / "spec" / "frontend" / "index.md", "未配置前端规范"
171
+ )
172
+ output.write(frontend_index)
173
+ output.write("\n\n")
174
+
175
+ # Backend 项目
176
+ if project_type in ("backend", "fullstack", "cli"):
177
+ output.write("## 后端开发规范\n")
178
+ backend_index = read_file(
179
+ trellis_dir / "spec" / "backend" / "index.md", "未配置后端规范"
180
+ )
181
+ output.write(backend_index)
182
+ output.write("\n\n")
183
+
184
+ # Story 项目
185
+ if project_type == "story":
186
+ output.write("## 漫剧创作规范\n")
187
+ story_index = read_file(
188
+ trellis_dir / "spec" / "story" / "index.md", "未配置漫剧规范"
189
+ )
190
+ output.write(story_index)
191
+ output.write("\n\n")
110
192
 
111
- output.write("## Guides\n")
193
+ # Guides - 始终提供
194
+ output.write("## 开发指南\n")
112
195
  guides_index = read_file(
113
- trellis_dir / "spec" / "guides" / "index.md", "Not configured"
196
+ trellis_dir / "spec" / "guides" / "index.md", "未配置开发指南"
114
197
  )
115
198
  output.write(guides_index)
116
199
 
117
200
  output.write("\n</guidelines>\n\n")
118
201
 
202
+ # 读取命令文件 - 必须使用 commands/aim/ 目录(新结构)
203
+ def read_command_file(filename: str) -> str:
204
+ """读取 commands/aim/ 目录下的命令文件"""
205
+ aim_path = claude_dir / "commands" / "aim" / filename
206
+ if aim_path.exists():
207
+ return read_file(aim_path, "")
208
+ return f"未找到命令文件: {filename}"
209
+
210
+ # 根据项目类型选择不同的 start 指令
211
+ if project_type == "story":
212
+ start_md = read_command_file("story.md")
213
+ else:
214
+ start_md = read_command_file("start.md")
215
+
119
216
  output.write("<instructions>\n")
120
- start_md = read_file(
121
- claude_dir / "commands" / "trellis" / "start.md", "No start.md found"
122
- )
123
217
  output.write(start_md)
124
218
  output.write("\n</instructions>\n\n")
125
219
 
220
+ # 项目类型特定的提示
221
+ type_hints = {
222
+ "cli": "注意:这是一个 CLI 工具项目,请参考 spec/cli/ 目录下的规范。",
223
+ "frontend": "注意:这是一个前端项目,请参考 spec/frontend/ 目录下的规范。",
224
+ "backend": "注意:这是一个后端项目,请参考 spec/backend/ 目录下的规范。",
225
+ "fullstack": "注意:这是一个全栈项目,请同时参考 spec/frontend/ 和 spec/backend/ 目录下的规范。",
226
+ "story": "注意:这是一个漫剧创作项目,请使用 /aim:story 命令开始创作。漫剧命令不适用于其他类型的项目。",
227
+ "unknown": "注意:项目类型未知,请根据实际情况选择合适的工作流程。",
228
+ }
229
+
230
+ output.write(f"""<project-type-hint>
231
+ {type_hints.get(project_type, '')}
232
+ </project-type-hint>
233
+
234
+ """)
235
+
126
236
  output.write("""<ready>
127
- Context loaded. Wait for user's first message, then follow <instructions> to handle their request.
237
+ 上下文已加载。请等待用户的第一个消息,然后按照 <instructions> 中的说明处理用户请求。
128
238
  </ready>""")
129
239
 
130
240
  result = {
@@ -29,4 +29,9 @@ export declare const storyIndexContent: string;
29
29
  export declare const storyCharacterContent: string;
30
30
  export declare const storyWorldContent: string;
31
31
  export declare const storyScriptContent: string;
32
+ export declare const cliIndexContent: string;
33
+ export declare const cliDirectoryStructureContent: string;
34
+ export declare const cliOptionsFlagsContent: string;
35
+ export declare const cliOutputFormattingContent: string;
36
+ export declare const cliErrorHandlingContent: string;
32
37
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/markdown/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,eAAO,MAAM,eAAe,EAAE,MAAuC,CAAC;AAGtE,eAAO,MAAM,qBAAqB,EAAE,MACK,CAAC;AAG1C,eAAO,MAAM,yBAAyB,QAAwB,CAAC;AAG/D,eAAO,MAAM,wBAAwB,EAAE,MACH,CAAC;AAQrC,eAAO,MAAM,mBAAmB,EAAE,MAEjC,CAAC;AACF,eAAO,MAAM,gCAAgC,EAAE,MAE9C,CAAC;AACF,eAAO,MAAM,gCAAgC,EAAE,MAE9C,CAAC;AACF,eAAO,MAAM,+BAA+B,EAAE,MAE7C,CAAC;AACF,eAAO,MAAM,+BAA+B,EAAE,MAE7C,CAAC;AACF,eAAO,MAAM,2BAA2B,EAAE,MAEzC,CAAC;AAGF,eAAO,MAAM,oBAAoB,EAAE,MAElC,CAAC;AACF,eAAO,MAAM,iCAAiC,EAAE,MAE/C,CAAC;AACF,eAAO,MAAM,yBAAyB,EAAE,MAEvC,CAAC;AACF,eAAO,MAAM,6BAA6B,EAAE,MAE3C,CAAC;AACF,eAAO,MAAM,kCAAkC,EAAE,MAEhD,CAAC;AACF,eAAO,MAAM,gCAAgC,EAAE,MAE9C,CAAC;AACF,eAAO,MAAM,8BAA8B,EAAE,MAE5C,CAAC;AAGF,eAAO,MAAM,kBAAkB,EAAE,MAEhC,CAAC;AACF,eAAO,MAAM,oCAAoC,EAAE,MAElD,CAAC;AACF,eAAO,MAAM,mCAAmC,EAAE,MAEjD,CAAC;AACF,eAAO,MAAM,uCAAuC,EAAE,MAErD,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,MAE/B,CAAC;AACF,eAAO,MAAM,qBAAqB,EAAE,MAEnC,CAAC;AACF,eAAO,MAAM,iBAAiB,EAAE,MAE/B,CAAC;AACF,eAAO,MAAM,kBAAkB,EAAE,MAEhC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/markdown/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,eAAO,MAAM,eAAe,EAAE,MAAuC,CAAC;AAGtE,eAAO,MAAM,qBAAqB,EAAE,MACK,CAAC;AAG1C,eAAO,MAAM,yBAAyB,QAAwB,CAAC;AAG/D,eAAO,MAAM,wBAAwB,EAAE,MACH,CAAC;AAQrC,eAAO,MAAM,mBAAmB,EAAE,MAEjC,CAAC;AACF,eAAO,MAAM,gCAAgC,EAAE,MAE9C,CAAC;AACF,eAAO,MAAM,gCAAgC,EAAE,MAE9C,CAAC;AACF,eAAO,MAAM,+BAA+B,EAAE,MAE7C,CAAC;AACF,eAAO,MAAM,+BAA+B,EAAE,MAE7C,CAAC;AACF,eAAO,MAAM,2BAA2B,EAAE,MAEzC,CAAC;AAGF,eAAO,MAAM,oBAAoB,EAAE,MAElC,CAAC;AACF,eAAO,MAAM,iCAAiC,EAAE,MAE/C,CAAC;AACF,eAAO,MAAM,yBAAyB,EAAE,MAEvC,CAAC;AACF,eAAO,MAAM,6BAA6B,EAAE,MAE3C,CAAC;AACF,eAAO,MAAM,kCAAkC,EAAE,MAEhD,CAAC;AACF,eAAO,MAAM,gCAAgC,EAAE,MAE9C,CAAC;AACF,eAAO,MAAM,8BAA8B,EAAE,MAE5C,CAAC;AAGF,eAAO,MAAM,kBAAkB,EAAE,MAEhC,CAAC;AACF,eAAO,MAAM,oCAAoC,EAAE,MAElD,CAAC;AACF,eAAO,MAAM,mCAAmC,EAAE,MAEjD,CAAC;AACF,eAAO,MAAM,uCAAuC,EAAE,MACiB,CAAC;AAGxE,eAAO,MAAM,iBAAiB,EAAE,MAE/B,CAAC;AACF,eAAO,MAAM,qBAAqB,EAAE,MAEnC,CAAC;AACF,eAAO,MAAM,iBAAiB,EAAE,MAE/B,CAAC;AACF,eAAO,MAAM,kBAAkB,EAAE,MAEhC,CAAC;AAGF,eAAO,MAAM,eAAe,EAAE,MAE7B,CAAC;AACF,eAAO,MAAM,4BAA4B,EAAE,MAE1C,CAAC;AACF,eAAO,MAAM,sBAAsB,EAAE,MAEpC,CAAC;AACF,eAAO,MAAM,0BAA0B,EAAE,MAExC,CAAC;AACF,eAAO,MAAM,uBAAuB,EAAE,MAErC,CAAC"}
@@ -55,4 +55,10 @@ export const storyIndexContent = readLocalTemplate("spec/story/index.md.txt");
55
55
  export const storyCharacterContent = readLocalTemplate("spec/story/character.md.txt");
56
56
  export const storyWorldContent = readLocalTemplate("spec/story/world.md.txt");
57
57
  export const storyScriptContent = readLocalTemplate("spec/story/script.md.txt");
58
+ // CLI tool structure
59
+ export const cliIndexContent = readLocalTemplate("spec/cli/index.md.txt");
60
+ export const cliDirectoryStructureContent = readLocalTemplate("spec/cli/directory-structure.md.txt");
61
+ export const cliOptionsFlagsContent = readLocalTemplate("spec/cli/options-flags.md.txt");
62
+ export const cliOutputFormattingContent = readLocalTemplate("spec/cli/output-formatting.md.txt");
63
+ export const cliErrorHandlingContent = readLocalTemplate("spec/cli/error-handling.md.txt");
58
64
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/markdown/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/markdown/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ # CLI Directory Structure
2
+
3
+ > How the CLI tool is organized.
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Describe your CLI project's directory structure and organization.
10
+
11
+ ---
12
+
13
+ ## Entry Point
14
+
15
+ | File | Purpose |
16
+ |------|---------|
17
+ | `bin/aim.js` | Main CLI entry point |
18
+ | `src/cli/` | CLI argument parsing |
19
+ | `src/commands/` | Command implementations |
20
+
21
+ ---
22
+
23
+ ## Example Structure
24
+
25
+ ```
26
+ .
27
+ ├── bin/
28
+ │ └── aim.js # CLI entry point
29
+ ├── src/
30
+ │ ├── cli/ # Command-line parsing
31
+ │ │ └── index.ts
32
+ │ ├── commands/ # Command implementations
33
+ │ │ ├── init.ts
34
+ │ │ └── update.ts
35
+ │ ├── utils/ # Utility functions
36
+ │ └── types/ # TypeScript types
37
+ ├── package.json
38
+ └── tsconfig.json
39
+ ```
40
+
41
+ ---
42
+
43
+ ## Patterns
44
+
45
+ Describe common patterns used in your project:
46
+
47
+ ### Command Organization
48
+
49
+ ```typescript
50
+ // Example: how commands are registered
51
+ export const commands = [init, update];
52
+ ```
53
+
54
+ ### Module Boundaries
55
+
56
+ - `src/cli/` - Pure CLI concerns (parsing, help text)
57
+ - `src/commands/` - Business logic
58
+ - `src/utils/` - Shared utilities
59
+
60
+ ---
61
+
62
+ ## Anti-Patterns
63
+
64
+ - ❌ Mixing business logic in CLI entry point
65
+ - ❌ No separation between commands
66
+
67
+ ---
68
+
69
+ ## Add Your Examples
70
+
71
+ Replace these with real examples from your codebase.