@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.
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +123 -101
- package/dist/commands/init.js.map +1 -1
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +91 -65
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/templates/aim/scripts/common/paths.py +3 -2
- package/dist/templates/aim/scripts/export.py +427 -0
- package/dist/templates/claude/commands/aim/export.md +89 -115
- package/dist/templates/claude/commands/aim/onboard.md +10 -8
- package/dist/templates/claude/commands/aim/start.md +104 -37
- package/dist/templates/claude/hooks/inject-subagent-context.py +6 -10
- package/dist/templates/claude/hooks/session-start.py +134 -24
- package/dist/templates/markdown/index.d.ts +5 -0
- package/dist/templates/markdown/index.d.ts.map +1 -1
- package/dist/templates/markdown/index.js +6 -0
- package/dist/templates/markdown/index.js.map +1 -1
- package/dist/templates/markdown/spec/cli/directory-structure.md.txt +71 -0
- package/dist/templates/markdown/spec/cli/error-handling.md.txt +91 -0
- package/dist/templates/markdown/spec/cli/index.md.txt +37 -0
- package/dist/templates/markdown/spec/cli/options-flags.md.txt +71 -0
- package/dist/templates/markdown/spec/cli/output-formatting.md.txt +93 -0
- package/dist/utils/project-detector.d.ts +1 -1
- package/dist/utils/project-detector.d.ts.map +1 -1
- package/dist/utils/project-detector.js +20 -0
- package/dist/utils/project-detector.js.map +1 -1
- package/package.json +1 -1
- package/dist/templates/claude/commands/trellis/before-backend-dev.md +0 -13
- package/dist/templates/claude/commands/trellis/before-frontend-dev.md +0 -13
- package/dist/templates/claude/commands/trellis/break-loop.md +0 -125
- package/dist/templates/claude/commands/trellis/check-backend.md +0 -13
- package/dist/templates/claude/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/claude/commands/trellis/check-frontend.md +0 -13
- package/dist/templates/claude/commands/trellis/create-command.md +0 -154
- package/dist/templates/claude/commands/trellis/finish-work.md +0 -129
- package/dist/templates/claude/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/claude/commands/trellis/onboard.md +0 -358
- package/dist/templates/claude/commands/trellis/parallel.md +0 -193
- package/dist/templates/claude/commands/trellis/record-session.md +0 -62
- package/dist/templates/claude/commands/trellis/start.md +0 -280
- package/dist/templates/claude/commands/trellis/update-spec.md +0 -285
- package/dist/templates/trellis/gitignore.txt +0 -29
- package/dist/templates/trellis/index.d.ts +0 -49
- package/dist/templates/trellis/index.d.ts.map +0 -1
- package/dist/templates/trellis/index.js +0 -92
- package/dist/templates/trellis/index.js.map +0 -1
- package/dist/templates/trellis/scripts/__init__.py +0 -5
- package/dist/templates/trellis/scripts/add_session.py +0 -392
- package/dist/templates/trellis/scripts/common/__init__.py +0 -80
- package/dist/templates/trellis/scripts/common/cli_adapter.py +0 -435
- package/dist/templates/trellis/scripts/common/developer.py +0 -190
- package/dist/templates/trellis/scripts/common/git_context.py +0 -383
- package/dist/templates/trellis/scripts/common/paths.py +0 -347
- package/dist/templates/trellis/scripts/common/phase.py +0 -253
- package/dist/templates/trellis/scripts/common/registry.py +0 -366
- package/dist/templates/trellis/scripts/common/task_queue.py +0 -255
- package/dist/templates/trellis/scripts/common/task_utils.py +0 -178
- package/dist/templates/trellis/scripts/common/worktree.py +0 -219
- package/dist/templates/trellis/scripts/create_bootstrap.py +0 -290
- package/dist/templates/trellis/scripts/get_context.py +0 -16
- package/dist/templates/trellis/scripts/get_developer.py +0 -26
- package/dist/templates/trellis/scripts/init_developer.py +0 -51
- package/dist/templates/trellis/scripts/multi_agent/__init__.py +0 -5
- package/dist/templates/trellis/scripts/multi_agent/cleanup.py +0 -403
- package/dist/templates/trellis/scripts/multi_agent/create_pr.py +0 -329
- package/dist/templates/trellis/scripts/multi_agent/plan.py +0 -233
- package/dist/templates/trellis/scripts/multi_agent/start.py +0 -461
- package/dist/templates/trellis/scripts/multi_agent/status.py +0 -817
- package/dist/templates/trellis/scripts/task.py +0 -1056
- package/dist/templates/trellis/scripts-shell-archive/add-session.sh +0 -384
- package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +0 -129
- package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +0 -263
- package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +0 -208
- package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +0 -150
- package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +0 -247
- package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +0 -142
- package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +0 -151
- package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +0 -128
- package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +0 -299
- package/dist/templates/trellis/scripts-shell-archive/get-context.sh +0 -7
- package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +0 -15
- package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +0 -34
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +0 -396
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +0 -241
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +0 -207
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +0 -317
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +0 -828
- package/dist/templates/trellis/scripts-shell-archive/task.sh +0 -1204
- package/dist/templates/trellis/tasks/.gitkeep +0 -0
- package/dist/templates/trellis/workflow.md +0 -416
- 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
|
|
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
|
-
|--
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
|
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/
|
|
48
|
-
cat .aim-studio/spec/
|
|
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
|
-
|
|
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
|
-
|
|
|
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.
|
|
77
|
-
3. /aim:
|
|
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:
|
|
87
|
-
3.
|
|
88
|
-
4. /aim:
|
|
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
|
-
>
|
|
158
|
+
> 开发工作流确保 AI 接收相关规范。这比希望 AI "记住"规范更可靠。
|
|
98
159
|
|
|
99
|
-
|
|
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
|
-
|
|
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/
|
|
341
|
-
(".claude/commands/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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", "
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
193
|
+
# Guides - 始终提供
|
|
194
|
+
output.write("## 开发指南\n")
|
|
112
195
|
guides_index = read_file(
|
|
113
|
-
trellis_dir / "spec" / "guides" / "index.md", "
|
|
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
|
-
|
|
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,
|
|
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":"AAAA;;;;;GAKG;AAEH,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,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;GAEG;AACH,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3C,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAW,iBAAiB,CAAC,WAAW,CAAC,CAAC;AAEtE,oDAAoD;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAChC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;AAE1C,gCAAgC;AAChC,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAE/D,2DAA2D;AAC3D,MAAM,CAAC,MAAM,wBAAwB,GACnC,iBAAiB,CAAC,eAAe,CAAC,CAAC;AAErC,gFAAgF;AAChF,0DAA0D;AAC1D,wEAAwE;AACxE,gFAAgF;AAEhF,uCAAuC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAW,iBAAiB,CAC1D,2BAA2B,CAC5B,CAAC;AACF,MAAM,CAAC,MAAM,gCAAgC,GAAW,iBAAiB,CACvE,yCAAyC,CAC1C,CAAC;AACF,MAAM,CAAC,MAAM,gCAAgC,GAAW,iBAAiB,CACvE,yCAAyC,CAC1C,CAAC;AACF,MAAM,CAAC,MAAM,+BAA+B,GAAW,iBAAiB,CACtE,wCAAwC,CACzC,CAAC;AACF,MAAM,CAAC,MAAM,+BAA+B,GAAW,iBAAiB,CACtE,wCAAwC,CACzC,CAAC;AACF,MAAM,CAAC,MAAM,2BAA2B,GAAW,iBAAiB,CAClE,oCAAoC,CACrC,CAAC;AAEF,wCAAwC;AACxC,MAAM,CAAC,MAAM,oBAAoB,GAAW,iBAAiB,CAC3D,4BAA4B,CAC7B,CAAC;AACF,MAAM,CAAC,MAAM,iCAAiC,GAAW,iBAAiB,CACxE,0CAA0C,CAC3C,CAAC;AACF,MAAM,CAAC,MAAM,yBAAyB,GAAW,iBAAiB,CAChE,kCAAkC,CACnC,CAAC;AACF,MAAM,CAAC,MAAM,6BAA6B,GAAW,iBAAiB,CACpE,sCAAsC,CACvC,CAAC;AACF,MAAM,CAAC,MAAM,kCAAkC,GAAW,iBAAiB,CACzE,2CAA2C,CAC5C,CAAC;AACF,MAAM,CAAC,MAAM,gCAAgC,GAAW,iBAAiB,CACvE,yCAAyC,CAC1C,CAAC;AACF,MAAM,CAAC,MAAM,8BAA8B,GAAW,iBAAiB,CACrE,uCAAuC,CACxC,CAAC;AAEF,mBAAmB;AACnB,MAAM,CAAC,MAAM,kBAAkB,GAAW,iBAAiB,CACzD,0BAA0B,CAC3B,CAAC;AACF,MAAM,CAAC,MAAM,oCAAoC,GAAW,iBAAiB,CAC3E,+CAA+C,CAChD,CAAC;AACF,MAAM,CAAC,MAAM,mCAAmC,GAAW,iBAAiB,CAC1E,8CAA8C,CAC/C,CAAC;AACF,MAAM,CAAC,MAAM,uCAAuC,
|
|
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.
|