pipulate 2.80__tar.gz → 2.82__tar.gz

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 (98) hide show
  1. {pipulate-2.80 → pipulate-2.82}/.agents/skills/journal/references/index.md +16 -9
  2. {pipulate-2.80 → pipulate-2.82}/PKG-INFO +1 -1
  3. {pipulate-2.80 → pipulate-2.82}/__init__.py +2 -2
  4. {pipulate-2.80 → pipulate-2.82}/pipulate/core.py +5 -90
  5. {pipulate-2.80 → pipulate-2.82}/pipulate.egg-info/PKG-INFO +1 -1
  6. {pipulate-2.80 → pipulate-2.82}/pipulate.egg-info/SOURCES.txt +0 -8
  7. {pipulate-2.80 → pipulate-2.82}/pyproject.toml +1 -1
  8. {pipulate-2.80 → pipulate-2.82}/server.py +286 -25
  9. {pipulate-2.80 → pipulate-2.82}/tools/__init__.py +2 -21
  10. {pipulate-2.80 → pipulate-2.82}/tools/mcp_tools.py +17 -665
  11. pipulate-2.80/apps/110_parameter_buster.py +0 -4158
  12. pipulate-2.80/apps/120_link_graph.py +0 -5319
  13. pipulate-2.80/apps/400_botify_trifecta.py +0 -5164
  14. pipulate-2.80/imports/botify/code_generators.py +0 -601
  15. pipulate-2.80/imports/botify/true_schema_discoverer.py +0 -432
  16. pipulate-2.80/imports/botify_code_generation.py +0 -424
  17. pipulate-2.80/imports/dom_processing/__init__.py +0 -0
  18. pipulate-2.80/tools/botify_tools.py +0 -475
  19. {pipulate-2.80 → pipulate-2.82}/.agents/skills/gsc-readonly/SKILL.md +0 -0
  20. {pipulate-2.80 → pipulate-2.82}/.agents/skills/hello-workflow/SKILL.md +0 -0
  21. {pipulate-2.80 → pipulate-2.82}/.agents/skills/journal/SKILL.md +0 -0
  22. {pipulate-2.80 → pipulate-2.82}/.agents/skills/pipulate/SKILL.md +0 -0
  23. {pipulate-2.80 → pipulate-2.82}/.agents/skills/roles/SKILL.md +0 -0
  24. {pipulate-2.80 → pipulate-2.82}/.agents/skills/sheets-readonly/SKILL.md +0 -0
  25. {pipulate-2.80 → pipulate-2.82}/AGENTS.md +0 -0
  26. {pipulate-2.80 → pipulate-2.82}/AUDIT.md +0 -0
  27. {pipulate-2.80 → pipulate-2.82}/LICENSE +0 -0
  28. {pipulate-2.80 → pipulate-2.82}/MANIFEST.in +0 -0
  29. {pipulate-2.80 → pipulate-2.82}/README.md +0 -0
  30. {pipulate-2.80 → pipulate-2.82}/apps/010_introduction.py +0 -0
  31. {pipulate-2.80 → pipulate-2.82}/apps/015_config.py +0 -0
  32. {pipulate-2.80 → pipulate-2.82}/apps/020_profiles.py +0 -0
  33. {pipulate-2.80 → pipulate-2.82}/apps/025_aspect.py +0 -0
  34. {pipulate-2.80 → pipulate-2.82}/apps/030_roles.py +0 -0
  35. {pipulate-2.80 → pipulate-2.82}/apps/040_hello_workflow.py +0 -0
  36. {pipulate-2.80 → pipulate-2.82}/apps/050_documentation.py +0 -0
  37. {pipulate-2.80 → pipulate-2.82}/apps/060_tasks.py +0 -0
  38. {pipulate-2.80 → pipulate-2.82}/apps/070_history.py +0 -0
  39. {pipulate-2.80 → pipulate-2.82}/apps/130_gap_analysis.py +0 -0
  40. {pipulate-2.80 → pipulate-2.82}/apps/200_workflow_genesis.py +0 -0
  41. {pipulate-2.80 → pipulate-2.82}/apps/210_widget_examples.py +0 -0
  42. {pipulate-2.80 → pipulate-2.82}/apps/220_roadmap.py +0 -0
  43. {pipulate-2.80 → pipulate-2.82}/apps/230_dev_assistant.py +0 -0
  44. {pipulate-2.80 → pipulate-2.82}/apps/240_simon_mcp.py +0 -0
  45. {pipulate-2.80 → pipulate-2.82}/apps/300_blank_placeholder.py +0 -0
  46. {pipulate-2.80 → pipulate-2.82}/apps/440_browser_automation.py +0 -0
  47. {pipulate-2.80 → pipulate-2.82}/apps/450_stream_simulator.py +0 -0
  48. {pipulate-2.80 → pipulate-2.82}/apps/510_text_field.py +0 -0
  49. {pipulate-2.80 → pipulate-2.82}/apps/520_text_area.py +0 -0
  50. {pipulate-2.80 → pipulate-2.82}/apps/530_dropdown.py +0 -0
  51. {pipulate-2.80 → pipulate-2.82}/apps/540_checkboxes.py +0 -0
  52. {pipulate-2.80 → pipulate-2.82}/apps/550_radios.py +0 -0
  53. {pipulate-2.80 → pipulate-2.82}/apps/560_range.py +0 -0
  54. {pipulate-2.80 → pipulate-2.82}/apps/570_switch.py +0 -0
  55. {pipulate-2.80 → pipulate-2.82}/apps/580_upload.py +0 -0
  56. {pipulate-2.80 → pipulate-2.82}/apps/610_markdown.py +0 -0
  57. {pipulate-2.80 → pipulate-2.82}/apps/620_mermaid.py +0 -0
  58. {pipulate-2.80 → pipulate-2.82}/apps/630_prism.py +0 -0
  59. {pipulate-2.80 → pipulate-2.82}/apps/640_javascript.py +0 -0
  60. {pipulate-2.80 → pipulate-2.82}/apps/710_pandas.py +0 -0
  61. {pipulate-2.80 → pipulate-2.82}/apps/720_rich.py +0 -0
  62. {pipulate-2.80 → pipulate-2.82}/apps/730_matplotlib.py +0 -0
  63. {pipulate-2.80 → pipulate-2.82}/apps/810_webbrowser.py +0 -0
  64. {pipulate-2.80 → pipulate-2.82}/apps/820_selenium.py +0 -0
  65. {pipulate-2.80 → pipulate-2.82}/apps/830_pico_slider.py +0 -0
  66. {pipulate-2.80 → pipulate-2.82}/cli.py +0 -0
  67. {pipulate-2.80 → pipulate-2.82}/config.py +0 -0
  68. {pipulate-2.80 → pipulate-2.82}/imports/__init__.py +0 -0
  69. {pipulate-2.80 → pipulate-2.82}/imports/ai_dictdb.py +0 -0
  70. {pipulate-2.80 → pipulate-2.82}/imports/ai_tool_discovery_simple_parser.py +0 -0
  71. {pipulate-2.80 → pipulate-2.82}/imports/append_only_conversation.py +0 -0
  72. {pipulate-2.80 → pipulate-2.82}/imports/ascii_displays.py +0 -0
  73. {pipulate-2.80 → pipulate-2.82}/imports/crud.py +0 -0
  74. {pipulate-2.80 → pipulate-2.82}/imports/database_safety_wrapper.py +0 -0
  75. {pipulate-2.80/imports/botify → pipulate-2.82/imports/dom_processing}/__init__.py +0 -0
  76. {pipulate-2.80 → pipulate-2.82}/imports/dom_processing/ai_dom_beautifier.py +0 -0
  77. {pipulate-2.80 → pipulate-2.82}/imports/dom_processing/enhanced_dom_processor.py +0 -0
  78. {pipulate-2.80 → pipulate-2.82}/imports/durable_backup_system.py +0 -0
  79. {pipulate-2.80 → pipulate-2.82}/imports/mcp_orchestrator.py +0 -0
  80. {pipulate-2.80 → pipulate-2.82}/imports/server_logging.py +0 -0
  81. {pipulate-2.80 → pipulate-2.82}/imports/stream_orchestrator.py +0 -0
  82. {pipulate-2.80 → pipulate-2.82}/imports/voice_synthesis.py +0 -0
  83. {pipulate-2.80 → pipulate-2.82}/pipulate/__init__.py +0 -0
  84. {pipulate-2.80 → pipulate-2.82}/pipulate.egg-info/dependency_links.txt +0 -0
  85. {pipulate-2.80 → pipulate-2.82}/pipulate.egg-info/entry_points.txt +0 -0
  86. {pipulate-2.80 → pipulate-2.82}/pipulate.egg-info/requires.txt +0 -0
  87. {pipulate-2.80 → pipulate-2.82}/pipulate.egg-info/top_level.txt +0 -0
  88. {pipulate-2.80 → pipulate-2.82}/setup.cfg +0 -0
  89. {pipulate-2.80 → pipulate-2.82}/tests/test_apply_airlock.py +0 -0
  90. {pipulate-2.80 → pipulate-2.82}/tests/test_mck_rep2.py +0 -0
  91. {pipulate-2.80 → pipulate-2.82}/tools/advanced_automation_tools.py +0 -0
  92. {pipulate-2.80 → pipulate-2.82}/tools/connector_tools.py +0 -0
  93. {pipulate-2.80 → pipulate-2.82}/tools/conversation_tools.py +0 -0
  94. {pipulate-2.80 → pipulate-2.82}/tools/dom_tools.py +0 -0
  95. {pipulate-2.80 → pipulate-2.82}/tools/keychain_tools.py +0 -0
  96. {pipulate-2.80 → pipulate-2.82}/tools/llm_optics.py +0 -0
  97. {pipulate-2.80 → pipulate-2.82}/tools/scraper_tools.py +0 -0
  98. {pipulate-2.80 → pipulate-2.82}/tools/system_tools.py +0 -0
@@ -1,8 +1,8 @@
1
1
  # The Pipulate journal, indexed
2
2
 
3
- > Auto-generated on 2026-10-08 by `scripts/articles/generate_ai_context.py` and
3
+ > Auto-generated on 2026-10-10 by `scripts/articles/generate_ai_context.py` and
4
4
  > rewritten from scratch on every release. If this date looks stale, assume
5
- > the rest of the repo is newer than this map. 1523 entries indexed.
5
+ > the rest of the repo is newer than this map. 1530 entries indexed.
6
6
 
7
7
  This repository holds the *machinery*. The *reasoning*, the running journal
8
8
  that explains why every piece exists, lives on a separate website and not in
@@ -27,6 +27,13 @@ The first 20 entries include full `index.md` URLs to establish
27
27
  the link pattern. All remaining entries are bare slugs. Reconstruct any full
28
28
  URL as: `https://mikelev.in/futureproof/{slug}/index.md`
29
29
 
30
+ - [2026-10-10] [Holding the Reins: Background Daemons, Quiet Shells, and Resisting the Rabbit Hole](https://mikelev.in/futureproof/holding-the-reins-background-daemons-and-rabbit-holes/index.md)
31
+ - [2026-10-10] [Less Messaging: RFC 9110 and the Inspection Airlock](https://mikelev.in/futureproof/less-messaging-rfc9110-inspection-airlock/index.md)
32
+ - [2026-10-10] [Making a Diff: The Minimal Instrument](https://mikelev.in/futureproof/making-a-diff-the-minimal-instrument/index.md)
33
+ - [2026-10-09] [The Heat and the Delete: Landauer's Limit and Verifiable Codebase Pruning](https://mikelev.in/futureproof/the-heat-and-the-delete-verifiable-pruning/index.md)
34
+ - [2026-10-09] [The Inverted Cave: AI Quality Assurance and the Jevons Paradox of Code](https://mikelev.in/futureproof/inverted-cave-ai-quality-assurance-jevons-paradox/index.md)
35
+ - [2026-10-08] [The Anti-Crichton Pipeline: Intentional Friction and Replayable Receipts](https://mikelev.in/futureproof/anti-crichton-pipeline-intentional-friction/index.md)
36
+ - [2026-10-08] [The Randi Test: Grounding Agent-Readiness in Verifiable Receipts](https://mikelev.in/futureproof/the-randi-test-for-agent-readiness/index.md)
30
37
  - [2026-10-08] [Jekyll Satellites: Decoupling Shared Tooling from Independent Sites with Nix](https://mikelev.in/futureproof/jekyll-satellites-shared-nix-kernel/index.md)
31
38
  - [2026-10-07] [Removing the Conversion Event: When Paradigms Become Invisible Infrastructure](https://mikelev.in/futureproof/removing-the-conversion-event/index.md)
32
39
  - [2026-10-07] [Public Installers, Private Entitlements, and Watching the Infrastructure Read](https://mikelev.in/futureproof/public-installers-private-entitlements-wire-telemetry/index.md)
@@ -40,18 +47,18 @@ URL as: `https://mikelev.in/futureproof/{slug}/index.md`
40
47
  - [2026-10-03] [The Single-Owner Rule and the Verifiable Deed: Quieting Pipeline Noise in the Age of AI](https://mikelev.in/futureproof/single-owner-rule-and-verifiable-deeds/index.md)
41
48
  - [2026-10-03] [The Render Canary and the Quiet Compiler: Distinguishing Exposure from Corruption in the Age of AI](https://mikelev.in/futureproof/render-canary-and-the-quiet-compiler/index.md)
42
49
  - [2026-10-02] [The Enter Fence and the Bell Cue: Building Replayable Browser Walks in the Age of AI](https://mikelev.in/futureproof/the-enter-fence-and-the-bell-cue/index.md)
43
- - [2026-10-02] [The Clear Cups Protocol: Auditing MCP Calls with Replayable Receipts](https://mikelev.in/futureproof/clear-cups-protocol-auditing-mcp-calls/index.md)
44
- - [2026-10-02] [The Door Table and the Moving Twig: Replayable Installs and the Stick Bug Secret](https://mikelev.in/futureproof/the-door-table-and-the-moving-twig/index.md)
45
- - [2026-10-01] [The Scrollback Rule: Engineering Full-Width Terminal Dividers for Replayable Logs](https://mikelev.in/futureproof/scrollback-rule-clear-x-receipts/index.md)
46
- - [2026-10-01] [The Prefix Ladder and the Unalias Guard: Replayable Shell Ergonomics in the Age of AI](https://mikelev.in/futureproof/prefix-ladders-and-the-unalias-guard/index.md)
47
- - [2026-09-30] [Forever-Commands and the Talk Toggle: Replayable CLI Habits in the Age of AI](https://mikelev.in/futureproof/forever-commands-and-the-talk-toggle/index.md)
48
- - [2026-09-29] [Layered Reality and Operator Overloading: Reading the Physics of CPython in the Age of AI](https://mikelev.in/futureproof/layered-reality-operator-overloading-cpython/index.md)
49
- - [2026-09-29] [The Three-Door Installer: Named Prompts, Split DNS, and Verifiable Releases](https://mikelev.in/futureproof/the-three-door-installer-and-named-prompts/index.md)
50
50
 
51
51
  ## Compact slug index -- pattern: https://mikelev.in/futureproof/{slug}/index.md
52
52
 
53
53
  Format: `[date] [size] slug` -- fetch any entry as `https://mikelev.in/futureproof/{slug}/index.md`
54
54
 
55
+ - [2026-10-02] [41k] clear-cups-protocol-auditing-mcp-calls
56
+ - [2026-10-02] [261k] the-door-table-and-the-moving-twig
57
+ - [2026-10-01] [22k] scrollback-rule-clear-x-receipts
58
+ - [2026-10-01] [51k] prefix-ladders-and-the-unalias-guard
59
+ - [2026-09-30] [103k] forever-commands-and-the-talk-toggle
60
+ - [2026-09-29] [35k] layered-reality-operator-overloading-cpython
61
+ - [2026-09-29] [245k] the-three-door-installer-and-named-prompts
55
62
  - [2026-09-29] [234k] the-deed-is-named-for-the-door-qa-archive-zip
56
63
  - [2026-09-29] [200k] qamy-door-cellular-witness-replayable-receipts
57
64
  - [2026-09-28] [368k] the-forward-slash-test-claude-skills-bridge
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pipulate
3
- Version: 2.80
3
+ Version: 2.82
4
4
  Summary: The context compiler that helps you prompt well -- local-first, Nix-reproducible, replayable. The successor to AI SEO software.
5
5
  Author-email: Mike Levin <pipulate@gmail.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -12,7 +12,7 @@ Usage:
12
12
  pipulate
13
13
  """
14
14
 
15
- __version__ = "2.80"
15
+ __version__ = "2.82"
16
16
  # APOSTROPHES RESTORED (2026-08-04). They were stripped as a workaround for
17
17
  # flake.nix's descMatch regex, whose character class excluded ' from the
18
18
  # CAPTURE and truncated the banner to "(So)". That regex was fixed in the same
@@ -23,7 +23,7 @@ __version__ = "2.80"
23
23
  # is not a property of the system; the regex is. Blast radius is one banner:
24
24
  # nothing but flake.nix reads this name -- version_sync.py syncs __version__
25
25
  # and __description__, never this. So'wI' chu' -- "engage the cloaking device."
26
- __version_description__ = "Left Side of Boundary"
26
+ __version_description__ = "Pipulate in Tmux"
27
27
  # SPDX expression, single source of truth, synced into pyproject.toml by
28
28
  # scripts/release/version_sync.py. "-or-later" (not bare AGPL-3.0, which is
29
29
  # deprecated SPDX) because the header below grants "any later version".
@@ -17,7 +17,6 @@ from loguru import logger
17
17
  import imports.server_logging as slog
18
18
  import config as CFG
19
19
  from config import COLOR_MAP
20
- from imports import botify_code_generation
21
20
  from imports.stream_orchestrator import stream_orchestrator
22
21
  from typing import AsyncGenerator, Optional
23
22
  import imports.server_logging as slog
@@ -902,7 +901,6 @@ class Pipulate:
902
901
 
903
902
  full_log_message = '\n'.join(log_entry_parts)
904
903
  logger.info(f'\n🚀 === API CALL TRANSPARENCY ===\n{full_log_message}\n🚀 === END API TRANSPARENCY ===')
905
- is_bql = 'bql' in (call_description or '').lower() or 'botify query language' in (call_description or '').lower()
906
904
 
907
905
  def _is_discovery_endpoint(self, url: str) -> bool:
908
906
  """Detect if this is a key discovery endpoint that should have full response logging.
@@ -1165,45 +1163,7 @@ class Pipulate:
1165
1163
 
1166
1164
  return '\n'.join(lines)
1167
1165
 
1168
- # ========================================
1169
- # REUSABLE BOTIFY PYTHON CODE GENERATION
1170
- # ========================================
1171
1166
 
1172
- def generate_botify_code_header(self, display_name: str, step_name: str, username: str, project_name: str,
1173
- template_info: dict = None, qualifier_config: dict = None) -> list:
1174
- """Generate standardized header for Botify Python debugging code.
1175
-
1176
- Delegates to external botify_code_generation module to reduce server.py size.
1177
- """
1178
- return botify_code_generation.generate_botify_code_header(
1179
- display_name=display_name,
1180
- step_name=step_name,
1181
- username=username,
1182
- project_name=project_name,
1183
- template_info=template_info,
1184
- qualifier_config=qualifier_config
1185
- )
1186
-
1187
- def generate_botify_token_loader(self) -> str:
1188
- """Generate the standard Botify token loading function.
1189
-
1190
- Delegates to external botify_code_generation module to reduce server.py size.
1191
- """
1192
- return botify_code_generation.generate_botify_token_loader()
1193
-
1194
- def generate_botify_http_client(self, client_name: str, description: str) -> str:
1195
- """Generate the standard HTTP client function for Botify APIs.
1196
-
1197
- Delegates to external botify_code_generation module to reduce server.py size.
1198
- """
1199
- return botify_code_generation.generate_botify_http_client(client_name, description)
1200
-
1201
- def generate_botify_main_executor(self, client_function_name: str, api_description: str) -> str:
1202
- """Generate the main execution function for Botify APIs.
1203
-
1204
- Delegates to external botify_code_generation module to reduce server.py size.
1205
- """
1206
- return botify_code_generation.generate_botify_main_executor(client_function_name, api_description)
1207
1167
 
1208
1168
  def create_folder_button(self, folder_path: str, icon: str = "📁", text: str = "Open Folder",
1209
1169
  title_prefix: str = "Open folder") -> object:
@@ -1226,50 +1186,7 @@ class Pipulate:
1226
1186
  cls="button-link"
1227
1187
  )
1228
1188
 
1229
- # ========================================
1230
- # ADVANCED BOTIFY CODE GENERATION UTILITIES
1231
- # ========================================
1232
1189
 
1233
- def generate_botify_bqlv2_python_code(self, query_payload, username, project_name, page_size, jobs_payload, display_name, get_step_name_from_payload_func, get_configured_template_func=None, query_templates=None):
1234
- """
1235
- 🚀 REUSABLE UTILITY: Generate complete Python code for BQLv2 queries (crawl, GSC)
1236
-
1237
- Delegates to external botify_code_generation module to reduce server.py size.
1238
- """
1239
- return botify_code_generation.generate_botify_bqlv2_python_code(
1240
- query_payload=query_payload,
1241
- username=username,
1242
- project_name=project_name,
1243
- page_size=page_size,
1244
- jobs_payload=jobs_payload,
1245
- display_name=display_name,
1246
- get_step_name_from_payload_func=get_step_name_from_payload_func,
1247
- get_configured_template_func=get_configured_template_func,
1248
- query_templates=query_templates
1249
- )
1250
-
1251
- def generate_botify_bqlv1_python_code(self, query_payload, username, project_name, jobs_payload, display_name, get_step_name_from_payload_func):
1252
- """
1253
- 🚀 REUSABLE UTILITY: Generate complete Python code for BQLv1 queries (web logs)
1254
-
1255
- Delegates to external botify_code_generation module to reduce server.py size.
1256
- """
1257
- return botify_code_generation.generate_botify_bqlv1_python_code(
1258
- query_payload=query_payload,
1259
- username=username,
1260
- project_name=project_name,
1261
- jobs_payload=jobs_payload,
1262
- display_name=display_name,
1263
- get_step_name_from_payload_func=get_step_name_from_payload_func
1264
- )
1265
-
1266
- def get_botify_analysis_path(self, app_name, username, project_name, analysis_slug, filename=None):
1267
- """
1268
- 🚀 REUSABLE UTILITY: Construct standardized Botify analysis file paths
1269
-
1270
- Delegates to external botify_code_generation module to reduce server.py size.
1271
- """
1272
- return botify_code_generation.get_botify_analysis_path(app_name, username, project_name, analysis_slug, filename)
1273
1190
 
1274
1191
  def fmt(self, endpoint: str) -> str:
1275
1192
  """Format an endpoint string into a human-readable form."""
@@ -2466,8 +2383,6 @@ class Pipulate:
2466
2383
 
2467
2384
  if "CLIENT_DOMAIN" in target_names:
2468
2385
  node.value = ast.Constant(value="uhnd.com")
2469
- elif "BOTIFY_PROJECT_URL" in target_names:
2470
- node.value = ast.Constant(value="https://app.botify.com/uhnd-com/uhnd.com-demo-account/")
2471
2386
  else:
2472
2387
  # Replace all other string values with None
2473
2388
  node.value = ast.Constant(value=None)
@@ -2835,8 +2750,8 @@ class Pipulate:
2835
2750
  then immediately prompts the user to enter a new one via the UI widget.
2836
2751
 
2837
2752
  Args:
2838
- env_var_name (str): The environment variable to remove (e.g., 'BOTIFY_API_TOKEN').
2839
- service_name (str): Friendly name for the UI (e.g., 'Botify'). Auto-derived if None.
2753
+ env_var_name (str): The environment variable to remove (e.g., 'GEMINI_API_KEY').
2754
+ service_name (str): Friendly name for the UI (e.g., 'Gemini'). Auto-derived if None.
2840
2755
  """
2841
2756
  import os
2842
2757
  from dotenv import load_dotenv, set_key
@@ -3088,8 +3003,8 @@ class Pipulate:
3088
3003
  mid-workflow lazy-loading crashes. Renders a secure widget if missing.
3089
3004
 
3090
3005
  Args:
3091
- env_var_name: The environment variable to look for (e.g., 'BOTIFY_API_TOKEN').
3092
- service_name: Friendly name for the UI (e.g., 'Botify'). Auto-derived if None.
3006
+ env_var_name: The environment variable to look for (e.g., 'GEMINI_API_KEY').
3007
+ service_name: Friendly name for the UI (e.g., 'Gemini'). Auto-derived if None.
3093
3008
  force_prompt: If True, ignores cached credentials and forces the UI widget.
3094
3009
  """
3095
3010
  import os
@@ -3098,7 +3013,7 @@ class Pipulate:
3098
3013
  from dotenv import load_dotenv, set_key
3099
3014
 
3100
3015
  if not service_name:
3101
- # Auto-derive friendly name (e.g., 'BOTIFY_API_TOKEN' -> 'Botify')
3016
+ # Auto-derive friendly name (e.g., 'GEMINI_API_KEY' -> 'Gemini')
3102
3017
  service_name = env_var_name.split('_')[0].title()
3103
3018
 
3104
3019
  # 1. Load existing environment variables (override=True fights caching stubbornness)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pipulate
3
- Version: 2.80
3
+ Version: 2.82
4
4
  Summary: The context compiler that helps you prompt well -- local-first, Nix-reproducible, replayable. The successor to AI SEO software.
5
5
  Author-email: Mike Levin <pipulate@gmail.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -24,8 +24,6 @@ apps/040_hello_workflow.py
24
24
  apps/050_documentation.py
25
25
  apps/060_tasks.py
26
26
  apps/070_history.py
27
- apps/110_parameter_buster.py
28
- apps/120_link_graph.py
29
27
  apps/130_gap_analysis.py
30
28
  apps/200_workflow_genesis.py
31
29
  apps/210_widget_examples.py
@@ -33,7 +31,6 @@ apps/220_roadmap.py
33
31
  apps/230_dev_assistant.py
34
32
  apps/240_simon_mcp.py
35
33
  apps/300_blank_placeholder.py
36
- apps/400_botify_trifecta.py
37
34
  apps/440_browser_automation.py
38
35
  apps/450_stream_simulator.py
39
36
  apps/510_text_field.py
@@ -59,7 +56,6 @@ imports/ai_dictdb.py
59
56
  imports/ai_tool_discovery_simple_parser.py
60
57
  imports/append_only_conversation.py
61
58
  imports/ascii_displays.py
62
- imports/botify_code_generation.py
63
59
  imports/crud.py
64
60
  imports/database_safety_wrapper.py
65
61
  imports/durable_backup_system.py
@@ -67,9 +63,6 @@ imports/mcp_orchestrator.py
67
63
  imports/server_logging.py
68
64
  imports/stream_orchestrator.py
69
65
  imports/voice_synthesis.py
70
- imports/botify/__init__.py
71
- imports/botify/code_generators.py
72
- imports/botify/true_schema_discoverer.py
73
66
  imports/dom_processing/__init__.py
74
67
  imports/dom_processing/ai_dom_beautifier.py
75
68
  imports/dom_processing/enhanced_dom_processor.py
@@ -85,7 +78,6 @@ tests/test_apply_airlock.py
85
78
  tests/test_mck_rep2.py
86
79
  tools/__init__.py
87
80
  tools/advanced_automation_tools.py
88
- tools/botify_tools.py
89
81
  tools/connector_tools.py
90
82
  tools/conversation_tools.py
91
83
  tools/dom_tools.py
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "pipulate"
7
7
  # VERSION NOTE: Synced from pipulate/__init__.py.__version__ via python version_sync.py
8
- version = "2.80"
8
+ version = "2.82"
9
9
  authors = [
10
10
  { name="Mike Levin", email="pipulate@gmail.com" },
11
11
  ]