claude-code-workflow 6.0.5 → 6.1.1

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 (118) hide show
  1. package/.claude/agents/action-planning-agent.md +1 -1
  2. package/.claude/agents/cli-execution-agent.md +269 -269
  3. package/.claude/agents/cli-explore-agent.md +182 -182
  4. package/.claude/agents/context-search-agent.md +582 -582
  5. package/.claude/agents/memory-bridge.md +93 -93
  6. package/.claude/commands/cli/cli-init.md +1 -1
  7. package/.claude/commands/memory/docs-full-cli.md +471 -471
  8. package/.claude/commands/memory/docs-related-cli.md +386 -386
  9. package/.claude/commands/memory/docs.md +615 -615
  10. package/.claude/commands/memory/load.md +1 -1
  11. package/.claude/commands/memory/update-full.md +332 -332
  12. package/.claude/commands/memory/update-related.md +5 -5
  13. package/.claude/commands/workflow/init.md +1 -1
  14. package/.claude/commands/workflow/lite-fix.md +621 -621
  15. package/.claude/commands/workflow/lite-plan.md +592 -592
  16. package/.claude/commands/workflow/tools/context-gather.md +434 -434
  17. package/.claude/commands/workflow/ui-design/generate.md +504 -504
  18. package/.claude/commands/workflow/ui-design/import-from-code.md +537 -537
  19. package/.claude/scripts/classify-folders.sh +4 -0
  20. package/.claude/scripts/convert_tokens_to_css.sh +4 -0
  21. package/.claude/scripts/detect_changed_modules.sh +5 -1
  22. package/.claude/scripts/discover-design-files.sh +87 -83
  23. package/.claude/scripts/generate_module_docs.sh +717 -713
  24. package/.claude/scripts/get_modules_by_depth.sh +5 -1
  25. package/.claude/scripts/ui-generate-preview.sh +4 -0
  26. package/.claude/scripts/ui-instantiate-prototypes.sh +4 -0
  27. package/.claude/scripts/update_module_claude.sh +4 -0
  28. package/.claude/skills/command-guide/index/all-commands.json +1 -12
  29. package/.claude/skills/command-guide/index/by-category.json +1 -12
  30. package/.claude/skills/command-guide/index/by-use-case.json +1 -12
  31. package/.claude/skills/command-guide/index/essential-commands.json +1 -12
  32. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +127 -71
  33. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +269 -269
  34. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +182 -182
  35. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +18 -38
  36. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +582 -577
  37. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
  38. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +1 -1
  39. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
  40. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
  41. package/.claude/skills/command-guide/reference/commands/memory/docs.md +615 -610
  42. package/.claude/skills/command-guide/reference/commands/memory/load.md +1 -1
  43. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
  44. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +5 -5
  45. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +299 -451
  46. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +14 -37
  47. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +252 -350
  48. package/.claude/skills/command-guide/reference/commands/workflow/init.md +2 -2
  49. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +52 -0
  50. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +621 -602
  51. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +46 -36
  52. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +18 -58
  53. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +22 -52
  54. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +19 -48
  55. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +25 -5
  56. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +1 -1
  57. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +7 -7
  58. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
  59. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +151 -11
  60. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +4 -4
  61. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +1 -1
  62. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +504 -504
  63. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +537 -537
  64. package/.claude/workflows/context-search-strategy.md +77 -77
  65. package/.claude/workflows/tool-strategy.md +90 -71
  66. package/.claude/workflows/workflow-architecture.md +1 -1
  67. package/README.md +285 -285
  68. package/ccw/src/cli.js +7 -0
  69. package/ccw/src/commands/tool.js +217 -0
  70. package/ccw/src/core/dashboard-generator.js +18 -3
  71. package/ccw/src/core/lite-scanner.js +35 -11
  72. package/ccw/src/core/server.js +531 -46
  73. package/ccw/src/templates/dashboard-css/01-base.css +161 -0
  74. package/ccw/src/templates/dashboard-css/02-session.css +726 -0
  75. package/ccw/src/templates/dashboard-css/03-tasks.css +512 -0
  76. package/ccw/src/templates/dashboard-css/04-lite-tasks.css +843 -0
  77. package/ccw/src/templates/dashboard-css/05-context.css +2206 -0
  78. package/ccw/src/templates/dashboard-css/06-cards.css +1570 -0
  79. package/ccw/src/templates/dashboard-css/07-managers.css +936 -0
  80. package/ccw/src/templates/dashboard-css/08-review.css +1266 -0
  81. package/ccw/src/templates/dashboard-css/09-explorer.css +1397 -0
  82. package/ccw/src/templates/dashboard-js/components/global-notifications.js +219 -0
  83. package/ccw/src/templates/dashboard-js/components/hook-manager.js +10 -0
  84. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +11 -1
  85. package/ccw/src/templates/dashboard-js/components/navigation.js +11 -5
  86. package/ccw/src/templates/dashboard-js/components/tabs-context.js +20 -20
  87. package/ccw/src/templates/dashboard-js/components/tabs-other.js +11 -11
  88. package/ccw/src/templates/dashboard-js/components/theme.js +29 -1
  89. package/ccw/src/templates/dashboard-js/main.js +4 -0
  90. package/ccw/src/templates/dashboard-js/state.js +5 -0
  91. package/ccw/src/templates/dashboard-js/views/explorer.js +852 -0
  92. package/ccw/src/templates/dashboard-js/views/home.js +13 -9
  93. package/ccw/src/templates/dashboard-js/views/hook-manager.js +8 -5
  94. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +21 -16
  95. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +90 -19
  96. package/ccw/src/templates/dashboard-js/views/project-overview.js +15 -11
  97. package/ccw/src/templates/dashboard-js/views/review-session.js +3 -3
  98. package/ccw/src/templates/dashboard-js/views/session-detail.js +38 -28
  99. package/ccw/src/templates/dashboard.html +129 -28
  100. package/ccw/src/tools/classify-folders.js +204 -0
  101. package/ccw/src/tools/convert-tokens-to-css.js +250 -0
  102. package/ccw/src/tools/detect-changed-modules.js +288 -0
  103. package/ccw/src/tools/discover-design-files.js +134 -0
  104. package/ccw/src/tools/edit-file.js +266 -0
  105. package/ccw/src/tools/generate-module-docs.js +416 -0
  106. package/ccw/src/tools/get-modules-by-depth.js +308 -0
  107. package/ccw/src/tools/index.js +176 -0
  108. package/ccw/src/tools/ui-generate-preview.js +327 -0
  109. package/ccw/src/tools/ui-instantiate-prototypes.js +301 -0
  110. package/ccw/src/tools/update-module-claude.js +380 -0
  111. package/package.json +1 -1
  112. package/.claude/skills/command-guide/reference/commands/workflow/status.md +0 -352
  113. package/ccw/src/core/server.js.bak +0 -385
  114. package/ccw/src/core/server_original.bak +0 -385
  115. package/ccw/src/templates/dashboard.css +0 -8187
  116. package/ccw/src/templates/dashboard_tailwind.html +0 -42
  117. package/ccw/src/templates/dashboard_test.html +0 -37
  118. package/ccw/src/templates/tailwind-base.css +0 -212
@@ -1,713 +1,717 @@
1
- #!/bin/bash
2
- # Generate documentation for modules and projects with multiple strategies
3
- # Usage: generate_module_docs.sh <strategy> <source_path> <project_name> [tool] [model]
4
- # strategy: full|single|project-readme|project-architecture|http-api
5
- # source_path: Path to the source module directory (or project root for project-level docs)
6
- # project_name: Project name for output path (e.g., "myproject")
7
- # tool: gemini|qwen|codex (default: gemini)
8
- # model: Model name (optional, uses tool defaults)
9
- #
10
- # Default Models:
11
- # gemini: gemini-2.5-flash
12
- # qwen: coder-model
13
- # codex: gpt5-codex
14
- #
15
- # Module-Level Strategies:
16
- # full: Full documentation generation
17
- # - Read: All files in current and subdirectories (@**/*)
18
- # - Generate: API.md + README.md for each directory containing code files
19
- # - Use: Deep directories (Layer 3), comprehensive documentation
20
- #
21
- # single: Single-layer documentation
22
- # - Read: Current directory code + child API.md/README.md files
23
- # - Generate: API.md + README.md only in current directory
24
- # - Use: Upper layers (Layer 1-2), incremental updates
25
- #
26
- # Project-Level Strategies:
27
- # project-readme: Project overview documentation
28
- # - Read: All module API.md and README.md files
29
- # - Generate: README.md (project root)
30
- # - Use: After all module docs are generated
31
- #
32
- # project-architecture: System design documentation
33
- # - Read: All module docs + project README
34
- # - Generate: ARCHITECTURE.md + EXAMPLES.md
35
- # - Use: After project README is generated
36
- #
37
- # http-api: HTTP API documentation
38
- # - Read: API route files + existing docs
39
- # - Generate: api/README.md
40
- # - Use: For projects with HTTP APIs
41
- #
42
- # Output Structure:
43
- # Module docs: .workflow/docs/{project_name}/{source_path}/API.md
44
- # Module docs: .workflow/docs/{project_name}/{source_path}/README.md
45
- # Project docs: .workflow/docs/{project_name}/README.md
46
- # Project docs: .workflow/docs/{project_name}/ARCHITECTURE.md
47
- # Project docs: .workflow/docs/{project_name}/EXAMPLES.md
48
- # API docs: .workflow/docs/{project_name}/api/README.md
49
- #
50
- # Features:
51
- # - Path mirroring: source structure → docs structure
52
- # - Template-driven generation
53
- # - Respects .gitignore patterns
54
- # - Detects code vs navigation folders
55
- # - Tool fallback support
56
-
57
- # Build exclusion filters from .gitignore
58
- build_exclusion_filters() {
59
- local filters=""
60
-
61
- # Common system/cache directories to exclude
62
- local system_excludes=(
63
- ".git" "__pycache__" "node_modules" ".venv" "venv" "env"
64
- "dist" "build" ".cache" ".pytest_cache" ".mypy_cache"
65
- "coverage" ".nyc_output" "logs" "tmp" "temp" ".workflow"
66
- )
67
-
68
- for exclude in "${system_excludes[@]}"; do
69
- filters+=" -not -path '*/$exclude' -not -path '*/$exclude/*'"
70
- done
71
-
72
- # Find and parse .gitignore (current dir first, then git root)
73
- local gitignore_file=""
74
-
75
- # Check current directory first
76
- if [ -f ".gitignore" ]; then
77
- gitignore_file=".gitignore"
78
- else
79
- # Try to find git root and check for .gitignore there
80
- local git_root=$(git rev-parse --show-toplevel 2>/dev/null)
81
- if [ -n "$git_root" ] && [ -f "$git_root/.gitignore" ]; then
82
- gitignore_file="$git_root/.gitignore"
83
- fi
84
- fi
85
-
86
- # Parse .gitignore if found
87
- if [ -n "$gitignore_file" ]; then
88
- while IFS= read -r line; do
89
- # Skip empty lines and comments
90
- [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
91
-
92
- # Remove trailing slash and whitespace
93
- line=$(echo "$line" | sed 's|/$||' | xargs)
94
-
95
- # Skip wildcards patterns (too complex for simple find)
96
- [[ "$line" =~ \* ]] && continue
97
-
98
- # Add to filters
99
- filters+=" -not -path '*/$line' -not -path '*/$line/*'"
100
- done < "$gitignore_file"
101
- fi
102
-
103
- echo "$filters"
104
- }
105
-
106
- # Detect folder type (code vs navigation)
107
- detect_folder_type() {
108
- local target_path="$1"
109
- local exclusion_filters="$2"
110
-
111
- # Count code files (primary indicators)
112
- local code_count=$(eval "find \"$target_path\" -maxdepth 1 -type f \\( -name '*.ts' -o -name '*.tsx' -o -name '*.js' -o -name '*.jsx' -o -name '*.py' -o -name '*.sh' -o -name '*.go' -o -name '*.rs' \\) $exclusion_filters 2>/dev/null" | wc -l)
113
-
114
- if [ $code_count -gt 0 ]; then
115
- echo "code"
116
- else
117
- echo "navigation"
118
- fi
119
- }
120
-
121
- # Scan directory structure and generate structured information
122
- scan_directory_structure() {
123
- local target_path="$1"
124
- local strategy="$2"
125
-
126
- if [ ! -d "$target_path" ]; then
127
- echo "Directory not found: $target_path"
128
- return 1
129
- fi
130
-
131
- local exclusion_filters=$(build_exclusion_filters)
132
- local structure_info=""
133
-
134
- # Get basic directory info
135
- local dir_name=$(basename "$target_path")
136
- local total_files=$(eval "find \"$target_path\" -type f $exclusion_filters 2>/dev/null" | wc -l)
137
- local total_dirs=$(eval "find \"$target_path\" -type d $exclusion_filters 2>/dev/null" | wc -l)
138
- local folder_type=$(detect_folder_type "$target_path" "$exclusion_filters")
139
-
140
- structure_info+="Directory: $dir_name\n"
141
- structure_info+="Total files: $total_files\n"
142
- structure_info+="Total directories: $total_dirs\n"
143
- structure_info+="Folder type: $folder_type\n\n"
144
-
145
- if [ "$strategy" = "full" ]; then
146
- # For full: show all subdirectories with file counts
147
- structure_info+="Subdirectories with files:\n"
148
- while IFS= read -r dir; do
149
- if [ -n "$dir" ] && [ "$dir" != "$target_path" ]; then
150
- local rel_path=${dir#$target_path/}
151
- local file_count=$(eval "find \"$dir\" -maxdepth 1 -type f $exclusion_filters 2>/dev/null" | wc -l)
152
- if [ $file_count -gt 0 ]; then
153
- local subdir_type=$(detect_folder_type "$dir" "$exclusion_filters")
154
- structure_info+=" - $rel_path/ ($file_count files, type: $subdir_type)\n"
155
- fi
156
- fi
157
- done < <(eval "find \"$target_path\" -type d $exclusion_filters 2>/dev/null")
158
- else
159
- # For single: show direct children only
160
- structure_info+="Direct subdirectories:\n"
161
- while IFS= read -r dir; do
162
- if [ -n "$dir" ]; then
163
- local dir_name=$(basename "$dir")
164
- local file_count=$(eval "find \"$dir\" -maxdepth 1 -type f $exclusion_filters 2>/dev/null" | wc -l)
165
- local has_api=$([ -f "$dir/API.md" ] && echo " [has API.md]" || echo "")
166
- local has_readme=$([ -f "$dir/README.md" ] && echo " [has README.md]" || echo "")
167
- structure_info+=" - $dir_name/ ($file_count files)$has_api$has_readme\n"
168
- fi
169
- done < <(eval "find \"$target_path\" -maxdepth 1 -type d $exclusion_filters 2>/dev/null" | grep -v "^$target_path$")
170
- fi
171
-
172
- # Show main file types in current directory
173
- structure_info+="\nCurrent directory files:\n"
174
- local code_files=$(eval "find \"$target_path\" -maxdepth 1 -type f \\( -name '*.ts' -o -name '*.tsx' -o -name '*.js' -o -name '*.jsx' -o -name '*.py' -o -name '*.sh' -o -name '*.go' -o -name '*.rs' \\) $exclusion_filters 2>/dev/null" | wc -l)
175
- local config_files=$(eval "find \"$target_path\" -maxdepth 1 -type f \\( -name '*.json' -o -name '*.yaml' -o -name '*.yml' -o -name '*.toml' \\) $exclusion_filters 2>/dev/null" | wc -l)
176
- local doc_files=$(eval "find \"$target_path\" -maxdepth 1 -type f -name '*.md' $exclusion_filters 2>/dev/null" | wc -l)
177
-
178
- structure_info+=" - Code files: $code_files\n"
179
- structure_info+=" - Config files: $config_files\n"
180
- structure_info+=" - Documentation: $doc_files\n"
181
-
182
- printf "%b" "$structure_info"
183
- }
184
-
185
- # Calculate output path based on source path and project name
186
- calculate_output_path() {
187
- local source_path="$1"
188
- local project_name="$2"
189
- local project_root="$3"
190
-
191
- # Get absolute path of source (normalize to Unix-style path)
192
- local abs_source=$(cd "$source_path" && pwd)
193
-
194
- # Normalize project root to same format
195
- local norm_project_root=$(cd "$project_root" && pwd)
196
-
197
- # Calculate relative path from project root
198
- local rel_path="${abs_source#$norm_project_root}"
199
-
200
- # Remove leading slash if present
201
- rel_path="${rel_path#/}"
202
-
203
- # If source is project root, use project name directly
204
- if [ "$abs_source" = "$norm_project_root" ] || [ -z "$rel_path" ]; then
205
- echo "$norm_project_root/.workflow/docs/$project_name"
206
- else
207
- echo "$norm_project_root/.workflow/docs/$project_name/$rel_path"
208
- fi
209
- }
210
-
211
- generate_module_docs() {
212
- local strategy="$1"
213
- local source_path="$2"
214
- local project_name="$3"
215
- local tool="${4:-gemini}"
216
- local model="$5"
217
-
218
- # Validate parameters
219
- if [ -z "$strategy" ] || [ -z "$source_path" ] || [ -z "$project_name" ]; then
220
- echo "❌ Error: Strategy, source path, and project name are required"
221
- echo "Usage: generate_module_docs.sh <strategy> <source_path> <project_name> [tool] [model]"
222
- echo "Module strategies: full, single"
223
- echo "Project strategies: project-readme, project-architecture, http-api"
224
- return 1
225
- fi
226
-
227
- # Validate strategy
228
- local valid_strategies=("full" "single" "project-readme" "project-architecture" "http-api")
229
- local strategy_valid=false
230
- for valid_strategy in "${valid_strategies[@]}"; do
231
- if [ "$strategy" = "$valid_strategy" ]; then
232
- strategy_valid=true
233
- break
234
- fi
235
- done
236
-
237
- if [ "$strategy_valid" = false ]; then
238
- echo "❌ Error: Invalid strategy '$strategy'"
239
- echo "Valid module strategies: full, single"
240
- echo "Valid project strategies: project-readme, project-architecture, http-api"
241
- return 1
242
- fi
243
-
244
- if [ ! -d "$source_path" ]; then
245
- echo "❌ Error: Source directory '$source_path' does not exist"
246
- return 1
247
- fi
248
-
249
- # Set default models if not specified
250
- if [ -z "$model" ]; then
251
- case "$tool" in
252
- gemini)
253
- model="gemini-2.5-flash"
254
- ;;
255
- qwen)
256
- model="coder-model"
257
- ;;
258
- codex)
259
- model="gpt5-codex"
260
- ;;
261
- *)
262
- model=""
263
- ;;
264
- esac
265
- fi
266
-
267
- # Build exclusion filters
268
- local exclusion_filters=$(build_exclusion_filters)
269
-
270
- # Get project root
271
- local project_root=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
272
-
273
- # Determine if this is a project-level strategy
274
- local is_project_level=false
275
- if [[ "$strategy" =~ ^project- ]] || [ "$strategy" = "http-api" ]; then
276
- is_project_level=true
277
- fi
278
-
279
- # Calculate output path
280
- local output_path
281
- if [ "$is_project_level" = true ]; then
282
- # Project-level docs go to project root
283
- if [ "$strategy" = "http-api" ]; then
284
- output_path="$project_root/.workflow/docs/$project_name/api"
285
- else
286
- output_path="$project_root/.workflow/docs/$project_name"
287
- fi
288
- else
289
- output_path=$(calculate_output_path "$source_path" "$project_name" "$project_root")
290
- fi
291
-
292
- # Create output directory
293
- mkdir -p "$output_path"
294
-
295
- # Detect folder type (only for module-level strategies)
296
- local folder_type=""
297
- if [ "$is_project_level" = false ]; then
298
- folder_type=$(detect_folder_type "$source_path" "$exclusion_filters")
299
- fi
300
-
301
- # Load templates based on strategy
302
- local api_template=""
303
- local readme_template=""
304
- local template_content=""
305
-
306
- if [ "$is_project_level" = true ]; then
307
- # Project-level templates
308
- case "$strategy" in
309
- project-readme)
310
- local proj_readme_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/project-readme.txt"
311
- if [ -f "$proj_readme_path" ]; then
312
- template_content=$(cat "$proj_readme_path")
313
- echo " 📋 Loaded Project README template: $(wc -l < "$proj_readme_path") lines"
314
- fi
315
- ;;
316
- project-architecture)
317
- local arch_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/project-architecture.txt"
318
- local examples_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/project-examples.txt"
319
- if [ -f "$arch_path" ]; then
320
- template_content=$(cat "$arch_path")
321
- echo " 📋 Loaded Architecture template: $(wc -l < "$arch_path") lines"
322
- fi
323
- if [ -f "$examples_path" ]; then
324
- template_content="$template_content
325
-
326
- EXAMPLES TEMPLATE:
327
- $(cat "$examples_path")"
328
- echo " 📋 Loaded Examples template: $(wc -l < "$examples_path") lines"
329
- fi
330
- ;;
331
- http-api)
332
- local api_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/api.txt"
333
- if [ -f "$api_path" ]; then
334
- template_content=$(cat "$api_path")
335
- echo " 📋 Loaded HTTP API template: $(wc -l < "$api_path") lines"
336
- fi
337
- ;;
338
- esac
339
- else
340
- # Module-level templates
341
- local api_template_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/api.txt"
342
- local readme_template_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/module-readme.txt"
343
- local nav_template_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/folder-navigation.txt"
344
-
345
- if [ "$folder_type" = "code" ]; then
346
- if [ -f "$api_template_path" ]; then
347
- api_template=$(cat "$api_template_path")
348
- echo " 📋 Loaded API template: $(wc -l < "$api_template_path") lines"
349
- fi
350
- if [ -f "$readme_template_path" ]; then
351
- readme_template=$(cat "$readme_template_path")
352
- echo " 📋 Loaded README template: $(wc -l < "$readme_template_path") lines"
353
- fi
354
- else
355
- # Navigation folder uses navigation template
356
- if [ -f "$nav_template_path" ]; then
357
- readme_template=$(cat "$nav_template_path")
358
- echo " 📋 Loaded Navigation template: $(wc -l < "$nav_template_path") lines"
359
- fi
360
- fi
361
- fi
362
-
363
- # Scan directory structure (only for module-level strategies)
364
- local structure_info=""
365
- if [ "$is_project_level" = false ]; then
366
- echo " 🔍 Scanning directory structure..."
367
- structure_info=$(scan_directory_structure "$source_path" "$strategy")
368
- fi
369
-
370
- # Prepare logging info
371
- local module_name=$(basename "$source_path")
372
-
373
- echo "⚡ Generating docs: $source_path → $output_path"
374
- echo " Strategy: $strategy | Tool: $tool | Model: $model | Type: $folder_type"
375
- echo " Output: $output_path"
376
-
377
- # Build strategy-specific prompt
378
- local final_prompt=""
379
-
380
- # Project-level strategies
381
- if [ "$strategy" = "project-readme" ]; then
382
- final_prompt="PURPOSE: Generate comprehensive project overview documentation
383
-
384
- PROJECT: $project_name
385
- OUTPUT: Current directory (file will be moved to final location)
386
-
387
- Read: @.workflow/docs/$project_name/**/*.md
388
-
389
- Context: All module documentation files from the project
390
-
391
- Generate ONE documentation file in current directory:
392
- - README.md - Project root documentation
393
-
394
- Template:
395
- $template_content
396
-
397
- Instructions:
398
- - Create README.md in CURRENT DIRECTORY
399
- - Synthesize information from all module docs
400
- - Include project overview, getting started, and navigation
401
- - Create clear module navigation with links
402
- - Follow template structure exactly"
403
-
404
- elif [ "$strategy" = "project-architecture" ]; then
405
- final_prompt="PURPOSE: Generate system design and usage examples documentation
406
-
407
- PROJECT: $project_name
408
- OUTPUT: Current directory (files will be moved to final location)
409
-
410
- Read: @.workflow/docs/$project_name/**/*.md
411
-
412
- Context: All project documentation including module docs and project README
413
-
414
- Generate TWO documentation files in current directory:
415
- 1. ARCHITECTURE.md - System architecture and design patterns
416
- 2. EXAMPLES.md - End-to-end usage examples
417
-
418
- Template:
419
- $template_content
420
-
421
- Instructions:
422
- - Create both ARCHITECTURE.md and EXAMPLES.md in CURRENT DIRECTORY
423
- - Synthesize architectural patterns from module documentation
424
- - Document system structure, module relationships, and design decisions
425
- - Provide practical code examples and usage scenarios
426
- - Follow template structure for both files"
427
-
428
- elif [ "$strategy" = "http-api" ]; then
429
- final_prompt="PURPOSE: Generate HTTP API reference documentation
430
-
431
- PROJECT: $project_name
432
- OUTPUT: Current directory (file will be moved to final location)
433
-
434
- Read: @**/*.{ts,js,py,go,rs} @.workflow/docs/$project_name/**/*.md
435
-
436
- Context: API route files and existing documentation
437
-
438
- Generate ONE documentation file in current directory:
439
- - README.md - HTTP API documentation (in api/ subdirectory)
440
-
441
- Template:
442
- $template_content
443
-
444
- Instructions:
445
- - Create README.md in CURRENT DIRECTORY
446
- - Document all HTTP endpoints (routes, methods, parameters, responses)
447
- - Include authentication requirements and error codes
448
- - Provide request/response examples
449
- - Follow template structure (Part B: HTTP API documentation)"
450
-
451
- # Module-level strategies
452
- elif [ "$strategy" = "full" ]; then
453
- # Full strategy: read all files, generate for each directory
454
- if [ "$folder_type" = "code" ]; then
455
- final_prompt="PURPOSE: Generate comprehensive API and module documentation
456
-
457
- Directory Structure Analysis:
458
- $structure_info
459
-
460
- SOURCE: $source_path
461
- OUTPUT: Current directory (files will be moved to final location)
462
-
463
- Read: @**/*
464
-
465
- Generate TWO documentation files in current directory:
466
- 1. API.md - Code API documentation (functions, classes, interfaces)
467
- Template:
468
- $api_template
469
-
470
- 2. README.md - Module overview documentation
471
- Template:
472
- $readme_template
473
-
474
- Instructions:
475
- - Generate both API.md and README.md in CURRENT DIRECTORY
476
- - If subdirectories contain code files, generate their docs too (recursive)
477
- - Work bottom-up: deepest directories first
478
- - Follow template structure exactly
479
- - Use structure analysis for context"
480
- else
481
- # Navigation folder - README only
482
- final_prompt="PURPOSE: Generate navigation documentation for folder structure
483
-
484
- Directory Structure Analysis:
485
- $structure_info
486
-
487
- SOURCE: $source_path
488
- OUTPUT: Current directory (file will be moved to final location)
489
-
490
- Read: @**/*
491
-
492
- Generate ONE documentation file in current directory:
493
- - README.md - Navigation and folder overview
494
-
495
- Template:
496
- $readme_template
497
-
498
- Instructions:
499
- - Create README.md in CURRENT DIRECTORY
500
- - Focus on folder structure and navigation
501
- - Link to subdirectory documentation
502
- - Use structure analysis for context"
503
- fi
504
- else
505
- # Single strategy: read current + child docs only
506
- if [ "$folder_type" = "code" ]; then
507
- final_prompt="PURPOSE: Generate API and module documentation for current directory
508
-
509
- Directory Structure Analysis:
510
- $structure_info
511
-
512
- SOURCE: $source_path
513
- OUTPUT: Current directory (files will be moved to final location)
514
-
515
- Read: @*/API.md @*/README.md @*.ts @*.tsx @*.js @*.jsx @*.py @*.sh @*.go @*.rs @*.md @*.json @*.yaml @*.yml
516
-
517
- Generate TWO documentation files in current directory:
518
- 1. API.md - Code API documentation
519
- Template:
520
- $api_template
521
-
522
- 2. README.md - Module overview
523
- Template:
524
- $readme_template
525
-
526
- Instructions:
527
- - Generate both API.md and README.md in CURRENT DIRECTORY
528
- - Reference child documentation, do not duplicate
529
- - Follow template structure
530
- - Use structure analysis for current directory context"
531
- else
532
- # Navigation folder - README only
533
- final_prompt="PURPOSE: Generate navigation documentation
534
-
535
- Directory Structure Analysis:
536
- $structure_info
537
-
538
- SOURCE: $source_path
539
- OUTPUT: Current directory (file will be moved to final location)
540
-
541
- Read: @*/API.md @*/README.md @*.md
542
-
543
- Generate ONE documentation file in current directory:
544
- - README.md - Navigation and overview
545
-
546
- Template:
547
- $readme_template
548
-
549
- Instructions:
550
- - Create README.md in CURRENT DIRECTORY
551
- - Link to child documentation
552
- - Use structure analysis for navigation context"
553
- fi
554
- fi
555
-
556
- # Execute documentation generation
557
- local start_time=$(date +%s)
558
- echo " 🔄 Starting documentation generation..."
559
-
560
- if cd "$source_path" 2>/dev/null; then
561
- local tool_result=0
562
-
563
- # Store current output path for CLI context
564
- export DOC_OUTPUT_PATH="$output_path"
565
-
566
- # Record git HEAD before CLI execution (to detect unwanted auto-commits)
567
- local git_head_before=""
568
- if git rev-parse --git-dir >/dev/null 2>&1; then
569
- git_head_before=$(git rev-parse HEAD 2>/dev/null)
570
- fi
571
-
572
- # Execute with selected tool
573
- case "$tool" in
574
- qwen)
575
- if [ "$model" = "coder-model" ]; then
576
- qwen -p "$final_prompt" --yolo 2>&1
577
- else
578
- qwen -p "$final_prompt" -m "$model" --yolo 2>&1
579
- fi
580
- tool_result=$?
581
- ;;
582
- codex)
583
- codex --full-auto exec "$final_prompt" -m "$model" --skip-git-repo-check -s danger-full-access 2>&1
584
- tool_result=$?
585
- ;;
586
- gemini)
587
- gemini -p "$final_prompt" -m "$model" --yolo 2>&1
588
- tool_result=$?
589
- ;;
590
- *)
591
- echo " ⚠️ Unknown tool: $tool, defaulting to gemini"
592
- gemini -p "$final_prompt" -m "$model" --yolo 2>&1
593
- tool_result=$?
594
- ;;
595
- esac
596
-
597
- # Move generated files to output directory
598
- local docs_created=0
599
- local moved_files=""
600
-
601
- if [ $tool_result -eq 0 ]; then
602
- if [ "$is_project_level" = true ]; then
603
- # Project-level documentation files
604
- case "$strategy" in
605
- project-readme)
606
- if [ -f "README.md" ]; then
607
- mv "README.md" "$output_path/README.md" 2>/dev/null && {
608
- docs_created=$((docs_created + 1))
609
- moved_files+="README.md "
610
- }
611
- fi
612
- ;;
613
- project-architecture)
614
- if [ -f "ARCHITECTURE.md" ]; then
615
- mv "ARCHITECTURE.md" "$output_path/ARCHITECTURE.md" 2>/dev/null && {
616
- docs_created=$((docs_created + 1))
617
- moved_files+="ARCHITECTURE.md "
618
- }
619
- fi
620
- if [ -f "EXAMPLES.md" ]; then
621
- mv "EXAMPLES.md" "$output_path/EXAMPLES.md" 2>/dev/null && {
622
- docs_created=$((docs_created + 1))
623
- moved_files+="EXAMPLES.md "
624
- }
625
- fi
626
- ;;
627
- http-api)
628
- if [ -f "README.md" ]; then
629
- mv "README.md" "$output_path/README.md" 2>/dev/null && {
630
- docs_created=$((docs_created + 1))
631
- moved_files+="api/README.md "
632
- }
633
- fi
634
- ;;
635
- esac
636
- else
637
- # Module-level documentation files
638
- # Check and move API.md if it exists
639
- if [ "$folder_type" = "code" ] && [ -f "API.md" ]; then
640
- mv "API.md" "$output_path/API.md" 2>/dev/null && {
641
- docs_created=$((docs_created + 1))
642
- moved_files+="API.md "
643
- }
644
- fi
645
-
646
- # Check and move README.md if it exists
647
- if [ -f "README.md" ]; then
648
- mv "README.md" "$output_path/README.md" 2>/dev/null && {
649
- docs_created=$((docs_created + 1))
650
- moved_files+="README.md "
651
- }
652
- fi
653
- fi
654
- fi
655
-
656
- # Check if CLI tool auto-committed (and revert if needed)
657
- if [ -n "$git_head_before" ]; then
658
- local git_head_after=$(git rev-parse HEAD 2>/dev/null)
659
- if [ "$git_head_before" != "$git_head_after" ]; then
660
- echo " ⚠️ Detected unwanted auto-commit by CLI tool, reverting..."
661
- git reset --soft "$git_head_before" 2>/dev/null
662
- echo " ✅ Auto-commit reverted (files remain staged)"
663
- fi
664
- fi
665
-
666
- if [ $docs_created -gt 0 ]; then
667
- local end_time=$(date +%s)
668
- local duration=$((end_time - start_time))
669
- echo " ✅ Generated $docs_created doc(s) in ${duration}s: $moved_files"
670
- cd - > /dev/null
671
- return 0
672
- else
673
- echo " Documentation generation failed for $source_path"
674
- cd - > /dev/null
675
- return 1
676
- fi
677
- else
678
- echo " ❌ Cannot access directory: $source_path"
679
- return 1
680
- fi
681
- }
682
-
683
- # Execute function if script is run directly
684
- if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
685
- # Show help if no arguments or help requested
686
- if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
687
- echo "Usage: generate_module_docs.sh <strategy> <source_path> <project_name> [tool] [model]"
688
- echo ""
689
- echo "Module-Level Strategies:"
690
- echo " full - Generate docs for all subdirectories with code"
691
- echo " single - Generate docs only for current directory"
692
- echo ""
693
- echo "Project-Level Strategies:"
694
- echo " project-readme - Generate project root README.md"
695
- echo " project-architecture - Generate ARCHITECTURE.md + EXAMPLES.md"
696
- echo " http-api - Generate HTTP API documentation (api/README.md)"
697
- echo ""
698
- echo "Tools: gemini (default), qwen, codex"
699
- echo "Models: Use tool defaults if not specified"
700
- echo ""
701
- echo "Module Examples:"
702
- echo " ./generate_module_docs.sh full ./src/auth myproject"
703
- echo " ./generate_module_docs.sh single ./components myproject gemini"
704
- echo ""
705
- echo "Project Examples:"
706
- echo " ./generate_module_docs.sh project-readme . myproject"
707
- echo " ./generate_module_docs.sh project-architecture . myproject qwen"
708
- echo " ./generate_module_docs.sh http-api . myproject"
709
- exit 0
710
- fi
711
-
712
- generate_module_docs "$@"
713
- fi
1
+ #!/bin/bash
2
+ # ⚠️ DEPRECATED: This script is deprecated.
3
+ # Please use: ccw tool exec generate_module_docs '{"path":".","strategy":"single-layer","tool":"gemini"}'
4
+ # This file will be removed in a future version.
5
+
6
+ # Generate documentation for modules and projects with multiple strategies
7
+ # Usage: generate_module_docs.sh <strategy> <source_path> <project_name> [tool] [model]
8
+ # strategy: full|single|project-readme|project-architecture|http-api
9
+ # source_path: Path to the source module directory (or project root for project-level docs)
10
+ # project_name: Project name for output path (e.g., "myproject")
11
+ # tool: gemini|qwen|codex (default: gemini)
12
+ # model: Model name (optional, uses tool defaults)
13
+ #
14
+ # Default Models:
15
+ # gemini: gemini-2.5-flash
16
+ # qwen: coder-model
17
+ # codex: gpt5-codex
18
+ #
19
+ # Module-Level Strategies:
20
+ # full: Full documentation generation
21
+ # - Read: All files in current and subdirectories (@**/*)
22
+ # - Generate: API.md + README.md for each directory containing code files
23
+ # - Use: Deep directories (Layer 3), comprehensive documentation
24
+ #
25
+ # single: Single-layer documentation
26
+ # - Read: Current directory code + child API.md/README.md files
27
+ # - Generate: API.md + README.md only in current directory
28
+ # - Use: Upper layers (Layer 1-2), incremental updates
29
+ #
30
+ # Project-Level Strategies:
31
+ # project-readme: Project overview documentation
32
+ # - Read: All module API.md and README.md files
33
+ # - Generate: README.md (project root)
34
+ # - Use: After all module docs are generated
35
+ #
36
+ # project-architecture: System design documentation
37
+ # - Read: All module docs + project README
38
+ # - Generate: ARCHITECTURE.md + EXAMPLES.md
39
+ # - Use: After project README is generated
40
+ #
41
+ # http-api: HTTP API documentation
42
+ # - Read: API route files + existing docs
43
+ # - Generate: api/README.md
44
+ # - Use: For projects with HTTP APIs
45
+ #
46
+ # Output Structure:
47
+ # Module docs: .workflow/docs/{project_name}/{source_path}/API.md
48
+ # Module docs: .workflow/docs/{project_name}/{source_path}/README.md
49
+ # Project docs: .workflow/docs/{project_name}/README.md
50
+ # Project docs: .workflow/docs/{project_name}/ARCHITECTURE.md
51
+ # Project docs: .workflow/docs/{project_name}/EXAMPLES.md
52
+ # API docs: .workflow/docs/{project_name}/api/README.md
53
+ #
54
+ # Features:
55
+ # - Path mirroring: source structure → docs structure
56
+ # - Template-driven generation
57
+ # - Respects .gitignore patterns
58
+ # - Detects code vs navigation folders
59
+ # - Tool fallback support
60
+
61
+ # Build exclusion filters from .gitignore
62
+ build_exclusion_filters() {
63
+ local filters=""
64
+
65
+ # Common system/cache directories to exclude
66
+ local system_excludes=(
67
+ ".git" "__pycache__" "node_modules" ".venv" "venv" "env"
68
+ "dist" "build" ".cache" ".pytest_cache" ".mypy_cache"
69
+ "coverage" ".nyc_output" "logs" "tmp" "temp" ".workflow"
70
+ )
71
+
72
+ for exclude in "${system_excludes[@]}"; do
73
+ filters+=" -not -path '*/$exclude' -not -path '*/$exclude/*'"
74
+ done
75
+
76
+ # Find and parse .gitignore (current dir first, then git root)
77
+ local gitignore_file=""
78
+
79
+ # Check current directory first
80
+ if [ -f ".gitignore" ]; then
81
+ gitignore_file=".gitignore"
82
+ else
83
+ # Try to find git root and check for .gitignore there
84
+ local git_root=$(git rev-parse --show-toplevel 2>/dev/null)
85
+ if [ -n "$git_root" ] && [ -f "$git_root/.gitignore" ]; then
86
+ gitignore_file="$git_root/.gitignore"
87
+ fi
88
+ fi
89
+
90
+ # Parse .gitignore if found
91
+ if [ -n "$gitignore_file" ]; then
92
+ while IFS= read -r line; do
93
+ # Skip empty lines and comments
94
+ [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
95
+
96
+ # Remove trailing slash and whitespace
97
+ line=$(echo "$line" | sed 's|/$||' | xargs)
98
+
99
+ # Skip wildcards patterns (too complex for simple find)
100
+ [[ "$line" =~ \* ]] && continue
101
+
102
+ # Add to filters
103
+ filters+=" -not -path '*/$line' -not -path '*/$line/*'"
104
+ done < "$gitignore_file"
105
+ fi
106
+
107
+ echo "$filters"
108
+ }
109
+
110
+ # Detect folder type (code vs navigation)
111
+ detect_folder_type() {
112
+ local target_path="$1"
113
+ local exclusion_filters="$2"
114
+
115
+ # Count code files (primary indicators)
116
+ local code_count=$(eval "find \"$target_path\" -maxdepth 1 -type f \\( -name '*.ts' -o -name '*.tsx' -o -name '*.js' -o -name '*.jsx' -o -name '*.py' -o -name '*.sh' -o -name '*.go' -o -name '*.rs' \\) $exclusion_filters 2>/dev/null" | wc -l)
117
+
118
+ if [ $code_count -gt 0 ]; then
119
+ echo "code"
120
+ else
121
+ echo "navigation"
122
+ fi
123
+ }
124
+
125
+ # Scan directory structure and generate structured information
126
+ scan_directory_structure() {
127
+ local target_path="$1"
128
+ local strategy="$2"
129
+
130
+ if [ ! -d "$target_path" ]; then
131
+ echo "Directory not found: $target_path"
132
+ return 1
133
+ fi
134
+
135
+ local exclusion_filters=$(build_exclusion_filters)
136
+ local structure_info=""
137
+
138
+ # Get basic directory info
139
+ local dir_name=$(basename "$target_path")
140
+ local total_files=$(eval "find \"$target_path\" -type f $exclusion_filters 2>/dev/null" | wc -l)
141
+ local total_dirs=$(eval "find \"$target_path\" -type d $exclusion_filters 2>/dev/null" | wc -l)
142
+ local folder_type=$(detect_folder_type "$target_path" "$exclusion_filters")
143
+
144
+ structure_info+="Directory: $dir_name\n"
145
+ structure_info+="Total files: $total_files\n"
146
+ structure_info+="Total directories: $total_dirs\n"
147
+ structure_info+="Folder type: $folder_type\n\n"
148
+
149
+ if [ "$strategy" = "full" ]; then
150
+ # For full: show all subdirectories with file counts
151
+ structure_info+="Subdirectories with files:\n"
152
+ while IFS= read -r dir; do
153
+ if [ -n "$dir" ] && [ "$dir" != "$target_path" ]; then
154
+ local rel_path=${dir#$target_path/}
155
+ local file_count=$(eval "find \"$dir\" -maxdepth 1 -type f $exclusion_filters 2>/dev/null" | wc -l)
156
+ if [ $file_count -gt 0 ]; then
157
+ local subdir_type=$(detect_folder_type "$dir" "$exclusion_filters")
158
+ structure_info+=" - $rel_path/ ($file_count files, type: $subdir_type)\n"
159
+ fi
160
+ fi
161
+ done < <(eval "find \"$target_path\" -type d $exclusion_filters 2>/dev/null")
162
+ else
163
+ # For single: show direct children only
164
+ structure_info+="Direct subdirectories:\n"
165
+ while IFS= read -r dir; do
166
+ if [ -n "$dir" ]; then
167
+ local dir_name=$(basename "$dir")
168
+ local file_count=$(eval "find \"$dir\" -maxdepth 1 -type f $exclusion_filters 2>/dev/null" | wc -l)
169
+ local has_api=$([ -f "$dir/API.md" ] && echo " [has API.md]" || echo "")
170
+ local has_readme=$([ -f "$dir/README.md" ] && echo " [has README.md]" || echo "")
171
+ structure_info+=" - $dir_name/ ($file_count files)$has_api$has_readme\n"
172
+ fi
173
+ done < <(eval "find \"$target_path\" -maxdepth 1 -type d $exclusion_filters 2>/dev/null" | grep -v "^$target_path$")
174
+ fi
175
+
176
+ # Show main file types in current directory
177
+ structure_info+="\nCurrent directory files:\n"
178
+ local code_files=$(eval "find \"$target_path\" -maxdepth 1 -type f \\( -name '*.ts' -o -name '*.tsx' -o -name '*.js' -o -name '*.jsx' -o -name '*.py' -o -name '*.sh' -o -name '*.go' -o -name '*.rs' \\) $exclusion_filters 2>/dev/null" | wc -l)
179
+ local config_files=$(eval "find \"$target_path\" -maxdepth 1 -type f \\( -name '*.json' -o -name '*.yaml' -o -name '*.yml' -o -name '*.toml' \\) $exclusion_filters 2>/dev/null" | wc -l)
180
+ local doc_files=$(eval "find \"$target_path\" -maxdepth 1 -type f -name '*.md' $exclusion_filters 2>/dev/null" | wc -l)
181
+
182
+ structure_info+=" - Code files: $code_files\n"
183
+ structure_info+=" - Config files: $config_files\n"
184
+ structure_info+=" - Documentation: $doc_files\n"
185
+
186
+ printf "%b" "$structure_info"
187
+ }
188
+
189
+ # Calculate output path based on source path and project name
190
+ calculate_output_path() {
191
+ local source_path="$1"
192
+ local project_name="$2"
193
+ local project_root="$3"
194
+
195
+ # Get absolute path of source (normalize to Unix-style path)
196
+ local abs_source=$(cd "$source_path" && pwd)
197
+
198
+ # Normalize project root to same format
199
+ local norm_project_root=$(cd "$project_root" && pwd)
200
+
201
+ # Calculate relative path from project root
202
+ local rel_path="${abs_source#$norm_project_root}"
203
+
204
+ # Remove leading slash if present
205
+ rel_path="${rel_path#/}"
206
+
207
+ # If source is project root, use project name directly
208
+ if [ "$abs_source" = "$norm_project_root" ] || [ -z "$rel_path" ]; then
209
+ echo "$norm_project_root/.workflow/docs/$project_name"
210
+ else
211
+ echo "$norm_project_root/.workflow/docs/$project_name/$rel_path"
212
+ fi
213
+ }
214
+
215
+ generate_module_docs() {
216
+ local strategy="$1"
217
+ local source_path="$2"
218
+ local project_name="$3"
219
+ local tool="${4:-gemini}"
220
+ local model="$5"
221
+
222
+ # Validate parameters
223
+ if [ -z "$strategy" ] || [ -z "$source_path" ] || [ -z "$project_name" ]; then
224
+ echo "❌ Error: Strategy, source path, and project name are required"
225
+ echo "Usage: generate_module_docs.sh <strategy> <source_path> <project_name> [tool] [model]"
226
+ echo "Module strategies: full, single"
227
+ echo "Project strategies: project-readme, project-architecture, http-api"
228
+ return 1
229
+ fi
230
+
231
+ # Validate strategy
232
+ local valid_strategies=("full" "single" "project-readme" "project-architecture" "http-api")
233
+ local strategy_valid=false
234
+ for valid_strategy in "${valid_strategies[@]}"; do
235
+ if [ "$strategy" = "$valid_strategy" ]; then
236
+ strategy_valid=true
237
+ break
238
+ fi
239
+ done
240
+
241
+ if [ "$strategy_valid" = false ]; then
242
+ echo "❌ Error: Invalid strategy '$strategy'"
243
+ echo "Valid module strategies: full, single"
244
+ echo "Valid project strategies: project-readme, project-architecture, http-api"
245
+ return 1
246
+ fi
247
+
248
+ if [ ! -d "$source_path" ]; then
249
+ echo "❌ Error: Source directory '$source_path' does not exist"
250
+ return 1
251
+ fi
252
+
253
+ # Set default models if not specified
254
+ if [ -z "$model" ]; then
255
+ case "$tool" in
256
+ gemini)
257
+ model="gemini-2.5-flash"
258
+ ;;
259
+ qwen)
260
+ model="coder-model"
261
+ ;;
262
+ codex)
263
+ model="gpt5-codex"
264
+ ;;
265
+ *)
266
+ model=""
267
+ ;;
268
+ esac
269
+ fi
270
+
271
+ # Build exclusion filters
272
+ local exclusion_filters=$(build_exclusion_filters)
273
+
274
+ # Get project root
275
+ local project_root=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
276
+
277
+ # Determine if this is a project-level strategy
278
+ local is_project_level=false
279
+ if [[ "$strategy" =~ ^project- ]] || [ "$strategy" = "http-api" ]; then
280
+ is_project_level=true
281
+ fi
282
+
283
+ # Calculate output path
284
+ local output_path
285
+ if [ "$is_project_level" = true ]; then
286
+ # Project-level docs go to project root
287
+ if [ "$strategy" = "http-api" ]; then
288
+ output_path="$project_root/.workflow/docs/$project_name/api"
289
+ else
290
+ output_path="$project_root/.workflow/docs/$project_name"
291
+ fi
292
+ else
293
+ output_path=$(calculate_output_path "$source_path" "$project_name" "$project_root")
294
+ fi
295
+
296
+ # Create output directory
297
+ mkdir -p "$output_path"
298
+
299
+ # Detect folder type (only for module-level strategies)
300
+ local folder_type=""
301
+ if [ "$is_project_level" = false ]; then
302
+ folder_type=$(detect_folder_type "$source_path" "$exclusion_filters")
303
+ fi
304
+
305
+ # Load templates based on strategy
306
+ local api_template=""
307
+ local readme_template=""
308
+ local template_content=""
309
+
310
+ if [ "$is_project_level" = true ]; then
311
+ # Project-level templates
312
+ case "$strategy" in
313
+ project-readme)
314
+ local proj_readme_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/project-readme.txt"
315
+ if [ -f "$proj_readme_path" ]; then
316
+ template_content=$(cat "$proj_readme_path")
317
+ echo " 📋 Loaded Project README template: $(wc -l < "$proj_readme_path") lines"
318
+ fi
319
+ ;;
320
+ project-architecture)
321
+ local arch_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/project-architecture.txt"
322
+ local examples_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/project-examples.txt"
323
+ if [ -f "$arch_path" ]; then
324
+ template_content=$(cat "$arch_path")
325
+ echo " 📋 Loaded Architecture template: $(wc -l < "$arch_path") lines"
326
+ fi
327
+ if [ -f "$examples_path" ]; then
328
+ template_content="$template_content
329
+
330
+ EXAMPLES TEMPLATE:
331
+ $(cat "$examples_path")"
332
+ echo " 📋 Loaded Examples template: $(wc -l < "$examples_path") lines"
333
+ fi
334
+ ;;
335
+ http-api)
336
+ local api_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/api.txt"
337
+ if [ -f "$api_path" ]; then
338
+ template_content=$(cat "$api_path")
339
+ echo " 📋 Loaded HTTP API template: $(wc -l < "$api_path") lines"
340
+ fi
341
+ ;;
342
+ esac
343
+ else
344
+ # Module-level templates
345
+ local api_template_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/api.txt"
346
+ local readme_template_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/module-readme.txt"
347
+ local nav_template_path="$HOME/.claude/workflows/cli-templates/prompts/documentation/folder-navigation.txt"
348
+
349
+ if [ "$folder_type" = "code" ]; then
350
+ if [ -f "$api_template_path" ]; then
351
+ api_template=$(cat "$api_template_path")
352
+ echo " 📋 Loaded API template: $(wc -l < "$api_template_path") lines"
353
+ fi
354
+ if [ -f "$readme_template_path" ]; then
355
+ readme_template=$(cat "$readme_template_path")
356
+ echo " 📋 Loaded README template: $(wc -l < "$readme_template_path") lines"
357
+ fi
358
+ else
359
+ # Navigation folder uses navigation template
360
+ if [ -f "$nav_template_path" ]; then
361
+ readme_template=$(cat "$nav_template_path")
362
+ echo " 📋 Loaded Navigation template: $(wc -l < "$nav_template_path") lines"
363
+ fi
364
+ fi
365
+ fi
366
+
367
+ # Scan directory structure (only for module-level strategies)
368
+ local structure_info=""
369
+ if [ "$is_project_level" = false ]; then
370
+ echo " 🔍 Scanning directory structure..."
371
+ structure_info=$(scan_directory_structure "$source_path" "$strategy")
372
+ fi
373
+
374
+ # Prepare logging info
375
+ local module_name=$(basename "$source_path")
376
+
377
+ echo "⚡ Generating docs: $source_path → $output_path"
378
+ echo " Strategy: $strategy | Tool: $tool | Model: $model | Type: $folder_type"
379
+ echo " Output: $output_path"
380
+
381
+ # Build strategy-specific prompt
382
+ local final_prompt=""
383
+
384
+ # Project-level strategies
385
+ if [ "$strategy" = "project-readme" ]; then
386
+ final_prompt="PURPOSE: Generate comprehensive project overview documentation
387
+
388
+ PROJECT: $project_name
389
+ OUTPUT: Current directory (file will be moved to final location)
390
+
391
+ Read: @.workflow/docs/$project_name/**/*.md
392
+
393
+ Context: All module documentation files from the project
394
+
395
+ Generate ONE documentation file in current directory:
396
+ - README.md - Project root documentation
397
+
398
+ Template:
399
+ $template_content
400
+
401
+ Instructions:
402
+ - Create README.md in CURRENT DIRECTORY
403
+ - Synthesize information from all module docs
404
+ - Include project overview, getting started, and navigation
405
+ - Create clear module navigation with links
406
+ - Follow template structure exactly"
407
+
408
+ elif [ "$strategy" = "project-architecture" ]; then
409
+ final_prompt="PURPOSE: Generate system design and usage examples documentation
410
+
411
+ PROJECT: $project_name
412
+ OUTPUT: Current directory (files will be moved to final location)
413
+
414
+ Read: @.workflow/docs/$project_name/**/*.md
415
+
416
+ Context: All project documentation including module docs and project README
417
+
418
+ Generate TWO documentation files in current directory:
419
+ 1. ARCHITECTURE.md - System architecture and design patterns
420
+ 2. EXAMPLES.md - End-to-end usage examples
421
+
422
+ Template:
423
+ $template_content
424
+
425
+ Instructions:
426
+ - Create both ARCHITECTURE.md and EXAMPLES.md in CURRENT DIRECTORY
427
+ - Synthesize architectural patterns from module documentation
428
+ - Document system structure, module relationships, and design decisions
429
+ - Provide practical code examples and usage scenarios
430
+ - Follow template structure for both files"
431
+
432
+ elif [ "$strategy" = "http-api" ]; then
433
+ final_prompt="PURPOSE: Generate HTTP API reference documentation
434
+
435
+ PROJECT: $project_name
436
+ OUTPUT: Current directory (file will be moved to final location)
437
+
438
+ Read: @**/*.{ts,js,py,go,rs} @.workflow/docs/$project_name/**/*.md
439
+
440
+ Context: API route files and existing documentation
441
+
442
+ Generate ONE documentation file in current directory:
443
+ - README.md - HTTP API documentation (in api/ subdirectory)
444
+
445
+ Template:
446
+ $template_content
447
+
448
+ Instructions:
449
+ - Create README.md in CURRENT DIRECTORY
450
+ - Document all HTTP endpoints (routes, methods, parameters, responses)
451
+ - Include authentication requirements and error codes
452
+ - Provide request/response examples
453
+ - Follow template structure (Part B: HTTP API documentation)"
454
+
455
+ # Module-level strategies
456
+ elif [ "$strategy" = "full" ]; then
457
+ # Full strategy: read all files, generate for each directory
458
+ if [ "$folder_type" = "code" ]; then
459
+ final_prompt="PURPOSE: Generate comprehensive API and module documentation
460
+
461
+ Directory Structure Analysis:
462
+ $structure_info
463
+
464
+ SOURCE: $source_path
465
+ OUTPUT: Current directory (files will be moved to final location)
466
+
467
+ Read: @**/*
468
+
469
+ Generate TWO documentation files in current directory:
470
+ 1. API.md - Code API documentation (functions, classes, interfaces)
471
+ Template:
472
+ $api_template
473
+
474
+ 2. README.md - Module overview documentation
475
+ Template:
476
+ $readme_template
477
+
478
+ Instructions:
479
+ - Generate both API.md and README.md in CURRENT DIRECTORY
480
+ - If subdirectories contain code files, generate their docs too (recursive)
481
+ - Work bottom-up: deepest directories first
482
+ - Follow template structure exactly
483
+ - Use structure analysis for context"
484
+ else
485
+ # Navigation folder - README only
486
+ final_prompt="PURPOSE: Generate navigation documentation for folder structure
487
+
488
+ Directory Structure Analysis:
489
+ $structure_info
490
+
491
+ SOURCE: $source_path
492
+ OUTPUT: Current directory (file will be moved to final location)
493
+
494
+ Read: @**/*
495
+
496
+ Generate ONE documentation file in current directory:
497
+ - README.md - Navigation and folder overview
498
+
499
+ Template:
500
+ $readme_template
501
+
502
+ Instructions:
503
+ - Create README.md in CURRENT DIRECTORY
504
+ - Focus on folder structure and navigation
505
+ - Link to subdirectory documentation
506
+ - Use structure analysis for context"
507
+ fi
508
+ else
509
+ # Single strategy: read current + child docs only
510
+ if [ "$folder_type" = "code" ]; then
511
+ final_prompt="PURPOSE: Generate API and module documentation for current directory
512
+
513
+ Directory Structure Analysis:
514
+ $structure_info
515
+
516
+ SOURCE: $source_path
517
+ OUTPUT: Current directory (files will be moved to final location)
518
+
519
+ Read: @*/API.md @*/README.md @*.ts @*.tsx @*.js @*.jsx @*.py @*.sh @*.go @*.rs @*.md @*.json @*.yaml @*.yml
520
+
521
+ Generate TWO documentation files in current directory:
522
+ 1. API.md - Code API documentation
523
+ Template:
524
+ $api_template
525
+
526
+ 2. README.md - Module overview
527
+ Template:
528
+ $readme_template
529
+
530
+ Instructions:
531
+ - Generate both API.md and README.md in CURRENT DIRECTORY
532
+ - Reference child documentation, do not duplicate
533
+ - Follow template structure
534
+ - Use structure analysis for current directory context"
535
+ else
536
+ # Navigation folder - README only
537
+ final_prompt="PURPOSE: Generate navigation documentation
538
+
539
+ Directory Structure Analysis:
540
+ $structure_info
541
+
542
+ SOURCE: $source_path
543
+ OUTPUT: Current directory (file will be moved to final location)
544
+
545
+ Read: @*/API.md @*/README.md @*.md
546
+
547
+ Generate ONE documentation file in current directory:
548
+ - README.md - Navigation and overview
549
+
550
+ Template:
551
+ $readme_template
552
+
553
+ Instructions:
554
+ - Create README.md in CURRENT DIRECTORY
555
+ - Link to child documentation
556
+ - Use structure analysis for navigation context"
557
+ fi
558
+ fi
559
+
560
+ # Execute documentation generation
561
+ local start_time=$(date +%s)
562
+ echo " 🔄 Starting documentation generation..."
563
+
564
+ if cd "$source_path" 2>/dev/null; then
565
+ local tool_result=0
566
+
567
+ # Store current output path for CLI context
568
+ export DOC_OUTPUT_PATH="$output_path"
569
+
570
+ # Record git HEAD before CLI execution (to detect unwanted auto-commits)
571
+ local git_head_before=""
572
+ if git rev-parse --git-dir >/dev/null 2>&1; then
573
+ git_head_before=$(git rev-parse HEAD 2>/dev/null)
574
+ fi
575
+
576
+ # Execute with selected tool
577
+ case "$tool" in
578
+ qwen)
579
+ if [ "$model" = "coder-model" ]; then
580
+ qwen -p "$final_prompt" --yolo 2>&1
581
+ else
582
+ qwen -p "$final_prompt" -m "$model" --yolo 2>&1
583
+ fi
584
+ tool_result=$?
585
+ ;;
586
+ codex)
587
+ codex --full-auto exec "$final_prompt" -m "$model" --skip-git-repo-check -s danger-full-access 2>&1
588
+ tool_result=$?
589
+ ;;
590
+ gemini)
591
+ gemini -p "$final_prompt" -m "$model" --yolo 2>&1
592
+ tool_result=$?
593
+ ;;
594
+ *)
595
+ echo " ⚠️ Unknown tool: $tool, defaulting to gemini"
596
+ gemini -p "$final_prompt" -m "$model" --yolo 2>&1
597
+ tool_result=$?
598
+ ;;
599
+ esac
600
+
601
+ # Move generated files to output directory
602
+ local docs_created=0
603
+ local moved_files=""
604
+
605
+ if [ $tool_result -eq 0 ]; then
606
+ if [ "$is_project_level" = true ]; then
607
+ # Project-level documentation files
608
+ case "$strategy" in
609
+ project-readme)
610
+ if [ -f "README.md" ]; then
611
+ mv "README.md" "$output_path/README.md" 2>/dev/null && {
612
+ docs_created=$((docs_created + 1))
613
+ moved_files+="README.md "
614
+ }
615
+ fi
616
+ ;;
617
+ project-architecture)
618
+ if [ -f "ARCHITECTURE.md" ]; then
619
+ mv "ARCHITECTURE.md" "$output_path/ARCHITECTURE.md" 2>/dev/null && {
620
+ docs_created=$((docs_created + 1))
621
+ moved_files+="ARCHITECTURE.md "
622
+ }
623
+ fi
624
+ if [ -f "EXAMPLES.md" ]; then
625
+ mv "EXAMPLES.md" "$output_path/EXAMPLES.md" 2>/dev/null && {
626
+ docs_created=$((docs_created + 1))
627
+ moved_files+="EXAMPLES.md "
628
+ }
629
+ fi
630
+ ;;
631
+ http-api)
632
+ if [ -f "README.md" ]; then
633
+ mv "README.md" "$output_path/README.md" 2>/dev/null && {
634
+ docs_created=$((docs_created + 1))
635
+ moved_files+="api/README.md "
636
+ }
637
+ fi
638
+ ;;
639
+ esac
640
+ else
641
+ # Module-level documentation files
642
+ # Check and move API.md if it exists
643
+ if [ "$folder_type" = "code" ] && [ -f "API.md" ]; then
644
+ mv "API.md" "$output_path/API.md" 2>/dev/null && {
645
+ docs_created=$((docs_created + 1))
646
+ moved_files+="API.md "
647
+ }
648
+ fi
649
+
650
+ # Check and move README.md if it exists
651
+ if [ -f "README.md" ]; then
652
+ mv "README.md" "$output_path/README.md" 2>/dev/null && {
653
+ docs_created=$((docs_created + 1))
654
+ moved_files+="README.md "
655
+ }
656
+ fi
657
+ fi
658
+ fi
659
+
660
+ # Check if CLI tool auto-committed (and revert if needed)
661
+ if [ -n "$git_head_before" ]; then
662
+ local git_head_after=$(git rev-parse HEAD 2>/dev/null)
663
+ if [ "$git_head_before" != "$git_head_after" ]; then
664
+ echo " ⚠️ Detected unwanted auto-commit by CLI tool, reverting..."
665
+ git reset --soft "$git_head_before" 2>/dev/null
666
+ echo " ✅ Auto-commit reverted (files remain staged)"
667
+ fi
668
+ fi
669
+
670
+ if [ $docs_created -gt 0 ]; then
671
+ local end_time=$(date +%s)
672
+ local duration=$((end_time - start_time))
673
+ echo " Generated $docs_created doc(s) in ${duration}s: $moved_files"
674
+ cd - > /dev/null
675
+ return 0
676
+ else
677
+ echo " ❌ Documentation generation failed for $source_path"
678
+ cd - > /dev/null
679
+ return 1
680
+ fi
681
+ else
682
+ echo " ❌ Cannot access directory: $source_path"
683
+ return 1
684
+ fi
685
+ }
686
+
687
+ # Execute function if script is run directly
688
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
689
+ # Show help if no arguments or help requested
690
+ if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
691
+ echo "Usage: generate_module_docs.sh <strategy> <source_path> <project_name> [tool] [model]"
692
+ echo ""
693
+ echo "Module-Level Strategies:"
694
+ echo " full - Generate docs for all subdirectories with code"
695
+ echo " single - Generate docs only for current directory"
696
+ echo ""
697
+ echo "Project-Level Strategies:"
698
+ echo " project-readme - Generate project root README.md"
699
+ echo " project-architecture - Generate ARCHITECTURE.md + EXAMPLES.md"
700
+ echo " http-api - Generate HTTP API documentation (api/README.md)"
701
+ echo ""
702
+ echo "Tools: gemini (default), qwen, codex"
703
+ echo "Models: Use tool defaults if not specified"
704
+ echo ""
705
+ echo "Module Examples:"
706
+ echo " ./generate_module_docs.sh full ./src/auth myproject"
707
+ echo " ./generate_module_docs.sh single ./components myproject gemini"
708
+ echo ""
709
+ echo "Project Examples:"
710
+ echo " ./generate_module_docs.sh project-readme . myproject"
711
+ echo " ./generate_module_docs.sh project-architecture . myproject qwen"
712
+ echo " ./generate_module_docs.sh http-api . myproject"
713
+ exit 0
714
+ fi
715
+
716
+ generate_module_docs "$@"
717
+ fi