pipulate 1.99__tar.gz → 2.2__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 (92) hide show
  1. pipulate-2.2/MANIFEST.in +5 -0
  2. {pipulate-1.99 → pipulate-2.2}/PKG-INFO +44 -32
  3. {pipulate-1.99 → pipulate-2.2}/README.md +40 -28
  4. {pipulate-1.99 → pipulate-2.2}/__init__.py +9 -5
  5. {pipulate-1.99 → pipulate-2.2}/apps/010_introduction.py +33 -12
  6. {pipulate-1.99 → pipulate-2.2}/apps/015_config.py +65 -32
  7. {pipulate-1.99 → pipulate-2.2}/apps/020_profiles.py +3 -11
  8. {pipulate-1.99 → pipulate-2.2}/apps/030_roles.py +17 -268
  9. {pipulate-1.99 → pipulate-2.2}/apps/040_hello_workflow.py +8 -14
  10. {pipulate-1.99 → pipulate-2.2}/apps/060_tasks.py +2 -5
  11. {pipulate-1.99 → pipulate-2.2}/apps/070_history.py +4 -4
  12. {pipulate-1.99 → pipulate-2.2}/apps/110_parameter_buster.py +20 -20
  13. {pipulate-1.99 → pipulate-2.2}/apps/120_link_graph.py +22 -22
  14. {pipulate-1.99 → pipulate-2.2}/apps/130_gap_analysis.py +8 -9
  15. {pipulate-1.99 → pipulate-2.2}/apps/200_workflow_genesis.py +5 -6
  16. {pipulate-1.99 → pipulate-2.2}/apps/210_widget_examples.py +35 -35
  17. {pipulate-1.99 → pipulate-2.2}/apps/230_dev_assistant.py +12 -13
  18. {pipulate-1.99 → pipulate-2.2}/apps/240_simon_mcp.py +6 -7
  19. {pipulate-1.99 → pipulate-2.2}/apps/300_blank_placeholder.py +4 -11
  20. {pipulate-1.99 → pipulate-2.2}/apps/400_botify_trifecta.py +13 -13
  21. {pipulate-1.99 → pipulate-2.2}/apps/440_browser_automation.py +67 -24
  22. {pipulate-1.99 → pipulate-2.2}/apps/450_stream_simulator.py +1 -1
  23. {pipulate-1.99 → pipulate-2.2}/apps/510_text_field.py +5 -5
  24. {pipulate-1.99 → pipulate-2.2}/apps/520_text_area.py +5 -5
  25. {pipulate-1.99 → pipulate-2.2}/apps/530_dropdown.py +6 -6
  26. {pipulate-1.99 → pipulate-2.2}/apps/540_checkboxes.py +6 -6
  27. {pipulate-1.99 → pipulate-2.2}/apps/550_radios.py +6 -6
  28. {pipulate-1.99 → pipulate-2.2}/apps/560_range.py +6 -6
  29. {pipulate-1.99 → pipulate-2.2}/apps/570_switch.py +4 -4
  30. {pipulate-1.99 → pipulate-2.2}/apps/580_upload.py +9 -9
  31. {pipulate-1.99 → pipulate-2.2}/apps/610_markdown.py +4 -4
  32. {pipulate-1.99 → pipulate-2.2}/apps/620_mermaid.py +4 -4
  33. {pipulate-1.99 → pipulate-2.2}/apps/630_prism.py +4 -4
  34. {pipulate-1.99 → pipulate-2.2}/apps/640_javascript.py +5 -5
  35. {pipulate-1.99 → pipulate-2.2}/apps/710_pandas.py +5 -5
  36. {pipulate-1.99 → pipulate-2.2}/apps/720_rich.py +5 -5
  37. {pipulate-1.99 → pipulate-2.2}/apps/730_matplotlib.py +5 -5
  38. {pipulate-1.99 → pipulate-2.2}/apps/810_webbrowser.py +4 -4
  39. {pipulate-1.99 → pipulate-2.2}/apps/820_selenium.py +4 -4
  40. {pipulate-1.99 → pipulate-2.2}/apps/830_pico_slider.py +6 -7
  41. {pipulate-1.99 → pipulate-2.2}/cli.py +17 -14
  42. {pipulate-1.99 → pipulate-2.2}/config.py +0 -38
  43. pipulate-2.2/imports/ascii_displays.py +2555 -0
  44. {pipulate-1.99 → pipulate-2.2}/imports/botify/true_schema_discoverer.py +136 -28
  45. {pipulate-1.99 → pipulate-2.2}/imports/crud.py +7 -428
  46. pipulate-2.2/imports/durable_backup_system.py +215 -0
  47. {pipulate-1.99 → pipulate-2.2}/imports/stream_orchestrator.py +37 -0
  48. {pipulate-1.99 → pipulate-2.2}/imports/voice_synthesis.py +49 -3
  49. {pipulate-1.99 → pipulate-2.2}/pipulate/core.py +3 -2
  50. {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/PKG-INFO +44 -32
  51. {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/SOURCES.txt +2 -2
  52. {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/top_level.txt +0 -2
  53. {pipulate-1.99 → pipulate-2.2}/pyproject.toml +6 -6
  54. {pipulate-1.99 → pipulate-2.2}/server.py +22 -29
  55. pipulate-2.2/tests/test_mck_rep2.py +157 -0
  56. {pipulate-1.99 → pipulate-2.2}/tools/dom_tools.py +35 -24
  57. {pipulate-1.99 → pipulate-2.2}/tools/llm_optics.py +148 -0
  58. pipulate-2.2/tools/scraper_tools.py +993 -0
  59. pipulate-1.99/apps/xx_link_graph_v2.py +0 -6243
  60. pipulate-1.99/imports/ascii_displays.py +0 -1292
  61. pipulate-1.99/imports/durable_backup_system.py +0 -600
  62. pipulate-1.99/pipulate/pipulate.py +0 -62
  63. pipulate-1.99/tools/scraper_tools.py +0 -481
  64. {pipulate-1.99 → pipulate-2.2}/LICENSE +0 -0
  65. {pipulate-1.99 → pipulate-2.2}/apps/025_aspect.py +0 -0
  66. {pipulate-1.99 → pipulate-2.2}/apps/050_documentation.py +0 -0
  67. {pipulate-1.99 → pipulate-2.2}/apps/220_roadmap.py +0 -0
  68. {pipulate-1.99 → pipulate-2.2}/imports/__init__.py +0 -0
  69. {pipulate-1.99 → pipulate-2.2}/imports/ai_dictdb.py +0 -0
  70. {pipulate-1.99 → pipulate-2.2}/imports/ai_tool_discovery_simple_parser.py +0 -0
  71. {pipulate-1.99 → pipulate-2.2}/imports/append_only_conversation.py +0 -0
  72. {pipulate-1.99 → pipulate-2.2}/imports/botify/__init__.py +0 -0
  73. {pipulate-1.99 → pipulate-2.2}/imports/botify/code_generators.py +0 -0
  74. {pipulate-1.99 → pipulate-2.2}/imports/botify_code_generation.py +0 -0
  75. {pipulate-1.99 → pipulate-2.2}/imports/database_safety_wrapper.py +0 -0
  76. {pipulate-1.99 → pipulate-2.2}/imports/dom_processing/__init__.py +0 -0
  77. {pipulate-1.99 → pipulate-2.2}/imports/dom_processing/ai_dom_beautifier.py +0 -0
  78. {pipulate-1.99 → pipulate-2.2}/imports/dom_processing/enhanced_dom_processor.py +0 -0
  79. {pipulate-1.99 → pipulate-2.2}/imports/mcp_orchestrator.py +0 -0
  80. {pipulate-1.99 → pipulate-2.2}/imports/server_logging.py +0 -0
  81. {pipulate-1.99 → pipulate-2.2}/pipulate/__init__.py +0 -0
  82. {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/dependency_links.txt +0 -0
  83. {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/entry_points.txt +0 -0
  84. {pipulate-1.99 → pipulate-2.2}/pipulate.egg-info/requires.txt +0 -0
  85. {pipulate-1.99 → pipulate-2.2}/setup.cfg +0 -0
  86. {pipulate-1.99 → pipulate-2.2}/tools/__init__.py +0 -0
  87. {pipulate-1.99 → pipulate-2.2}/tools/advanced_automation_tools.py +0 -0
  88. {pipulate-1.99 → pipulate-2.2}/tools/botify_tools.py +0 -0
  89. {pipulate-1.99 → pipulate-2.2}/tools/conversation_tools.py +0 -0
  90. {pipulate-1.99 → pipulate-2.2}/tools/keychain_tools.py +0 -0
  91. {pipulate-1.99 → pipulate-2.2}/tools/mcp_tools.py +0 -0
  92. {pipulate-1.99 → pipulate-2.2}/tools/system_tools.py +0 -0
@@ -0,0 +1,5 @@
1
+ # Work-in-progress plugin sketches (xx_ prefix) never ship to PyPI.
2
+ # Runtime plugin discovery already skips xx_ files; this keeps the sdist
3
+ # — and the wheel `python -m build` derives from it — in agreement with
4
+ # that convention. Fix protects v2.1 forward; the 2.0 artifact is history.
5
+ exclude apps/xx_*.py
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pipulate
3
- Version: 1.99
4
- Summary: A Notebook-inspired Hand-cranked Agentic Framework
3
+ Version: 2.2
4
+ Summary: AI-readiness for the agentic web — local-first, Nix-reproducible workflows. The successor to AI SEO software.
5
5
  Author-email: Mike Levin <pipulate@gmail.com>
6
- License-Expression: MIT
6
+ License-Expression: AGPL-3.0-or-later
7
7
  Project-URL: Homepage, https://github.com/miklevin/pipulate/
8
8
  Project-URL: Bug Tracker, https://github.com/miklevin/pipulate/issues
9
9
  Project-URL: Documentation, https://pipulate.com/guide/
10
- Keywords: seo,ai,llm,automation,local-first,nix,fasthtml,htmx,agentic
10
+ Keywords: ai-readiness,agentic-web,seo,ai,llm,automation,local-first,nix,fasthtml,htmx,agentic,content-negotiation
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Operating System :: OS Independent
@@ -59,12 +59,17 @@ Dynamic: license-file
59
59
  2. Hi, Auditor! What you're looking for is AUDIT.md ( https://pipulate.com/AUDIT.md )
60
60
  3. And context AI_CONTEXT.md ( https://pipulate.com/AI_CONTEXT.md )
61
61
 
62
- # Pipulate: Local First AI SEO Software
62
+ # Pipulate: Local First AI-Readiness for the Agentic Web
63
63
 
64
- ![Pipulate Free & Open Source SEO with & for LLMs](https://github.com/miklevin/pipulate/raw/main/assets/images/ai-seo-software.png)
65
-
66
- > **Your data. Your AI. Your machine. Your control.**
67
- > No subscriptions, no vendor lock-in, no cloud costs.
64
+ ```text
65
+ ( Like a canary you say? )
66
+ O /) ____ The "No Problem" Framework
67
+ > I HEREBY WILL NOT RE-GENERATE o /)\__// / \ Pipulate - Protecting Your Code
68
+ > Once upon machines be smarten ___(/_ 0 0 | | just by being honest about text.
69
+ > ASCII sealing immutata art in *( ==(_T_)== NPvg | (If mangled, then AI drifted.)
70
+ > This here cony if it's broken \ ) ""\ | | https://pipulate.com
71
+ > Smokin gun drift now in token |__>-\_>_> \____/ 🥕🥕🥕
72
+ ```
68
73
 
69
74
  ## Quick Start: Be Running in 5 Minutes
70
75
 
@@ -78,7 +83,7 @@ curl -fsSL https://pipulate.com/install.sh | bash
78
83
 
79
84
  ```bash
80
85
  # 2. Launch it
81
- nix develop
86
+ cd ~/pipulate && nix develop
82
87
  ```
83
88
 
84
89
  **What you get:** A local web app at `http://localhost:5001` with step-by-step workflows, integrated AI chat, and a JupyterLab instance at `http://localhost:8888`. No cloud required.
@@ -107,10 +112,10 @@ nix develop
107
112
 
108
113
  **Real examples of what people create with Pipulate:**
109
114
 
110
- ### 🔍 SEO Workflows
115
+ ### 🔍 Agentic-Web Readiness Workflows (the craft formerly known as SEO)
111
116
  - **Keyword Research Pipeline**: Input seed keywords → AI expansion → competition analysis → export spreadsheet
112
117
  - **Content Gap Analysis**: Compare your site vs competitors → identify missing topics → prioritized content calendar
113
- - **Technical SEO Audits**: Crawl site → check Core Web Vitals → generate action items → track fixes
118
+ - **Technical Readiness Audits**: Crawl site → check what agents actually see → generate action items → track fixes
114
119
 
115
120
  ### 📊 Data Processing Workflows
116
121
  - **CSV Data Cleaning**: Upload messy data → standardize formats → remove duplicates → validate results
@@ -118,7 +123,7 @@ nix develop
118
123
  - **Report Generation**: Combine multiple data sources → apply business rules → create branded reports
119
124
 
120
125
  ### 🤖 AI-Assisted Workflows
121
- - **Content Creation Pipeline**: Research topics → generate outlines → write drafts → optimize for SEO
126
+ - **Content Creation Pipeline**: Research topics → generate outlines → write drafts → optimize for machine readers
122
127
  - **Data Analysis Helper**: Upload spreadsheet → AI suggests insights → create visualizations → export findings
123
128
 
124
129
  **Key advantage:** Each workflow is a guided, step-by-step process that non-technical users can run repeatedly, while developers can customize the Python code behind each step.
@@ -127,7 +132,7 @@ nix develop
127
132
 
128
133
  ```text
129
134
  ╔═════════════════════════════════════════════════════════════════════════╗ Chip O'What?
130
- ║ 🎭 PIPULATE: LOCAL-FIRST AI SEO SOFTWARE & DIGITAL WORKSHOP ║ , O
135
+ ║ 🎭 PIPULATE: LOCAL-FIRST AI-READINESS & DIGITAL WORKSHOP ║ , O
131
136
  ║ ────────────────────────────────────────────────────────────────────── ║ \\ . O
132
137
  ║ ║ |\\/| o
133
138
  ║ 💬 Chip O'Theseus: "Welcome to your sovereign computing environment!" ║ / " '\
@@ -172,7 +177,7 @@ Think of it as putting guardrails on AI assistance. Instead of asking an AI to "
172
177
  3. 📓 **Transforms Jupyter Notebooks** into production-ready, step-by-step workflows
173
178
  4. 🤖 **Integrated AI assistance** using your own local models with complete privacy
174
179
  5. 🔧 **Reproducible environments** with Nix that work identically across all platforms
175
- 6. 🎯 **Perfect for SEO practitioners** who want to turn technical expertise into guided, reusable workflows
180
+ 6. 🎯 **Perfect for practitioners readying clients for the agentic web** who want to turn technical expertise into guided, reusable workflows
176
181
 
177
182
  --------------------------------------------------------------------------------
178
183
 
@@ -272,7 +277,7 @@ If you are not an Empire builder and prefer craftsmanship over the rat race and
272
277
 
273
278
  ### Primary Goals
274
279
 
275
- 1. **Empower End-Users (e.g., SEO Practitioners):** Enable non-programmers to run powerful, AI-guided workflows (often ported from Jupyter Notebooks) without needing to interact with Python code directly.
280
+ 1. **Empower End-Users (e.g., Agentic-Web Practitioners):** Enable non-programmers to run powerful, AI-guided workflows (often ported from Jupyter Notebooks) without needing to interact with Python code directly.
276
281
  2. **Serve Developers:** Provide a simple, reproducible environment for building these workflows, leveraging integrated tooling like Jupyter, local LLMs, and a streamlined web framework.
277
282
 
278
283
  --------------------------------------------------------------------------------
@@ -564,12 +569,19 @@ The installation procedures labeled "Quick Start Guide" and the main installatio
564
569
 
565
570
  ```bash
566
571
  rm -rf ~/TestProject
567
- curl -L https://pipulate.com/install.sh | bash -s TestProject
572
+ curl -fsSL https://pipulate.com/install.sh | bash -s TestProject
568
573
  cd ~/TestProject
569
- ./run
574
+ nix develop
570
575
  ```
571
576
 
572
- Wait for ***BOTH TABS*** to auto-open in your browser.
577
+ Wait for the JupyterLab tab to auto-open, then run the Onboarding notebook to unlock the Pipulate app.
578
+
579
+ **Automating past the boot menu:** `nix develop` ends at a two-door prompt — start Pipulate, or drop to the shell. It fails open, so anything without a terminal (CI, a provisioning script, an SSH session with no tty) starts the app and never sees the prompt. Two environment variables cover the cases that do:
580
+
581
+ | Variable | Effect |
582
+ |----------|--------|
583
+ | `PIPULATE_BOOT_MENU=0` | Skip the prompt entirely and start the app, e.g. `PIPULATE_BOOT_MENU=0 nix develop`. For an unattended terminal that would otherwise wait for a keypress that never comes. |
584
+ | `PIPULATE_BOOT_MENU_TIMEOUT=10` | Keep the prompt, but start the app after N seconds if nobody chooses. Off by default — with a human provably present, the prompt waits indefinitely rather than starting something they didn't ask for. |
573
585
 
574
586
  ### 🚨 Installation Troubleshooting
575
587
 
@@ -690,7 +702,7 @@ Are you a Developer or an End User? Chef or Customer? Understanding your audienc
690
702
  ### 👨‍🍳 The Chef (Developer/Technical User)
691
703
  * **🔧 Workflow Creators:** Build and customize AI-assisted workflows
692
704
  * **📓 Jupyter Porters:** Convert notebook experiments into guided applications
693
- * **🔍 Technical SEOs:** Create sophisticated, reusable SEO processes
705
+ * **🔍 Technical SEOs (and their successors):** Create sophisticated, reusable readiness processes
694
706
  * **⚙️ System Administrators:** Deploy consistent environments across teams
695
707
 
696
708
  **What Chefs Get:**
@@ -700,10 +712,10 @@ Are you a Developer or an End User? Chef or Customer? Understanding your audienc
700
712
  - 🧰 Integrated tooling (Jupyter, local LLM, SQLite)
701
713
 
702
714
  ### 🍽️ The Customer (End User/Non-Technical)
703
- * **📈 SEO Practitioners:** Run powerful workflows without coding
704
- * **✍️ Content Creators:** Use AI-assisted processes for optimization
705
- * **📊 Marketing Teams:** Execute consistent SEO strategies
706
- * **🏢 Business Owners:** Access enterprise-level SEO capabilities
715
+ * **📈 Agentic-Web Practitioners:** Run powerful workflows without coding
716
+ * **✍️ Content Creators:** Use AI-assisted processes for machine legibility
717
+ * **📊 Marketing Teams:** Execute consistent agentic-web strategies
718
+ * **🏢 Business Owners:** Access enterprise-level readiness capabilities
707
719
 
708
720
  **What Customers Get:**
709
721
  - 🚶‍♂️ Guided, step-by-step workflow experiences
@@ -719,9 +731,9 @@ Just as a chef talks about knife techniques while a diner just wants amazing pas
719
731
  **After installation succeeds, here's what to expect:**
720
732
 
721
733
  ### What You'll See
722
- 1. **Two browser tabs open automatically:**
734
+ 1. **JupyterLab opens automatically** for onboarding. Completing the Onboarding notebook unlocks the Pipulate app, which then opens automatically on future launches:
735
+ - `localhost:8888` - JupyterLab for development/experimentation (opens first)
723
736
  - `localhost:5001` - Pipulate web interface with navigation menu
724
- - `localhost:8888` - JupyterLab for development/experimentation
725
737
 
726
738
  2. **In the Pipulate interface:**
727
739
  - Left sidebar with workflow plugins (Introduction, Profiles, etc.)
@@ -738,7 +750,7 @@ Just as a chef talks about knife techniques while a diner just wants amazing pas
738
750
 
739
751
  ### Your Next Steps Depend on Who You Are
740
752
 
741
- **🔍 If you're an SEO practitioner:**
753
+ **🔍 If you're readying clients for the agentic web:**
742
754
  - Click "Introduction" in the left menu for a guided tour
743
755
  - Try the built-in workflows to see the step-by-step pattern
744
756
  - Use the AI chat to ask "How do I create a keyword research workflow?"
@@ -820,11 +832,11 @@ Traditional development follows DRY principles, creating abstract, complex syste
820
832
 
821
833
  ## Developer Setup & Environment Notes
822
834
 
823
- **Nix Environment Activation:** Always run `./run` (a.k.a. `nix develop`) from the `~/pipulate` directory *before* running any project commands (`python server.py`, `pip install`, etc.) in a new terminal. This ensures you are using the correct dependencies defined in `flake.nix`.
835
+ **Nix Environment Activation:** Always run `nix develop` from the `~/pipulate` directory *before* running any project commands (`python server.py`, `pip install`, etc.) in a new terminal. This ensures you are using the correct dependencies defined in `flake.nix`.
824
836
 
825
837
  **Interactive vs. Quiet Shell:**
826
838
 
827
- **Standard Shell:** `./run` (same as `nix develop` or `nix develop .#default`) runs the startup script (`run-script` defined in `flake.nix`) with welcome messages and service startup. Ideal for general use.
839
+ **Standard Shell:** `nix develop` (the same as `nix develop .#default`) runs the startup script (`run-script` defined in `flake.nix`) with welcome messages and service startup. Ideal for general use.
828
840
 
829
841
  **Quiet Shell:** `nix develop .#quiet` activates the Nix environment *without* running the full startup script or launching services automatically. It only sets up paths and installs pip requirements. Use this for:
830
842
  - Running specific commands without starting the servers (e.g., `nix develop .#quiet --command python -c "import pandas"`).
@@ -1407,10 +1419,10 @@ create_workflow.py │ └──────┬──────
1407
1419
  ### Essential Commands
1408
1420
  ```bash
1409
1421
  # Development workflow
1410
- cd ~/pipulate && ./run # Start Pipulate
1422
+ cd ~/pipulate && nix develop # Start Pipulate
1411
1423
  nix develop .#quiet # Start without auto-services
1412
1424
  python server.py # Manual server start
1413
- git pull && ./run # Update to latest
1425
+ git pull && nix develop # Update to latest
1414
1426
 
1415
1427
  # Create new workflows
1416
1428
  python helpers/workflow/create_workflow.py my_workflow.py MyClass my_internal_name
@@ -1702,6 +1714,6 @@ This project is licensed under the MIT License. See the [LICENSE](https://github
1702
1714
 
1703
1715
  **Background Articles:** <a href="https://mikelev.in/">Mike Levin, AI SEO in NYC</a>
1704
1716
 
1705
- **Enhanced Documentation:** <a href="https://pipulate.com/">Pipulate AI SEO Software</a>
1717
+ **Enhanced Documentation:** <a href="https://pipulate.com/">Pipulate: AI-Readiness for the Agentic Web</a>
1706
1718
 
1707
1719
  **On GitHub:** <a href="https://github.com/miklevin/pipulate">Pipulate on GitHub</a>
@@ -2,12 +2,17 @@
2
2
  2. Hi, Auditor! What you're looking for is AUDIT.md ( https://pipulate.com/AUDIT.md )
3
3
  3. And context AI_CONTEXT.md ( https://pipulate.com/AI_CONTEXT.md )
4
4
 
5
- # Pipulate: Local First AI SEO Software
5
+ # Pipulate: Local First AI-Readiness for the Agentic Web
6
6
 
7
- ![Pipulate Free & Open Source SEO with & for LLMs](https://github.com/miklevin/pipulate/raw/main/assets/images/ai-seo-software.png)
8
-
9
- > **Your data. Your AI. Your machine. Your control.**
10
- > No subscriptions, no vendor lock-in, no cloud costs.
7
+ ```text
8
+ ( Like a canary you say? )
9
+ O /) ____ The "No Problem" Framework
10
+ > I HEREBY WILL NOT RE-GENERATE o /)\__// / \ Pipulate - Protecting Your Code
11
+ > Once upon machines be smarten ___(/_ 0 0 | | just by being honest about text.
12
+ > ASCII sealing immutata art in *( ==(_T_)== NPvg | (If mangled, then AI drifted.)
13
+ > This here cony if it's broken \ ) ""\ | | https://pipulate.com
14
+ > Smokin gun drift now in token |__>-\_>_> \____/ 🥕🥕🥕
15
+ ```
11
16
 
12
17
  ## Quick Start: Be Running in 5 Minutes
13
18
 
@@ -21,7 +26,7 @@ curl -fsSL https://pipulate.com/install.sh | bash
21
26
 
22
27
  ```bash
23
28
  # 2. Launch it
24
- nix develop
29
+ cd ~/pipulate && nix develop
25
30
  ```
26
31
 
27
32
  **What you get:** A local web app at `http://localhost:5001` with step-by-step workflows, integrated AI chat, and a JupyterLab instance at `http://localhost:8888`. No cloud required.
@@ -50,10 +55,10 @@ nix develop
50
55
 
51
56
  **Real examples of what people create with Pipulate:**
52
57
 
53
- ### 🔍 SEO Workflows
58
+ ### 🔍 Agentic-Web Readiness Workflows (the craft formerly known as SEO)
54
59
  - **Keyword Research Pipeline**: Input seed keywords → AI expansion → competition analysis → export spreadsheet
55
60
  - **Content Gap Analysis**: Compare your site vs competitors → identify missing topics → prioritized content calendar
56
- - **Technical SEO Audits**: Crawl site → check Core Web Vitals → generate action items → track fixes
61
+ - **Technical Readiness Audits**: Crawl site → check what agents actually see → generate action items → track fixes
57
62
 
58
63
  ### 📊 Data Processing Workflows
59
64
  - **CSV Data Cleaning**: Upload messy data → standardize formats → remove duplicates → validate results
@@ -61,7 +66,7 @@ nix develop
61
66
  - **Report Generation**: Combine multiple data sources → apply business rules → create branded reports
62
67
 
63
68
  ### 🤖 AI-Assisted Workflows
64
- - **Content Creation Pipeline**: Research topics → generate outlines → write drafts → optimize for SEO
69
+ - **Content Creation Pipeline**: Research topics → generate outlines → write drafts → optimize for machine readers
65
70
  - **Data Analysis Helper**: Upload spreadsheet → AI suggests insights → create visualizations → export findings
66
71
 
67
72
  **Key advantage:** Each workflow is a guided, step-by-step process that non-technical users can run repeatedly, while developers can customize the Python code behind each step.
@@ -70,7 +75,7 @@ nix develop
70
75
 
71
76
  ```text
72
77
  ╔═════════════════════════════════════════════════════════════════════════╗ Chip O'What?
73
- ║ 🎭 PIPULATE: LOCAL-FIRST AI SEO SOFTWARE & DIGITAL WORKSHOP ║ , O
78
+ ║ 🎭 PIPULATE: LOCAL-FIRST AI-READINESS & DIGITAL WORKSHOP ║ , O
74
79
  ║ ────────────────────────────────────────────────────────────────────── ║ \\ . O
75
80
  ║ ║ |\\/| o
76
81
  ║ 💬 Chip O'Theseus: "Welcome to your sovereign computing environment!" ║ / " '\
@@ -115,7 +120,7 @@ Think of it as putting guardrails on AI assistance. Instead of asking an AI to "
115
120
  3. 📓 **Transforms Jupyter Notebooks** into production-ready, step-by-step workflows
116
121
  4. 🤖 **Integrated AI assistance** using your own local models with complete privacy
117
122
  5. 🔧 **Reproducible environments** with Nix that work identically across all platforms
118
- 6. 🎯 **Perfect for SEO practitioners** who want to turn technical expertise into guided, reusable workflows
123
+ 6. 🎯 **Perfect for practitioners readying clients for the agentic web** who want to turn technical expertise into guided, reusable workflows
119
124
 
120
125
  --------------------------------------------------------------------------------
121
126
 
@@ -215,7 +220,7 @@ If you are not an Empire builder and prefer craftsmanship over the rat race and
215
220
 
216
221
  ### Primary Goals
217
222
 
218
- 1. **Empower End-Users (e.g., SEO Practitioners):** Enable non-programmers to run powerful, AI-guided workflows (often ported from Jupyter Notebooks) without needing to interact with Python code directly.
223
+ 1. **Empower End-Users (e.g., Agentic-Web Practitioners):** Enable non-programmers to run powerful, AI-guided workflows (often ported from Jupyter Notebooks) without needing to interact with Python code directly.
219
224
  2. **Serve Developers:** Provide a simple, reproducible environment for building these workflows, leveraging integrated tooling like Jupyter, local LLMs, and a streamlined web framework.
220
225
 
221
226
  --------------------------------------------------------------------------------
@@ -507,12 +512,19 @@ The installation procedures labeled "Quick Start Guide" and the main installatio
507
512
 
508
513
  ```bash
509
514
  rm -rf ~/TestProject
510
- curl -L https://pipulate.com/install.sh | bash -s TestProject
515
+ curl -fsSL https://pipulate.com/install.sh | bash -s TestProject
511
516
  cd ~/TestProject
512
- ./run
517
+ nix develop
513
518
  ```
514
519
 
515
- Wait for ***BOTH TABS*** to auto-open in your browser.
520
+ Wait for the JupyterLab tab to auto-open, then run the Onboarding notebook to unlock the Pipulate app.
521
+
522
+ **Automating past the boot menu:** `nix develop` ends at a two-door prompt — start Pipulate, or drop to the shell. It fails open, so anything without a terminal (CI, a provisioning script, an SSH session with no tty) starts the app and never sees the prompt. Two environment variables cover the cases that do:
523
+
524
+ | Variable | Effect |
525
+ |----------|--------|
526
+ | `PIPULATE_BOOT_MENU=0` | Skip the prompt entirely and start the app, e.g. `PIPULATE_BOOT_MENU=0 nix develop`. For an unattended terminal that would otherwise wait for a keypress that never comes. |
527
+ | `PIPULATE_BOOT_MENU_TIMEOUT=10` | Keep the prompt, but start the app after N seconds if nobody chooses. Off by default — with a human provably present, the prompt waits indefinitely rather than starting something they didn't ask for. |
516
528
 
517
529
  ### 🚨 Installation Troubleshooting
518
530
 
@@ -633,7 +645,7 @@ Are you a Developer or an End User? Chef or Customer? Understanding your audienc
633
645
  ### 👨‍🍳 The Chef (Developer/Technical User)
634
646
  * **🔧 Workflow Creators:** Build and customize AI-assisted workflows
635
647
  * **📓 Jupyter Porters:** Convert notebook experiments into guided applications
636
- * **🔍 Technical SEOs:** Create sophisticated, reusable SEO processes
648
+ * **🔍 Technical SEOs (and their successors):** Create sophisticated, reusable readiness processes
637
649
  * **⚙️ System Administrators:** Deploy consistent environments across teams
638
650
 
639
651
  **What Chefs Get:**
@@ -643,10 +655,10 @@ Are you a Developer or an End User? Chef or Customer? Understanding your audienc
643
655
  - 🧰 Integrated tooling (Jupyter, local LLM, SQLite)
644
656
 
645
657
  ### 🍽️ The Customer (End User/Non-Technical)
646
- * **📈 SEO Practitioners:** Run powerful workflows without coding
647
- * **✍️ Content Creators:** Use AI-assisted processes for optimization
648
- * **📊 Marketing Teams:** Execute consistent SEO strategies
649
- * **🏢 Business Owners:** Access enterprise-level SEO capabilities
658
+ * **📈 Agentic-Web Practitioners:** Run powerful workflows without coding
659
+ * **✍️ Content Creators:** Use AI-assisted processes for machine legibility
660
+ * **📊 Marketing Teams:** Execute consistent agentic-web strategies
661
+ * **🏢 Business Owners:** Access enterprise-level readiness capabilities
650
662
 
651
663
  **What Customers Get:**
652
664
  - 🚶‍♂️ Guided, step-by-step workflow experiences
@@ -662,9 +674,9 @@ Just as a chef talks about knife techniques while a diner just wants amazing pas
662
674
  **After installation succeeds, here's what to expect:**
663
675
 
664
676
  ### What You'll See
665
- 1. **Two browser tabs open automatically:**
677
+ 1. **JupyterLab opens automatically** for onboarding. Completing the Onboarding notebook unlocks the Pipulate app, which then opens automatically on future launches:
678
+ - `localhost:8888` - JupyterLab for development/experimentation (opens first)
666
679
  - `localhost:5001` - Pipulate web interface with navigation menu
667
- - `localhost:8888` - JupyterLab for development/experimentation
668
680
 
669
681
  2. **In the Pipulate interface:**
670
682
  - Left sidebar with workflow plugins (Introduction, Profiles, etc.)
@@ -681,7 +693,7 @@ Just as a chef talks about knife techniques while a diner just wants amazing pas
681
693
 
682
694
  ### Your Next Steps Depend on Who You Are
683
695
 
684
- **🔍 If you're an SEO practitioner:**
696
+ **🔍 If you're readying clients for the agentic web:**
685
697
  - Click "Introduction" in the left menu for a guided tour
686
698
  - Try the built-in workflows to see the step-by-step pattern
687
699
  - Use the AI chat to ask "How do I create a keyword research workflow?"
@@ -763,11 +775,11 @@ Traditional development follows DRY principles, creating abstract, complex syste
763
775
 
764
776
  ## Developer Setup & Environment Notes
765
777
 
766
- **Nix Environment Activation:** Always run `./run` (a.k.a. `nix develop`) from the `~/pipulate` directory *before* running any project commands (`python server.py`, `pip install`, etc.) in a new terminal. This ensures you are using the correct dependencies defined in `flake.nix`.
778
+ **Nix Environment Activation:** Always run `nix develop` from the `~/pipulate` directory *before* running any project commands (`python server.py`, `pip install`, etc.) in a new terminal. This ensures you are using the correct dependencies defined in `flake.nix`.
767
779
 
768
780
  **Interactive vs. Quiet Shell:**
769
781
 
770
- **Standard Shell:** `./run` (same as `nix develop` or `nix develop .#default`) runs the startup script (`run-script` defined in `flake.nix`) with welcome messages and service startup. Ideal for general use.
782
+ **Standard Shell:** `nix develop` (the same as `nix develop .#default`) runs the startup script (`run-script` defined in `flake.nix`) with welcome messages and service startup. Ideal for general use.
771
783
 
772
784
  **Quiet Shell:** `nix develop .#quiet` activates the Nix environment *without* running the full startup script or launching services automatically. It only sets up paths and installs pip requirements. Use this for:
773
785
  - Running specific commands without starting the servers (e.g., `nix develop .#quiet --command python -c "import pandas"`).
@@ -1350,10 +1362,10 @@ create_workflow.py │ └──────┬──────
1350
1362
  ### Essential Commands
1351
1363
  ```bash
1352
1364
  # Development workflow
1353
- cd ~/pipulate && ./run # Start Pipulate
1365
+ cd ~/pipulate && nix develop # Start Pipulate
1354
1366
  nix develop .#quiet # Start without auto-services
1355
1367
  python server.py # Manual server start
1356
- git pull && ./run # Update to latest
1368
+ git pull && nix develop # Update to latest
1357
1369
 
1358
1370
  # Create new workflows
1359
1371
  python helpers/workflow/create_workflow.py my_workflow.py MyClass my_internal_name
@@ -1645,6 +1657,6 @@ This project is licensed under the MIT License. See the [LICENSE](https://github
1645
1657
 
1646
1658
  **Background Articles:** <a href="https://mikelev.in/">Mike Levin, AI SEO in NYC</a>
1647
1659
 
1648
- **Enhanced Documentation:** <a href="https://pipulate.com/">Pipulate AI SEO Software</a>
1660
+ **Enhanced Documentation:** <a href="https://pipulate.com/">Pipulate: AI-Readiness for the Agentic Web</a>
1649
1661
 
1650
1662
  **On GitHub:** <a href="https://github.com/miklevin/pipulate">Pipulate on GitHub</a>
@@ -1,5 +1,5 @@
1
1
  """
2
- Pipulate: A hand-cranked, local-first AI SEO software framework.
2
+ Pipulate: A hand-cranked, local-first AI-readiness software framework — the successor to AI SEO software.
3
3
 
4
4
  Your data. Your AI. Your machine. Your control.
5
5
 
@@ -12,12 +12,16 @@ Usage:
12
12
  pipulate
13
13
  """
14
14
 
15
- __version__ = "1.99"
16
- __version_description__ = "Softwired Paths"
15
+ __version__ = "2.02"
16
+ __version_description__ = "Operation Stick Bug"
17
+ # SPDX expression, single source of truth, synced into pyproject.toml by
18
+ # scripts/release/version_sync.py. "-or-later" (not bare AGPL-3.0, which is
19
+ # deprecated SPDX) because the header below grants "any later version".
20
+ __license__ = "AGPL-3.0-or-later"
17
21
  __email__ = "pipulate@gmail.com"
18
- __description__ = "A Notebook-inspired Hand-cranked Agentic Framework"
22
+ __description__ = "AI-readiness for the agentic web — local-first, Nix-reproducible workflows. The successor to AI SEO software."
19
23
 
20
- # Pipulate: A hand-cranked, local-first AI SEO software framework.
24
+ # Pipulate: A hand-cranked, local-first AI-readiness software framework — the successor to AI SEO software.
21
25
  # Copyright (C) 2026 Michael Jay Levin
22
26
  #
23
27
  # This program is free software: you can redistribute it and/or modify
@@ -84,30 +84,47 @@ class IntroductionPlugin:
84
84
  except Exception as e:
85
85
  logger.warning(f"Could not verify config pipeline state: {e}")
86
86
  dynamic_app_name = self.wand.get_config().APP_NAME
87
- active_model = self.wand.db.get('active_local_model', 'an external provider')
87
+ active_model = self.wand.db.get('active_local_model', 'not yet selected')
88
88
 
89
89
  if not operator_name:
90
- # STATE 1: The Bouncer Persona (Airlock has not fired)
90
+ # STATE 1: The Doorway (Airlock has not fired)
91
+ # ATTRIBUTED VOICE: the first thing a stranger hears must say
92
+ # what is producing it. This is Piper reading a fixed string,
93
+ # so it says so, and it does not borrow a persona to do it.
91
94
  msg = (
92
- "Halt. I am Chip O'Theseus. My speech is generated entirely on your machine, "
93
- "but you are trying to sneak into the VIP lounge through the kitchen. "
94
- "You have discovered port 5001, but the doors to the Control Room remain sealed until you complete the initiation rite. "
95
- "Return to your JupyterLab tab, execute the Golden Path, and drop the sentinel file."
95
+ "One disclosure before anything else. This voice is Piper, a speech "
96
+ "synthesizer running entirely on your machine, reading a fixed script. "
97
+ "There is no language model behind it yet. You have found port 5001 early, "
98
+ "which is fine, but this room fills in as you finish onboarding. "
99
+ "Head back to your JupyterLab tab, run the Onboarding notebook top to bottom, "
100
+ "and this page will have something worth saying."
96
101
  )
97
- return "Access Denied 🛑", msg, None
102
+ return "Onboarding Not Finished 🔒", msg, None
98
103
 
99
104
  elif not has_configured:
100
- # STATE 2: The Guide Persona (Airlock fired, but Configuration is pending)
105
+ # STATE 2: The Guide (Airlock fired, but Configuration is pending)
106
+ # The demo is a scripted scenario driven by player-piano.js, so
107
+ # it is a tour OF THE SYSTEM, never of anyone's "capabilities."
101
108
  msg = (
102
- f"Welcome to {dynamic_app_name}, {operator_name}. I am Chip O'Theseus. To see a demonstration of my capabilities, press ",
109
+ f"Welcome to {dynamic_app_name}, {operator_name}. This voice is still a local "
110
+ "speech synthesizer reading a script, not a language model. The thinking "
111
+ "engines, local and cloud, get wired up next in Configuration. For a scripted "
112
+ "tour of the interface, press ",
103
113
  Strong("Ctrl+Alt+D", cls="platform-shortcut"),
104
114
  " right now. Otherwise, we will proceed to finalize your configuration."
105
115
  )
106
116
  return "Welcome", msg, 'finalize'
107
117
 
108
118
  else:
109
- # STATE 3: The Veteran Persona (Config workflow is finalized)
110
- msg = f"Welcome back to {dynamic_app_name}, {operator_name}. All systems are online and ready."
119
+ # STATE 3: The Veteran (Config workflow is finalized)
120
+ # Even here the narration stays scripted. The model name is a
121
+ # receipt, so it is spoken only about the engine, never as a
122
+ # claim about the speaker.
123
+ msg = (
124
+ f"Welcome back to {dynamic_app_name}, {operator_name}. This narration is still "
125
+ f"scripted speech, not inference. Your local engine is {active_model}. Anything "
126
+ "a model actually generates from here on will name the model that generated it."
127
+ )
111
128
  return "Dashboard Ready ✅", msg, None
112
129
 
113
130
  elif step_id == 'finalize':
@@ -132,6 +149,10 @@ class IntroductionPlugin:
132
149
  else:
133
150
  text = str(content)
134
151
 
152
+ # Markup stripping lives at the voice boundary (the ACOUSTIC SANITIZER
153
+ # in imports/voice_synthesis.py), which every caller crosses. Duplicated
154
+ # here it was harmless but drift-prone, so it moved rather than doubled.
155
+
135
156
 
136
157
  from imports.voice_synthesis import chip_voice_system
137
158
  if chip_voice_system and chip_voice_system.voice_ready:
@@ -206,7 +227,7 @@ class IntroductionPlugin:
206
227
 
207
228
  return Div(
208
229
  onload_trigger,
209
- Card(
230
+ Article(
210
231
  Div(
211
232
  H2(title, style="display: inline-block; margin-bottom: 0;"),
212
233
  encore_btn,