htmlgraph 0.21.0__py3-none-any.whl → 0.23.0__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.
Files changed (40) hide show
  1. htmlgraph/__init__.py +1 -1
  2. htmlgraph/agent_detection.py +41 -2
  3. htmlgraph/analytics/cli.py +86 -20
  4. htmlgraph/cli.py +519 -87
  5. htmlgraph/collections/base.py +68 -4
  6. htmlgraph/docs/__init__.py +77 -0
  7. htmlgraph/docs/docs_version.py +55 -0
  8. htmlgraph/docs/metadata.py +93 -0
  9. htmlgraph/docs/migrations.py +232 -0
  10. htmlgraph/docs/template_engine.py +143 -0
  11. htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
  12. htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
  13. htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
  14. htmlgraph/docs/templates/base_agents.md.j2 +78 -0
  15. htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
  16. htmlgraph/docs/version_check.py +161 -0
  17. htmlgraph/git_events.py +61 -7
  18. htmlgraph/operations/README.md +62 -0
  19. htmlgraph/operations/__init__.py +61 -0
  20. htmlgraph/operations/analytics.py +338 -0
  21. htmlgraph/operations/events.py +243 -0
  22. htmlgraph/operations/hooks.py +349 -0
  23. htmlgraph/operations/server.py +302 -0
  24. htmlgraph/orchestration/__init__.py +39 -0
  25. htmlgraph/orchestration/headless_spawner.py +566 -0
  26. htmlgraph/orchestration/model_selection.py +323 -0
  27. htmlgraph/orchestrator-system-prompt-optimized.txt +47 -0
  28. htmlgraph/parser.py +56 -1
  29. htmlgraph/sdk.py +529 -7
  30. htmlgraph/server.py +153 -60
  31. {htmlgraph-0.21.0.dist-info → htmlgraph-0.23.0.dist-info}/METADATA +3 -1
  32. {htmlgraph-0.21.0.dist-info → htmlgraph-0.23.0.dist-info}/RECORD +40 -19
  33. /htmlgraph/{orchestration.py → orchestration/task_coordination.py} +0 -0
  34. {htmlgraph-0.21.0.data → htmlgraph-0.23.0.data}/data/htmlgraph/dashboard.html +0 -0
  35. {htmlgraph-0.21.0.data → htmlgraph-0.23.0.data}/data/htmlgraph/styles.css +0 -0
  36. {htmlgraph-0.21.0.data → htmlgraph-0.23.0.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
  37. {htmlgraph-0.21.0.data → htmlgraph-0.23.0.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
  38. {htmlgraph-0.21.0.data → htmlgraph-0.23.0.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
  39. {htmlgraph-0.21.0.dist-info → htmlgraph-0.23.0.dist-info}/WHEEL +0 -0
  40. {htmlgraph-0.21.0.dist-info → htmlgraph-0.23.0.dist-info}/entry_points.txt +0 -0
htmlgraph/server.py CHANGED
@@ -1174,6 +1174,8 @@ def serve(
1174
1174
  host: str = "localhost",
1175
1175
  watch: bool = True,
1176
1176
  auto_port: bool = False,
1177
+ show_progress: bool = False,
1178
+ quiet: bool = False,
1177
1179
  ) -> None:
1178
1180
  """
1179
1181
  Start the HtmlGraph server.
@@ -1186,7 +1188,11 @@ def serve(
1186
1188
  host: Host to bind to
1187
1189
  watch: Enable file watching for auto-reload (default: True)
1188
1190
  auto_port: Automatically find available port if specified port is in use
1191
+ show_progress: Show Rich progress during startup
1192
+ quiet: Suppress progress output when true
1189
1193
  """
1194
+ from contextlib import nullcontext
1195
+
1190
1196
  graph_dir = Path(graph_dir)
1191
1197
  static_dir = Path(static_dir)
1192
1198
 
@@ -1196,67 +1202,121 @@ def serve(
1196
1202
  port = find_available_port(port + 1)
1197
1203
  print(f"⚠️ Port {original_port} is in use, using {port} instead\n")
1198
1204
 
1199
- # Auto-sync dashboard files
1200
- try:
1201
- if sync_dashboard_files(static_dir):
1202
- print("⚠️ Dashboard files out of sync")
1203
- print("✅ Synced dashboard.html index.html\n")
1204
- except PermissionError as e:
1205
- print(f"⚠️ Warning: Unable to sync dashboard files: {e}")
1206
- print(
1207
- f" Run: cp src/python/htmlgraph/dashboard.html {static_dir / 'index.html'}\n"
1208
- )
1209
- except Exception as e:
1210
- print(f"⚠️ Warning: Error during dashboard sync: {e}\n")
1211
-
1212
- # Create graph directory structure
1213
- graph_dir.mkdir(parents=True, exist_ok=True)
1214
- for collection in HtmlGraphAPIHandler.COLLECTIONS:
1215
- (graph_dir / collection).mkdir(exist_ok=True)
1216
-
1217
- # Copy default stylesheet if not present
1218
- styles_dest = graph_dir / "styles.css"
1219
- if not styles_dest.exists():
1220
- styles_src = Path(__file__).parent / "styles.css"
1221
- if styles_src.exists():
1222
- styles_dest.write_text(styles_src.read_text())
1223
-
1224
- # Configure handler
1225
- HtmlGraphAPIHandler.graph_dir = graph_dir
1226
- HtmlGraphAPIHandler.static_dir = static_dir
1227
- HtmlGraphAPIHandler.graphs = {}
1228
- HtmlGraphAPIHandler.analytics_db = None
1229
-
1230
- # Create server with error handling
1231
- try:
1232
- server = HTTPServer((host, port), HtmlGraphAPIHandler)
1233
- except OSError as e:
1234
- # Handle "Address already in use" error
1235
- if e.errno == 48 or "Address already in use" in str(e):
1236
- print(f"\n❌ Port {port} is already in use\n")
1237
- print("Solutions:")
1238
- print(" 1. Use a different port:")
1239
- print(f" htmlgraph serve --port {port + 1}\n")
1240
- print(" 2. Let htmlgraph automatically find an available port:")
1241
- print(" htmlgraph serve --auto-port\n")
1242
- print(f" 3. Find and kill the process using port {port}:")
1243
- print(f" lsof -ti:{port} | xargs kill -9\n")
1244
-
1245
- # Try to find and suggest an available port
1246
- try:
1247
- alt_port = find_available_port(port + 1)
1248
- print(f"💡 Found available port: {alt_port}")
1249
- print(f" Run: htmlgraph serve --port {alt_port}\n")
1250
- except OSError:
1251
- pass
1205
+ progress = None
1206
+ progress_console = None
1207
+ if show_progress and not quiet:
1208
+ try:
1209
+ from rich.console import Console
1210
+ from rich.progress import (
1211
+ BarColumn,
1212
+ Progress,
1213
+ SpinnerColumn,
1214
+ TextColumn,
1215
+ TimeElapsedColumn,
1216
+ )
1217
+ except Exception:
1218
+ progress = None
1219
+ else:
1220
+ progress_console = Console()
1221
+ progress = Progress(
1222
+ SpinnerColumn(),
1223
+ TextColumn("{task.description}"),
1224
+ BarColumn(),
1225
+ TimeElapsedColumn(),
1226
+ console=progress_console,
1227
+ transient=True,
1228
+ )
1252
1229
 
1253
- sys.exit(1)
1254
- # Re-raise other OSErrors
1255
- raise
1230
+ def status_context(message: str) -> Any:
1231
+ if progress_console is None:
1232
+ return nullcontext()
1233
+ return progress_console.status(message)
1256
1234
 
1257
- # Start file watcher if enabled
1235
+ server = None
1258
1236
  watcher = None
1259
- if watch:
1237
+
1238
+ events_dir = graph_dir / "events"
1239
+ db_path = graph_dir / "index.sqlite"
1240
+ index_needs_build = (
1241
+ not db_path.exists() and events_dir.exists() and any(events_dir.glob("*.jsonl"))
1242
+ )
1243
+
1244
+ def sync_dashboard() -> None:
1245
+ # Auto-sync dashboard files
1246
+ try:
1247
+ if sync_dashboard_files(static_dir):
1248
+ print("⚠️ Dashboard files out of sync")
1249
+ print("✅ Synced dashboard.html → index.html\n")
1250
+ except PermissionError as e:
1251
+ print(f"⚠️ Warning: Unable to sync dashboard files: {e}")
1252
+ print(
1253
+ f" Run: cp src/python/htmlgraph/dashboard.html {static_dir / 'index.html'}\n"
1254
+ )
1255
+ except Exception as e:
1256
+ print(f"⚠️ Warning: Error during dashboard sync: {e}\n")
1257
+
1258
+ def create_graph_dirs() -> None:
1259
+ graph_dir.mkdir(parents=True, exist_ok=True)
1260
+ for collection in HtmlGraphAPIHandler.COLLECTIONS:
1261
+ (graph_dir / collection).mkdir(exist_ok=True)
1262
+
1263
+ def copy_stylesheet() -> None:
1264
+ styles_dest = graph_dir / "styles.css"
1265
+ if not styles_dest.exists():
1266
+ styles_src = Path(__file__).parent / "styles.css"
1267
+ if styles_src.exists():
1268
+ styles_dest.write_text(styles_src.read_text())
1269
+
1270
+ def build_analytics_index() -> None:
1271
+ if not index_needs_build:
1272
+ return
1273
+ with status_context("Building analytics index..."):
1274
+ try:
1275
+ log = JsonlEventLog(events_dir)
1276
+ index = AnalyticsIndex(db_path)
1277
+ events = (event for _, event in log.iter_events())
1278
+ index.rebuild_from_events(events)
1279
+ except Exception as e:
1280
+ print(f"⚠️ Warning: Failed to build analytics index: {e}")
1281
+
1282
+ def configure_handler() -> None:
1283
+ HtmlGraphAPIHandler.graph_dir = graph_dir
1284
+ HtmlGraphAPIHandler.static_dir = static_dir
1285
+ HtmlGraphAPIHandler.graphs = {}
1286
+ HtmlGraphAPIHandler.analytics_db = None
1287
+
1288
+ def create_server() -> None:
1289
+ nonlocal server
1290
+ try:
1291
+ server = HTTPServer((host, port), HtmlGraphAPIHandler)
1292
+ except OSError as e:
1293
+ # Handle "Address already in use" error
1294
+ if e.errno == 48 or "Address already in use" in str(e):
1295
+ print(f"\n❌ Port {port} is already in use\n")
1296
+ print("Solutions:")
1297
+ print(" 1. Use a different port:")
1298
+ print(f" htmlgraph serve --port {port + 1}\n")
1299
+ print(" 2. Let htmlgraph automatically find an available port:")
1300
+ print(" htmlgraph serve --auto-port\n")
1301
+ print(f" 3. Find and kill the process using port {port}:")
1302
+ print(f" lsof -ti:{port} | xargs kill -9\n")
1303
+
1304
+ # Try to find and suggest an available port
1305
+ try:
1306
+ alt_port = find_available_port(port + 1)
1307
+ print(f"💡 Found available port: {alt_port}")
1308
+ print(f" Run: htmlgraph serve --port {alt_port}\n")
1309
+ except OSError:
1310
+ pass
1311
+
1312
+ sys.exit(1)
1313
+ # Re-raise other OSErrors
1314
+ raise
1315
+
1316
+ def start_watcher() -> None:
1317
+ nonlocal watcher
1318
+ if not watch:
1319
+ return
1260
1320
 
1261
1321
  def get_graph(collection: str) -> HtmlGraph:
1262
1322
  """Callback to get graph instance for a collection."""
@@ -1275,6 +1335,37 @@ def serve(
1275
1335
  )
1276
1336
  watcher.start()
1277
1337
 
1338
+ steps: list[tuple[str, Any]] = [
1339
+ ("Sync dashboard files", sync_dashboard),
1340
+ ("Create graph directories", create_graph_dirs),
1341
+ ("Copy default stylesheet", copy_stylesheet),
1342
+ ]
1343
+ if index_needs_build:
1344
+ steps.append(("Build analytics index", build_analytics_index))
1345
+ steps.extend(
1346
+ [
1347
+ ("Configure server", configure_handler),
1348
+ ("Start HTTP server", create_server),
1349
+ ("Start file watcher", start_watcher),
1350
+ ]
1351
+ )
1352
+
1353
+ def run_steps(step_list: list[tuple[str, Any]]) -> None:
1354
+ if progress is None:
1355
+ for _, fn in step_list:
1356
+ fn()
1357
+ return
1358
+ with progress:
1359
+ task_id = progress.add_task(
1360
+ "Starting HtmlGraph server...", total=len(step_list)
1361
+ )
1362
+ for description, fn in step_list:
1363
+ progress.update(task_id, description=description)
1364
+ fn()
1365
+ progress.advance(task_id)
1366
+
1367
+ run_steps(steps)
1368
+
1278
1369
  watch_status = "Enabled" if watch else "Disabled"
1279
1370
  print(f"""
1280
1371
  ╔══════════════════════════════════════════════════════════════╗
@@ -1308,12 +1399,14 @@ Press Ctrl+C to stop.
1308
1399
  """)
1309
1400
 
1310
1401
  try:
1311
- server.serve_forever()
1402
+ if server is not None:
1403
+ server.serve_forever()
1312
1404
  except KeyboardInterrupt:
1313
1405
  print("\nShutting down...")
1314
1406
  if watcher:
1315
1407
  watcher.stop()
1316
- server.shutdown()
1408
+ if server is not None:
1409
+ server.shutdown()
1317
1410
 
1318
1411
 
1319
1412
  if __name__ == "__main__":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: htmlgraph
3
- Version: 0.21.0
3
+ Version: 0.23.0
4
4
  Summary: HTML is All You Need - Graph database on web standards
5
5
  Project-URL: Homepage, https://github.com/Shakes-tzd/htmlgraph
6
6
  Project-URL: Documentation, https://github.com/Shakes-tzd/htmlgraph#readme
@@ -19,6 +19,7 @@ Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Topic :: Database
20
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
21
  Requires-Python: >=3.10
22
+ Requires-Dist: jinja2>=3.1.0
22
23
  Requires-Dist: justhtml>=0.6.0
23
24
  Requires-Dist: pydantic>=2.0.0
24
25
  Requires-Dist: rich>=13.0.0
@@ -199,6 +200,7 @@ HtmlGraph nodes are standard HTML files:
199
200
  - **Agent Handoff** - Context-preserving task transfers between agents
200
201
  - **Capability Routing** - Automatic task assignment based on agent skills
201
202
  - **Deployment Automation** - One-command releases with version management
203
+ - **Unified Backend** - Operations layer shared by CLI and SDK for consistency
202
204
 
203
205
  ## Comparison
204
206
 
@@ -1,10 +1,10 @@
1
- htmlgraph/__init__.py,sha256=AbgvM2vQ2nTI1DHlLsxmhhXZgrxmLxgwr5stbc25ZSc,4979
2
- htmlgraph/agent_detection.py,sha256=PAYo7rU3N_y1cGRd7Dwjh5Wgu-QZ7ENblX_yOzU-gJ0,2749
1
+ htmlgraph/__init__.py,sha256=lsnihHBI-FCjus10dqcyw6LgbtkXDvg4PliTsz5qvTY,4979
2
+ htmlgraph/agent_detection.py,sha256=MG1kx9S-ey_Wi84hJTwwgw6VDvYEbUpygmDjGPhHcUA,3805
3
3
  htmlgraph/agent_registry.py,sha256=Usa_35by7p5gtpvHO7K3AcGimnorw-FzgPVa3cWTQ58,9448
4
4
  htmlgraph/agents.py,sha256=Yvu6x1nOfrW2WhRTAHiCuSpvqoVJXx1Mkzd59kwEczw,33466
5
5
  htmlgraph/analytics_index.py,sha256=ba6Y4H_NNOCxI_Z4U7wSgBFFairf4IJT74WcM1PoZuI,30594
6
6
  htmlgraph/attribute_index.py,sha256=cBZUV4YfGnhh6lF59aYPCdNrRr1hK__BzSKCueSDUhQ,6593
7
- htmlgraph/cli.py,sha256=6CwzcFZ6tOlYCS1521gvFkwVw4qb9XSLvq-eqb2Mz8I,182068
7
+ htmlgraph/cli.py,sha256=-h-_7b5xRuxyLpIYHIeNbJabe3hY3_yTql_jWxfbjTU,197621
8
8
  htmlgraph/context_analytics.py,sha256=CaLu0o2uSr6rlBM5YeaFZe7grgsy7_Hx10qdXuNcdao,11344
9
9
  htmlgraph/converter.py,sha256=OfcydZcJqvr2jpMxvAD4wcq8o4NXC7w4X4QzdDiYq8k,22277
10
10
  htmlgraph/dashboard.html,sha256=rkZYjSnPbUuAm35QMpCNWemenYqQTdkkumCX2hhe8Dc,173537
@@ -17,24 +17,24 @@ htmlgraph/event_migration.py,sha256=7vocfwy-E6_D8_Aeql630FrlBXppIYp1iLmZ_cw_ras,
17
17
  htmlgraph/exceptions.py,sha256=o_BPNQXtv9zaejbiItDVBK7kcGvYbh4Icj5NXmDSLeU,1592
18
18
  htmlgraph/file_watcher.py,sha256=qwwmDkWnKLPp8a_48VrtJZo6HcoYPRz1KMAD39yCV7U,6296
19
19
  htmlgraph/find_api.py,sha256=ggVIxFRNcgKyGu6cda4upASUj2xBfBgmTgSBsfIOVqw,12723
20
- htmlgraph/git_events.py,sha256=62lmhGc7W1KGXAcW_Efpd_v2nIuUl0a4Ggpf73RyRmY,20271
20
+ htmlgraph/git_events.py,sha256=trPJ2mPedjLeIdqEWa8bl9IbqROKaGXJ6UBYl4XZYVI,22479
21
21
  htmlgraph/graph.py,sha256=XhPuUYwhrCFVBEijjOdcHjjMEUlduba39CyzZ9dJ6X0,68187
22
22
  htmlgraph/ids.py,sha256=ibEC8xW1ZHbAW6ImOKP2wLARgW7nzkxu8voce_hkljk,8389
23
23
  htmlgraph/index.d.ts,sha256=7dvExfA16g1z5Kut8xyHnSUfZ6wiUUwWNy6R7WKiwas,6922
24
24
  htmlgraph/learning.py,sha256=6SsRdz-xJGFPjp7YagpUDTZqqjNKp2wWihcnhwkHys0,28566
25
25
  htmlgraph/mcp_server.py,sha256=AeJeGJEtX5Dqu5rfhKfT5kwF2Oe8V8xCaP8BgMEh86s,24033
26
26
  htmlgraph/models.py,sha256=tgFFFwOuEe7Yal5I1JTZHJnF625oaHMATEGIvJgrFnk,81818
27
- htmlgraph/orchestration.py,sha256=7_oQ4AlHOv14hs6RvLsatJzF-F5gkIbv1EOrmeGPhiw,9699
27
+ htmlgraph/orchestrator-system-prompt-optimized.txt,sha256=yCXIM-gH7nSDJfh9UFsvu_VHimKI_Rra3sWvF7fMqEw,1350
28
28
  htmlgraph/orchestrator.py,sha256=6mj70vroWjmNmdvQ7jqqRSA9O1rFUNMUYDWPzqkizLk,19697
29
29
  htmlgraph/orchestrator_mode.py,sha256=F6LNZARqieQXUri3CRSq_lsqFbnVeGXJQPno1ZP47O4,9187
30
30
  htmlgraph/orchestrator_validator.py,sha256=gd_KbHsRsNEIF7EElwcxbMYqOMlyeuYIZwClASp-L-E,4699
31
31
  htmlgraph/parallel.py,sha256=BsyqGKWY_DkSRElBdvvAkWlL6stC9BPkyxjdPdggx_w,22418
32
- htmlgraph/parser.py,sha256=w5JIYvS8XmUGGsp-YC2ZWAJANS6hvQtvBxOYy9mL-Rs,13934
32
+ htmlgraph/parser.py,sha256=w6KHfg6Bd4E6_Z-XzhWIb-YgsaqIw8wmzn-mirPbZcI,15890
33
33
  htmlgraph/planning.py,sha256=iqPF9mCVQwOfJ4vuqcF2Y3-yhx9koJZw0cID7CknIug,35903
34
34
  htmlgraph/query_builder.py,sha256=aNtJ05GpGl9yUSSrX0D6pX_AgqlrrH-CulI_oP11PUk,18092
35
35
  htmlgraph/routing.py,sha256=QYDY6bzYPmv6kocAXCqguB1cazN0i_xTo9EVCO3fO2Y,8803
36
- htmlgraph/sdk.py,sha256=mcJh1cZO9xB2iPJwFQJRnMb5ylr_qmd7c_YgLvgUWRo,82565
37
- htmlgraph/server.py,sha256=ti_ROzVxc3b4TGylHZ5uzfgax3OHyBoyeJxAaeMfdAo,49297
36
+ htmlgraph/sdk.py,sha256=jhKHAU7hFsKFawQQOYjwnM4FJ69HC9lOwCDRh2Qt9ho,100400
37
+ htmlgraph/server.py,sha256=F94rNpGSlgCg3Ax6kvzi7WjWFeHr7QerLxgmVknP4gA,52479
38
38
  htmlgraph/session_manager.py,sha256=8_H29kN6Btii1RfzNpifjjUVTMU0cEeTElFsDC6icLM,89430
39
39
  htmlgraph/session_warning.py,sha256=leAYNp8pOkPFosIvNkY4Y3vjs1j76F3pGktUqQX9tI0,7877
40
40
  htmlgraph/setup.py,sha256=LpA6R7gAsevFhXh5AGGBmHyhb2ijIAjxTsm0VuzvH2Y,10866
@@ -49,7 +49,7 @@ htmlgraph/types.py,sha256=EBxCbke3PhORsmIhHrD-f1XG6YPRX-1D5R1OXCp6xt8,8945
49
49
  htmlgraph/watch.py,sha256=xsiZwDVaXZ6vXI_oOZMqMF78aeAgxuhKpxiz98Hryqg,3791
50
50
  htmlgraph/work_type_utils.py,sha256=exA3FnuSmVMMMSBhPYDW-Bq5jGaTDjX7jkckCvnVZ_s,3408
51
51
  htmlgraph/analytics/__init__.py,sha256=G_DvCaiAeYVfMWFri1GOfLNF7PtAhitKa2V9TXHtsds,409
52
- htmlgraph/analytics/cli.py,sha256=ujHhMnI13eDJQKBywPNFfUkq_p2vNEG16P_a6vAx0U0,13017
52
+ htmlgraph/analytics/cli.py,sha256=aSnxkvNdrdukytqSirpFtcuiNRbg3Dt-hSpUsDPF9jo,14771
53
53
  htmlgraph/analytics/cross_session.py,sha256=KjDohOPigkHrwI_bnDr3v5MIIgx_bSEIIxXK3UcQoaM,20472
54
54
  htmlgraph/analytics/dependency.py,sha256=7Qc5xe0b1QE_P6-l4Z0WtstEmEXc4ZGNbyIEBMoABys,25757
55
55
  htmlgraph/analytics/work_type.py,sha256=nMuUmC0rV4gvu2eovCBuR-JEnsCzk6nWnB4_zIfbJ9s,17594
@@ -71,7 +71,7 @@ htmlgraph/builders/phase.py,sha256=pvdG_ZiswzdRCBM1pz7hOoCS9MD-lwaOgPqVcuLXucs,3
71
71
  htmlgraph/builders/spike.py,sha256=_LXMDEJCdCjJPbNB8CA0FDlFDN-pZbdzvQDFXdrldo0,4327
72
72
  htmlgraph/builders/track.py,sha256=tdolGgYQl3PvoX6jHNCq3Vh6USrb7uN3NX555SoRHGs,23097
73
73
  htmlgraph/collections/__init__.py,sha256=qHT1UvHD-jCmNI4t1fWprWLw-5jE7NabN6kngboVRFY,1056
74
- htmlgraph/collections/base.py,sha256=Sm67PGd_0e4aPY5fr0JY4gxTiiaRtHOjSYExrAYOkuQ,20047
74
+ htmlgraph/collections/base.py,sha256=gOEWzOqtOSphhjzvncIl0hrQTus7rGukXZgHwubxDa0,22730
75
75
  htmlgraph/collections/bug.py,sha256=bDbZy_sdiIn7AK0b8CXs88mUEr1ZkOGVezG0aKwh0pw,1331
76
76
  htmlgraph/collections/chore.py,sha256=PgKPjd1WkHHmZD4p4nRr8rUhC1JxfYfNWOfANxNbXqs,1352
77
77
  htmlgraph/collections/epic.py,sha256=1qJPzEHqwlfRk-4VVyKNvlZPRuGlXq68saH3tv0fZqY,1350
@@ -82,6 +82,17 @@ htmlgraph/collections/pattern.py,sha256=FkEqF0eoMoluJxvpiZZ3OZnZNxMc24kzTL0Zmvyi
82
82
  htmlgraph/collections/phase.py,sha256=2GcgD-P-j61jgG4c0VhUmsOp1qjtrJLtRDNumHHDNZA,1359
83
83
  htmlgraph/collections/spike.py,sha256=Omazli2JM9RoYgseSAxKYeK4KC8mAwMCfUAF1XFml54,2963
84
84
  htmlgraph/collections/todo.py,sha256=SWOkolqCIvf7PCxCLuqPuNCpdDSTOc9KsuaXanWSEFY,15548
85
+ htmlgraph/docs/__init__.py,sha256=WlDS4y_DgpkoXQbJMucUjkCwyQs60t_QySI9m1CaMKU,2106
86
+ htmlgraph/docs/docs_version.py,sha256=4rXIhuhKv7VDGRlNtvWyB4zPboNGtcGfJjbf0yf1sI0,1475
87
+ htmlgraph/docs/metadata.py,sha256=sUlbIEqysXRma99a2KLSfJ-NqPYfz5p2pSj-s8wPblQ,2708
88
+ htmlgraph/docs/migrations.py,sha256=-kCWXOmilJKXCxe1LKob8sfVCQhcWambEa9asTCobKg,7248
89
+ htmlgraph/docs/template_engine.py,sha256=aRr7hUcCoXOPzZlxifmxNr3nImOvla-X3qYYWKfXDMw,4825
90
+ htmlgraph/docs/version_check.py,sha256=4zhplgv42k8REik4fU9Q2LANZoSRv7uSzGQGdVKj5VI,4892
91
+ htmlgraph/docs/templates/base_agents.md.j2,sha256=s3qyWyx4XWkeeqmWGtnsK0AsDOhBA108Cc2lbA08VfE,1713
92
+ htmlgraph/docs/templates/example_user_override.md.j2,sha256=BYm_p9qP21hjAF7zwGfx1NU8PTlQ00yphk-leHsMHDY,1361
93
+ htmlgraph/docs/templates/_sections/cli_reference.md.j2,sha256=TItgng09Qxre2EdqXdq-R2RhS9IW5W7mis-vjpWGKA4,806
94
+ htmlgraph/docs/templates/_sections/core_concepts.md.j2,sha256=7kkyaKiKOqMg5NF_IIRxdDk5RGfq0vnRZd6ZBI5_mUE,738
95
+ htmlgraph/docs/templates/_sections/sdk_basics.md.j2,sha256=XEL90BQvTKa4xiWkCO96CT9ddp47IiBOoMDrpZOL2B0,1334
85
96
  htmlgraph/extensions/gemini/GEMINI.md,sha256=fRUP-u1UmUTuRVbQ32sK3iYQAFYGYRyjU0W0_igT6GA,20462
86
97
  htmlgraph/extensions/gemini/README.md,sha256=PDWQDi6IA8Jq6ZMrEn9jpLygbSjp41Chtl2wGSm5Y1c,7116
87
98
  htmlgraph/extensions/gemini/gemini-extension.json,sha256=-CU-34hZkmw8gx-Tdojjuytf12LfArzCBMVFyc8X_Eo,493
@@ -106,6 +117,16 @@ htmlgraph/hooks/pretooluse.py,sha256=Q6wtU_IBIjCd22j7MvZrdd959TdAHx8OovIOnqkwCm0
106
117
  htmlgraph/hooks/task_enforcer.py,sha256=H7Gug843BTR5H4YfAgW8-b7rjICuAHLP9cw1iNfcHew,4510
107
118
  htmlgraph/hooks/task_validator.py,sha256=GwEoqL2lptPWQqckkfl0N-Auc7TtHiyRlOf6p7HcoIo,5438
108
119
  htmlgraph/hooks/validator.py,sha256=cwul8fIGS-_hFKskrYC6Hjh0F9yP4_3ErAsyp_SL43c,17417
120
+ htmlgraph/operations/README.md,sha256=5h0P-aZ3po3h_7mUpuh7jJwOL-NEvtlBlPCbqzvLrIE,1730
121
+ htmlgraph/operations/__init__.py,sha256=uiUUmWG3BAtRlSr-WMS4STB76JKJYs0QPQKR7mRh3Co,1237
122
+ htmlgraph/operations/analytics.py,sha256=XDbGEG5ydrjqM5sXa01wsruT0u9DtOb24VJEPzQS8BM,11583
123
+ htmlgraph/operations/events.py,sha256=vSuLj8IWtdfPMvoK6yDmDM3kh_SDOWU8Ofu5u4DF_Tw,6842
124
+ htmlgraph/operations/hooks.py,sha256=_jRHbjrWNM1fjukEr0TBu6wn90PVfpXtJjicSITqP0A,10037
125
+ htmlgraph/operations/server.py,sha256=cxdSYZU10pNgiNfYk2T84D_40CAFjA9wSVsRfk9Ipm8,8746
126
+ htmlgraph/orchestration/__init__.py,sha256=a9NWy-zWG9T7f7V37ibahniF_enn-31gM4veEJkM8cw,844
127
+ htmlgraph/orchestration/headless_spawner.py,sha256=1eZ_jGwkRAQPkLY02fLZ-FgNpj4xKTVdcr2zpnUYy58,19746
128
+ htmlgraph/orchestration/model_selection.py,sha256=2IArHkde5rKD56aj5Jw9I9Z5iLV0yOgw3QCmNF996DE,11311
129
+ htmlgraph/orchestration/task_coordination.py,sha256=7_oQ4AlHOv14hs6RvLsatJzF-F5gkIbv1EOrmeGPhiw,9699
109
130
  htmlgraph/scripts/__init__.py,sha256=a_ef7jnypTH3fzjutKYtUquJospdbA6IOR4o9dgv8Gk,48
110
131
  htmlgraph/scripts/deploy.py,sha256=TAdUvnHRuWHgoyUgif8Eln-aY9JWLbXAhkMpzQ1kC9A,4191
111
132
  htmlgraph/services/__init__.py,sha256=Cy-4RI7raV4jd2Vfc5Zya0VTgV0x9LNt32h9DhYVGkI,282
@@ -113,12 +134,12 @@ htmlgraph/services/claiming.py,sha256=HcrltEJKN72mxuD7fGuXWeh1U0vwhjMvhZcFc02Eiy
113
134
  htmlgraph/templates/AGENTS.md.template,sha256=f96h7V6ygwj-v-fanVI48eYMxR6t_se4bet1H4ZsDpI,7642
114
135
  htmlgraph/templates/CLAUDE.md.template,sha256=h1kG2hTX2XYig2KszsHBfzrwa_4Cfcq2Pj4SwqzeDlM,1984
115
136
  htmlgraph/templates/GEMINI.md.template,sha256=gAGzE53Avki87BM_otqy5HdcYCoLsHgqaKjVzNzPMX8,1622
116
- htmlgraph-0.21.0.data/data/htmlgraph/dashboard.html,sha256=rkZYjSnPbUuAm35QMpCNWemenYqQTdkkumCX2hhe8Dc,173537
117
- htmlgraph-0.21.0.data/data/htmlgraph/styles.css,sha256=oDUSC8jG-V-hKojOBO9J88hxAeY2wJrBYTq0uCwX_Y4,7135
118
- htmlgraph-0.21.0.data/data/htmlgraph/templates/AGENTS.md.template,sha256=f96h7V6ygwj-v-fanVI48eYMxR6t_se4bet1H4ZsDpI,7642
119
- htmlgraph-0.21.0.data/data/htmlgraph/templates/CLAUDE.md.template,sha256=h1kG2hTX2XYig2KszsHBfzrwa_4Cfcq2Pj4SwqzeDlM,1984
120
- htmlgraph-0.21.0.data/data/htmlgraph/templates/GEMINI.md.template,sha256=gAGzE53Avki87BM_otqy5HdcYCoLsHgqaKjVzNzPMX8,1622
121
- htmlgraph-0.21.0.dist-info/METADATA,sha256=imvjH4WNDmGZNWZ9atUaBoHlxiOfjlAxGrzE0XfHoY8,7645
122
- htmlgraph-0.21.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
123
- htmlgraph-0.21.0.dist-info/entry_points.txt,sha256=EaUbjA_bbDwEO_XDLEGMeK8aQP-ZnHiUTkLshyKDyB8,98
124
- htmlgraph-0.21.0.dist-info/RECORD,,
137
+ htmlgraph-0.23.0.data/data/htmlgraph/dashboard.html,sha256=rkZYjSnPbUuAm35QMpCNWemenYqQTdkkumCX2hhe8Dc,173537
138
+ htmlgraph-0.23.0.data/data/htmlgraph/styles.css,sha256=oDUSC8jG-V-hKojOBO9J88hxAeY2wJrBYTq0uCwX_Y4,7135
139
+ htmlgraph-0.23.0.data/data/htmlgraph/templates/AGENTS.md.template,sha256=f96h7V6ygwj-v-fanVI48eYMxR6t_se4bet1H4ZsDpI,7642
140
+ htmlgraph-0.23.0.data/data/htmlgraph/templates/CLAUDE.md.template,sha256=h1kG2hTX2XYig2KszsHBfzrwa_4Cfcq2Pj4SwqzeDlM,1984
141
+ htmlgraph-0.23.0.data/data/htmlgraph/templates/GEMINI.md.template,sha256=gAGzE53Avki87BM_otqy5HdcYCoLsHgqaKjVzNzPMX8,1622
142
+ htmlgraph-0.23.0.dist-info/METADATA,sha256=3siZ1Sgj7MSqr_JR4DHf2j7qnrGB6QqGSYlFEu54hJM,7753
143
+ htmlgraph-0.23.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
144
+ htmlgraph-0.23.0.dist-info/entry_points.txt,sha256=EaUbjA_bbDwEO_XDLEGMeK8aQP-ZnHiUTkLshyKDyB8,98
145
+ htmlgraph-0.23.0.dist-info/RECORD,,