@voodocs/cli 2.1.3 → 2.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.
- package/CHANGELOG.md +215 -38
- package/LICENSE +1 -1
- package/PRIVACY.md +10 -10
- package/README.md +39 -35
- package/USAGE.md +50 -27
- package/examples/.cursorrules +9 -9
- package/examples/instructions/.claude/instructions.md +77 -65
- package/examples/instructions/.cursorrules +9 -9
- package/examples/instructions/.windsurfrules +9 -9
- package/examples/instructions/VOODOCS_INSTRUCTIONS.md +74 -62
- package/examples/math_example.py +1 -1
- package/examples/phase2_test.py +1 -1
- package/examples/test_function_invariants.py +1 -1
- package/lib/cli/__init__.py +3 -3
- package/lib/cli/benchmark.py +3 -3
- package/lib/cli/context.py +1 -1
- package/lib/cli/fix.py +1 -1
- package/lib/cli/generate.py +60 -1
- package/lib/cli/init.py +10 -10
- package/lib/cli/instruct.py +1 -1
- package/lib/cli/validate.py +3 -3
- package/lib/darkarts/annotations/DARKARTS_SYMBOLS.md +110 -95
- package/lib/darkarts/annotations/TRANSFORMATION_EXAMPLES.md +29 -27
- package/lib/darkarts/annotations/parser.py +1 -1
- package/lib/darkarts/cli_darkarts.py +5 -5
- package/lib/darkarts/context/ai_instructions.py +12 -12
- package/lib/darkarts/context/ai_integrations.py +16 -16
- package/lib/darkarts/context/commands.py +4 -4
- package/lib/darkarts/context/errors.py +1 -1
- package/lib/darkarts/context/models.py +1 -1
- package/lib/darkarts/context/ui.py +4 -4
- package/lib/darkarts/context/yaml_utils.py +3 -3
- package/lib/darkarts/core/loader.py +1 -1
- package/lib/darkarts/documentation/__init__.py +10 -0
- package/lib/darkarts/documentation/categorizer.py +137 -0
- package/lib/darkarts/documentation/consolidator.py +303 -0
- package/lib/darkarts/exceptions.py +3 -3
- package/lib/darkarts/plugins/voodocs/ai_native_plugin.py +1 -1
- package/lib/darkarts/plugins/voodocs/annotation_validator.py +2 -2
- package/lib/darkarts/plugins/voodocs/documentation_generator.py +3 -3
- package/lib/darkarts/plugins/voodocs/html_exporter.py +4 -4
- package/lib/darkarts/plugins/voodocs/instruction_generator.py +10 -10
- package/lib/darkarts/plugins/voodocs/pdf_exporter.py +1 -1
- package/lib/darkarts/plugins/voodocs/test_generator.py +1 -1
- package/lib/darkarts/telemetry.py +5 -5
- package/lib/darkarts/validation/README.md +6 -3
- package/package.json +2 -1
- package/requirements.txt +2 -2
- package/templates/ci/github-actions.yml +64 -64
- package/templates/ci/pre-commit-hook.sh +4 -4
- package/voodocs_cli.py +1 -1
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Voodocs Instructions for Generic AI Assistant
|
|
2
2
|
|
|
3
|
-
**Project**:
|
|
4
|
-
**Generated**: Automatically by
|
|
3
|
+
**Project**: Voodocs Example Project
|
|
4
|
+
**Generated**: Automatically by Voodocs
|
|
5
5
|
**Purpose**: Guide AI assistants to document code using @voodocs annotations
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## Overview
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Voodocs is an AI-native documentation system that allows you to document code in **DarkArts language** - a mathematical and logical notation that AI naturally understands. Your annotations will be automatically translated into human-readable documentation, property-based tests, and API specifications.
|
|
12
12
|
|
|
13
13
|
**Key Benefits:**
|
|
14
|
+
|
|
14
15
|
- Document in AI's native language (mathematical notation)
|
|
15
16
|
- Automatic generation of comprehensive tests
|
|
16
17
|
- Property-based testing with Hypothesis
|
|
@@ -22,7 +23,7 @@ As an AI coding assistant, you should add `@voodocs` annotations to **every sign
|
|
|
22
23
|
|
|
23
24
|
## Core Principles
|
|
24
25
|
|
|
25
|
-
When writing code with
|
|
26
|
+
When writing code with Voodocs annotations, follow these principles:
|
|
26
27
|
|
|
27
28
|
1. **Annotate as you code** - Add `@voodocs` annotations immediately when creating functions/classes
|
|
28
29
|
2. **Be precise** - Use mathematical notation for exact specifications
|
|
@@ -61,33 +62,33 @@ class ClassName:
|
|
|
61
62
|
|
|
62
63
|
### For Functions/Methods
|
|
63
64
|
|
|
64
|
-
| Field
|
|
65
|
-
|
|
66
|
-
| `preconditions`
|
|
67
|
-
| `postconditions`
|
|
68
|
-
| `complexity`
|
|
69
|
-
| `invariants`
|
|
70
|
-
| `error_cases`
|
|
71
|
-
| `side_effects`
|
|
72
|
-
| `security_implications` | Optional
|
|
73
|
-
| `assumptions`
|
|
65
|
+
| Field | Required | Description | Example |
|
|
66
|
+
| ----------------------- | ----------- | --------------------------------------------- | -------------------------------------------------------------- |
|
|
67
|
+
| `preconditions` | Recommended | Conditions that must be true before execution | `["x > 0", "user is authenticated"]` |
|
|
68
|
+
| `postconditions` | Recommended | Conditions guaranteed after execution | `["result > 0", "database updated"]` |
|
|
69
|
+
| `complexity` | Recommended | Time/space complexity | `"O(n log n)"` or `"O(n)"` |
|
|
70
|
+
| `invariants` | Optional | Properties that remain unchanged | `["∀ x: x ∈ original_set ⇒ x ∈ result_set"]` |
|
|
71
|
+
| `error_cases` | Optional | Error conditions and exceptions | `["x < 0 → ValueError", "file not found → FileNotFoundError"]` |
|
|
72
|
+
| `side_effects` | Optional | External changes made | `["Writes to database", "Sends email"]` |
|
|
73
|
+
| `security_implications` | Optional | Security considerations | `["Requires admin role", "Rate limited"]` |
|
|
74
|
+
| `assumptions` | Optional | Environmental assumptions | `["Database is available", "Network is stable"]` |
|
|
74
75
|
|
|
75
76
|
### For Classes
|
|
76
77
|
|
|
77
|
-
| Field
|
|
78
|
-
|
|
79
|
-
| `class_invariants`
|
|
80
|
-
| `state_transitions` | Valid state changes
|
|
81
|
-
| `thread_safety`
|
|
78
|
+
| Field | Description | Example |
|
|
79
|
+
| ------------------- | --------------------------- | -------------------------------------------------- |
|
|
80
|
+
| `class_invariants` | Properties that always hold | `["∀ item ∈ queue: item.status ∈ VALID_STATUSES"]` |
|
|
81
|
+
| `state_transitions` | Valid state changes | `["IDLE → PROCESSING", "PROCESSING → COMPLETE"]` |
|
|
82
|
+
| `thread_safety` | Concurrency safety | `"Thread-safe with mutex"` or `"Not thread-safe"` |
|
|
82
83
|
|
|
83
84
|
### For Modules
|
|
84
85
|
|
|
85
|
-
| Field
|
|
86
|
-
|
|
87
|
-
| `module_purpose` | High-level module description | `"User authentication and authorization"`
|
|
88
|
-
| `dependencies`
|
|
89
|
-
| `assumptions`
|
|
90
|
-
| `security_model` | Overall security approach
|
|
86
|
+
| Field | Description | Example |
|
|
87
|
+
| ---------------- | ----------------------------- | --------------------------------------------- |
|
|
88
|
+
| `module_purpose` | High-level module description | `"User authentication and authorization"` |
|
|
89
|
+
| `dependencies` | External dependencies | `["@supabase/supabase-js", "bcrypt"]` |
|
|
90
|
+
| `assumptions` | Module-level assumptions | `["Database schema v2.0", "Redis available"]` |
|
|
91
|
+
| `security_model` | Overall security approach | `"Defense in depth - fails closed"` |
|
|
91
92
|
|
|
92
93
|
## DarkArts Language Guide
|
|
93
94
|
|
|
@@ -95,49 +96,49 @@ DarkArts is a mathematical notation language for precise specifications. Use the
|
|
|
95
96
|
|
|
96
97
|
### Logical Operators
|
|
97
98
|
|
|
98
|
-
| Symbol | Meaning
|
|
99
|
-
|
|
100
|
-
| `∧`
|
|
101
|
-
| `∨`
|
|
102
|
-
| `¬`
|
|
103
|
-
| `⇒`
|
|
104
|
-
| `⇔`
|
|
99
|
+
| Symbol | Meaning | Example |
|
|
100
|
+
| ------ | -------------- | ------------------------------ |
|
|
101
|
+
| `∧` | AND | `x > 0 ∧ y > 0` |
|
|
102
|
+
| `∨` | OR | `x = 0 ∨ y = 0` |
|
|
103
|
+
| `¬` | NOT | `¬(x < 0)` |
|
|
104
|
+
| `⇒` | IMPLIES | `x > 0 ⇒ result > 0` |
|
|
105
|
+
| `⇔` | IF AND ONLY IF | `result = true ⇔ user.isAdmin` |
|
|
105
106
|
|
|
106
107
|
### Quantifiers
|
|
107
108
|
|
|
108
|
-
| Symbol | Meaning
|
|
109
|
-
|
|
110
|
-
| `∀`
|
|
111
|
-
| `∃`
|
|
109
|
+
| Symbol | Meaning | Example |
|
|
110
|
+
| ------ | ------------ | ------------------------- |
|
|
111
|
+
| `∀` | FOR ALL | `∀ x ∈ items: x > 0` |
|
|
112
|
+
| `∃` | THERE EXISTS | `∃ x ∈ items: x = target` |
|
|
112
113
|
|
|
113
114
|
### Set Operations
|
|
114
115
|
|
|
115
|
-
| Symbol | Meaning
|
|
116
|
-
|
|
117
|
-
| `∈`
|
|
118
|
-
| `∉`
|
|
119
|
-
| `⊆`
|
|
120
|
-
| `∪`
|
|
121
|
-
| `∩`
|
|
116
|
+
| Symbol | Meaning | Example |
|
|
117
|
+
| ------ | --------------- | ---------------------- |
|
|
118
|
+
| `∈` | IN / ELEMENT OF | `x ∈ valid_values` |
|
|
119
|
+
| `∉` | NOT IN | `x ∉ blacklist` |
|
|
120
|
+
| `⊆` | SUBSET OF | `result ⊆ input` |
|
|
121
|
+
| `∪` | UNION | `result = set1 ∪ set2` |
|
|
122
|
+
| `∩` | INTERSECTION | `common = set1 ∩ set2` |
|
|
122
123
|
|
|
123
124
|
### Comparisons
|
|
124
125
|
|
|
125
|
-
| Symbol | Meaning
|
|
126
|
-
|
|
127
|
-
| `≥`
|
|
128
|
-
| `≤`
|
|
129
|
-
| `≠`
|
|
130
|
-
| `≈`
|
|
126
|
+
| Symbol | Meaning | Example |
|
|
127
|
+
| ------ | --------------------- | ------------------- |
|
|
128
|
+
| `≥` | GREATER THAN OR EQUAL | `x ≥ 0` |
|
|
129
|
+
| `≤` | LESS THAN OR EQUAL | `x ≤ 100` |
|
|
130
|
+
| `≠` | NOT EQUAL | `x ≠ 0` |
|
|
131
|
+
| `≈` | APPROXIMATELY EQUAL | `result ≈ expected` |
|
|
131
132
|
|
|
132
133
|
### Number Sets
|
|
133
134
|
|
|
134
|
-
| Symbol | Meaning
|
|
135
|
-
|
|
136
|
-
| `ℕ`
|
|
137
|
-
| `ℤ`
|
|
138
|
-
| `ℝ`
|
|
135
|
+
| Symbol | Meaning | Example |
|
|
136
|
+
| ------ | ------------------------------ | ------- |
|
|
137
|
+
| `ℕ` | Natural numbers (0, 1, 2, ...) | `n ∈ ℕ` |
|
|
138
|
+
| `ℤ` | Integers (..., -1, 0, 1, ...) | `x ∈ ℤ` |
|
|
139
|
+
| `ℝ` | Real numbers | `x ∈ ℝ` |
|
|
139
140
|
|
|
140
|
-
**Tip**: You can use plain English too!
|
|
141
|
+
**Tip**: You can use plain English too! Voodocs understands both mathematical notation and natural language. Mix them for clarity.
|
|
141
142
|
|
|
142
143
|
## Examples
|
|
143
144
|
|
|
@@ -167,7 +168,7 @@ def calculate_discount(price: float, discount_percent: float) -> float:
|
|
|
167
168
|
raise ValueError("Price must be positive")
|
|
168
169
|
if not 0 <= discount_percent <= 100:
|
|
169
170
|
raise ValueError("Discount must be between 0 and 100")
|
|
170
|
-
|
|
171
|
+
|
|
171
172
|
return price * (1 - discount_percent / 100)
|
|
172
173
|
```
|
|
173
174
|
|
|
@@ -219,12 +220,12 @@ class BankAccount:
|
|
|
219
220
|
]
|
|
220
221
|
thread_safety: "Thread-safe with account-level mutex"
|
|
221
222
|
"""
|
|
222
|
-
|
|
223
|
+
|
|
223
224
|
def __init__(self, account_id: str):
|
|
224
225
|
self.balance = 0.0
|
|
225
226
|
self.transactions = []
|
|
226
227
|
self.status = "PENDING"
|
|
227
|
-
|
|
228
|
+
|
|
228
229
|
def deposit(self, amount: float) -> bool:
|
|
229
230
|
"""@voodocs
|
|
230
231
|
preconditions: [
|
|
@@ -314,7 +315,7 @@ complexity: "O(1)"
|
|
|
314
315
|
"""
|
|
315
316
|
```
|
|
316
317
|
|
|
317
|
-
|
|
318
|
+
Voodocs generates:
|
|
318
319
|
|
|
319
320
|
```python
|
|
320
321
|
# Generated test
|
|
@@ -332,6 +333,7 @@ def test_property_based_add(x, y):
|
|
|
332
333
|
### 1. Be Specific with Preconditions
|
|
333
334
|
|
|
334
335
|
**Good:**
|
|
336
|
+
|
|
335
337
|
```python
|
|
336
338
|
preconditions: [
|
|
337
339
|
"amount > 0",
|
|
@@ -341,6 +343,7 @@ preconditions: [
|
|
|
341
343
|
```
|
|
342
344
|
|
|
343
345
|
**Avoid:**
|
|
346
|
+
|
|
344
347
|
```python
|
|
345
348
|
preconditions: ["valid input"] # Too vague
|
|
346
349
|
```
|
|
@@ -348,6 +351,7 @@ preconditions: ["valid input"] # Too vague
|
|
|
348
351
|
### 2. Use Mathematical Notation for Precision
|
|
349
352
|
|
|
350
353
|
**Good:**
|
|
354
|
+
|
|
351
355
|
```python
|
|
352
356
|
postconditions: [
|
|
353
357
|
"∀ x ∈ result: x ∈ input", # All results are from input
|
|
@@ -356,6 +360,7 @@ postconditions: [
|
|
|
356
360
|
```
|
|
357
361
|
|
|
358
362
|
**Avoid:**
|
|
363
|
+
|
|
359
364
|
```python
|
|
360
365
|
postconditions: ["returns filtered list"] # Imprecise
|
|
361
366
|
```
|
|
@@ -363,18 +368,21 @@ postconditions: ["returns filtered list"] # Imprecise
|
|
|
363
368
|
### 3. Always Specify Complexity
|
|
364
369
|
|
|
365
370
|
**Good:**
|
|
371
|
+
|
|
366
372
|
```python
|
|
367
373
|
complexity: "O(n log n)"
|
|
368
374
|
```
|
|
369
375
|
|
|
370
376
|
**Also Good:**
|
|
377
|
+
|
|
371
378
|
```python
|
|
372
|
-
complexity: "O(n)" #
|
|
379
|
+
complexity: "O(n)" # Voodocs infers space as O(1)
|
|
373
380
|
```
|
|
374
381
|
|
|
375
382
|
### 4. Document Security Implications
|
|
376
383
|
|
|
377
384
|
**Good:**
|
|
385
|
+
|
|
378
386
|
```python
|
|
379
387
|
security_implications: [
|
|
380
388
|
"Requires admin role",
|
|
@@ -386,6 +394,7 @@ security_implications: [
|
|
|
386
394
|
### 5. Specify Error Cases
|
|
387
395
|
|
|
388
396
|
**Good:**
|
|
397
|
+
|
|
389
398
|
```python
|
|
390
399
|
error_cases: [
|
|
391
400
|
"amount <= 0 → ValueError",
|
|
@@ -397,6 +406,7 @@ error_cases: [
|
|
|
397
406
|
### 6. Use Invariants for Loops and Recursion
|
|
398
407
|
|
|
399
408
|
**Good:**
|
|
409
|
+
|
|
400
410
|
```python
|
|
401
411
|
invariants: [
|
|
402
412
|
"∀ iteration: 0 <= i < len(arr)",
|
|
@@ -407,6 +417,7 @@ invariants: [
|
|
|
407
417
|
### 7. Document Side Effects
|
|
408
418
|
|
|
409
419
|
**Good:**
|
|
420
|
+
|
|
410
421
|
```python
|
|
411
422
|
side_effects: [
|
|
412
423
|
"Writes to database",
|
|
@@ -416,6 +427,7 @@ side_effects: [
|
|
|
416
427
|
```
|
|
417
428
|
|
|
418
429
|
**Avoid:**
|
|
430
|
+
|
|
419
431
|
```python
|
|
420
432
|
side_effects: ["Does stuff"] # Too vague
|
|
421
433
|
```
|
|
@@ -434,4 +446,4 @@ side_effects: ["Does stuff"] # Too vague
|
|
|
434
446
|
|
|
435
447
|
By documenting in DarkArts language, you're not just writing comments - you're creating a **formal specification** that generates tests, documentation, and API specs automatically.
|
|
436
448
|
|
|
437
|
-
**Generated by
|
|
449
|
+
**Generated by Voodocs** - AI-native documentation for modern development.
|
package/examples/math_example.py
CHANGED
package/examples/phase2_test.py
CHANGED
package/lib/cli/__init__.py
CHANGED
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
"""
|
|
11
|
-
|
|
11
|
+
Voodocs CLI - Main entry point
|
|
12
12
|
|
|
13
|
-
This module provides the command-line interface for
|
|
13
|
+
This module provides the command-line interface for Voodocs.
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
import click
|
|
@@ -24,7 +24,7 @@ __version__ = "2.1.3"
|
|
|
24
24
|
@click.pass_context
|
|
25
25
|
def cli(ctx):
|
|
26
26
|
"""
|
|
27
|
-
|
|
27
|
+
Voodocs - AI-Native Symbolic Documentation System
|
|
28
28
|
|
|
29
29
|
Generate and validate @darkarts symbolic annotations in your codebase.
|
|
30
30
|
|
package/lib/cli/benchmark.py
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
"""
|
|
11
|
-
|
|
11
|
+
Voodocs CLI - Benchmark Command
|
|
12
12
|
|
|
13
13
|
Runs performance benchmarks to validate complexity claims in @darkarts annotations.
|
|
14
14
|
"""
|
|
@@ -222,7 +222,7 @@ def _generate_html_report(results: Dict[str, Any]) -> str:
|
|
|
222
222
|
html = f"""<!DOCTYPE html>
|
|
223
223
|
<html>
|
|
224
224
|
<head>
|
|
225
|
-
<title>
|
|
225
|
+
<title>Voodocs Benchmark Report</title>
|
|
226
226
|
<style>
|
|
227
227
|
body {{ font-family: Arial, sans-serif; margin: 40px; background: #f5f5f5; }}
|
|
228
228
|
.container {{ max-width: 1200px; margin: 0 auto; background: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }}
|
|
@@ -242,7 +242,7 @@ def _generate_html_report(results: Dict[str, Any]) -> str:
|
|
|
242
242
|
</head>
|
|
243
243
|
<body>
|
|
244
244
|
<div class="container">
|
|
245
|
-
<h1>📊
|
|
245
|
+
<h1>📊 Voodocs Benchmark Report</h1>
|
|
246
246
|
|
|
247
247
|
<div class="summary">
|
|
248
248
|
<div class="metric">
|
package/lib/cli/context.py
CHANGED
package/lib/cli/fix.py
CHANGED
package/lib/cli/generate.py
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
"""
|
|
11
|
-
|
|
11
|
+
Voodocs CLI - Generate Command
|
|
12
12
|
|
|
13
13
|
Generates documentation from @darkarts annotations.
|
|
14
14
|
"""
|
|
@@ -202,6 +202,65 @@ def generate(
|
|
|
202
202
|
except Exception as e:
|
|
203
203
|
click.secho(f"❌ {file_path}: {e}", fg='red')
|
|
204
204
|
|
|
205
|
+
# Generate consolidated documentation
|
|
206
|
+
click.echo()
|
|
207
|
+
click.secho("📚 Generating consolidated documentation...", fg='cyan')
|
|
208
|
+
try:
|
|
209
|
+
from darkarts.documentation import DocumentationConsolidator, DocumentedItem, AnnotationCategorizer
|
|
210
|
+
|
|
211
|
+
consolidator = DocumentationConsolidator(
|
|
212
|
+
project_name=config.get('project', {}).get('name', 'Project') if config else 'Project'
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
# Add all processed files to consolidator
|
|
216
|
+
for file_path in files_to_process:
|
|
217
|
+
try:
|
|
218
|
+
content = file_path.read_text(encoding='utf-8')
|
|
219
|
+
annotation = _extract_annotation(content)
|
|
220
|
+
|
|
221
|
+
if annotation:
|
|
222
|
+
# Parse annotations
|
|
223
|
+
annotations_dict = {
|
|
224
|
+
'module_id': _extract_section(annotation, '⊢'),
|
|
225
|
+
'dependencies': _extract_section(annotation, '∂'),
|
|
226
|
+
'assumptions': _extract_section(annotation, '⚠'),
|
|
227
|
+
'invariants': _extract_section(annotation, '⊨'),
|
|
228
|
+
'security': _extract_section(annotation, '🔒'),
|
|
229
|
+
'complexity': _extract_section(annotation, '⚡'),
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
# Create documented item
|
|
233
|
+
item = DocumentedItem(
|
|
234
|
+
name=AnnotationCategorizer.extract_name(str(file_path)),
|
|
235
|
+
file_path=str(file_path.relative_to(source_path)),
|
|
236
|
+
item_type=AnnotationCategorizer.detect_type(str(file_path), annotations_dict),
|
|
237
|
+
content=_generate_doc_for_file(file_path, 'markdown', include_private),
|
|
238
|
+
annotations=annotations_dict,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
# Detect categories
|
|
242
|
+
item.domains = AnnotationCategorizer.detect_domains(str(file_path), annotations_dict)
|
|
243
|
+
item.concerns = AnnotationCategorizer.detect_concerns(annotations_dict)
|
|
244
|
+
item.layers = AnnotationCategorizer.detect_layers(str(file_path), annotations_dict)
|
|
245
|
+
|
|
246
|
+
consolidator.add_item(item)
|
|
247
|
+
except Exception as e:
|
|
248
|
+
click.secho(f" ⚠️ Failed to consolidate {file_path}: {e}", fg='yellow')
|
|
249
|
+
|
|
250
|
+
# Generate all consolidated docs
|
|
251
|
+
consolidated_docs = consolidator.generate_all()
|
|
252
|
+
|
|
253
|
+
# Write consolidated docs
|
|
254
|
+
for doc_path, doc_content in consolidated_docs.items():
|
|
255
|
+
full_path = output_path / doc_path
|
|
256
|
+
full_path.parent.mkdir(parents=True, exist_ok=True)
|
|
257
|
+
full_path.write_text(doc_content, encoding='utf-8')
|
|
258
|
+
click.echo(f" ✓ {doc_path}")
|
|
259
|
+
|
|
260
|
+
click.secho(f" ✓ Generated {len(consolidated_docs)} consolidated documents", fg='green')
|
|
261
|
+
except Exception as e:
|
|
262
|
+
click.secho(f" ⚠️ Consolidated documentation failed: {e}", fg='yellow')
|
|
263
|
+
|
|
205
264
|
# Summary
|
|
206
265
|
click.echo()
|
|
207
266
|
click.echo("━" * 60)
|
package/lib/cli/init.py
CHANGED
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
"""
|
|
11
|
-
|
|
11
|
+
Voodocs Init Command
|
|
12
12
|
|
|
13
|
-
Interactive wizard to initialize or upgrade a project with
|
|
13
|
+
Interactive wizard to initialize or upgrade a project with Voodocs.
|
|
14
14
|
Re-runnable to add missing features after upgrades.
|
|
15
15
|
"""
|
|
16
16
|
|
|
@@ -35,7 +35,7 @@ from typing import Optional, Dict, Any
|
|
|
35
35
|
)
|
|
36
36
|
def init(non_interactive, upgrade):
|
|
37
37
|
"""
|
|
38
|
-
Initialize or upgrade a project with
|
|
38
|
+
Initialize or upgrade a project with Voodocs.
|
|
39
39
|
|
|
40
40
|
This interactive wizard will:
|
|
41
41
|
- Set up your project configuration
|
|
@@ -70,14 +70,14 @@ def init(non_interactive, upgrade):
|
|
|
70
70
|
click.echo()
|
|
71
71
|
if is_upgrade:
|
|
72
72
|
click.echo(click.style('╔══════════════════════════════════════════╗', fg='yellow', bold=True))
|
|
73
|
-
click.echo(click.style('║ 🔄
|
|
73
|
+
click.echo(click.style('║ 🔄 Voodocs Upgrade Wizard ║', fg='yellow', bold=True))
|
|
74
74
|
click.echo(click.style('╚══════════════════════════════════════════╝', fg='yellow', bold=True))
|
|
75
75
|
click.echo()
|
|
76
76
|
click.echo(click.style('Existing configuration detected!', fg='yellow'))
|
|
77
77
|
click.echo('This wizard will help you add any missing features.')
|
|
78
78
|
else:
|
|
79
79
|
click.echo(click.style('╔══════════════════════════════════════════╗', fg='cyan', bold=True))
|
|
80
|
-
click.echo(click.style('║ 🎉 Welcome to
|
|
80
|
+
click.echo(click.style('║ 🎉 Welcome to Voodocs Setup Wizard ║', fg='cyan', bold=True))
|
|
81
81
|
click.echo(click.style('╚══════════════════════════════════════════╝', fg='cyan', bold=True))
|
|
82
82
|
click.echo()
|
|
83
83
|
|
|
@@ -361,11 +361,11 @@ def init(non_interactive, upgrade):
|
|
|
361
361
|
click.echo()
|
|
362
362
|
if is_upgrade:
|
|
363
363
|
click.echo(click.style('╔══════════════════════════════════════════╗', fg='green', bold=True))
|
|
364
|
-
click.echo(click.style('║ ✅
|
|
364
|
+
click.echo(click.style('║ ✅ Voodocs Upgrade Complete! ║', fg='green', bold=True))
|
|
365
365
|
click.echo(click.style('╚══════════════════════════════════════════╝', fg='green', bold=True))
|
|
366
366
|
else:
|
|
367
367
|
click.echo(click.style('╔══════════════════════════════════════════╗', fg='green', bold=True))
|
|
368
|
-
click.echo(click.style('║ 🎉
|
|
368
|
+
click.echo(click.style('║ 🎉 Voodocs Setup Complete! ║', fg='green', bold=True))
|
|
369
369
|
click.echo(click.style('╚══════════════════════════════════════════╝', fg='green', bold=True))
|
|
370
370
|
click.echo()
|
|
371
371
|
click.echo(click.style('Next steps:', fg='cyan', bold=True))
|
|
@@ -532,7 +532,7 @@ def _add_to_gitignore(cwd: Path, entry: str):
|
|
|
532
532
|
|
|
533
533
|
if content and not content.endswith('\n'):
|
|
534
534
|
content += '\n'
|
|
535
|
-
content += f'\n#
|
|
535
|
+
content += f'\n# Voodocs\n{entry}\n'
|
|
536
536
|
|
|
537
537
|
gitignore.write_text(content)
|
|
538
538
|
|
|
@@ -648,10 +648,10 @@ def _install_git_hooks(cwd: Path):
|
|
|
648
648
|
pre_commit_hook = hooks_dir / 'pre-commit'
|
|
649
649
|
|
|
650
650
|
hook_content = '''#!/bin/sh
|
|
651
|
-
#
|
|
651
|
+
# Voodocs auto-update hook
|
|
652
652
|
# Updates context files before commit
|
|
653
653
|
|
|
654
|
-
echo "🔄 Updating
|
|
654
|
+
echo "🔄 Updating Voodocs context..."
|
|
655
655
|
voodocs generate --quiet 2>&1 || true
|
|
656
656
|
git add context/
|
|
657
657
|
|
package/lib/cli/instruct.py
CHANGED
package/lib/cli/validate.py
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
"""
|
|
11
|
-
|
|
11
|
+
Voodocs CLI - Validate Command
|
|
12
12
|
|
|
13
13
|
Validates @darkarts annotations in Python files.
|
|
14
14
|
"""
|
|
@@ -309,7 +309,7 @@ def display_html_results(
|
|
|
309
309
|
<!DOCTYPE html>
|
|
310
310
|
<html>
|
|
311
311
|
<head>
|
|
312
|
-
<title>
|
|
312
|
+
<title>Voodocs Validation Report</title>
|
|
313
313
|
<style>
|
|
314
314
|
body { font-family: Arial, sans-serif; margin: 20px; }
|
|
315
315
|
h1 { color: #333; }
|
|
@@ -319,7 +319,7 @@ def display_html_results(
|
|
|
319
319
|
</style>
|
|
320
320
|
</head>
|
|
321
321
|
<body>
|
|
322
|
-
<h1>
|
|
322
|
+
<h1>Voodocs Validation Report</h1>
|
|
323
323
|
|
|
324
324
|
<h2>Semantic Validation</h2>
|
|
325
325
|
"""
|