@techwavedev/agi-agent-kit 1.1.5 → 1.2.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.

Potentially problematic release.


This version of @techwavedev/agi-agent-kit might be problematic. Click here for more details.

Files changed (237) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/README.md +190 -12
  3. package/bin/init.js +30 -2
  4. package/package.json +6 -3
  5. package/templates/base/AGENTS.md +54 -23
  6. package/templates/base/README.md +325 -0
  7. package/templates/base/directives/memory_integration.md +95 -0
  8. package/templates/base/execution/memory_manager.py +309 -0
  9. package/templates/base/execution/session_boot.py +218 -0
  10. package/templates/base/execution/session_init.py +320 -0
  11. package/templates/base/skill-creator/LICENSE.txt +0 -0
  12. package/templates/base/skill-creator/references/output-patterns.md +0 -0
  13. package/templates/base/skill-creator/references/workflows.md +0 -0
  14. package/templates/base/skill-creator/scripts/init_skill.py +0 -0
  15. package/templates/base/skill-creator/scripts/package_skill.py +0 -0
  16. package/templates/base/skill-creator/scripts/quick_validate.py +0 -0
  17. package/templates/skills/core/documentation/SKILL.md +0 -0
  18. package/templates/skills/core/documentation/references/best_practices.md +0 -0
  19. package/templates/skills/core/documentation/scripts/analyze_code.py +0 -0
  20. package/templates/skills/core/documentation/scripts/detect_changes.py +0 -0
  21. package/templates/skills/core/documentation/scripts/generate_changelog.py +0 -0
  22. package/templates/skills/core/documentation/scripts/sync_docs.py +0 -0
  23. package/templates/skills/core/documentation/scripts/update_skill_docs.py +0 -0
  24. package/templates/skills/core/pdf-reader/SKILL.md +0 -0
  25. package/templates/skills/core/pdf-reader/references/pdf_libraries.md +0 -0
  26. package/templates/skills/core/pdf-reader/scripts/extract_text.py +0 -0
  27. package/templates/skills/core/qdrant-memory/SKILL.md +0 -0
  28. package/templates/skills/core/qdrant-memory/references/advanced_patterns.md +0 -0
  29. package/templates/skills/core/qdrant-memory/references/collection_schemas.md +0 -0
  30. package/templates/skills/core/qdrant-memory/references/complete_guide.md +0 -0
  31. package/templates/skills/core/qdrant-memory/references/embedding_models.md +0 -0
  32. package/templates/skills/core/qdrant-memory/scripts/__pycache__/embedding_utils.cpython-314.pyc +0 -0
  33. package/templates/skills/core/qdrant-memory/scripts/__pycache__/init_collection.cpython-314.pyc +0 -0
  34. package/templates/skills/core/qdrant-memory/scripts/benchmark_token_savings.py +0 -0
  35. package/templates/skills/core/qdrant-memory/scripts/embedding_utils.py +0 -0
  36. package/templates/skills/core/qdrant-memory/scripts/hybrid_search.py +0 -0
  37. package/templates/skills/core/qdrant-memory/scripts/init_collection.py +0 -0
  38. package/templates/skills/core/qdrant-memory/scripts/memory_retrieval.py +0 -0
  39. package/templates/skills/core/qdrant-memory/scripts/semantic_cache.py +0 -0
  40. package/templates/skills/core/qdrant-memory/scripts/test_skill.py +0 -0
  41. package/templates/skills/core/webcrawler/references/advanced_crawling.md +0 -0
  42. package/templates/skills/core/webcrawler/scripts/crawl_docs.py +0 -0
  43. package/templates/skills/core/webcrawler/scripts/extract_page.py +0 -0
  44. package/templates/skills/core/webcrawler/scripts/filter_docs.py +0 -0
  45. package/templates/skills/ec/README.md +31 -0
  46. package/templates/skills/ec/aws/SKILL.md +1020 -0
  47. package/templates/skills/ec/aws/defaults.yaml +13 -0
  48. package/templates/skills/ec/aws/references/common_patterns.md +80 -0
  49. package/templates/skills/ec/aws/references/mcp_servers.md +98 -0
  50. package/templates/skills/ec/aws-terraform/SKILL.md +349 -0
  51. package/templates/skills/ec/aws-terraform/references/best_practices.md +394 -0
  52. package/templates/skills/ec/aws-terraform/references/checkov_reference.md +337 -0
  53. package/templates/skills/ec/aws-terraform/scripts/configure_mcp.py +150 -0
  54. package/templates/skills/ec/confluent-kafka/SKILL.md +655 -0
  55. package/templates/skills/ec/confluent-kafka/references/ansible_playbooks.md +792 -0
  56. package/templates/skills/ec/confluent-kafka/references/ec_deployment.md +579 -0
  57. package/templates/skills/ec/confluent-kafka/references/kraft_migration.md +490 -0
  58. package/templates/skills/ec/confluent-kafka/references/troubleshooting.md +778 -0
  59. package/templates/skills/ec/confluent-kafka/references/upgrade_7x_to_8x.md +488 -0
  60. package/templates/skills/ec/confluent-kafka/scripts/kafka_health_check.py +435 -0
  61. package/templates/skills/ec/confluent-kafka/scripts/upgrade_preflight.py +568 -0
  62. package/templates/skills/ec/confluent-kafka/scripts/validate_config.py +455 -0
  63. package/templates/skills/ec/consul/SKILL.md +427 -0
  64. package/templates/skills/ec/consul/references/acl_setup.md +168 -0
  65. package/templates/skills/ec/consul/references/ha_config.md +196 -0
  66. package/templates/skills/ec/consul/references/troubleshooting.md +267 -0
  67. package/templates/skills/ec/consul/references/upgrades.md +213 -0
  68. package/templates/skills/ec/consul/scripts/consul_health_report.py +530 -0
  69. package/templates/skills/ec/consul/scripts/consul_status.py +264 -0
  70. package/templates/skills/ec/consul/scripts/generate_values.py +170 -0
  71. package/templates/skills/ec/documentation/SKILL.md +351 -0
  72. package/templates/skills/ec/documentation/references/best_practices.md +201 -0
  73. package/templates/skills/ec/documentation/scripts/analyze_code.py +307 -0
  74. package/templates/skills/ec/documentation/scripts/detect_changes.py +460 -0
  75. package/templates/skills/ec/documentation/scripts/generate_changelog.py +312 -0
  76. package/templates/skills/ec/documentation/scripts/sync_docs.py +272 -0
  77. package/templates/skills/ec/documentation/scripts/update_skill_docs.py +366 -0
  78. package/templates/skills/ec/gitlab/SKILL.md +529 -0
  79. package/templates/skills/ec/gitlab/references/agent_installation.md +416 -0
  80. package/templates/skills/ec/gitlab/references/api_reference.md +508 -0
  81. package/templates/skills/ec/gitlab/references/gitops_flux.md +465 -0
  82. package/templates/skills/ec/gitlab/references/troubleshooting.md +518 -0
  83. package/templates/skills/ec/gitlab/scripts/generate_agent_values.py +329 -0
  84. package/templates/skills/ec/gitlab/scripts/gitlab_agent_status.py +414 -0
  85. package/templates/skills/ec/jira/SKILL.md +484 -0
  86. package/templates/skills/ec/jira/references/jql_reference.md +148 -0
  87. package/templates/skills/ec/jira/scripts/add_comment.py +91 -0
  88. package/templates/skills/ec/jira/scripts/bulk_log_work.py +124 -0
  89. package/templates/skills/ec/jira/scripts/create_ticket.py +162 -0
  90. package/templates/skills/ec/jira/scripts/get_ticket.py +191 -0
  91. package/templates/skills/ec/jira/scripts/jira_client.py +383 -0
  92. package/templates/skills/ec/jira/scripts/log_work.py +154 -0
  93. package/templates/skills/ec/jira/scripts/search_tickets.py +104 -0
  94. package/templates/skills/ec/jira/scripts/update_comment.py +67 -0
  95. package/templates/skills/ec/jira/scripts/update_ticket.py +161 -0
  96. package/templates/skills/ec/karpenter/SKILL.md +301 -0
  97. package/templates/skills/ec/karpenter/references/ec2nodeclasses.md +421 -0
  98. package/templates/skills/ec/karpenter/references/migration.md +396 -0
  99. package/templates/skills/ec/karpenter/references/nodepools.md +400 -0
  100. package/templates/skills/ec/karpenter/references/troubleshooting.md +359 -0
  101. package/templates/skills/ec/karpenter/scripts/generate_ec2nodeclass.py +187 -0
  102. package/templates/skills/ec/karpenter/scripts/generate_nodepool.py +245 -0
  103. package/templates/skills/ec/karpenter/scripts/karpenter_status.py +359 -0
  104. package/templates/skills/ec/opensearch/SKILL.md +720 -0
  105. package/templates/skills/ec/opensearch/references/ml_neural_search.md +576 -0
  106. package/templates/skills/ec/opensearch/references/operator.md +532 -0
  107. package/templates/skills/ec/opensearch/references/query_dsl.md +532 -0
  108. package/templates/skills/ec/opensearch/scripts/configure_mcp.py +148 -0
  109. package/templates/skills/ec/victoriametrics/SKILL.md +598 -0
  110. package/templates/skills/ec/victoriametrics/references/kubernetes.md +531 -0
  111. package/templates/skills/ec/victoriametrics/references/prometheus_migration.md +333 -0
  112. package/templates/skills/ec/victoriametrics/references/troubleshooting.md +442 -0
  113. package/templates/skills/knowledge/SKILLS_CATALOG.md +1066 -0
  114. package/templates/skills/knowledge/api-patterns/SKILL.md +0 -0
  115. package/templates/skills/knowledge/api-patterns/api-style.md +0 -0
  116. package/templates/skills/knowledge/api-patterns/auth.md +0 -0
  117. package/templates/skills/knowledge/api-patterns/documentation.md +0 -0
  118. package/templates/skills/knowledge/api-patterns/graphql.md +0 -0
  119. package/templates/skills/knowledge/api-patterns/rate-limiting.md +0 -0
  120. package/templates/skills/knowledge/api-patterns/response.md +0 -0
  121. package/templates/skills/knowledge/api-patterns/rest.md +0 -0
  122. package/templates/skills/knowledge/api-patterns/scripts/api_validator.py +0 -0
  123. package/templates/skills/knowledge/api-patterns/security-testing.md +0 -0
  124. package/templates/skills/knowledge/api-patterns/trpc.md +0 -0
  125. package/templates/skills/knowledge/api-patterns/versioning.md +0 -0
  126. package/templates/skills/knowledge/app-builder/SKILL.md +0 -0
  127. package/templates/skills/knowledge/app-builder/agent-coordination.md +0 -0
  128. package/templates/skills/knowledge/app-builder/feature-building.md +0 -0
  129. package/templates/skills/knowledge/app-builder/project-detection.md +0 -0
  130. package/templates/skills/knowledge/app-builder/scaffolding.md +0 -0
  131. package/templates/skills/knowledge/app-builder/tech-stack.md +0 -0
  132. package/templates/skills/knowledge/app-builder/templates/SKILL.md +0 -0
  133. package/templates/skills/knowledge/app-builder/templates/astro-static/TEMPLATE.md +0 -0
  134. package/templates/skills/knowledge/app-builder/templates/chrome-extension/TEMPLATE.md +0 -0
  135. package/templates/skills/knowledge/app-builder/templates/cli-tool/TEMPLATE.md +0 -0
  136. package/templates/skills/knowledge/app-builder/templates/electron-desktop/TEMPLATE.md +0 -0
  137. package/templates/skills/knowledge/app-builder/templates/express-api/TEMPLATE.md +0 -0
  138. package/templates/skills/knowledge/app-builder/templates/flutter-app/TEMPLATE.md +0 -0
  139. package/templates/skills/knowledge/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -0
  140. package/templates/skills/knowledge/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -0
  141. package/templates/skills/knowledge/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -0
  142. package/templates/skills/knowledge/app-builder/templates/nextjs-static/TEMPLATE.md +0 -0
  143. package/templates/skills/knowledge/app-builder/templates/nuxt-app/TEMPLATE.md +0 -0
  144. package/templates/skills/knowledge/app-builder/templates/python-fastapi/TEMPLATE.md +0 -0
  145. package/templates/skills/knowledge/app-builder/templates/react-native-app/TEMPLATE.md +0 -0
  146. package/templates/skills/knowledge/architecture/SKILL.md +0 -0
  147. package/templates/skills/knowledge/architecture/context-discovery.md +0 -0
  148. package/templates/skills/knowledge/architecture/examples.md +0 -0
  149. package/templates/skills/knowledge/architecture/pattern-selection.md +0 -0
  150. package/templates/skills/knowledge/architecture/patterns-reference.md +0 -0
  151. package/templates/skills/knowledge/architecture/trade-off-analysis.md +0 -0
  152. package/templates/skills/knowledge/bash-linux/SKILL.md +0 -0
  153. package/templates/skills/knowledge/behavioral-modes/SKILL.md +0 -0
  154. package/templates/skills/knowledge/brainstorming/SKILL.md +0 -0
  155. package/templates/skills/knowledge/brainstorming/dynamic-questioning.md +0 -0
  156. package/templates/skills/knowledge/clean-code/SKILL.md +0 -0
  157. package/templates/skills/knowledge/code-review-checklist/SKILL.md +0 -0
  158. package/templates/skills/knowledge/database-design/SKILL.md +0 -0
  159. package/templates/skills/knowledge/database-design/database-selection.md +0 -0
  160. package/templates/skills/knowledge/database-design/indexing.md +0 -0
  161. package/templates/skills/knowledge/database-design/migrations.md +0 -0
  162. package/templates/skills/knowledge/database-design/optimization.md +0 -0
  163. package/templates/skills/knowledge/database-design/orm-selection.md +0 -0
  164. package/templates/skills/knowledge/database-design/schema-design.md +0 -0
  165. package/templates/skills/knowledge/database-design/scripts/schema_validator.py +0 -0
  166. package/templates/skills/knowledge/deployment-procedures/SKILL.md +0 -0
  167. package/templates/skills/knowledge/documentation-templates/SKILL.md +0 -0
  168. package/templates/skills/knowledge/frontend-design/SKILL.md +0 -0
  169. package/templates/skills/knowledge/frontend-design/animation-guide.md +0 -0
  170. package/templates/skills/knowledge/frontend-design/color-system.md +0 -0
  171. package/templates/skills/knowledge/frontend-design/decision-trees.md +0 -0
  172. package/templates/skills/knowledge/frontend-design/motion-graphics.md +0 -0
  173. package/templates/skills/knowledge/frontend-design/scripts/accessibility_checker.py +0 -0
  174. package/templates/skills/knowledge/frontend-design/scripts/ux_audit.py +0 -0
  175. package/templates/skills/knowledge/frontend-design/typography-system.md +0 -0
  176. package/templates/skills/knowledge/frontend-design/ux-psychology.md +0 -0
  177. package/templates/skills/knowledge/frontend-design/visual-effects.md +0 -0
  178. package/templates/skills/knowledge/game-development/2d-games/SKILL.md +0 -0
  179. package/templates/skills/knowledge/game-development/3d-games/SKILL.md +0 -0
  180. package/templates/skills/knowledge/game-development/SKILL.md +0 -0
  181. package/templates/skills/knowledge/game-development/game-art/SKILL.md +0 -0
  182. package/templates/skills/knowledge/game-development/game-audio/SKILL.md +0 -0
  183. package/templates/skills/knowledge/game-development/game-design/SKILL.md +0 -0
  184. package/templates/skills/knowledge/game-development/mobile-games/SKILL.md +0 -0
  185. package/templates/skills/knowledge/game-development/multiplayer/SKILL.md +0 -0
  186. package/templates/skills/knowledge/game-development/pc-games/SKILL.md +0 -0
  187. package/templates/skills/knowledge/game-development/vr-ar/SKILL.md +0 -0
  188. package/templates/skills/knowledge/game-development/web-games/SKILL.md +0 -0
  189. package/templates/skills/knowledge/geo-fundamentals/SKILL.md +0 -0
  190. package/templates/skills/knowledge/geo-fundamentals/scripts/geo_checker.py +0 -0
  191. package/templates/skills/knowledge/i18n-localization/SKILL.md +0 -0
  192. package/templates/skills/knowledge/i18n-localization/scripts/i18n_checker.py +0 -0
  193. package/templates/skills/knowledge/intelligent-routing/SKILL.md +237 -164
  194. package/templates/skills/knowledge/jira/scripts/__pycache__/jira_client.cpython-314.pyc +0 -0
  195. package/templates/skills/knowledge/lint-and-validate/SKILL.md +0 -0
  196. package/templates/skills/knowledge/lint-and-validate/scripts/lint_runner.py +0 -0
  197. package/templates/skills/knowledge/lint-and-validate/scripts/type_coverage.py +0 -0
  198. package/templates/skills/knowledge/mcp-builder/SKILL.md +0 -0
  199. package/templates/skills/knowledge/mobile-design/SKILL.md +0 -0
  200. package/templates/skills/knowledge/mobile-design/decision-trees.md +0 -0
  201. package/templates/skills/knowledge/mobile-design/mobile-backend.md +0 -0
  202. package/templates/skills/knowledge/mobile-design/mobile-color-system.md +0 -0
  203. package/templates/skills/knowledge/mobile-design/mobile-debugging.md +0 -0
  204. package/templates/skills/knowledge/mobile-design/mobile-design-thinking.md +0 -0
  205. package/templates/skills/knowledge/mobile-design/mobile-navigation.md +0 -0
  206. package/templates/skills/knowledge/mobile-design/mobile-performance.md +0 -0
  207. package/templates/skills/knowledge/mobile-design/mobile-testing.md +0 -0
  208. package/templates/skills/knowledge/mobile-design/mobile-typography.md +0 -0
  209. package/templates/skills/knowledge/mobile-design/platform-android.md +0 -0
  210. package/templates/skills/knowledge/mobile-design/platform-ios.md +0 -0
  211. package/templates/skills/knowledge/mobile-design/scripts/mobile_audit.py +0 -0
  212. package/templates/skills/knowledge/mobile-design/touch-psychology.md +0 -0
  213. package/templates/skills/knowledge/nextjs-best-practices/SKILL.md +0 -0
  214. package/templates/skills/knowledge/nodejs-best-practices/SKILL.md +0 -0
  215. package/templates/skills/knowledge/parallel-agents/SKILL.md +345 -73
  216. package/templates/skills/knowledge/performance-profiling/SKILL.md +0 -0
  217. package/templates/skills/knowledge/performance-profiling/scripts/lighthouse_audit.py +0 -0
  218. package/templates/skills/knowledge/plan-writing/SKILL.md +0 -0
  219. package/templates/skills/knowledge/plugin-discovery/SKILL.md +582 -0
  220. package/templates/skills/knowledge/plugin-discovery/scripts/platform_setup.py +1083 -0
  221. package/templates/skills/knowledge/powershell-windows/SKILL.md +0 -0
  222. package/templates/skills/knowledge/python-patterns/SKILL.md +0 -0
  223. package/templates/skills/knowledge/react-patterns/SKILL.md +0 -0
  224. package/templates/skills/knowledge/red-team-tactics/SKILL.md +0 -0
  225. package/templates/skills/knowledge/seo-fundamentals/SKILL.md +0 -0
  226. package/templates/skills/knowledge/seo-fundamentals/scripts/seo_checker.py +0 -0
  227. package/templates/skills/knowledge/server-management/SKILL.md +0 -0
  228. package/templates/skills/knowledge/systematic-debugging/SKILL.md +0 -0
  229. package/templates/skills/knowledge/tailwind-patterns/SKILL.md +0 -0
  230. package/templates/skills/knowledge/tdd-workflow/SKILL.md +0 -0
  231. package/templates/skills/knowledge/testing-patterns/SKILL.md +0 -0
  232. package/templates/skills/knowledge/testing-patterns/scripts/test_runner.py +0 -0
  233. package/templates/skills/knowledge/vulnerability-scanner/SKILL.md +0 -0
  234. package/templates/skills/knowledge/vulnerability-scanner/checklists.md +0 -0
  235. package/templates/skills/knowledge/vulnerability-scanner/scripts/security_scan.py +0 -0
  236. package/templates/skills/knowledge/webapp-testing/SKILL.md +0 -0
  237. package/templates/skills/knowledge/webapp-testing/scripts/playwright_runner.py +0 -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()