@techwavedev/agi-agent-kit 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +147 -0
  3. package/bin/init.js +471 -0
  4. package/package.json +36 -0
  5. package/templates/.agent/agents/backend-specialist.md +263 -0
  6. package/templates/.agent/agents/code-archaeologist.md +106 -0
  7. package/templates/.agent/agents/database-architect.md +226 -0
  8. package/templates/.agent/agents/debugger.md +225 -0
  9. package/templates/.agent/agents/devops-engineer.md +242 -0
  10. package/templates/.agent/agents/documentation-writer.md +104 -0
  11. package/templates/.agent/agents/explorer-agent.md +73 -0
  12. package/templates/.agent/agents/frontend-specialist.md +556 -0
  13. package/templates/.agent/agents/game-developer.md +162 -0
  14. package/templates/.agent/agents/mobile-developer.md +377 -0
  15. package/templates/.agent/agents/orchestrator.md +416 -0
  16. package/templates/.agent/agents/penetration-tester.md +188 -0
  17. package/templates/.agent/agents/performance-optimizer.md +187 -0
  18. package/templates/.agent/agents/product-manager.md +112 -0
  19. package/templates/.agent/agents/project-planner.md +403 -0
  20. package/templates/.agent/agents/qa-automation-engineer.md +109 -0
  21. package/templates/.agent/agents/security-auditor.md +170 -0
  22. package/templates/.agent/agents/seo-specialist.md +111 -0
  23. package/templates/.agent/agents/test-engineer.md +158 -0
  24. package/templates/.agent/rules/GEMINI.md +253 -0
  25. package/templates/.agent/workflows/brainstorm.md +113 -0
  26. package/templates/.agent/workflows/create.md +59 -0
  27. package/templates/.agent/workflows/debug.md +103 -0
  28. package/templates/.agent/workflows/deploy.md +176 -0
  29. package/templates/.agent/workflows/enhance.md +63 -0
  30. package/templates/.agent/workflows/orchestrate.md +237 -0
  31. package/templates/.agent/workflows/plan.md +89 -0
  32. package/templates/.agent/workflows/preview.md +81 -0
  33. package/templates/.agent/workflows/status.md +86 -0
  34. package/templates/.agent/workflows/test.md +144 -0
  35. package/templates/.agent/workflows/ui-ux-pro-max.md +296 -0
  36. package/templates/base/.env.example +54 -0
  37. package/templates/base/AGENTS.md +463 -0
  38. package/templates/base/requirements.txt +6 -0
  39. package/templates/base/skill-creator/LICENSE.txt +202 -0
  40. package/templates/base/skill-creator/SKILL_skillcreator.md +389 -0
  41. package/templates/base/skill-creator/references/output-patterns.md +82 -0
  42. package/templates/base/skill-creator/references/workflows.md +28 -0
  43. package/templates/base/skill-creator/scripts/init_skill.py +304 -0
  44. package/templates/base/skill-creator/scripts/package_skill.py +110 -0
  45. package/templates/base/skill-creator/scripts/quick_validate.py +95 -0
  46. package/templates/base/skill-creator/scripts/update_catalog.py +371 -0
  47. package/templates/skills/core/README.md +21 -0
  48. package/templates/skills/core/documentation/SKILL.md +351 -0
  49. package/templates/skills/core/documentation/references/best_practices.md +201 -0
  50. package/templates/skills/core/documentation/scripts/analyze_code.py +307 -0
  51. package/templates/skills/core/documentation/scripts/detect_changes.py +460 -0
  52. package/templates/skills/core/documentation/scripts/generate_changelog.py +312 -0
  53. package/templates/skills/core/documentation/scripts/sync_docs.py +272 -0
  54. package/templates/skills/core/documentation/scripts/update_skill_docs.py +366 -0
  55. package/templates/skills/core/pdf-reader/SKILL.md +104 -0
  56. package/templates/skills/core/pdf-reader/references/pdf_libraries.md +83 -0
  57. package/templates/skills/core/pdf-reader/scripts/extract_text.py +295 -0
  58. package/templates/skills/core/qdrant-memory/SKILL.md +435 -0
  59. package/templates/skills/core/qdrant-memory/references/advanced_patterns.md +375 -0
  60. package/templates/skills/core/qdrant-memory/references/collection_schemas.md +229 -0
  61. package/templates/skills/core/qdrant-memory/references/complete_guide.md +724 -0
  62. package/templates/skills/core/qdrant-memory/references/embedding_models.md +325 -0
  63. package/templates/skills/core/qdrant-memory/scripts/benchmark_token_savings.py +640 -0
  64. package/templates/skills/core/qdrant-memory/scripts/embedding_utils.py +323 -0
  65. package/templates/skills/core/qdrant-memory/scripts/hybrid_search.py +214 -0
  66. package/templates/skills/core/qdrant-memory/scripts/init_collection.py +193 -0
  67. package/templates/skills/core/qdrant-memory/scripts/memory_retrieval.py +345 -0
  68. package/templates/skills/core/qdrant-memory/scripts/semantic_cache.py +282 -0
  69. package/templates/skills/core/qdrant-memory/scripts/test_skill.py +655 -0
  70. package/templates/skills/core/webcrawler/SKILL.md +292 -0
  71. package/templates/skills/core/webcrawler/references/advanced_crawling.md +181 -0
  72. package/templates/skills/core/webcrawler/scripts/crawl_docs.py +532 -0
  73. package/templates/skills/core/webcrawler/scripts/extract_page.py +189 -0
  74. package/templates/skills/core/webcrawler/scripts/filter_docs.py +200 -0
  75. package/templates/skills/knowledge/api-patterns/SKILL.md +81 -0
  76. package/templates/skills/knowledge/api-patterns/api-style.md +42 -0
  77. package/templates/skills/knowledge/api-patterns/auth.md +24 -0
  78. package/templates/skills/knowledge/api-patterns/documentation.md +26 -0
  79. package/templates/skills/knowledge/api-patterns/graphql.md +41 -0
  80. package/templates/skills/knowledge/api-patterns/rate-limiting.md +31 -0
  81. package/templates/skills/knowledge/api-patterns/response.md +37 -0
  82. package/templates/skills/knowledge/api-patterns/rest.md +40 -0
  83. package/templates/skills/knowledge/api-patterns/scripts/api_validator.py +211 -0
  84. package/templates/skills/knowledge/api-patterns/security-testing.md +122 -0
  85. package/templates/skills/knowledge/api-patterns/trpc.md +41 -0
  86. package/templates/skills/knowledge/api-patterns/versioning.md +22 -0
  87. package/templates/skills/knowledge/app-builder/SKILL.md +75 -0
  88. package/templates/skills/knowledge/app-builder/agent-coordination.md +71 -0
  89. package/templates/skills/knowledge/app-builder/feature-building.md +53 -0
  90. package/templates/skills/knowledge/app-builder/project-detection.md +34 -0
  91. package/templates/skills/knowledge/app-builder/scaffolding.md +118 -0
  92. package/templates/skills/knowledge/app-builder/tech-stack.md +40 -0
  93. package/templates/skills/knowledge/app-builder/templates/SKILL.md +39 -0
  94. package/templates/skills/knowledge/app-builder/templates/astro-static/TEMPLATE.md +76 -0
  95. package/templates/skills/knowledge/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
  96. package/templates/skills/knowledge/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
  97. package/templates/skills/knowledge/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
  98. package/templates/skills/knowledge/app-builder/templates/express-api/TEMPLATE.md +83 -0
  99. package/templates/skills/knowledge/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
  100. package/templates/skills/knowledge/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
  101. package/templates/skills/knowledge/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
  102. package/templates/skills/knowledge/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
  103. package/templates/skills/knowledge/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
  104. package/templates/skills/knowledge/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
  105. package/templates/skills/knowledge/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
  106. package/templates/skills/knowledge/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
  107. package/templates/skills/knowledge/architecture/SKILL.md +55 -0
  108. package/templates/skills/knowledge/architecture/context-discovery.md +43 -0
  109. package/templates/skills/knowledge/architecture/examples.md +94 -0
  110. package/templates/skills/knowledge/architecture/pattern-selection.md +68 -0
  111. package/templates/skills/knowledge/architecture/patterns-reference.md +50 -0
  112. package/templates/skills/knowledge/architecture/trade-off-analysis.md +77 -0
  113. package/templates/skills/knowledge/bash-linux/SKILL.md +199 -0
  114. package/templates/skills/knowledge/behavioral-modes/SKILL.md +242 -0
  115. package/templates/skills/knowledge/brainstorming/SKILL.md +163 -0
  116. package/templates/skills/knowledge/brainstorming/dynamic-questioning.md +350 -0
  117. package/templates/skills/knowledge/clean-code/SKILL.md +201 -0
  118. package/templates/skills/knowledge/code-review-checklist/SKILL.md +109 -0
  119. package/templates/skills/knowledge/database-design/SKILL.md +52 -0
  120. package/templates/skills/knowledge/database-design/database-selection.md +43 -0
  121. package/templates/skills/knowledge/database-design/indexing.md +39 -0
  122. package/templates/skills/knowledge/database-design/migrations.md +48 -0
  123. package/templates/skills/knowledge/database-design/optimization.md +36 -0
  124. package/templates/skills/knowledge/database-design/orm-selection.md +30 -0
  125. package/templates/skills/knowledge/database-design/schema-design.md +56 -0
  126. package/templates/skills/knowledge/database-design/scripts/schema_validator.py +172 -0
  127. package/templates/skills/knowledge/deployment-procedures/SKILL.md +241 -0
  128. package/templates/skills/knowledge/doc.md +177 -0
  129. package/templates/skills/knowledge/documentation-templates/SKILL.md +194 -0
  130. package/templates/skills/knowledge/frontend-design/SKILL.md +396 -0
  131. package/templates/skills/knowledge/frontend-design/animation-guide.md +331 -0
  132. package/templates/skills/knowledge/frontend-design/color-system.md +311 -0
  133. package/templates/skills/knowledge/frontend-design/decision-trees.md +418 -0
  134. package/templates/skills/knowledge/frontend-design/motion-graphics.md +306 -0
  135. package/templates/skills/knowledge/frontend-design/scripts/accessibility_checker.py +183 -0
  136. package/templates/skills/knowledge/frontend-design/scripts/ux_audit.py +722 -0
  137. package/templates/skills/knowledge/frontend-design/typography-system.md +345 -0
  138. package/templates/skills/knowledge/frontend-design/ux-psychology.md +541 -0
  139. package/templates/skills/knowledge/frontend-design/visual-effects.md +383 -0
  140. package/templates/skills/knowledge/game-development/2d-games/SKILL.md +119 -0
  141. package/templates/skills/knowledge/game-development/3d-games/SKILL.md +135 -0
  142. package/templates/skills/knowledge/game-development/SKILL.md +167 -0
  143. package/templates/skills/knowledge/game-development/game-art/SKILL.md +185 -0
  144. package/templates/skills/knowledge/game-development/game-audio/SKILL.md +190 -0
  145. package/templates/skills/knowledge/game-development/game-design/SKILL.md +129 -0
  146. package/templates/skills/knowledge/game-development/mobile-games/SKILL.md +108 -0
  147. package/templates/skills/knowledge/game-development/multiplayer/SKILL.md +132 -0
  148. package/templates/skills/knowledge/game-development/pc-games/SKILL.md +144 -0
  149. package/templates/skills/knowledge/game-development/vr-ar/SKILL.md +123 -0
  150. package/templates/skills/knowledge/game-development/web-games/SKILL.md +150 -0
  151. package/templates/skills/knowledge/geo-fundamentals/SKILL.md +156 -0
  152. package/templates/skills/knowledge/geo-fundamentals/scripts/geo_checker.py +289 -0
  153. package/templates/skills/knowledge/i18n-localization/SKILL.md +154 -0
  154. package/templates/skills/knowledge/i18n-localization/scripts/i18n_checker.py +241 -0
  155. package/templates/skills/knowledge/intelligent-routing/SKILL.md +334 -0
  156. package/templates/skills/knowledge/lint-and-validate/SKILL.md +45 -0
  157. package/templates/skills/knowledge/lint-and-validate/scripts/lint_runner.py +172 -0
  158. package/templates/skills/knowledge/lint-and-validate/scripts/type_coverage.py +173 -0
  159. package/templates/skills/knowledge/mcp-builder/SKILL.md +176 -0
  160. package/templates/skills/knowledge/mobile-design/SKILL.md +394 -0
  161. package/templates/skills/knowledge/mobile-design/decision-trees.md +516 -0
  162. package/templates/skills/knowledge/mobile-design/mobile-backend.md +491 -0
  163. package/templates/skills/knowledge/mobile-design/mobile-color-system.md +420 -0
  164. package/templates/skills/knowledge/mobile-design/mobile-debugging.md +122 -0
  165. package/templates/skills/knowledge/mobile-design/mobile-design-thinking.md +357 -0
  166. package/templates/skills/knowledge/mobile-design/mobile-navigation.md +458 -0
  167. package/templates/skills/knowledge/mobile-design/mobile-performance.md +767 -0
  168. package/templates/skills/knowledge/mobile-design/mobile-testing.md +356 -0
  169. package/templates/skills/knowledge/mobile-design/mobile-typography.md +433 -0
  170. package/templates/skills/knowledge/mobile-design/platform-android.md +666 -0
  171. package/templates/skills/knowledge/mobile-design/platform-ios.md +561 -0
  172. package/templates/skills/knowledge/mobile-design/scripts/mobile_audit.py +670 -0
  173. package/templates/skills/knowledge/mobile-design/touch-psychology.md +537 -0
  174. package/templates/skills/knowledge/nextjs-best-practices/SKILL.md +203 -0
  175. package/templates/skills/knowledge/nodejs-best-practices/SKILL.md +333 -0
  176. package/templates/skills/knowledge/parallel-agents/SKILL.md +175 -0
  177. package/templates/skills/knowledge/performance-profiling/SKILL.md +143 -0
  178. package/templates/skills/knowledge/performance-profiling/scripts/lighthouse_audit.py +76 -0
  179. package/templates/skills/knowledge/plan-writing/SKILL.md +152 -0
  180. package/templates/skills/knowledge/powershell-windows/SKILL.md +167 -0
  181. package/templates/skills/knowledge/python-patterns/SKILL.md +441 -0
  182. package/templates/skills/knowledge/react-patterns/SKILL.md +198 -0
  183. package/templates/skills/knowledge/red-team-tactics/SKILL.md +199 -0
  184. package/templates/skills/knowledge/seo-fundamentals/SKILL.md +129 -0
  185. package/templates/skills/knowledge/seo-fundamentals/scripts/seo_checker.py +219 -0
  186. package/templates/skills/knowledge/server-management/SKILL.md +161 -0
  187. package/templates/skills/knowledge/systematic-debugging/SKILL.md +109 -0
  188. package/templates/skills/knowledge/tailwind-patterns/SKILL.md +269 -0
  189. package/templates/skills/knowledge/tdd-workflow/SKILL.md +149 -0
  190. package/templates/skills/knowledge/testing-patterns/SKILL.md +178 -0
  191. package/templates/skills/knowledge/testing-patterns/scripts/test_runner.py +219 -0
  192. package/templates/skills/knowledge/vulnerability-scanner/SKILL.md +276 -0
  193. package/templates/skills/knowledge/vulnerability-scanner/checklists.md +121 -0
  194. package/templates/skills/knowledge/vulnerability-scanner/scripts/security_scan.py +458 -0
  195. package/templates/skills/knowledge/webapp-testing/SKILL.md +187 -0
  196. package/templates/skills/knowledge/webapp-testing/scripts/playwright_runner.py +173 -0
@@ -0,0 +1,307 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Code Analysis for Documentation
4
+
5
+ Analyzes Python files to extract documentation-relevant information
6
+ including docstrings, function signatures, and usage examples.
7
+
8
+ Usage:
9
+ python analyze_code.py --file <path> [options]
10
+
11
+ Arguments:
12
+ --file File to analyze (required)
13
+ --output Output format: summary, full, json (default: summary)
14
+
15
+ Exit Codes:
16
+ 0 - Success
17
+ 1 - Invalid arguments
18
+ 2 - File not found
19
+ 3 - Parse error
20
+ """
21
+
22
+ import argparse
23
+ import ast
24
+ import json
25
+ import sys
26
+ from pathlib import Path
27
+ from typing import Dict, List, Optional, Any
28
+
29
+
30
+ class CodeAnalyzer(ast.NodeVisitor):
31
+ """AST visitor to extract documentation-relevant information."""
32
+
33
+ def __init__(self):
34
+ self.module_docstring = None
35
+ self.classes = []
36
+ self.functions = []
37
+ self.imports = []
38
+ self.constants = []
39
+
40
+ def visit_Module(self, node):
41
+ """Extract module-level docstring."""
42
+ self.module_docstring = ast.get_docstring(node)
43
+ self.generic_visit(node)
44
+
45
+ def visit_Import(self, node):
46
+ """Track imports."""
47
+ for alias in node.names:
48
+ self.imports.append(alias.name)
49
+
50
+ def visit_ImportFrom(self, node):
51
+ """Track from imports."""
52
+ module = node.module or ''
53
+ for alias in node.names:
54
+ self.imports.append(f"{module}.{alias.name}")
55
+
56
+ def visit_ClassDef(self, node):
57
+ """Extract class information."""
58
+ class_info = {
59
+ 'name': node.name,
60
+ 'docstring': ast.get_docstring(node) or '',
61
+ 'methods': [],
62
+ 'bases': [self._get_name(base) for base in node.bases],
63
+ 'lineno': node.lineno
64
+ }
65
+
66
+ for item in node.body:
67
+ if isinstance(item, ast.FunctionDef):
68
+ method_info = self._extract_function(item)
69
+ class_info['methods'].append(method_info)
70
+
71
+ self.classes.append(class_info)
72
+
73
+ def visit_FunctionDef(self, node):
74
+ """Extract function information (module-level only)."""
75
+ # Skip methods (handled in visit_ClassDef)
76
+ if isinstance(node, ast.FunctionDef):
77
+ # Check if this is a top-level function
78
+ func_info = self._extract_function(node)
79
+ self.functions.append(func_info)
80
+
81
+ def visit_Assign(self, node):
82
+ """Extract module-level constants."""
83
+ for target in node.targets:
84
+ if isinstance(target, ast.Name):
85
+ if target.id.isupper(): # Convention: constants are UPPERCASE
86
+ self.constants.append({
87
+ 'name': target.id,
88
+ 'lineno': node.lineno
89
+ })
90
+
91
+ def _extract_function(self, node: ast.FunctionDef) -> Dict:
92
+ """Extract function/method information."""
93
+ args = []
94
+ for arg in node.args.args:
95
+ arg_info = {'name': arg.arg}
96
+ if arg.annotation:
97
+ arg_info['type'] = self._get_annotation(arg.annotation)
98
+ args.append(arg_info)
99
+
100
+ # Get return type
101
+ return_type = None
102
+ if node.returns:
103
+ return_type = self._get_annotation(node.returns)
104
+
105
+ # Get decorators
106
+ decorators = []
107
+ for decorator in node.decorator_list:
108
+ decorators.append(self._get_name(decorator))
109
+
110
+ return {
111
+ 'name': node.name,
112
+ 'docstring': ast.get_docstring(node) or '',
113
+ 'args': args,
114
+ 'return_type': return_type,
115
+ 'decorators': decorators,
116
+ 'lineno': node.lineno,
117
+ 'is_async': isinstance(node, ast.AsyncFunctionDef)
118
+ }
119
+
120
+ def _get_name(self, node) -> str:
121
+ """Get the name from an AST node."""
122
+ if isinstance(node, ast.Name):
123
+ return node.id
124
+ elif isinstance(node, ast.Attribute):
125
+ return f"{self._get_name(node.value)}.{node.attr}"
126
+ elif isinstance(node, ast.Call):
127
+ return self._get_name(node.func)
128
+ return str(node)
129
+
130
+ def _get_annotation(self, node) -> str:
131
+ """Get type annotation as string."""
132
+ if isinstance(node, ast.Name):
133
+ return node.id
134
+ elif isinstance(node, ast.Constant):
135
+ return str(node.value)
136
+ elif isinstance(node, ast.Subscript):
137
+ return f"{self._get_name(node.value)}[{self._get_annotation(node.slice)}]"
138
+ elif isinstance(node, ast.Tuple):
139
+ return ', '.join(self._get_annotation(el) for el in node.elts)
140
+ return ast.unparse(node) if hasattr(ast, 'unparse') else '...'
141
+
142
+
143
+ def analyze_file(file_path: Path) -> Dict[str, Any]:
144
+ """
145
+ Analyze a Python file and extract documentation info.
146
+
147
+ Returns:
148
+ Dict with module info, classes, functions, etc.
149
+ """
150
+ try:
151
+ content = file_path.read_text()
152
+ tree = ast.parse(content)
153
+ except SyntaxError as e:
154
+ return {'error': f'Syntax error: {e}', 'file': str(file_path)}
155
+ except Exception as e:
156
+ return {'error': str(e), 'file': str(file_path)}
157
+
158
+ analyzer = CodeAnalyzer()
159
+ analyzer.visit(tree)
160
+
161
+ return {
162
+ 'file': str(file_path),
163
+ 'module_docstring': analyzer.module_docstring,
164
+ 'classes': analyzer.classes,
165
+ 'functions': analyzer.functions,
166
+ 'imports': list(set(analyzer.imports)),
167
+ 'constants': analyzer.constants,
168
+ 'line_count': len(content.split('\n'))
169
+ }
170
+
171
+
172
+ def format_summary(analysis: Dict) -> str:
173
+ """Format analysis as a brief summary."""
174
+ if 'error' in analysis:
175
+ return f"❌ Error analyzing {analysis['file']}: {analysis['error']}"
176
+
177
+ lines = [
178
+ f"📄 **{Path(analysis['file']).name}**",
179
+ ""
180
+ ]
181
+
182
+ if analysis['module_docstring']:
183
+ # First line of docstring
184
+ first_line = analysis['module_docstring'].split('\n')[0].strip()
185
+ lines.append(f"> {first_line}")
186
+ lines.append("")
187
+
188
+ lines.append(f"- **Lines:** {analysis['line_count']}")
189
+ lines.append(f"- **Classes:** {len(analysis['classes'])}")
190
+ lines.append(f"- **Functions:** {len(analysis['functions'])}")
191
+ lines.append(f"- **Constants:** {len(analysis['constants'])}")
192
+
193
+ if analysis['classes']:
194
+ lines.append("")
195
+ lines.append("**Classes:**")
196
+ for cls in analysis['classes']:
197
+ method_count = len(cls['methods'])
198
+ lines.append(f"- `{cls['name']}` ({method_count} methods)")
199
+
200
+ if analysis['functions']:
201
+ lines.append("")
202
+ lines.append("**Functions:**")
203
+ for func in analysis['functions']:
204
+ if not func['name'].startswith('_'):
205
+ args_str = ', '.join(a['name'] for a in func['args'])
206
+ lines.append(f"- `{func['name']}({args_str})`")
207
+
208
+ return '\n'.join(lines)
209
+
210
+
211
+ def format_full(analysis: Dict) -> str:
212
+ """Format analysis with full details."""
213
+ if 'error' in analysis:
214
+ return f"❌ Error: {analysis['error']}"
215
+
216
+ lines = [
217
+ f"# {Path(analysis['file']).name}",
218
+ ""
219
+ ]
220
+
221
+ if analysis['module_docstring']:
222
+ lines.append("## Module Documentation")
223
+ lines.append("")
224
+ lines.append("```")
225
+ lines.append(analysis['module_docstring'])
226
+ lines.append("```")
227
+ lines.append("")
228
+
229
+ if analysis['classes']:
230
+ lines.append("## Classes")
231
+ lines.append("")
232
+
233
+ for cls in analysis['classes']:
234
+ bases = f"({', '.join(cls['bases'])})" if cls['bases'] else ""
235
+ lines.append(f"### `class {cls['name']}{bases}`")
236
+ lines.append("")
237
+
238
+ if cls['docstring']:
239
+ lines.append(cls['docstring'].split('\n')[0])
240
+ lines.append("")
241
+
242
+ if cls['methods']:
243
+ lines.append("**Methods:**")
244
+ for method in cls['methods']:
245
+ args = ', '.join(a['name'] for a in method['args'] if a['name'] != 'self')
246
+ ret = f" -> {method['return_type']}" if method['return_type'] else ""
247
+ lines.append(f"- `{method['name']}({args}){ret}`")
248
+ lines.append("")
249
+
250
+ if analysis['functions']:
251
+ lines.append("## Functions")
252
+ lines.append("")
253
+
254
+ for func in analysis['functions']:
255
+ args = ', '.join(a['name'] for a in func['args'])
256
+ ret = f" -> {func['return_type']}" if func['return_type'] else ""
257
+ lines.append(f"### `{func['name']}({args}){ret}`")
258
+ lines.append("")
259
+
260
+ if func['docstring']:
261
+ lines.append(func['docstring'])
262
+ lines.append("")
263
+
264
+ return '\n'.join(lines)
265
+
266
+
267
+ def main():
268
+ parser = argparse.ArgumentParser(
269
+ description='Analyze Python code for documentation',
270
+ formatter_class=argparse.RawDescriptionHelpFormatter,
271
+ epilog=__doc__
272
+ )
273
+ parser.add_argument('--file', required=True, help='File to analyze')
274
+ parser.add_argument('--output', choices=['summary', 'full', 'json'],
275
+ default='summary', help='Output format')
276
+ args = parser.parse_args()
277
+
278
+ file_path = Path(args.file).resolve()
279
+
280
+ if not file_path.exists():
281
+ print(f"❌ Error: File not found: {file_path}", file=sys.stderr)
282
+ sys.exit(2)
283
+
284
+ if not file_path.suffix == '.py':
285
+ print(f"❌ Error: Not a Python file: {file_path}", file=sys.stderr)
286
+ sys.exit(1)
287
+
288
+ # Analyze
289
+ analysis = analyze_file(file_path)
290
+
291
+ if 'error' in analysis:
292
+ print(f"❌ {analysis['error']}", file=sys.stderr)
293
+ sys.exit(3)
294
+
295
+ # Format output
296
+ if args.output == 'json':
297
+ print(json.dumps(analysis, indent=2))
298
+ elif args.output == 'full':
299
+ print(format_full(analysis))
300
+ else:
301
+ print(format_summary(analysis))
302
+
303
+ sys.exit(0)
304
+
305
+
306
+ if __name__ == '__main__':
307
+ main()