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,53 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Bug collection for managing bug report work items.
|
|
5
|
+
|
|
6
|
+
Extends BaseCollection with bug-specific builder support.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from htmlgraph.sdk import SDK
|
|
14
|
+
|
|
15
|
+
from htmlgraph.collections.base import BaseCollection
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class BugCollection(BaseCollection["BugCollection"]):
|
|
19
|
+
"""
|
|
20
|
+
Collection interface for bugs with builder support.
|
|
21
|
+
|
|
22
|
+
Provides all base collection methods plus a fluent builder
|
|
23
|
+
interface for creating new bugs.
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
>>> sdk = SDK(agent="claude")
|
|
27
|
+
>>> bug = sdk.bugs.create("Login button broken") \\
|
|
28
|
+
... .set_priority("critical") \\
|
|
29
|
+
... .set_severity("high") \\
|
|
30
|
+
... .set_repro_steps(["Go to login", "Click button"]) \\
|
|
31
|
+
... .save()
|
|
32
|
+
>>>
|
|
33
|
+
>>> # Query bugs
|
|
34
|
+
>>> critical_bugs = sdk.bugs.where(priority="critical")
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
_collection_name = "bugs"
|
|
38
|
+
_node_type = "bug"
|
|
39
|
+
|
|
40
|
+
def __init__(self, sdk: SDK):
|
|
41
|
+
"""
|
|
42
|
+
Initialize bug collection.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
sdk: Parent SDK instance
|
|
46
|
+
"""
|
|
47
|
+
super().__init__(sdk, "bugs", "bug")
|
|
48
|
+
self._sdk = sdk
|
|
49
|
+
|
|
50
|
+
# Set builder class for create() method
|
|
51
|
+
from htmlgraph.builders.bug import BugBuilder
|
|
52
|
+
|
|
53
|
+
self._builder_class = BugBuilder
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Chore collection for managing maintenance task work items.
|
|
5
|
+
|
|
6
|
+
Extends BaseCollection with chore-specific builder support.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from htmlgraph.sdk import SDK
|
|
14
|
+
|
|
15
|
+
from htmlgraph.collections.base import BaseCollection
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ChoreCollection(BaseCollection["ChoreCollection"]):
|
|
19
|
+
"""
|
|
20
|
+
Collection interface for chores with builder support.
|
|
21
|
+
|
|
22
|
+
Provides all base collection methods plus a fluent builder
|
|
23
|
+
interface for creating new chores.
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
>>> sdk = SDK(agent="claude")
|
|
27
|
+
>>> chore = sdk.chores.create("Update dependencies") \\
|
|
28
|
+
... .set_priority("low") \\
|
|
29
|
+
... .set_chore_type("maintenance") \\
|
|
30
|
+
... .set_recurring(interval_days=30) \\
|
|
31
|
+
... .save()
|
|
32
|
+
>>>
|
|
33
|
+
>>> # Query chores
|
|
34
|
+
>>> maintenance = sdk.chores.where(status="todo")
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
_collection_name = "chores"
|
|
38
|
+
_node_type = "chore"
|
|
39
|
+
|
|
40
|
+
def __init__(self, sdk: SDK):
|
|
41
|
+
"""
|
|
42
|
+
Initialize chore collection.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
sdk: Parent SDK instance
|
|
46
|
+
"""
|
|
47
|
+
super().__init__(sdk, "chores", "chore")
|
|
48
|
+
self._sdk = sdk
|
|
49
|
+
|
|
50
|
+
# Set builder class for create() method
|
|
51
|
+
from htmlgraph.builders.chore import ChoreBuilder
|
|
52
|
+
|
|
53
|
+
self._builder_class = ChoreBuilder
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Epic collection for managing large body of work items.
|
|
5
|
+
|
|
6
|
+
Extends BaseCollection with epic-specific builder support.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from htmlgraph.sdk import SDK
|
|
14
|
+
|
|
15
|
+
from htmlgraph.collections.base import BaseCollection
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class EpicCollection(BaseCollection["EpicCollection"]):
|
|
19
|
+
"""
|
|
20
|
+
Collection interface for epics with builder support.
|
|
21
|
+
|
|
22
|
+
Provides all base collection methods plus a fluent builder
|
|
23
|
+
interface for creating new epics.
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
>>> sdk = SDK(agent="claude")
|
|
27
|
+
>>> epic = sdk.epics.create("v2.0 Release") \\
|
|
28
|
+
... .set_priority("high") \\
|
|
29
|
+
... .set_target_date(date(2025, 6, 1)) \\
|
|
30
|
+
... .add_child_features(["feat-001", "feat-002"]) \\
|
|
31
|
+
... .save()
|
|
32
|
+
>>>
|
|
33
|
+
>>> # Query epics
|
|
34
|
+
>>> active_epics = sdk.epics.where(status="in-progress")
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
_collection_name = "epics"
|
|
38
|
+
_node_type = "epic"
|
|
39
|
+
|
|
40
|
+
def __init__(self, sdk: SDK):
|
|
41
|
+
"""
|
|
42
|
+
Initialize epic collection.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
sdk: Parent SDK instance
|
|
46
|
+
"""
|
|
47
|
+
super().__init__(sdk, "epics", "epic")
|
|
48
|
+
self._sdk = sdk
|
|
49
|
+
|
|
50
|
+
# Set builder class for create() method
|
|
51
|
+
from htmlgraph.builders.epic import EpicBuilder
|
|
52
|
+
|
|
53
|
+
self._builder_class = EpicBuilder
|
htmlgraph/collections/feature.py
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Feature collection for managing feature work items.
|
|
3
5
|
|
|
4
6
|
Extends BaseCollection with feature-specific builder support.
|
|
5
7
|
"""
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
from typing import TYPE_CHECKING
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
9
11
|
|
|
10
12
|
if TYPE_CHECKING:
|
|
11
|
-
from htmlgraph.sdk import SDK
|
|
12
|
-
from htmlgraph.builders import FeatureBuilder
|
|
13
13
|
from htmlgraph.models import Node
|
|
14
|
+
from htmlgraph.sdk import SDK
|
|
14
15
|
|
|
15
16
|
from htmlgraph.collections.base import BaseCollection
|
|
16
17
|
|
|
17
18
|
|
|
18
|
-
class FeatureCollection(BaseCollection[
|
|
19
|
+
class FeatureCollection(BaseCollection["FeatureCollection"]):
|
|
19
20
|
"""
|
|
20
21
|
Collection interface for features with builder support.
|
|
21
22
|
|
|
@@ -37,7 +38,7 @@ class FeatureCollection(BaseCollection['FeatureCollection']):
|
|
|
37
38
|
_collection_name = "features"
|
|
38
39
|
_node_type = "feature"
|
|
39
40
|
|
|
40
|
-
def __init__(self, sdk:
|
|
41
|
+
def __init__(self, sdk: SDK):
|
|
41
42
|
"""
|
|
42
43
|
Initialize feature collection.
|
|
43
44
|
|
|
@@ -47,25 +48,10 @@ class FeatureCollection(BaseCollection['FeatureCollection']):
|
|
|
47
48
|
super().__init__(sdk, "features", "feature")
|
|
48
49
|
self._sdk = sdk
|
|
49
50
|
|
|
50
|
-
|
|
51
|
-
"""
|
|
52
|
-
Create a new feature with fluent interface.
|
|
53
|
-
|
|
54
|
-
Args:
|
|
55
|
-
title: Feature title
|
|
56
|
-
**kwargs: Additional feature properties
|
|
57
|
-
|
|
58
|
-
Returns:
|
|
59
|
-
FeatureBuilder for method chaining
|
|
60
|
-
|
|
61
|
-
Example:
|
|
62
|
-
>>> feature = sdk.features.create("User Auth") \\
|
|
63
|
-
... .set_priority("high") \\
|
|
64
|
-
... .add_steps(["Login", "Logout"]) \\
|
|
65
|
-
... .save()
|
|
66
|
-
"""
|
|
51
|
+
# Set builder class for create() method
|
|
67
52
|
from htmlgraph.builders import FeatureBuilder
|
|
68
|
-
|
|
53
|
+
|
|
54
|
+
self._builder_class = FeatureBuilder
|
|
69
55
|
|
|
70
56
|
def set_primary(self, node_id: str) -> Node | None:
|
|
71
57
|
"""
|
|
@@ -79,11 +65,11 @@ class FeatureCollection(BaseCollection['FeatureCollection']):
|
|
|
79
65
|
Returns:
|
|
80
66
|
Updated Node
|
|
81
67
|
"""
|
|
82
|
-
if hasattr(self._sdk,
|
|
68
|
+
if hasattr(self._sdk, "session_manager"):
|
|
83
69
|
return self._sdk.session_manager.set_primary_feature(
|
|
84
70
|
feature_id=node_id,
|
|
85
71
|
collection=self._collection_name,
|
|
86
72
|
agent=self._sdk.agent,
|
|
87
|
-
log_activity=True
|
|
73
|
+
log_activity=True,
|
|
88
74
|
)
|
|
89
75
|
return None
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
SessionInsight collection for managing session insights.
|
|
5
|
+
|
|
6
|
+
Extends BaseCollection with insight-specific query methods.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from htmlgraph.models import Node
|
|
14
|
+
from htmlgraph.sdk import SDK
|
|
15
|
+
|
|
16
|
+
from htmlgraph.collections.base import BaseCollection
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class InsightCollection(BaseCollection["InsightCollection"]):
|
|
20
|
+
"""
|
|
21
|
+
Collection interface for session insights.
|
|
22
|
+
|
|
23
|
+
Provides all base collection methods plus insight-specific
|
|
24
|
+
queries for analyzing session efficiency and detecting issues.
|
|
25
|
+
|
|
26
|
+
Example:
|
|
27
|
+
>>> sdk = SDK(agent="claude")
|
|
28
|
+
>>> insight = sdk.insights.for_session("sess-abc-123")
|
|
29
|
+
>>>
|
|
30
|
+
>>> # Query insights
|
|
31
|
+
>>> low_eff = sdk.insights.get_low_efficiency(threshold=0.7)
|
|
32
|
+
>>> with_issues = sdk.insights.get_with_issues()
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
_collection_name = "insights"
|
|
36
|
+
_node_type = "insight"
|
|
37
|
+
|
|
38
|
+
def __init__(self, sdk: SDK):
|
|
39
|
+
"""
|
|
40
|
+
Initialize insight collection.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
sdk: Parent SDK instance
|
|
44
|
+
"""
|
|
45
|
+
super().__init__(sdk, "insights", "insight")
|
|
46
|
+
self._sdk = sdk
|
|
47
|
+
|
|
48
|
+
# Set builder class for create() method
|
|
49
|
+
from htmlgraph.builders import InsightBuilder
|
|
50
|
+
|
|
51
|
+
self._builder_class = InsightBuilder
|
|
52
|
+
|
|
53
|
+
def for_session(self, session_id: str) -> Node | None:
|
|
54
|
+
"""
|
|
55
|
+
Get insight for a specific session.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
session_id: Session ID to find insight for
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
Insight node if found, None otherwise
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
>>> insight = sdk.insights.for_session("sess-abc-123")
|
|
65
|
+
"""
|
|
66
|
+
results = list(self.where(session_id=session_id))
|
|
67
|
+
return results[0] if results else None
|
|
68
|
+
|
|
69
|
+
def get_low_efficiency(self, threshold: float = 0.7) -> list[Node]:
|
|
70
|
+
"""
|
|
71
|
+
Get insights with efficiency below threshold.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
threshold: Minimum efficiency score (0.0 to 1.0)
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
List of insights with efficiency_score < threshold
|
|
78
|
+
|
|
79
|
+
Example:
|
|
80
|
+
>>> low_eff = sdk.insights.get_low_efficiency(threshold=0.6)
|
|
81
|
+
"""
|
|
82
|
+
return [
|
|
83
|
+
i
|
|
84
|
+
for i in self.all()
|
|
85
|
+
if hasattr(i, "efficiency_score") and i.efficiency_score < threshold
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
def get_with_issues(self) -> list[Node]:
|
|
89
|
+
"""
|
|
90
|
+
Get insights that detected issues.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
List of insights where issues_detected is True
|
|
94
|
+
|
|
95
|
+
Example:
|
|
96
|
+
>>> problematic = sdk.insights.get_with_issues()
|
|
97
|
+
"""
|
|
98
|
+
return [
|
|
99
|
+
i for i in self.all() if hasattr(i, "issues_detected") and i.issues_detected
|
|
100
|
+
]
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
AggregatedMetric collection for managing aggregated metrics.
|
|
5
|
+
|
|
6
|
+
Extends BaseCollection with metric-specific query methods.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from htmlgraph.models import Node
|
|
14
|
+
from htmlgraph.sdk import SDK
|
|
15
|
+
|
|
16
|
+
from htmlgraph.collections.base import BaseCollection
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class MetricCollection(BaseCollection["MetricCollection"]):
|
|
20
|
+
"""
|
|
21
|
+
Collection interface for aggregated metrics.
|
|
22
|
+
|
|
23
|
+
Provides all base collection methods plus metric-specific
|
|
24
|
+
queries for analyzing trends and retrieving latest metrics.
|
|
25
|
+
|
|
26
|
+
Example:
|
|
27
|
+
>>> sdk = SDK(agent="claude")
|
|
28
|
+
>>> latest = sdk.metrics.get_latest(scope="session", period="weekly")
|
|
29
|
+
>>>
|
|
30
|
+
>>> # Query metrics
|
|
31
|
+
>>> trending = sdk.metrics.get_trend(scope="session")
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
_collection_name = "metrics"
|
|
35
|
+
_node_type = "metric"
|
|
36
|
+
|
|
37
|
+
def __init__(self, sdk: SDK):
|
|
38
|
+
"""
|
|
39
|
+
Initialize metric collection.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
sdk: Parent SDK instance
|
|
43
|
+
"""
|
|
44
|
+
super().__init__(sdk, "metrics", "metric")
|
|
45
|
+
self._sdk = sdk
|
|
46
|
+
|
|
47
|
+
# Set builder class for create() method
|
|
48
|
+
from htmlgraph.builders import MetricBuilder
|
|
49
|
+
|
|
50
|
+
self._builder_class = MetricBuilder
|
|
51
|
+
|
|
52
|
+
def get_latest(self, scope: str = "session", period: str = "weekly") -> Node | None:
|
|
53
|
+
"""
|
|
54
|
+
Get the most recent metric for a scope/period.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
scope: Metric scope (e.g., "session", "feature", "agent")
|
|
58
|
+
period: Time period (e.g., "daily", "weekly", "monthly")
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
Most recent metric node if found, None otherwise
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
>>> latest = sdk.metrics.get_latest(scope="session", period="weekly")
|
|
65
|
+
"""
|
|
66
|
+
results = list(self.where(scope=scope, period=period))
|
|
67
|
+
if not results:
|
|
68
|
+
return None
|
|
69
|
+
# Sort by period_end descending (most recent first)
|
|
70
|
+
results.sort(key=lambda m: getattr(m, "period_end", "") or "", reverse=True)
|
|
71
|
+
return results[0]
|
|
72
|
+
|
|
73
|
+
def get_trend(self, scope: str = "session") -> list[Node]:
|
|
74
|
+
"""
|
|
75
|
+
Get metrics showing trends for a scope.
|
|
76
|
+
|
|
77
|
+
Filters out metrics with "stable" trend_direction.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
scope: Metric scope to filter by
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
List of metrics with non-stable trends
|
|
84
|
+
|
|
85
|
+
Example:
|
|
86
|
+
>>> trending = sdk.metrics.get_trend(scope="session")
|
|
87
|
+
"""
|
|
88
|
+
return [
|
|
89
|
+
m
|
|
90
|
+
for m in self.where(scope=scope)
|
|
91
|
+
if hasattr(m, "trend_direction") and m.trend_direction != "stable"
|
|
92
|
+
]
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Pattern collection for managing workflow patterns.
|
|
5
|
+
|
|
6
|
+
Extends BaseCollection with pattern-specific query methods.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from htmlgraph.models import Node
|
|
14
|
+
from htmlgraph.sdk import SDK
|
|
15
|
+
|
|
16
|
+
from htmlgraph.collections.base import BaseCollection
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class PatternCollection(BaseCollection["PatternCollection"]):
|
|
20
|
+
"""
|
|
21
|
+
Collection interface for workflow patterns.
|
|
22
|
+
|
|
23
|
+
Provides all base collection methods plus pattern-specific
|
|
24
|
+
queries for finding optimal patterns and anti-patterns.
|
|
25
|
+
|
|
26
|
+
Example:
|
|
27
|
+
>>> sdk = SDK(agent="claude")
|
|
28
|
+
>>> pattern = sdk.patterns.create("File-then-Edit Pattern") \\
|
|
29
|
+
... .set_sequence(["Read", "Edit"]) \\
|
|
30
|
+
... .save()
|
|
31
|
+
>>>
|
|
32
|
+
>>> # Query patterns
|
|
33
|
+
>>> optimal = sdk.patterns.get_optimal_patterns()
|
|
34
|
+
>>> anti = sdk.patterns.get_anti_patterns()
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
_collection_name = "patterns"
|
|
38
|
+
_node_type = "pattern"
|
|
39
|
+
|
|
40
|
+
def __init__(self, sdk: SDK):
|
|
41
|
+
"""
|
|
42
|
+
Initialize pattern collection.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
sdk: Parent SDK instance
|
|
46
|
+
"""
|
|
47
|
+
super().__init__(sdk, "patterns", "pattern")
|
|
48
|
+
self._sdk = sdk
|
|
49
|
+
|
|
50
|
+
# Set builder class for create() method
|
|
51
|
+
from htmlgraph.builders import PatternBuilder
|
|
52
|
+
|
|
53
|
+
self._builder_class = PatternBuilder
|
|
54
|
+
|
|
55
|
+
def find_by_sequence(self, sequence: list[str]) -> list[Node]:
|
|
56
|
+
"""
|
|
57
|
+
Find patterns matching a specific tool sequence.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
sequence: List of tool names in order (e.g., ["Read", "Edit"])
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
List of patterns with matching sequence
|
|
64
|
+
|
|
65
|
+
Example:
|
|
66
|
+
>>> patterns = sdk.patterns.find_by_sequence(["Read", "Edit"])
|
|
67
|
+
"""
|
|
68
|
+
seq_str = "->".join(sequence)
|
|
69
|
+
return [
|
|
70
|
+
p
|
|
71
|
+
for p in self.all()
|
|
72
|
+
if hasattr(p, "sequence") and "->".join(p.sequence) == seq_str
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
def get_anti_patterns(self) -> list[Node]:
|
|
76
|
+
"""
|
|
77
|
+
Get all anti-patterns.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
List of anti-pattern nodes
|
|
81
|
+
|
|
82
|
+
Example:
|
|
83
|
+
>>> anti_patterns = sdk.patterns.get_anti_patterns()
|
|
84
|
+
"""
|
|
85
|
+
return self.where(pattern_type="anti-pattern")
|
|
86
|
+
|
|
87
|
+
def get_optimal_patterns(self) -> list[Node]:
|
|
88
|
+
"""
|
|
89
|
+
Get all optimal patterns.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
List of optimal pattern nodes
|
|
93
|
+
|
|
94
|
+
Example:
|
|
95
|
+
>>> optimal = sdk.patterns.get_optimal_patterns()
|
|
96
|
+
"""
|
|
97
|
+
return self.where(pattern_type="optimal")
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Phase collection for managing project phase work items.
|
|
5
|
+
|
|
6
|
+
Extends BaseCollection with phase-specific builder support.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from htmlgraph.sdk import SDK
|
|
14
|
+
|
|
15
|
+
from htmlgraph.collections.base import BaseCollection
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class PhaseCollection(BaseCollection["PhaseCollection"]):
|
|
19
|
+
"""
|
|
20
|
+
Collection interface for phases with builder support.
|
|
21
|
+
|
|
22
|
+
Provides all base collection methods plus a fluent builder
|
|
23
|
+
interface for creating new phases.
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
>>> sdk = SDK(agent="claude")
|
|
27
|
+
>>> phase = sdk.phases.create("Phase 1: Core Library") \\
|
|
28
|
+
... .set_priority("high") \\
|
|
29
|
+
... .set_phase_number(1) \\
|
|
30
|
+
... .set_deliverables(["Core API", "Tests"]) \\
|
|
31
|
+
... .save()
|
|
32
|
+
>>>
|
|
33
|
+
>>> # Query phases
|
|
34
|
+
>>> active_phases = sdk.phases.where(status="in-progress")
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
_collection_name = "phases"
|
|
38
|
+
_node_type = "phase"
|
|
39
|
+
|
|
40
|
+
def __init__(self, sdk: SDK):
|
|
41
|
+
"""
|
|
42
|
+
Initialize phase collection.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
sdk: Parent SDK instance
|
|
46
|
+
"""
|
|
47
|
+
super().__init__(sdk, "phases", "phase")
|
|
48
|
+
self._sdk = sdk
|
|
49
|
+
|
|
50
|
+
# Set builder class for create() method
|
|
51
|
+
from htmlgraph.builders.phase import PhaseBuilder
|
|
52
|
+
|
|
53
|
+
self._builder_class = PhaseBuilder
|