@voodocs/cli 2.2.1 → 2.2.2
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 +38 -215
- package/LICENSE +1 -1
- package/PRIVACY.md +10 -10
- package/README.md +35 -39
- package/USAGE.md +27 -50
- package/examples/.cursorrules +9 -9
- package/examples/instructions/.claude/instructions.md +65 -77
- package/examples/instructions/.cursorrules +9 -9
- package/examples/instructions/.windsurfrules +9 -9
- package/examples/instructions/VOODOCS_INSTRUCTIONS.md +62 -74
- 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 +1 -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 +95 -110
- package/lib/darkarts/annotations/TRANSFORMATION_EXAMPLES.md +27 -29
- package/lib/darkarts/annotations/parser.py +215 -36
- 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/exceptions.py +3 -3
- package/lib/darkarts/parsers/typescript/dist/parser.d.ts +16 -0
- package/lib/darkarts/parsers/typescript/dist/parser.d.ts.map +1 -1
- package/lib/darkarts/parsers/typescript/dist/parser.js +64 -0
- package/lib/darkarts/parsers/typescript/dist/parser.js.map +1 -1
- package/lib/darkarts/parsers/typescript/src/parser.ts +68 -0
- 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 +3 -6
- package/package.json +1 -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,17 +1,16 @@
|
|
|
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
|
-
|
|
15
14
|
- Document in AI's native language (mathematical notation)
|
|
16
15
|
- Automatic generation of comprehensive tests
|
|
17
16
|
- Property-based testing with Hypothesis
|
|
@@ -23,7 +22,7 @@ As an AI coding assistant, you should add `@voodocs` annotations to **every sign
|
|
|
23
22
|
|
|
24
23
|
## Core Principles
|
|
25
24
|
|
|
26
|
-
When writing code with
|
|
25
|
+
When writing code with VooDocs annotations, follow these principles:
|
|
27
26
|
|
|
28
27
|
1. **Annotate as you code** - Add `@voodocs` annotations immediately when creating functions/classes
|
|
29
28
|
2. **Be precise** - Use mathematical notation for exact specifications
|
|
@@ -62,33 +61,33 @@ class ClassName:
|
|
|
62
61
|
|
|
63
62
|
### For Functions/Methods
|
|
64
63
|
|
|
65
|
-
| Field
|
|
66
|
-
|
|
67
|
-
| `preconditions`
|
|
68
|
-
| `postconditions`
|
|
69
|
-
| `complexity`
|
|
70
|
-
| `invariants`
|
|
71
|
-
| `error_cases`
|
|
72
|
-
| `side_effects`
|
|
73
|
-
| `security_implications` | Optional
|
|
74
|
-
| `assumptions`
|
|
64
|
+
| Field | Required | Description | Example |
|
|
65
|
+
|-------|----------|-------------|---------|
|
|
66
|
+
| `preconditions` | Recommended | Conditions that must be true before execution | `["x > 0", "user is authenticated"]` |
|
|
67
|
+
| `postconditions` | Recommended | Conditions guaranteed after execution | `["result > 0", "database updated"]` |
|
|
68
|
+
| `complexity` | Recommended | Time/space complexity | `"O(n log n)"` or `"O(n)"` |
|
|
69
|
+
| `invariants` | Optional | Properties that remain unchanged | `["∀ x: x ∈ original_set ⇒ x ∈ result_set"]` |
|
|
70
|
+
| `error_cases` | Optional | Error conditions and exceptions | `["x < 0 → ValueError", "file not found → FileNotFoundError"]` |
|
|
71
|
+
| `side_effects` | Optional | External changes made | `["Writes to database", "Sends email"]` |
|
|
72
|
+
| `security_implications` | Optional | Security considerations | `["Requires admin role", "Rate limited"]` |
|
|
73
|
+
| `assumptions` | Optional | Environmental assumptions | `["Database is available", "Network is stable"]` |
|
|
75
74
|
|
|
76
75
|
### For Classes
|
|
77
76
|
|
|
78
|
-
| Field
|
|
79
|
-
|
|
80
|
-
| `class_invariants`
|
|
81
|
-
| `state_transitions` | Valid state changes
|
|
82
|
-
| `thread_safety`
|
|
77
|
+
| Field | Description | Example |
|
|
78
|
+
|-------|-------------|---------|
|
|
79
|
+
| `class_invariants` | Properties that always hold | `["∀ item ∈ queue: item.status ∈ VALID_STATUSES"]` |
|
|
80
|
+
| `state_transitions` | Valid state changes | `["IDLE → PROCESSING", "PROCESSING → COMPLETE"]` |
|
|
81
|
+
| `thread_safety` | Concurrency safety | `"Thread-safe with mutex"` or `"Not thread-safe"` |
|
|
83
82
|
|
|
84
83
|
### For Modules
|
|
85
84
|
|
|
86
|
-
| Field
|
|
87
|
-
|
|
88
|
-
| `module_purpose` | High-level module description | `"User authentication and authorization"`
|
|
89
|
-
| `dependencies`
|
|
90
|
-
| `assumptions`
|
|
91
|
-
| `security_model` | Overall security approach
|
|
85
|
+
| Field | Description | Example |
|
|
86
|
+
|-------|-------------|---------|
|
|
87
|
+
| `module_purpose` | High-level module description | `"User authentication and authorization"` |
|
|
88
|
+
| `dependencies` | External dependencies | `["@supabase/supabase-js", "bcrypt"]` |
|
|
89
|
+
| `assumptions` | Module-level assumptions | `["Database schema v2.0", "Redis available"]` |
|
|
90
|
+
| `security_model` | Overall security approach | `"Defense in depth - fails closed"` |
|
|
92
91
|
|
|
93
92
|
## DarkArts Language Guide
|
|
94
93
|
|
|
@@ -96,49 +95,49 @@ DarkArts is a mathematical notation language for precise specifications. Use the
|
|
|
96
95
|
|
|
97
96
|
### Logical Operators
|
|
98
97
|
|
|
99
|
-
| Symbol | Meaning
|
|
100
|
-
|
|
101
|
-
| `∧`
|
|
102
|
-
| `∨`
|
|
103
|
-
| `¬`
|
|
104
|
-
| `⇒`
|
|
105
|
-
| `⇔`
|
|
98
|
+
| Symbol | Meaning | Example |
|
|
99
|
+
|--------|---------|---------|
|
|
100
|
+
| `∧` | AND | `x > 0 ∧ y > 0` |
|
|
101
|
+
| `∨` | OR | `x = 0 ∨ y = 0` |
|
|
102
|
+
| `¬` | NOT | `¬(x < 0)` |
|
|
103
|
+
| `⇒` | IMPLIES | `x > 0 ⇒ result > 0` |
|
|
104
|
+
| `⇔` | IF AND ONLY IF | `result = true ⇔ user.isAdmin` |
|
|
106
105
|
|
|
107
106
|
### Quantifiers
|
|
108
107
|
|
|
109
|
-
| Symbol | Meaning
|
|
110
|
-
|
|
111
|
-
| `∀`
|
|
112
|
-
| `∃`
|
|
108
|
+
| Symbol | Meaning | Example |
|
|
109
|
+
|--------|---------|---------|
|
|
110
|
+
| `∀` | FOR ALL | `∀ x ∈ items: x > 0` |
|
|
111
|
+
| `∃` | THERE EXISTS | `∃ x ∈ items: x = target` |
|
|
113
112
|
|
|
114
113
|
### Set Operations
|
|
115
114
|
|
|
116
|
-
| Symbol | Meaning
|
|
117
|
-
|
|
118
|
-
| `∈`
|
|
119
|
-
| `∉`
|
|
120
|
-
| `⊆`
|
|
121
|
-
| `∪`
|
|
122
|
-
| `∩`
|
|
115
|
+
| Symbol | Meaning | Example |
|
|
116
|
+
|--------|---------|---------|
|
|
117
|
+
| `∈` | IN / ELEMENT OF | `x ∈ valid_values` |
|
|
118
|
+
| `∉` | NOT IN | `x ∉ blacklist` |
|
|
119
|
+
| `⊆` | SUBSET OF | `result ⊆ input` |
|
|
120
|
+
| `∪` | UNION | `result = set1 ∪ set2` |
|
|
121
|
+
| `∩` | INTERSECTION | `common = set1 ∩ set2` |
|
|
123
122
|
|
|
124
123
|
### Comparisons
|
|
125
124
|
|
|
126
|
-
| Symbol | Meaning
|
|
127
|
-
|
|
128
|
-
| `≥`
|
|
129
|
-
| `≤`
|
|
130
|
-
| `≠`
|
|
131
|
-
| `≈`
|
|
125
|
+
| Symbol | Meaning | Example |
|
|
126
|
+
|--------|---------|---------|
|
|
127
|
+
| `≥` | GREATER THAN OR EQUAL | `x ≥ 0` |
|
|
128
|
+
| `≤` | LESS THAN OR EQUAL | `x ≤ 100` |
|
|
129
|
+
| `≠` | NOT EQUAL | `x ≠ 0` |
|
|
130
|
+
| `≈` | APPROXIMATELY EQUAL | `result ≈ expected` |
|
|
132
131
|
|
|
133
132
|
### Number Sets
|
|
134
133
|
|
|
135
|
-
| Symbol | Meaning
|
|
136
|
-
|
|
137
|
-
| `ℕ`
|
|
138
|
-
| `ℤ`
|
|
139
|
-
| `ℝ`
|
|
134
|
+
| Symbol | Meaning | Example |
|
|
135
|
+
|--------|---------|---------|
|
|
136
|
+
| `ℕ` | Natural numbers (0, 1, 2, ...) | `n ∈ ℕ` |
|
|
137
|
+
| `ℤ` | Integers (..., -1, 0, 1, ...) | `x ∈ ℤ` |
|
|
138
|
+
| `ℝ` | Real numbers | `x ∈ ℝ` |
|
|
140
139
|
|
|
141
|
-
**Tip**: You can use plain English too!
|
|
140
|
+
**Tip**: You can use plain English too! VooDocs understands both mathematical notation and natural language. Mix them for clarity.
|
|
142
141
|
|
|
143
142
|
## Examples
|
|
144
143
|
|
|
@@ -168,7 +167,7 @@ def calculate_discount(price: float, discount_percent: float) -> float:
|
|
|
168
167
|
raise ValueError("Price must be positive")
|
|
169
168
|
if not 0 <= discount_percent <= 100:
|
|
170
169
|
raise ValueError("Discount must be between 0 and 100")
|
|
171
|
-
|
|
170
|
+
|
|
172
171
|
return price * (1 - discount_percent / 100)
|
|
173
172
|
```
|
|
174
173
|
|
|
@@ -220,12 +219,12 @@ class BankAccount:
|
|
|
220
219
|
]
|
|
221
220
|
thread_safety: "Thread-safe with account-level mutex"
|
|
222
221
|
"""
|
|
223
|
-
|
|
222
|
+
|
|
224
223
|
def __init__(self, account_id: str):
|
|
225
224
|
self.balance = 0.0
|
|
226
225
|
self.transactions = []
|
|
227
226
|
self.status = "PENDING"
|
|
228
|
-
|
|
227
|
+
|
|
229
228
|
def deposit(self, amount: float) -> bool:
|
|
230
229
|
"""@voodocs
|
|
231
230
|
preconditions: [
|
|
@@ -315,7 +314,7 @@ complexity: "O(1)"
|
|
|
315
314
|
"""
|
|
316
315
|
```
|
|
317
316
|
|
|
318
|
-
|
|
317
|
+
VooDocs generates:
|
|
319
318
|
|
|
320
319
|
```python
|
|
321
320
|
# Generated test
|
|
@@ -333,7 +332,6 @@ def test_property_based_add(x, y):
|
|
|
333
332
|
### 1. Be Specific with Preconditions
|
|
334
333
|
|
|
335
334
|
**Good:**
|
|
336
|
-
|
|
337
335
|
```python
|
|
338
336
|
preconditions: [
|
|
339
337
|
"amount > 0",
|
|
@@ -343,7 +341,6 @@ preconditions: [
|
|
|
343
341
|
```
|
|
344
342
|
|
|
345
343
|
**Avoid:**
|
|
346
|
-
|
|
347
344
|
```python
|
|
348
345
|
preconditions: ["valid input"] # Too vague
|
|
349
346
|
```
|
|
@@ -351,7 +348,6 @@ preconditions: ["valid input"] # Too vague
|
|
|
351
348
|
### 2. Use Mathematical Notation for Precision
|
|
352
349
|
|
|
353
350
|
**Good:**
|
|
354
|
-
|
|
355
351
|
```python
|
|
356
352
|
postconditions: [
|
|
357
353
|
"∀ x ∈ result: x ∈ input", # All results are from input
|
|
@@ -360,7 +356,6 @@ postconditions: [
|
|
|
360
356
|
```
|
|
361
357
|
|
|
362
358
|
**Avoid:**
|
|
363
|
-
|
|
364
359
|
```python
|
|
365
360
|
postconditions: ["returns filtered list"] # Imprecise
|
|
366
361
|
```
|
|
@@ -368,21 +363,18 @@ postconditions: ["returns filtered list"] # Imprecise
|
|
|
368
363
|
### 3. Always Specify Complexity
|
|
369
364
|
|
|
370
365
|
**Good:**
|
|
371
|
-
|
|
372
366
|
```python
|
|
373
367
|
complexity: "O(n log n)"
|
|
374
368
|
```
|
|
375
369
|
|
|
376
370
|
**Also Good:**
|
|
377
|
-
|
|
378
371
|
```python
|
|
379
|
-
complexity: "O(n)" #
|
|
372
|
+
complexity: "O(n)" # VooDocs infers space as O(1)
|
|
380
373
|
```
|
|
381
374
|
|
|
382
375
|
### 4. Document Security Implications
|
|
383
376
|
|
|
384
377
|
**Good:**
|
|
385
|
-
|
|
386
378
|
```python
|
|
387
379
|
security_implications: [
|
|
388
380
|
"Requires admin role",
|
|
@@ -394,7 +386,6 @@ security_implications: [
|
|
|
394
386
|
### 5. Specify Error Cases
|
|
395
387
|
|
|
396
388
|
**Good:**
|
|
397
|
-
|
|
398
389
|
```python
|
|
399
390
|
error_cases: [
|
|
400
391
|
"amount <= 0 → ValueError",
|
|
@@ -406,7 +397,6 @@ error_cases: [
|
|
|
406
397
|
### 6. Use Invariants for Loops and Recursion
|
|
407
398
|
|
|
408
399
|
**Good:**
|
|
409
|
-
|
|
410
400
|
```python
|
|
411
401
|
invariants: [
|
|
412
402
|
"∀ iteration: 0 <= i < len(arr)",
|
|
@@ -417,7 +407,6 @@ invariants: [
|
|
|
417
407
|
### 7. Document Side Effects
|
|
418
408
|
|
|
419
409
|
**Good:**
|
|
420
|
-
|
|
421
410
|
```python
|
|
422
411
|
side_effects: [
|
|
423
412
|
"Writes to database",
|
|
@@ -427,7 +416,6 @@ side_effects: [
|
|
|
427
416
|
```
|
|
428
417
|
|
|
429
418
|
**Avoid:**
|
|
430
|
-
|
|
431
419
|
```python
|
|
432
420
|
side_effects: ["Does stuff"] # Too vague
|
|
433
421
|
```
|
|
@@ -446,4 +434,4 @@ side_effects: ["Does stuff"] # Too vague
|
|
|
446
434
|
|
|
447
435
|
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.
|
|
448
436
|
|
|
449
|
-
**Generated by
|
|
437
|
+
**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
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
|
"""
|