pipulate 2.68__tar.gz → 2.70__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.68 → pipulate-2.70}/.agents/skills/journal/references/index.md +8 -5
- {pipulate-2.68 → pipulate-2.70}/AGENTS.md +13 -7
- {pipulate-2.68 → pipulate-2.70}/PKG-INFO +1 -1
- {pipulate-2.68 → pipulate-2.70}/__init__.py +2 -2
- {pipulate-2.68 → pipulate-2.70}/imports/ascii_displays.py +9 -9
- {pipulate-2.68 → pipulate-2.70}/pipulate.egg-info/PKG-INFO +1 -1
- {pipulate-2.68 → pipulate-2.70}/pyproject.toml +1 -1
- {pipulate-2.68 → pipulate-2.70}/.agents/skills/gsc-readonly/SKILL.md +0 -0
- {pipulate-2.68 → pipulate-2.70}/.agents/skills/hello-workflow/SKILL.md +0 -0
- {pipulate-2.68 → pipulate-2.70}/.agents/skills/journal/SKILL.md +0 -0
- {pipulate-2.68 → pipulate-2.70}/.agents/skills/pipulate/SKILL.md +0 -0
- {pipulate-2.68 → pipulate-2.70}/.agents/skills/roles/SKILL.md +0 -0
- {pipulate-2.68 → pipulate-2.70}/.agents/skills/sheets-readonly/SKILL.md +0 -0
- {pipulate-2.68 → pipulate-2.70}/AUDIT.md +0 -0
- {pipulate-2.68 → pipulate-2.70}/LICENSE +0 -0
- {pipulate-2.68 → pipulate-2.70}/MANIFEST.in +0 -0
- {pipulate-2.68 → pipulate-2.70}/README.md +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/010_introduction.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/015_config.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/020_profiles.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/025_aspect.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/030_roles.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/040_hello_workflow.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/050_documentation.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/060_tasks.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/070_history.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/110_parameter_buster.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/120_link_graph.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/130_gap_analysis.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/200_workflow_genesis.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/210_widget_examples.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/220_roadmap.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/230_dev_assistant.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/240_simon_mcp.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/300_blank_placeholder.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/400_botify_trifecta.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/440_browser_automation.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/450_stream_simulator.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/510_text_field.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/520_text_area.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/530_dropdown.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/540_checkboxes.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/550_radios.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/560_range.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/570_switch.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/580_upload.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/610_markdown.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/620_mermaid.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/630_prism.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/640_javascript.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/710_pandas.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/720_rich.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/730_matplotlib.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/810_webbrowser.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/820_selenium.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/apps/830_pico_slider.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/cli.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/config.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/__init__.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/ai_dictdb.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/ai_tool_discovery_simple_parser.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/append_only_conversation.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/botify/__init__.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/botify/code_generators.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/botify/true_schema_discoverer.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/botify_code_generation.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/crud.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/database_safety_wrapper.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/dom_processing/__init__.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/dom_processing/ai_dom_beautifier.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/dom_processing/enhanced_dom_processor.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/durable_backup_system.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/mcp_orchestrator.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/server_logging.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/stream_orchestrator.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/imports/voice_synthesis.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/pipulate/__init__.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/pipulate/core.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/pipulate.egg-info/SOURCES.txt +0 -0
- {pipulate-2.68 → pipulate-2.70}/pipulate.egg-info/dependency_links.txt +0 -0
- {pipulate-2.68 → pipulate-2.70}/pipulate.egg-info/entry_points.txt +0 -0
- {pipulate-2.68 → pipulate-2.70}/pipulate.egg-info/requires.txt +0 -0
- {pipulate-2.68 → pipulate-2.70}/pipulate.egg-info/top_level.txt +0 -0
- {pipulate-2.68 → pipulate-2.70}/server.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/setup.cfg +0 -0
- {pipulate-2.68 → pipulate-2.70}/tests/test_apply_airlock.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tests/test_mck_rep2.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/__init__.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/advanced_automation_tools.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/botify_tools.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/connector_tools.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/conversation_tools.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/dom_tools.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/keychain_tools.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/llm_optics.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/mcp_tools.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/scraper_tools.py +0 -0
- {pipulate-2.68 → pipulate-2.70}/tools/system_tools.py +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# The Pipulate journal, indexed
|
|
2
2
|
|
|
3
|
-
> Auto-generated on 2026-09-
|
|
3
|
+
> Auto-generated on 2026-09-29 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.
|
|
5
|
+
> the rest of the repo is newer than this map. 1503 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,9 @@ 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-09-29] [The Deed Is Named for the Door: Engineering Replayable QA Archives for AI](https://mikelev.in/futureproof/the-deed-is-named-for-the-door-qa-archive-zip/index.md)
|
|
31
|
+
- [2026-09-29] [The Qamy Door and the Cellular Witness: Launching a Third Domain with Replayable Receipts](https://mikelev.in/futureproof/qamy-door-cellular-witness-replayable-receipts/index.md)
|
|
32
|
+
- [2026-09-28] [The Forward-Slash Test: Bridging Agent Skills to Claude Code with Verifiable Receipts](https://mikelev.in/futureproof/the-forward-slash-test-claude-skills-bridge/index.md)
|
|
30
33
|
- [2026-09-28] [AGENTS.md and Agent Skills: Refactoring Pipulate for a Checkable PyPI Release](https://mikelev.in/futureproof/agents-md-agent-skills-pypi-receipts/index.md)
|
|
31
34
|
- [2026-09-28] [The Cost of Forgetting: The Epistemic Price List and the Art of the Lean Codebase](https://mikelev.in/futureproof/the-forgetting-kata-and-the-epistemic-price-list/index.md)
|
|
32
35
|
- [2026-09-28] [Pinball, Pachinko, and the Art of Replayable AI Workflows](https://mikelev.in/futureproof/pinball-pachinko-replayable-ai-workflows/index.md)
|
|
@@ -44,14 +47,14 @@ URL as: `https://mikelev.in/futureproof/{slug}/index.md`
|
|
|
44
47
|
- [2026-09-19] [The Color Blue and the Pipe: Inspecting Code Before Execution](https://mikelev.in/futureproof/color-blue-pipe-inspecting-code/index.md)
|
|
45
48
|
- [2026-09-19] [Edna Mode Rules for AI Workflows: Why Practical Tooling Beats Fragile Abstractions](https://mikelev.in/futureproof/edna-mode-rules-for-ai-workflows/index.md)
|
|
46
49
|
- [2026-09-18] [The One-Door Threshold: Engineering Replayable AI Workflows and Quiet Shells](https://mikelev.in/futureproof/the-one-door-threshold-replayable-ai-workflows/index.md)
|
|
47
|
-
- [2026-09-18] [The First Ten Minutes: Engineering Reproducible AI Workflows in the Age of AI](https://mikelev.in/futureproof/the-first-ten-minutes-reproducible-ai-workflows/index.md)
|
|
48
|
-
- [2026-09-17] [The Retrieval Cue: Memory Consolidation and Selective Hydration in the Age of AI](https://mikelev.in/futureproof/retrieval-cue-memory-consolidation-selective-hydration/index.md)
|
|
49
|
-
- [2026-09-17] [The Voice Asks First: Engineering Verifiable Consent and Silent Defaults](https://mikelev.in/futureproof/the-voice-asks-first-verifiable-consent/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-09-18] [292k] the-first-ten-minutes-reproducible-ai-workflows
|
|
56
|
+
- [2026-09-17] [184k] retrieval-cue-memory-consolidation-selective-hydration
|
|
57
|
+
- [2026-09-17] [239k] the-voice-asks-first-verifiable-consent
|
|
55
58
|
- [2026-09-17] [122k] the-workbench-pin-and-the-help-screen-census
|
|
56
59
|
- [2026-09-17] [54k] useless-machine-oauth-replayable-workflows
|
|
57
60
|
- [2026-09-17] [89k] escaped-monopolies-and-replayable-receipts
|
|
@@ -5,10 +5,10 @@ This repository carries Agent Skills under https://agentskills.io/specification
|
|
|
5
5
|
demand), with this file as the nearest-ancestor signpost that points at
|
|
6
6
|
executable truth instead of duplicating it. Every tool call taught here runs
|
|
7
7
|
on localhost under the POSIX conventions of a command, stdin, stdout and an
|
|
8
|
-
exit code, so that its output lands in the sealed compile (`
|
|
9
|
-
receipt; a cloud-side tool call that cannot be
|
|
10
|
-
non-reproducible, non-portable, cannot be compiled into
|
|
11
|
-
out of scope by that rule, not by taste.
|
|
8
|
+
exit code, so that its output lands in the sealed compile (`qamy.ai.zip`, the
|
|
9
|
+
QA archive zip) as a receipt; a cloud-side tool call that cannot be
|
|
10
|
+
reconstructed here is non-reproducible, non-portable, cannot be compiled into
|
|
11
|
+
that archive, and is out of scope by that rule, not by taste.
|
|
12
12
|
|
|
13
13
|
This repo predates those conventions and complies with them by *pointing*,
|
|
14
14
|
not duplicating. Do not add sibling status .md files; anything written here
|
|
@@ -54,9 +54,15 @@ run since the sentinels landed.
|
|
|
54
54
|
## Context (how this repo talks to AI)
|
|
55
55
|
|
|
56
56
|
- `prompt_foo.py` compiles context payloads; `foo_files.py` is its router.
|
|
57
|
-
- Each compile emits `
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
- Each compile emits `qamy.ai.zip`, the QA archive zip: a portable
|
|
58
|
+
AGENTS-class archive holding `payload.md`, `prompt.md` and `manifest.json`,
|
|
59
|
+
whose YAML frontmatter (`type: qa-zip-archive`) names its entrypoint. The
|
|
60
|
+
actionable request is always in the final section labeled
|
|
61
|
+
`--- START: Prompt ---`. A rotated copy, `qamy.ai_<deed>-<hash8>.zip`, is
|
|
62
|
+
minted beside it, the deed number first so a listing reads in order and the
|
|
63
|
+
domain on the file so a recipient knows where it is explained;
|
|
64
|
+
`python scripts/foo_cartridge.py <that zip>` verifies one with the standard
|
|
65
|
+
library alone.
|
|
60
66
|
|
|
61
67
|
## Edits (the executable version of "PR instructions")
|
|
62
68
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pipulate
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.70
|
|
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.70"
|
|
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.68"
|
|
|
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__ = "
|
|
26
|
+
__version_description__ = "New Installer Messaging"
|
|
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".
|
|
@@ -53,7 +53,7 @@ console = Console()
|
|
|
53
53
|
# To add a new entry: print(binascii.crc32(your_art_string.encode('utf-8')))
|
|
54
54
|
|
|
55
55
|
FIGURATE_LEDGER: dict = {
|
|
56
|
-
"white_rabbit":
|
|
56
|
+
"white_rabbit": 509925915,
|
|
57
57
|
"player_piano": 3357002674,
|
|
58
58
|
"clipboard": 858911667,
|
|
59
59
|
"bunny_trail": 615479347,
|
|
@@ -608,17 +608,17 @@ def _expand_color_bits_ai(text: str) -> str:
|
|
|
608
608
|
def _figurate_white_rabbit():
|
|
609
609
|
"""Render white_rabbit as (human, ai) tuple for FIGURATE_REGISTRY."""
|
|
610
610
|
art = r"""
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
>
|
|
614
|
-
>
|
|
615
|
-
>
|
|
616
|
-
>
|
|
617
|
-
>
|
|
611
|
+
( Do you put your name on it because Claude said so? )
|
|
612
|
+
O /) __
|
|
613
|
+
> Do you think the Aviation industry o /)\__// / \ "What Claude said" is a Cockpit
|
|
614
|
+
> vibe-codes without checking for ___(/_ 0 0 | | Voice Recorder (CVR) hear-say of a
|
|
615
|
+
> confident hallucinations? So then *( ==(_T_)== QA | subcontractor. This tool is a Flight
|
|
616
|
+
> why should you? If anyone relies on \ ) ""\ | | Data Recorder (FDR) for High Reliability
|
|
617
|
+
> your work then you should Q/A it. |__>-\_>_> \__/ Organizations (HROs). Use when it matters.
|
|
618
618
|
"""
|
|
619
619
|
ai_art = _expand_color_bits_ai(art)
|
|
620
620
|
human_art = _expand_color_bits_human(art)
|
|
621
|
-
human = Panel(human_art, title="
|
|
621
|
+
human = Panel(human_art, title="QA My AI: Is what Claude said True?", border_style="white")
|
|
622
622
|
return human, ai_art
|
|
623
623
|
|
|
624
624
|
def _figurate_player_piano():
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pipulate
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.70
|
|
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.70"
|
|
9
9
|
authors = [
|
|
10
10
|
{ name="Mike Levin", email="pipulate@gmail.com" },
|
|
11
11
|
]
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|