pipulate 2.56__tar.gz → 2.57__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.
- {pipulate-2.56/pipulate.egg-info → pipulate-2.57}/PKG-INFO +1 -1
- {pipulate-2.56 → pipulate-2.57}/__init__.py +2 -2
- {pipulate-2.56 → pipulate-2.57/pipulate.egg-info}/PKG-INFO +1 -1
- {pipulate-2.56 → pipulate-2.57}/pyproject.toml +1 -1
- {pipulate-2.56 → pipulate-2.57}/tools/scraper_tools.py +7 -10
- {pipulate-2.56 → pipulate-2.57}/LICENSE +0 -0
- {pipulate-2.56 → pipulate-2.57}/MANIFEST.in +0 -0
- {pipulate-2.56 → pipulate-2.57}/README.md +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/010_introduction.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/015_config.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/020_profiles.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/025_aspect.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/030_roles.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/040_hello_workflow.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/050_documentation.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/060_tasks.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/070_history.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/110_parameter_buster.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/120_link_graph.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/130_gap_analysis.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/200_workflow_genesis.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/210_widget_examples.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/220_roadmap.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/230_dev_assistant.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/240_simon_mcp.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/300_blank_placeholder.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/400_botify_trifecta.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/440_browser_automation.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/450_stream_simulator.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/510_text_field.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/520_text_area.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/530_dropdown.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/540_checkboxes.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/550_radios.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/560_range.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/570_switch.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/580_upload.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/610_markdown.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/620_mermaid.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/630_prism.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/640_javascript.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/710_pandas.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/720_rich.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/730_matplotlib.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/810_webbrowser.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/820_selenium.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/apps/830_pico_slider.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/cli.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/config.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/__init__.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/ai_dictdb.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/ai_tool_discovery_simple_parser.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/append_only_conversation.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/ascii_displays.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/botify/__init__.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/botify/code_generators.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/botify/true_schema_discoverer.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/botify_code_generation.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/crud.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/database_safety_wrapper.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/dom_processing/__init__.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/dom_processing/ai_dom_beautifier.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/dom_processing/enhanced_dom_processor.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/durable_backup_system.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/mcp_orchestrator.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/server_logging.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/stream_orchestrator.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/imports/voice_synthesis.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/pipulate/__init__.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/pipulate/core.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/pipulate.egg-info/SOURCES.txt +0 -0
- {pipulate-2.56 → pipulate-2.57}/pipulate.egg-info/dependency_links.txt +0 -0
- {pipulate-2.56 → pipulate-2.57}/pipulate.egg-info/entry_points.txt +0 -0
- {pipulate-2.56 → pipulate-2.57}/pipulate.egg-info/requires.txt +0 -0
- {pipulate-2.56 → pipulate-2.57}/pipulate.egg-info/top_level.txt +0 -0
- {pipulate-2.56 → pipulate-2.57}/server.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/setup.cfg +0 -0
- {pipulate-2.56 → pipulate-2.57}/tests/test_apply_airlock.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tests/test_mck_rep2.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tools/__init__.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tools/advanced_automation_tools.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tools/botify_tools.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tools/connector_tools.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tools/conversation_tools.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tools/dom_tools.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tools/keychain_tools.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tools/llm_optics.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tools/mcp_tools.py +0 -0
- {pipulate-2.56 → pipulate-2.57}/tools/system_tools.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pipulate
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.57
|
|
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.
|
|
15
|
+
__version__ = "2.57"
|
|
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.56"
|
|
|
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__ = "NPvg.org
|
|
26
|
+
__version_description__ = "NPvg.org Walk Walking"
|
|
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".
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pipulate
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.57
|
|
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
|
|
@@ -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.
|
|
8
|
+
version = "2.57"
|
|
9
9
|
authors = [
|
|
10
10
|
{ name="Mike Levin", email="pipulate@gmail.com" },
|
|
11
11
|
]
|
|
@@ -58,7 +58,7 @@ def _guided_path_component(url: str) -> tuple[str, str]:
|
|
|
58
58
|
return parsed.netloc, f"{readable_path}--{url_digest}"
|
|
59
59
|
|
|
60
60
|
|
|
61
|
-
# ---
|
|
61
|
+
# --- Optional audio during browser startup ---
|
|
62
62
|
# Forked from stream.py's start_updating_music/stop_updating_music pattern:
|
|
63
63
|
# a marker-tagged shell loop in its OWN process group (os.setsid), killed as
|
|
64
64
|
# a group, with an idempotent pkill backstop keyed to the marker so it can
|
|
@@ -84,14 +84,7 @@ def _start_scrape_music(verbose=True):
|
|
|
84
84
|
music = _find_music_file()
|
|
85
85
|
if not music:
|
|
86
86
|
return None
|
|
87
|
-
|
|
88
|
-
print(r"""
|
|
89
|
-
⏳ THE SUMMONING — thumper planted, hooks in hand
|
|
90
|
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
91
|
-
o Cloudflare drums the sand beneath us;
|
|
92
|
-
/|\ we wait it out, staked and hooked.
|
|
93
|
-
~~ 🎵 jeopardy.wav looping until the Maker surfaces ~~
|
|
94
|
-
""")
|
|
87
|
+
|
|
95
88
|
try:
|
|
96
89
|
return subprocess.Popen(
|
|
97
90
|
["sh", "-c", f'while :; do aplay -q -D default "{music}"; done # {SCRAPE_MUSIC_MARKER}'],
|
|
@@ -273,7 +266,7 @@ def _capture_checkpoint(stdin=None, stdout=None) -> dict:
|
|
|
273
266
|
|
|
274
267
|
try:
|
|
275
268
|
output_stream.write(
|
|
276
|
-
"\
|
|
269
|
+
"\nWhen the page you want is ready, type CAPTURE and press Enter.\n"
|
|
277
270
|
"Any other response aborts without capturing artifacts.\n"
|
|
278
271
|
"CAPTURE> "
|
|
279
272
|
)
|
|
@@ -446,6 +439,7 @@ async def _selenium_capture(params: dict, checkpoint=None) -> dict:
|
|
|
446
439
|
("seo.md", "seo_md"),
|
|
447
440
|
("links.md", "links_md"),
|
|
448
441
|
("diff_hierarchy.txt", "diff_hierarchy_txt"),
|
|
442
|
+
("diff_simple_dom.txt", "diff_simple_txt"),
|
|
449
443
|
("accessibility_tree_summary.txt", "accessibility_tree_summary"),
|
|
450
444
|
("optics_manifest.txt", "optics_manifest"),
|
|
451
445
|
]:
|
|
@@ -558,6 +552,8 @@ async def _selenium_capture(params: dict, checkpoint=None) -> dict:
|
|
|
558
552
|
temp_profile = True
|
|
559
553
|
logger.info(f"👻 Using temporary profile: {profile_path}")
|
|
560
554
|
|
|
555
|
+
if verbose:
|
|
556
|
+
print("Opening the browser; waiting for the page...", flush=True)
|
|
561
557
|
music_proc = _start_scrape_music(verbose=verbose)
|
|
562
558
|
logger.info(f"🚀 Initializing undetected-chromedriver (Headless: {headless})...")
|
|
563
559
|
try:
|
|
@@ -912,6 +908,7 @@ async def _selenium_capture(params: dict, checkpoint=None) -> dict:
|
|
|
912
908
|
('source_hierarchy_txt', 'source_dom_hierarchy.txt'),
|
|
913
909
|
# ... (keep the rest of the original list if desired, or prune)
|
|
914
910
|
('diff_hierarchy_txt', 'diff_hierarchy.txt'),
|
|
911
|
+
('diff_simple_txt', 'diff_simple_dom.txt'),
|
|
915
912
|
('links_md', 'links.md'),
|
|
916
913
|
# etc.
|
|
917
914
|
]:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|