htmlgraph 0.9.3__py3-none-any.whl → 0.27.5__py3-none-any.whl
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.
- htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/.htmlgraph/agents.json +72 -0
- htmlgraph/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/__init__.py +173 -17
- htmlgraph/__init__.pyi +123 -0
- htmlgraph/agent_detection.py +127 -0
- htmlgraph/agent_registry.py +45 -30
- htmlgraph/agents.py +160 -107
- htmlgraph/analytics/__init__.py +9 -2
- htmlgraph/analytics/cli.py +190 -51
- htmlgraph/analytics/cost_analyzer.py +391 -0
- htmlgraph/analytics/cost_monitor.py +664 -0
- htmlgraph/analytics/cost_reporter.py +675 -0
- htmlgraph/analytics/cross_session.py +617 -0
- htmlgraph/analytics/dependency.py +192 -100
- htmlgraph/analytics/pattern_learning.py +771 -0
- htmlgraph/analytics/session_graph.py +707 -0
- htmlgraph/analytics/strategic/__init__.py +80 -0
- htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
- htmlgraph/analytics/strategic/pattern_detector.py +876 -0
- htmlgraph/analytics/strategic/preference_manager.py +709 -0
- htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
- htmlgraph/analytics/work_type.py +190 -14
- htmlgraph/analytics_index.py +135 -51
- htmlgraph/api/__init__.py +3 -0
- htmlgraph/api/cost_alerts_websocket.py +416 -0
- htmlgraph/api/main.py +2498 -0
- htmlgraph/api/static/htmx.min.js +1 -0
- htmlgraph/api/static/style-redesign.css +1344 -0
- htmlgraph/api/static/style.css +1079 -0
- htmlgraph/api/templates/dashboard-redesign.html +1366 -0
- htmlgraph/api/templates/dashboard.html +794 -0
- htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
- htmlgraph/api/templates/partials/activity-feed.html +1100 -0
- htmlgraph/api/templates/partials/agents-redesign.html +317 -0
- htmlgraph/api/templates/partials/agents.html +317 -0
- htmlgraph/api/templates/partials/event-traces.html +373 -0
- htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
- htmlgraph/api/templates/partials/features.html +578 -0
- htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
- htmlgraph/api/templates/partials/metrics.html +346 -0
- htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
- htmlgraph/api/templates/partials/orchestration.html +198 -0
- htmlgraph/api/templates/partials/spawners.html +375 -0
- htmlgraph/api/templates/partials/work-items.html +613 -0
- htmlgraph/api/websocket.py +538 -0
- htmlgraph/archive/__init__.py +24 -0
- htmlgraph/archive/bloom.py +234 -0
- htmlgraph/archive/fts.py +297 -0
- htmlgraph/archive/manager.py +583 -0
- htmlgraph/archive/search.py +244 -0
- htmlgraph/atomic_ops.py +560 -0
- htmlgraph/attribute_index.py +208 -0
- htmlgraph/bounded_paths.py +539 -0
- htmlgraph/builders/__init__.py +14 -0
- htmlgraph/builders/base.py +118 -29
- htmlgraph/builders/bug.py +150 -0
- htmlgraph/builders/chore.py +119 -0
- htmlgraph/builders/epic.py +150 -0
- htmlgraph/builders/feature.py +31 -6
- htmlgraph/builders/insight.py +195 -0
- htmlgraph/builders/metric.py +217 -0
- htmlgraph/builders/pattern.py +202 -0
- htmlgraph/builders/phase.py +162 -0
- htmlgraph/builders/spike.py +52 -19
- htmlgraph/builders/track.py +148 -72
- htmlgraph/cigs/__init__.py +81 -0
- htmlgraph/cigs/autonomy.py +385 -0
- htmlgraph/cigs/cost.py +475 -0
- htmlgraph/cigs/messages_basic.py +472 -0
- htmlgraph/cigs/messaging.py +365 -0
- htmlgraph/cigs/models.py +771 -0
- htmlgraph/cigs/pattern_storage.py +427 -0
- htmlgraph/cigs/patterns.py +503 -0
- htmlgraph/cigs/posttool_analyzer.py +234 -0
- htmlgraph/cigs/reporter.py +818 -0
- htmlgraph/cigs/tracker.py +317 -0
- htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/cli/.htmlgraph/agents.json +72 -0
- htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/cli/__init__.py +42 -0
- htmlgraph/cli/__main__.py +6 -0
- htmlgraph/cli/analytics.py +1424 -0
- htmlgraph/cli/base.py +685 -0
- htmlgraph/cli/constants.py +206 -0
- htmlgraph/cli/core.py +954 -0
- htmlgraph/cli/main.py +147 -0
- htmlgraph/cli/models.py +475 -0
- htmlgraph/cli/templates/__init__.py +1 -0
- htmlgraph/cli/templates/cost_dashboard.py +399 -0
- htmlgraph/cli/work/__init__.py +239 -0
- htmlgraph/cli/work/browse.py +115 -0
- htmlgraph/cli/work/features.py +568 -0
- htmlgraph/cli/work/orchestration.py +676 -0
- htmlgraph/cli/work/report.py +728 -0
- htmlgraph/cli/work/sessions.py +466 -0
- htmlgraph/cli/work/snapshot.py +559 -0
- htmlgraph/cli/work/tracks.py +486 -0
- htmlgraph/cli_commands/__init__.py +1 -0
- htmlgraph/cli_commands/feature.py +195 -0
- htmlgraph/cli_framework.py +115 -0
- htmlgraph/collections/__init__.py +18 -0
- htmlgraph/collections/base.py +415 -98
- htmlgraph/collections/bug.py +53 -0
- htmlgraph/collections/chore.py +53 -0
- htmlgraph/collections/epic.py +53 -0
- htmlgraph/collections/feature.py +12 -26
- htmlgraph/collections/insight.py +100 -0
- htmlgraph/collections/metric.py +92 -0
- htmlgraph/collections/pattern.py +97 -0
- htmlgraph/collections/phase.py +53 -0
- htmlgraph/collections/session.py +194 -0
- htmlgraph/collections/spike.py +56 -16
- htmlgraph/collections/task_delegation.py +241 -0
- htmlgraph/collections/todo.py +511 -0
- htmlgraph/collections/traces.py +487 -0
- htmlgraph/config/cost_models.json +56 -0
- htmlgraph/config.py +190 -0
- htmlgraph/context_analytics.py +344 -0
- htmlgraph/converter.py +216 -28
- htmlgraph/cost_analysis/__init__.py +5 -0
- htmlgraph/cost_analysis/analyzer.py +438 -0
- htmlgraph/dashboard.html +2406 -307
- htmlgraph/dashboard.html.backup +6592 -0
- htmlgraph/dashboard.html.bak +7181 -0
- htmlgraph/dashboard.html.bak2 +7231 -0
- htmlgraph/dashboard.html.bak3 +7232 -0
- htmlgraph/db/__init__.py +38 -0
- htmlgraph/db/queries.py +790 -0
- htmlgraph/db/schema.py +1788 -0
- htmlgraph/decorators.py +317 -0
- htmlgraph/dependency_models.py +19 -2
- htmlgraph/deploy.py +142 -125
- htmlgraph/deployment_models.py +474 -0
- htmlgraph/docs/API_REFERENCE.md +841 -0
- htmlgraph/docs/HTTP_API.md +750 -0
- htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
- htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
- htmlgraph/docs/README.md +532 -0
- htmlgraph/docs/__init__.py +77 -0
- htmlgraph/docs/docs_version.py +55 -0
- htmlgraph/docs/metadata.py +93 -0
- htmlgraph/docs/migrations.py +232 -0
- htmlgraph/docs/template_engine.py +143 -0
- htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
- htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
- htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
- htmlgraph/docs/templates/base_agents.md.j2 +78 -0
- htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
- htmlgraph/docs/version_check.py +163 -0
- htmlgraph/edge_index.py +182 -27
- htmlgraph/error_handler.py +544 -0
- htmlgraph/event_log.py +100 -52
- htmlgraph/event_migration.py +13 -4
- htmlgraph/exceptions.py +49 -0
- htmlgraph/file_watcher.py +101 -28
- htmlgraph/find_api.py +75 -63
- htmlgraph/git_events.py +145 -63
- htmlgraph/graph.py +1122 -106
- htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/hooks/.htmlgraph/agents.json +72 -0
- htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
- htmlgraph/hooks/__init__.py +45 -0
- htmlgraph/hooks/bootstrap.py +169 -0
- htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
- htmlgraph/hooks/concurrent_sessions.py +208 -0
- htmlgraph/hooks/context.py +350 -0
- htmlgraph/hooks/drift_handler.py +525 -0
- htmlgraph/hooks/event_tracker.py +1314 -0
- htmlgraph/hooks/git_commands.py +175 -0
- htmlgraph/hooks/hooks-config.example.json +12 -0
- htmlgraph/hooks/installer.py +343 -0
- htmlgraph/hooks/orchestrator.py +674 -0
- htmlgraph/hooks/orchestrator_reflector.py +223 -0
- htmlgraph/hooks/post-checkout.sh +28 -0
- htmlgraph/hooks/post-commit.sh +24 -0
- htmlgraph/hooks/post-merge.sh +26 -0
- htmlgraph/hooks/post_tool_use_failure.py +273 -0
- htmlgraph/hooks/post_tool_use_handler.py +257 -0
- htmlgraph/hooks/posttooluse.py +408 -0
- htmlgraph/hooks/pre-commit.sh +94 -0
- htmlgraph/hooks/pre-push.sh +28 -0
- htmlgraph/hooks/pretooluse.py +819 -0
- htmlgraph/hooks/prompt_analyzer.py +637 -0
- htmlgraph/hooks/session_handler.py +668 -0
- htmlgraph/hooks/session_summary.py +395 -0
- htmlgraph/hooks/state_manager.py +504 -0
- htmlgraph/hooks/subagent_detection.py +202 -0
- htmlgraph/hooks/subagent_stop.py +369 -0
- htmlgraph/hooks/task_enforcer.py +255 -0
- htmlgraph/hooks/task_validator.py +177 -0
- htmlgraph/hooks/validator.py +628 -0
- htmlgraph/ids.py +41 -27
- htmlgraph/index.d.ts +286 -0
- htmlgraph/learning.py +767 -0
- htmlgraph/mcp_server.py +69 -23
- htmlgraph/models.py +1586 -87
- htmlgraph/operations/README.md +62 -0
- htmlgraph/operations/__init__.py +79 -0
- htmlgraph/operations/analytics.py +339 -0
- htmlgraph/operations/bootstrap.py +289 -0
- htmlgraph/operations/events.py +244 -0
- htmlgraph/operations/fastapi_server.py +231 -0
- htmlgraph/operations/hooks.py +350 -0
- htmlgraph/operations/initialization.py +597 -0
- htmlgraph/operations/initialization.py.backup +228 -0
- htmlgraph/operations/server.py +303 -0
- htmlgraph/orchestration/__init__.py +58 -0
- htmlgraph/orchestration/claude_launcher.py +179 -0
- htmlgraph/orchestration/command_builder.py +72 -0
- htmlgraph/orchestration/headless_spawner.py +281 -0
- htmlgraph/orchestration/live_events.py +377 -0
- htmlgraph/orchestration/model_selection.py +327 -0
- htmlgraph/orchestration/plugin_manager.py +140 -0
- htmlgraph/orchestration/prompts.py +137 -0
- htmlgraph/orchestration/spawner_event_tracker.py +383 -0
- htmlgraph/orchestration/spawners/__init__.py +16 -0
- htmlgraph/orchestration/spawners/base.py +194 -0
- htmlgraph/orchestration/spawners/claude.py +173 -0
- htmlgraph/orchestration/spawners/codex.py +435 -0
- htmlgraph/orchestration/spawners/copilot.py +294 -0
- htmlgraph/orchestration/spawners/gemini.py +471 -0
- htmlgraph/orchestration/subprocess_runner.py +36 -0
- htmlgraph/orchestration/task_coordination.py +343 -0
- htmlgraph/orchestration.md +563 -0
- htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
- htmlgraph/orchestrator.py +669 -0
- htmlgraph/orchestrator_config.py +357 -0
- htmlgraph/orchestrator_mode.py +328 -0
- htmlgraph/orchestrator_validator.py +133 -0
- htmlgraph/parallel.py +646 -0
- htmlgraph/parser.py +160 -35
- htmlgraph/path_query.py +608 -0
- htmlgraph/pattern_matcher.py +636 -0
- htmlgraph/planning.py +147 -52
- htmlgraph/pydantic_models.py +476 -0
- htmlgraph/quality_gates.py +350 -0
- htmlgraph/query_builder.py +109 -72
- htmlgraph/query_composer.py +509 -0
- htmlgraph/reflection.py +443 -0
- htmlgraph/refs.py +344 -0
- htmlgraph/repo_hash.py +512 -0
- htmlgraph/repositories/__init__.py +292 -0
- htmlgraph/repositories/analytics_repository.py +455 -0
- htmlgraph/repositories/analytics_repository_standard.py +628 -0
- htmlgraph/repositories/feature_repository.py +581 -0
- htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
- htmlgraph/repositories/feature_repository_memory.py +607 -0
- htmlgraph/repositories/feature_repository_sqlite.py +858 -0
- htmlgraph/repositories/filter_service.py +620 -0
- htmlgraph/repositories/filter_service_standard.py +445 -0
- htmlgraph/repositories/shared_cache.py +621 -0
- htmlgraph/repositories/shared_cache_memory.py +395 -0
- htmlgraph/repositories/track_repository.py +552 -0
- htmlgraph/repositories/track_repository_htmlfile.py +619 -0
- htmlgraph/repositories/track_repository_memory.py +508 -0
- htmlgraph/repositories/track_repository_sqlite.py +711 -0
- htmlgraph/routing.py +8 -19
- htmlgraph/scripts/deploy.py +1 -2
- htmlgraph/sdk/__init__.py +398 -0
- htmlgraph/sdk/__init__.pyi +14 -0
- htmlgraph/sdk/analytics/__init__.py +19 -0
- htmlgraph/sdk/analytics/engine.py +155 -0
- htmlgraph/sdk/analytics/helpers.py +178 -0
- htmlgraph/sdk/analytics/registry.py +109 -0
- htmlgraph/sdk/base.py +484 -0
- htmlgraph/sdk/constants.py +216 -0
- htmlgraph/sdk/core.pyi +308 -0
- htmlgraph/sdk/discovery.py +120 -0
- htmlgraph/sdk/help/__init__.py +12 -0
- htmlgraph/sdk/help/mixin.py +699 -0
- htmlgraph/sdk/mixins/__init__.py +15 -0
- htmlgraph/sdk/mixins/attribution.py +113 -0
- htmlgraph/sdk/mixins/mixin.py +410 -0
- htmlgraph/sdk/operations/__init__.py +12 -0
- htmlgraph/sdk/operations/mixin.py +427 -0
- htmlgraph/sdk/orchestration/__init__.py +17 -0
- htmlgraph/sdk/orchestration/coordinator.py +203 -0
- htmlgraph/sdk/orchestration/spawner.py +204 -0
- htmlgraph/sdk/planning/__init__.py +19 -0
- htmlgraph/sdk/planning/bottlenecks.py +93 -0
- htmlgraph/sdk/planning/mixin.py +211 -0
- htmlgraph/sdk/planning/parallel.py +186 -0
- htmlgraph/sdk/planning/queue.py +210 -0
- htmlgraph/sdk/planning/recommendations.py +87 -0
- htmlgraph/sdk/planning/smart_planning.py +319 -0
- htmlgraph/sdk/session/__init__.py +19 -0
- htmlgraph/sdk/session/continuity.py +57 -0
- htmlgraph/sdk/session/handoff.py +110 -0
- htmlgraph/sdk/session/info.py +309 -0
- htmlgraph/sdk/session/manager.py +103 -0
- htmlgraph/sdk/strategic/__init__.py +26 -0
- htmlgraph/sdk/strategic/mixin.py +563 -0
- htmlgraph/server.py +685 -180
- htmlgraph/services/__init__.py +10 -0
- htmlgraph/services/claiming.py +199 -0
- htmlgraph/session_hooks.py +300 -0
- htmlgraph/session_manager.py +1392 -175
- htmlgraph/session_registry.py +587 -0
- htmlgraph/session_state.py +436 -0
- htmlgraph/session_warning.py +201 -0
- htmlgraph/sessions/__init__.py +23 -0
- htmlgraph/sessions/handoff.py +756 -0
- htmlgraph/setup.py +34 -17
- htmlgraph/spike_index.py +143 -0
- htmlgraph/sync_docs.py +12 -15
- htmlgraph/system_prompts.py +450 -0
- htmlgraph/templates/AGENTS.md.template +366 -0
- htmlgraph/templates/CLAUDE.md.template +97 -0
- htmlgraph/templates/GEMINI.md.template +87 -0
- htmlgraph/templates/orchestration-view.html +350 -0
- htmlgraph/track_builder.py +146 -15
- htmlgraph/track_manager.py +69 -21
- htmlgraph/transcript.py +890 -0
- htmlgraph/transcript_analytics.py +699 -0
- htmlgraph/types.py +323 -0
- htmlgraph/validation.py +115 -0
- htmlgraph/watch.py +8 -5
- htmlgraph/work_type_utils.py +3 -2
- {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2406 -307
- htmlgraph-0.27.5.data/data/htmlgraph/templates/AGENTS.md.template +366 -0
- htmlgraph-0.27.5.data/data/htmlgraph/templates/CLAUDE.md.template +97 -0
- htmlgraph-0.27.5.data/data/htmlgraph/templates/GEMINI.md.template +87 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +97 -64
- htmlgraph-0.27.5.dist-info/RECORD +337 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
- htmlgraph/cli.py +0 -2688
- htmlgraph/sdk.py +0 -709
- htmlgraph-0.9.3.dist-info/RECORD +0 -61
- {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,841 @@
|
|
|
1
|
+
# HtmlGraph SDK API Reference
|
|
2
|
+
|
|
3
|
+
Complete API documentation for HtmlGraph SDK with examples for every method.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
1. [Initialization](#initialization)
|
|
8
|
+
2. [Collections](#collections)
|
|
9
|
+
3. [Builders](#builders)
|
|
10
|
+
4. [Queries](#queries)
|
|
11
|
+
5. [Analytics](#analytics)
|
|
12
|
+
6. [Orchestration](#orchestration)
|
|
13
|
+
7. [Error Handling](#error-handling)
|
|
14
|
+
|
|
15
|
+
## Initialization
|
|
16
|
+
|
|
17
|
+
### SDK Constructor
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
from htmlgraph import SDK
|
|
21
|
+
|
|
22
|
+
# Basic initialization (auto-discovers .htmlgraph directory)
|
|
23
|
+
sdk = SDK(agent="claude")
|
|
24
|
+
|
|
25
|
+
# With explicit directory
|
|
26
|
+
sdk = SDK(agent="claude", directory="/path/to/.htmlgraph")
|
|
27
|
+
|
|
28
|
+
# With parent session tracking (for nested contexts)
|
|
29
|
+
sdk = SDK(agent="claude", parent_session="sess-12345")
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Parameters:**
|
|
33
|
+
- `agent` (str, REQUIRED): Agent identifier for work attribution. Examples: "claude", "explorer", "coder", "tester"
|
|
34
|
+
- `directory` (Path | str, optional): Path to .htmlgraph directory. Auto-discovered if not provided.
|
|
35
|
+
- `parent_session` (str, optional): Parent session ID for nested contexts
|
|
36
|
+
|
|
37
|
+
**Raises:**
|
|
38
|
+
- `ValueError`: If agent cannot be determined and not provided
|
|
39
|
+
|
|
40
|
+
**Auto-Discovery Logic:**
|
|
41
|
+
1. Checks current directory for `.htmlgraph/`
|
|
42
|
+
2. Recursively checks parent directories
|
|
43
|
+
3. Raises error if not found
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Collections
|
|
48
|
+
|
|
49
|
+
All collections provide the same base interface for CRUD operations and querying.
|
|
50
|
+
|
|
51
|
+
### Collection Methods
|
|
52
|
+
|
|
53
|
+
#### `create(title: str, **kwargs) -> Builder`
|
|
54
|
+
|
|
55
|
+
Create a new work item with fluent builder interface.
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
# Simple creation
|
|
59
|
+
feature = sdk.features.create("User Authentication")
|
|
60
|
+
|
|
61
|
+
# With builder pattern
|
|
62
|
+
feature = sdk.features.create("User Auth") \
|
|
63
|
+
.set_priority("high") \
|
|
64
|
+
.add_steps(["Design schema", "Implement", "Test"]) \
|
|
65
|
+
.set_status("in-progress") \
|
|
66
|
+
.save()
|
|
67
|
+
|
|
68
|
+
# Create with custom properties
|
|
69
|
+
spike = sdk.spikes.create(
|
|
70
|
+
"Investigate caching strategies",
|
|
71
|
+
investigation_type="technical",
|
|
72
|
+
estimated_hours=8
|
|
73
|
+
)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Parameters:**
|
|
77
|
+
- `title` (str): Work item title
|
|
78
|
+
- `**kwargs`: Additional properties
|
|
79
|
+
|
|
80
|
+
**Returns:**
|
|
81
|
+
- Builder instance with fluent interface (supports method chaining)
|
|
82
|
+
|
|
83
|
+
**Raises:**
|
|
84
|
+
- `ValidationError`: If title is empty
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
#### `get(node_id: str) -> Node | None`
|
|
89
|
+
|
|
90
|
+
Retrieve a single work item by ID.
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
feature = sdk.features.get("feat-12345")
|
|
94
|
+
if feature:
|
|
95
|
+
print(f"Title: {feature.title}")
|
|
96
|
+
print(f"Status: {feature.status}")
|
|
97
|
+
else:
|
|
98
|
+
print("Feature not found")
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Parameters:**
|
|
102
|
+
- `node_id` (str): Unique node identifier
|
|
103
|
+
|
|
104
|
+
**Returns:**
|
|
105
|
+
- `Node` object if found, `None` if not found
|
|
106
|
+
|
|
107
|
+
**Error Behavior:**
|
|
108
|
+
- Returns `None` (safe for conditional checks)
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
#### `all() -> list[Node]`
|
|
113
|
+
|
|
114
|
+
Retrieve all work items in collection.
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
all_features = sdk.features.all()
|
|
118
|
+
print(f"Total features: {len(all_features)}")
|
|
119
|
+
|
|
120
|
+
# Safe iteration even if empty
|
|
121
|
+
for feature in all_features:
|
|
122
|
+
print(feature.title)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Returns:**
|
|
126
|
+
- List of Node objects (empty list if none found)
|
|
127
|
+
|
|
128
|
+
**Error Behavior:**
|
|
129
|
+
- Returns empty list on error (safe iteration)
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
#### `where(**filters) -> list[Node]`
|
|
134
|
+
|
|
135
|
+
Query work items with filter conditions.
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
# Single filter
|
|
139
|
+
todo_features = sdk.features.where(status="todo")
|
|
140
|
+
|
|
141
|
+
# Multiple filters (AND condition)
|
|
142
|
+
high_priority_bugs = sdk.bugs.where(
|
|
143
|
+
status="todo",
|
|
144
|
+
priority="high"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# Complex queries
|
|
148
|
+
in_progress = sdk.features.where(
|
|
149
|
+
status="in-progress",
|
|
150
|
+
priority__in=["high", "critical"]
|
|
151
|
+
)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Parameters:**
|
|
155
|
+
- `**filters`: Key-value pairs for filtering
|
|
156
|
+
- Supports nested attributes: `priority__in=["high", "critical"]`
|
|
157
|
+
- Multiple filters combine with AND logic
|
|
158
|
+
|
|
159
|
+
**Returns:**
|
|
160
|
+
- List of matching Node objects (empty list if no matches)
|
|
161
|
+
|
|
162
|
+
**Common Filters:**
|
|
163
|
+
- `status`: "todo", "in-progress", "blocked", "done"
|
|
164
|
+
- `priority`: "low", "medium", "high", "critical"
|
|
165
|
+
- `agent`: Agent identifier
|
|
166
|
+
- `track`: Track identifier
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
#### `edit(node_id: str) -> ContextManager[Node]`
|
|
171
|
+
|
|
172
|
+
Edit a work item using context manager.
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
# Update status
|
|
176
|
+
with sdk.features.edit("feat-12345") as feature:
|
|
177
|
+
feature.status = "done"
|
|
178
|
+
feature.priority = "low"
|
|
179
|
+
# Auto-saves on exit
|
|
180
|
+
|
|
181
|
+
# Modify steps
|
|
182
|
+
with sdk.features.edit("feat-12345") as feature:
|
|
183
|
+
if feature.steps:
|
|
184
|
+
feature.steps[0].completed = True
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**Parameters:**
|
|
188
|
+
- `node_id` (str): Node to edit
|
|
189
|
+
|
|
190
|
+
**Returns:**
|
|
191
|
+
- Context manager yielding Node object
|
|
192
|
+
- Auto-saves on exit
|
|
193
|
+
|
|
194
|
+
**Raises:**
|
|
195
|
+
- `NodeNotFoundError`: If node not found
|
|
196
|
+
|
|
197
|
+
**Error Behavior:**
|
|
198
|
+
- Raises exception (must handle with try/except)
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
#### `mark_done(node_ids: list[str]) -> dict`
|
|
203
|
+
|
|
204
|
+
Mark multiple work items as done.
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
result = sdk.features.mark_done([
|
|
208
|
+
"feat-001",
|
|
209
|
+
"feat-002",
|
|
210
|
+
"feat-003"
|
|
211
|
+
])
|
|
212
|
+
|
|
213
|
+
print(f"Completed: {result['success_count']}")
|
|
214
|
+
if result['failed_ids']:
|
|
215
|
+
print(f"Failed: {result['failed_ids']}")
|
|
216
|
+
print(f"Reasons: {result['warnings']}")
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**Parameters:**
|
|
220
|
+
- `node_ids` (list[str]): IDs to mark as done
|
|
221
|
+
|
|
222
|
+
**Returns:**
|
|
223
|
+
- Dict with:
|
|
224
|
+
- `success_count` (int): Number successfully updated
|
|
225
|
+
- `failed_ids` (list[str]): IDs that failed
|
|
226
|
+
- `warnings` (list[str]): Reason for each failure
|
|
227
|
+
|
|
228
|
+
**Error Behavior:**
|
|
229
|
+
- Returns results dict with partial success details
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
#### `batch_update(updates: dict[str, dict]) -> dict`
|
|
234
|
+
|
|
235
|
+
Update multiple work items in batch.
|
|
236
|
+
|
|
237
|
+
```python
|
|
238
|
+
updates = {
|
|
239
|
+
"feat-001": {"status": "done", "priority": "low"},
|
|
240
|
+
"feat-002": {"status": "in-progress"},
|
|
241
|
+
"feat-003": {"status": "blocked"}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
result = sdk.features.batch_update(updates)
|
|
245
|
+
print(f"Updated: {result['success_count']}")
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Parameters:**
|
|
249
|
+
- `updates` (dict): Mapping of node_id to update dict
|
|
250
|
+
|
|
251
|
+
**Returns:**
|
|
252
|
+
- Dict with success_count, failed_ids, warnings
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
#### `delete(node_id: str) -> bool`
|
|
257
|
+
|
|
258
|
+
Delete a work item.
|
|
259
|
+
|
|
260
|
+
```python
|
|
261
|
+
if sdk.features.delete("feat-12345"):
|
|
262
|
+
print("Deleted successfully")
|
|
263
|
+
else:
|
|
264
|
+
print("Feature not found")
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**Parameters:**
|
|
268
|
+
- `node_id` (str): Node to delete
|
|
269
|
+
|
|
270
|
+
**Returns:**
|
|
271
|
+
- `True` if deleted, `False` if not found
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
#### `assign(node_ids: list[str], agent: str) -> dict`
|
|
276
|
+
|
|
277
|
+
Assign work items to an agent.
|
|
278
|
+
|
|
279
|
+
```python
|
|
280
|
+
result = sdk.features.assign(
|
|
281
|
+
["feat-001", "feat-002"],
|
|
282
|
+
agent="claude"
|
|
283
|
+
)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**Parameters:**
|
|
287
|
+
- `node_ids` (list[str]): IDs to assign
|
|
288
|
+
- `agent` (str): Agent identifier
|
|
289
|
+
|
|
290
|
+
**Returns:**
|
|
291
|
+
- Results dict with success_count, failed_ids
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
### Available Collections
|
|
296
|
+
|
|
297
|
+
**Work Item Collections** (all support builder pattern):
|
|
298
|
+
- `sdk.features` - Feature work items
|
|
299
|
+
- `sdk.bugs` - Bug reports
|
|
300
|
+
- `sdk.spikes` - Investigation/research spikes
|
|
301
|
+
- `sdk.chores` - Maintenance tasks
|
|
302
|
+
- `sdk.epics` - Large bodies of work
|
|
303
|
+
- `sdk.phases` - Project phases
|
|
304
|
+
|
|
305
|
+
**Support Collections**:
|
|
306
|
+
- `sdk.sessions` - Agent sessions
|
|
307
|
+
- `sdk.tracks` - Work tracks
|
|
308
|
+
- `sdk.agents` - Agent information
|
|
309
|
+
- `sdk.todos` - Persistent task tracking (mirrors TodoWrite API)
|
|
310
|
+
- `sdk.patterns` - Workflow patterns (optimal/anti-pattern)
|
|
311
|
+
- `sdk.insights` - Session health insights
|
|
312
|
+
- `sdk.metrics` - Aggregated time-series metrics
|
|
313
|
+
- `sdk.task_delegations` - Task delegation observability
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## Builders
|
|
318
|
+
|
|
319
|
+
Builders provide fluent interface for creating and configuring work items.
|
|
320
|
+
|
|
321
|
+
### Base Builder Methods
|
|
322
|
+
|
|
323
|
+
All builders inherit from `BaseBuilder` and support these methods:
|
|
324
|
+
|
|
325
|
+
#### `set_priority(priority: str) -> Builder`
|
|
326
|
+
|
|
327
|
+
```python
|
|
328
|
+
feature = sdk.features.create("Feature") \
|
|
329
|
+
.set_priority("high")
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
**Values:** "low", "medium", "high", "critical"
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
#### `set_status(status: str) -> Builder`
|
|
337
|
+
|
|
338
|
+
```python
|
|
339
|
+
feature = sdk.features.create("Feature") \
|
|
340
|
+
.set_status("in-progress")
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
**Values:** "todo", "in-progress", "blocked", "done"
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
#### `add_step(description: str) -> Builder`
|
|
348
|
+
|
|
349
|
+
```python
|
|
350
|
+
feature = sdk.features.create("Feature") \
|
|
351
|
+
.add_step("Design the schema") \
|
|
352
|
+
.add_step("Implement API")
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
#### `add_steps(descriptions: list[str]) -> Builder`
|
|
358
|
+
|
|
359
|
+
```python
|
|
360
|
+
feature = sdk.features.create("Feature") \
|
|
361
|
+
.add_steps([
|
|
362
|
+
"Design the schema",
|
|
363
|
+
"Implement API",
|
|
364
|
+
"Add tests",
|
|
365
|
+
"Deploy"
|
|
366
|
+
])
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
#### `set_description(description: str) -> Builder`
|
|
372
|
+
|
|
373
|
+
```python
|
|
374
|
+
feature = sdk.features.create("Feature") \
|
|
375
|
+
.set_description("This feature adds user authentication")
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
#### `blocks(node_id: str) -> Builder`
|
|
381
|
+
|
|
382
|
+
```python
|
|
383
|
+
feature = sdk.features.create("Feature") \
|
|
384
|
+
.blocks("feat-999") # This blocks feat-999
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
#### `blocked_by(node_id: str) -> Builder`
|
|
390
|
+
|
|
391
|
+
```python
|
|
392
|
+
feature = sdk.features.create("Feature") \
|
|
393
|
+
.blocked_by("feat-111") # This is blocked by feat-111
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
#### `save() -> Node`
|
|
399
|
+
|
|
400
|
+
```python
|
|
401
|
+
feature = sdk.features.create("Feature") \
|
|
402
|
+
.set_priority("high") \
|
|
403
|
+
.add_steps(["Step 1", "Step 2"]) \
|
|
404
|
+
.save()
|
|
405
|
+
|
|
406
|
+
print(f"Created: {feature.id}")
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**Returns:**
|
|
410
|
+
- Saved Node object with generated ID
|
|
411
|
+
|
|
412
|
+
**Raises:**
|
|
413
|
+
- `ValidationError`: If required fields missing
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
### Feature-Specific Builder Methods
|
|
418
|
+
|
|
419
|
+
```python
|
|
420
|
+
feature = sdk.features.create("User Authentication") \
|
|
421
|
+
.set_track("auth") \
|
|
422
|
+
.set_priority("high") \
|
|
423
|
+
.add_steps([...]) \
|
|
424
|
+
.save()
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
### Spike-Specific Builder Methods
|
|
430
|
+
|
|
431
|
+
```python
|
|
432
|
+
spike = sdk.spikes.create("Investigate caching strategies") \
|
|
433
|
+
.set_spike_type("technical") \
|
|
434
|
+
.set_estimated_hours(8) \
|
|
435
|
+
.save()
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
### Complete Builder Example
|
|
441
|
+
|
|
442
|
+
```python
|
|
443
|
+
feature = sdk.features.create("User Authentication System") \
|
|
444
|
+
.set_priority("high") \
|
|
445
|
+
.set_status("todo") \
|
|
446
|
+
.set_description(
|
|
447
|
+
"Implement JWT-based authentication with OAuth2 support"
|
|
448
|
+
) \
|
|
449
|
+
.add_steps([
|
|
450
|
+
"Design authentication schema",
|
|
451
|
+
"Implement JWT middleware",
|
|
452
|
+
"Add OAuth2 integration",
|
|
453
|
+
"Write comprehensive tests",
|
|
454
|
+
"Deploy to staging",
|
|
455
|
+
"Perform security audit",
|
|
456
|
+
"Deploy to production"
|
|
457
|
+
]) \
|
|
458
|
+
.blocks("feat-post-auth-flow") \
|
|
459
|
+
.blocked_by("feat-database-setup") \
|
|
460
|
+
.save()
|
|
461
|
+
|
|
462
|
+
print(f"Feature {feature.id} created successfully")
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
---
|
|
466
|
+
|
|
467
|
+
## Queries
|
|
468
|
+
|
|
469
|
+
### Query Builder
|
|
470
|
+
|
|
471
|
+
For complex queries beyond basic filtering:
|
|
472
|
+
|
|
473
|
+
```python
|
|
474
|
+
from htmlgraph import HtmlGraph, QueryBuilder
|
|
475
|
+
|
|
476
|
+
graph = HtmlGraph("features/")
|
|
477
|
+
|
|
478
|
+
# Query with multiple conditions
|
|
479
|
+
results = graph.query_builder() \
|
|
480
|
+
.where("status", "todo") \
|
|
481
|
+
.and_("priority").in_(["high", "critical"]) \
|
|
482
|
+
.and_("completion").lt(50) \
|
|
483
|
+
.execute()
|
|
484
|
+
|
|
485
|
+
# Text search
|
|
486
|
+
results = graph.query_builder() \
|
|
487
|
+
.where("title").contains("auth") \
|
|
488
|
+
.or_("title").contains("login") \
|
|
489
|
+
.execute()
|
|
490
|
+
|
|
491
|
+
# Numeric comparisons
|
|
492
|
+
results = graph.query_builder() \
|
|
493
|
+
.where("estimated_hours").gte(8) \
|
|
494
|
+
.and_("estimated_hours").lte(40) \
|
|
495
|
+
.execute()
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### QueryBuilder Operators
|
|
499
|
+
|
|
500
|
+
**Comparison Operators:**
|
|
501
|
+
- `.eq(value)` - Equal
|
|
502
|
+
- `.ne(value)` - Not equal
|
|
503
|
+
- `.gt(value)` - Greater than
|
|
504
|
+
- `.gte(value)` - Greater than or equal
|
|
505
|
+
- `.lt(value)` - Less than
|
|
506
|
+
- `.lte(value)` - Less than or equal
|
|
507
|
+
- `.in_(values)` - In list
|
|
508
|
+
- `.not_in(values)` - Not in list
|
|
509
|
+
- `.between(a, b)` - Between (inclusive)
|
|
510
|
+
|
|
511
|
+
**String Operators:**
|
|
512
|
+
- `.contains(text)` - String contains
|
|
513
|
+
- `.starts_with(text)` - Starts with
|
|
514
|
+
- `.ends_with(text)` - Ends with
|
|
515
|
+
- `.matches(regex)` - Regex match
|
|
516
|
+
|
|
517
|
+
**Null Operators:**
|
|
518
|
+
- `.is_null()` - Is null
|
|
519
|
+
- `.is_not_null()` - Is not null
|
|
520
|
+
|
|
521
|
+
**Logical Operators:**
|
|
522
|
+
- `.and_(field)` - AND condition
|
|
523
|
+
- `.or_(field)` - OR condition
|
|
524
|
+
- `.not_()` - NOT condition
|
|
525
|
+
|
|
526
|
+
---
|
|
527
|
+
|
|
528
|
+
## Analytics
|
|
529
|
+
|
|
530
|
+
### Work Type Analytics
|
|
531
|
+
|
|
532
|
+
```python
|
|
533
|
+
# Get distribution of work types
|
|
534
|
+
distribution = sdk.analytics.get_work_type_distribution()
|
|
535
|
+
# Returns: {"feature": 25, "spike": 8, "bug": 12, "chore": 5}
|
|
536
|
+
|
|
537
|
+
# Get spike to feature ratio
|
|
538
|
+
ratio = sdk.analytics.get_spike_to_feature_ratio()
|
|
539
|
+
# Returns: 0.32 (1 spike per 3 features, indicating good investigation)
|
|
540
|
+
|
|
541
|
+
# Get maintenance burden
|
|
542
|
+
burden = sdk.analytics.get_maintenance_burden()
|
|
543
|
+
# Returns: 0.17 (chores are 17% of total work)
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
### Dependency Analytics
|
|
549
|
+
|
|
550
|
+
```python
|
|
551
|
+
# Find blocking tasks
|
|
552
|
+
bottlenecks = sdk.dep_analytics.find_bottlenecks(top_n=5)
|
|
553
|
+
# Returns: [
|
|
554
|
+
# {
|
|
555
|
+
# "node_id": "feat-001",
|
|
556
|
+
# "title": "Database Schema",
|
|
557
|
+
# "blocking_count": 8,
|
|
558
|
+
# "blocker_ids": [...]
|
|
559
|
+
# }
|
|
560
|
+
# ]
|
|
561
|
+
|
|
562
|
+
# Find parallelizable work
|
|
563
|
+
parallel = sdk.dep_analytics.get_parallel_work(max_agents=3)
|
|
564
|
+
# Returns: {
|
|
565
|
+
# "agent_1": ["feat-001", "feat-002"],
|
|
566
|
+
# "agent_2": ["feat-003", "feat-004"],
|
|
567
|
+
# "agent_3": ["feat-005"]
|
|
568
|
+
# }
|
|
569
|
+
|
|
570
|
+
# Get recommendations
|
|
571
|
+
recommendations = sdk.dep_analytics.recommend_next_tasks(agent_count=1)
|
|
572
|
+
|
|
573
|
+
# Assess dependency risk
|
|
574
|
+
risk = sdk.dep_analytics.assess_dependency_risk()
|
|
575
|
+
# Returns: {"has_cycles": false, "risk_level": "low"}
|
|
576
|
+
|
|
577
|
+
# Impact analysis
|
|
578
|
+
impact = sdk.dep_analytics.impact_analysis("feat-001")
|
|
579
|
+
# Returns: {"unlocked_nodes": [...], "impact_count": 5}
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
---
|
|
583
|
+
|
|
584
|
+
### Context Analytics
|
|
585
|
+
|
|
586
|
+
```python
|
|
587
|
+
# Get context usage metrics
|
|
588
|
+
usage = sdk.context.get_context_usage()
|
|
589
|
+
# Returns: {
|
|
590
|
+
# "current_tokens": 45000,
|
|
591
|
+
# "max_tokens": 100000,
|
|
592
|
+
# "usage_percent": 45
|
|
593
|
+
# }
|
|
594
|
+
|
|
595
|
+
# Get efficiency score
|
|
596
|
+
efficiency = sdk.context.get_context_efficiency()
|
|
597
|
+
# Returns: 0.85 (efficiency score 0-1)
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
---
|
|
601
|
+
|
|
602
|
+
### System Prompts
|
|
603
|
+
|
|
604
|
+
```python
|
|
605
|
+
# Get active system prompt (project override OR plugin default)
|
|
606
|
+
active = sdk.system_prompts.get_active()
|
|
607
|
+
|
|
608
|
+
# Get plugin default
|
|
609
|
+
default = sdk.system_prompts.get_default()
|
|
610
|
+
|
|
611
|
+
# Get project override if exists
|
|
612
|
+
project = sdk.system_prompts.get_project()
|
|
613
|
+
|
|
614
|
+
# Create project-level override
|
|
615
|
+
sdk.system_prompts.create("""
|
|
616
|
+
# Custom System Prompt
|
|
617
|
+
|
|
618
|
+
Your custom guidance here...
|
|
619
|
+
""")
|
|
620
|
+
|
|
621
|
+
# Validate prompt token count
|
|
622
|
+
stats = sdk.system_prompts.validate()
|
|
623
|
+
# Returns: {
|
|
624
|
+
# "tokens": 1250,
|
|
625
|
+
# "max_tokens": 2000,
|
|
626
|
+
# "is_valid": true
|
|
627
|
+
# }
|
|
628
|
+
|
|
629
|
+
# Get prompt statistics
|
|
630
|
+
stats = sdk.system_prompts.get_stats()
|
|
631
|
+
|
|
632
|
+
# Delete project override (fallback to default)
|
|
633
|
+
sdk.system_prompts.delete()
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
---
|
|
637
|
+
|
|
638
|
+
## Orchestration
|
|
639
|
+
|
|
640
|
+
### Task Delegation
|
|
641
|
+
|
|
642
|
+
```python
|
|
643
|
+
from htmlgraph import SDK, delegate_with_id, get_results_by_task_id
|
|
644
|
+
|
|
645
|
+
sdk = SDK(agent="orchestrator")
|
|
646
|
+
|
|
647
|
+
# Delegate task to specific agent
|
|
648
|
+
task_id = delegate_with_id(
|
|
649
|
+
prompt="Implement authentication module",
|
|
650
|
+
agent="coder",
|
|
651
|
+
task_id="task-auth-001"
|
|
652
|
+
)
|
|
653
|
+
|
|
654
|
+
# Check results later
|
|
655
|
+
results = get_results_by_task_id("task-auth-001")
|
|
656
|
+
if results:
|
|
657
|
+
print(f"Result: {results['output']}")
|
|
658
|
+
print(f"Status: {results['status']}")
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
---
|
|
662
|
+
|
|
663
|
+
### Parallel Delegation
|
|
664
|
+
|
|
665
|
+
```python
|
|
666
|
+
from htmlgraph import parallel_delegate
|
|
667
|
+
|
|
668
|
+
# Delegate multiple tasks in parallel
|
|
669
|
+
results = parallel_delegate([
|
|
670
|
+
{
|
|
671
|
+
"prompt": "Implement login endpoint",
|
|
672
|
+
"agent": "coder",
|
|
673
|
+
"task_id": "auth-login"
|
|
674
|
+
},
|
|
675
|
+
{
|
|
676
|
+
"prompt": "Implement logout endpoint",
|
|
677
|
+
"agent": "coder",
|
|
678
|
+
"task_id": "auth-logout"
|
|
679
|
+
},
|
|
680
|
+
{
|
|
681
|
+
"prompt": "Write authentication tests",
|
|
682
|
+
"agent": "tester",
|
|
683
|
+
"task_id": "auth-tests"
|
|
684
|
+
}
|
|
685
|
+
])
|
|
686
|
+
|
|
687
|
+
# Aggregate results
|
|
688
|
+
for task_id, result in results.items():
|
|
689
|
+
print(f"{task_id}: {result['status']}")
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
---
|
|
693
|
+
|
|
694
|
+
### Model Selection
|
|
695
|
+
|
|
696
|
+
```python
|
|
697
|
+
from htmlgraph.orchestration import select_model, TaskType, ComplexityLevel
|
|
698
|
+
|
|
699
|
+
# Select best model for task
|
|
700
|
+
model = select_model(
|
|
701
|
+
task_type=TaskType.CODE_GENERATION,
|
|
702
|
+
complexity=ComplexityLevel.HIGH,
|
|
703
|
+
budget_mode="balanced" # or "cost-optimized"
|
|
704
|
+
)
|
|
705
|
+
# Returns: "gpt-4-turbo" or "claude-opus" based on heuristics
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
---
|
|
709
|
+
|
|
710
|
+
## Error Handling
|
|
711
|
+
|
|
712
|
+
### Error Classes
|
|
713
|
+
|
|
714
|
+
```python
|
|
715
|
+
from htmlgraph import (
|
|
716
|
+
HtmlGraphError,
|
|
717
|
+
NodeNotFoundError,
|
|
718
|
+
SessionNotFoundError,
|
|
719
|
+
ClaimConflictError,
|
|
720
|
+
ValidationError
|
|
721
|
+
)
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
---
|
|
725
|
+
|
|
726
|
+
### Error Handling Patterns
|
|
727
|
+
|
|
728
|
+
**Pattern 1: Safe Lookup**
|
|
729
|
+
|
|
730
|
+
```python
|
|
731
|
+
feature = sdk.features.get("feat-12345")
|
|
732
|
+
if feature:
|
|
733
|
+
print(feature.title)
|
|
734
|
+
else:
|
|
735
|
+
print("Not found - safe to ignore")
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
**Pattern 2: Safe Query**
|
|
739
|
+
|
|
740
|
+
```python
|
|
741
|
+
# Returns empty list - safe iteration
|
|
742
|
+
high_priority = sdk.features.where(status="todo", priority="high")
|
|
743
|
+
for item in high_priority:
|
|
744
|
+
process(item)
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
**Pattern 3: Edit with Exception Handling**
|
|
748
|
+
|
|
749
|
+
```python
|
|
750
|
+
try:
|
|
751
|
+
with sdk.features.edit("feat-12345") as feature:
|
|
752
|
+
feature.status = "done"
|
|
753
|
+
except NodeNotFoundError:
|
|
754
|
+
print("Feature not found")
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
**Pattern 4: Batch with Results**
|
|
758
|
+
|
|
759
|
+
```python
|
|
760
|
+
result = sdk.features.mark_done(["feat-1", "feat-2", "missing"])
|
|
761
|
+
if result['failed_ids']:
|
|
762
|
+
print(f"Failed: {result['failed_ids']}")
|
|
763
|
+
for warning in result['warnings']:
|
|
764
|
+
print(f" Reason: {warning}")
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
---
|
|
768
|
+
|
|
769
|
+
### Common Error Scenarios
|
|
770
|
+
|
|
771
|
+
| Error | Cause | Solution |
|
|
772
|
+
|-------|-------|----------|
|
|
773
|
+
| `NodeNotFoundError` | Node ID doesn't exist | Check `.get()` result or catch exception |
|
|
774
|
+
| `ValidationError` | Invalid input (e.g., empty title) | Validate input before creating |
|
|
775
|
+
| `ClaimConflictError` | Another agent claimed the item | Release claim or work with different item |
|
|
776
|
+
| `SessionNotFoundError` | Parent session doesn't exist | Check parent_session parameter |
|
|
777
|
+
|
|
778
|
+
---
|
|
779
|
+
|
|
780
|
+
## Complete Example
|
|
781
|
+
|
|
782
|
+
```python
|
|
783
|
+
from htmlgraph import SDK
|
|
784
|
+
from htmlgraph.exceptions import NodeNotFoundError
|
|
785
|
+
|
|
786
|
+
# Initialize
|
|
787
|
+
sdk = SDK(agent="claude")
|
|
788
|
+
|
|
789
|
+
# Create feature with builder
|
|
790
|
+
feature = sdk.features.create("User Authentication System") \
|
|
791
|
+
.set_priority("high") \
|
|
792
|
+
.add_steps([
|
|
793
|
+
"Design schema",
|
|
794
|
+
"Implement API",
|
|
795
|
+
"Add tests"
|
|
796
|
+
]) \
|
|
797
|
+
.save()
|
|
798
|
+
|
|
799
|
+
print(f"Created feature: {feature.id}")
|
|
800
|
+
|
|
801
|
+
# Query work
|
|
802
|
+
high_priority_todos = sdk.features.where(
|
|
803
|
+
status="todo",
|
|
804
|
+
priority="high"
|
|
805
|
+
)
|
|
806
|
+
|
|
807
|
+
# Update feature
|
|
808
|
+
try:
|
|
809
|
+
with sdk.features.edit(feature.id) as f:
|
|
810
|
+
f.status = "in-progress"
|
|
811
|
+
f.priority = "critical"
|
|
812
|
+
except NodeNotFoundError:
|
|
813
|
+
print("Feature was deleted")
|
|
814
|
+
|
|
815
|
+
# Batch operations
|
|
816
|
+
result = sdk.features.mark_done([feature.id])
|
|
817
|
+
print(f"Marked done: {result['success_count']}")
|
|
818
|
+
|
|
819
|
+
# Analytics
|
|
820
|
+
distribution = sdk.analytics.get_work_type_distribution()
|
|
821
|
+
bottlenecks = sdk.dep_analytics.find_bottlenecks(top_n=3)
|
|
822
|
+
|
|
823
|
+
print(f"Work distribution: {distribution}")
|
|
824
|
+
print(f"Bottlenecks: {bottlenecks}")
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
---
|
|
828
|
+
|
|
829
|
+
## Version
|
|
830
|
+
|
|
831
|
+
Current API version: 0.24.1
|
|
832
|
+
|
|
833
|
+
Compatible with: HtmlGraph 0.20.0+
|
|
834
|
+
|
|
835
|
+
---
|
|
836
|
+
|
|
837
|
+
## See Also
|
|
838
|
+
|
|
839
|
+
- [HTTP API Reference](HTTP_API.md) - REST endpoint documentation
|
|
840
|
+
- [Orchestration Patterns](ORCHESTRATION_PATTERNS.md) - Multi-agent coordination
|
|
841
|
+
- [Integration Guide](INTEGRATION_GUIDE.md) - Quick start and examples
|