metamuse-cli 0.1.0a1__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.
- metamuse_cli-0.1.0a1/.gitattributes +2 -0
- metamuse_cli-0.1.0a1/.github/workflows/ci.yml +245 -0
- metamuse_cli-0.1.0a1/.github/workflows/pages.yml +57 -0
- metamuse_cli-0.1.0a1/.github/workflows/publish.yml +176 -0
- metamuse_cli-0.1.0a1/.gitignore +17 -0
- metamuse_cli-0.1.0a1/.python-version +1 -0
- metamuse_cli-0.1.0a1/AGENTS.md +35 -0
- metamuse_cli-0.1.0a1/LICENSE +202 -0
- metamuse_cli-0.1.0a1/PKG-INFO +258 -0
- metamuse_cli-0.1.0a1/README.md +230 -0
- metamuse_cli-0.1.0a1/THIRD_PARTY_NOTICES.md +247 -0
- metamuse_cli-0.1.0a1/docs/ALPHA_RELEASE.md +120 -0
- metamuse_cli-0.1.0a1/docs/CONNECTED_WORKFLOW.md +104 -0
- metamuse_cli-0.1.0a1/docs/GETTING_STARTED.md +65 -0
- metamuse_cli-0.1.0a1/docs/design/01_PLAN.md +80 -0
- metamuse_cli-0.1.0a1/docs/design/02_SPEC.md +1500 -0
- metamuse_cli-0.1.0a1/docs/design/03_SDS.md +1749 -0
- metamuse_cli-0.1.0a1/docs/design/04_BACKLOG.md +30 -0
- metamuse_cli-0.1.0a1/docs/design/05_ACCEPTANCE.md +78 -0
- metamuse_cli-0.1.0a1/docs/design/06_SOURCES.md +20 -0
- metamuse_cli-0.1.0a1/docs/design/AGENTS.md +15 -0
- metamuse_cli-0.1.0a1/docs/design/CODING_AGENT_KICKOFF.md +9 -0
- metamuse_cli-0.1.0a1/docs/design/DESIGN_VALIDATION_REPORT.json +19 -0
- metamuse_cli-0.1.0a1/docs/design/MANIFEST.json +131 -0
- metamuse_cli-0.1.0a1/docs/design/MetaMuse_CLI_Plan_Spec_SDS_v1.1.md +3366 -0
- metamuse_cli-0.1.0a1/docs/design/README.md +22 -0
- metamuse_cli-0.1.0a1/docs/design/appendices/FEATURE_INVENTORY.md +52 -0
- metamuse_cli-0.1.0a1/docs/design/contracts/README.md +77 -0
- metamuse_cli-0.1.0a1/docs/design/contracts/acceptance-cases.json +437 -0
- metamuse_cli-0.1.0a1/docs/design/contracts/backlog.json +180 -0
- metamuse_cli-0.1.0a1/docs/design/contracts/envelope.schema.json +377 -0
- metamuse_cli-0.1.0a1/docs/design/contracts/mcp-tools.json +8581 -0
- metamuse_cli-0.1.0a1/docs/design/contracts/requirements.json +197 -0
- metamuse_cli-0.1.0a1/docs/design/examples/captions.vtt +4 -0
- metamuse_cli-0.1.0a1/docs/design/examples/comments.jsonl +1 -0
- metamuse_cli-0.1.0a1/docs/design/examples/metamuse.example.toml +17 -0
- metamuse_cli-0.1.0a1/docs/design/examples/tool-call.json +24 -0
- metamuse_cli-0.1.0a1/docs/design/examples/tool-result.json +15 -0
- metamuse_cli-0.1.0a1/docs/design/skills/metamuse/SKILL.md +61 -0
- metamuse_cli-0.1.0a1/docs/design/validate_design_pack.py +99 -0
- metamuse_cli-0.1.0a1/docs/dev/B01_SOURCES_COMPAT.md +249 -0
- metamuse_cli-0.1.0a1/docs/dev/COLLECT.md +828 -0
- metamuse_cli-0.1.0a1/docs/dev/CONTENT_API.md +428 -0
- metamuse_cli-0.1.0a1/docs/dev/CORE_API.md +1187 -0
- metamuse_cli-0.1.0a1/docs/dev/FACEBOOK.md +828 -0
- metamuse_cli-0.1.0a1/docs/dev/MCP.md +117 -0
- metamuse_cli-0.1.0a1/docs/dev/MUSE.md +982 -0
- metamuse_cli-0.1.0a1/docs/dev/MUSE_SPIKE.md +369 -0
- metamuse_cli-0.1.0a1/docs/dev/OFFLINE_SLICE.md +163 -0
- metamuse_cli-0.1.0a1/docs/dev/PUBLISHING.md +153 -0
- metamuse_cli-0.1.0a1/docs/dev/SAFETY_API.md +860 -0
- metamuse_cli-0.1.0a1/docs/dev/SITE.md +157 -0
- metamuse_cli-0.1.0a1/docs/dev/SKILL.md +23 -0
- metamuse_cli-0.1.0a1/docs/dev/STATUS.md +38 -0
- metamuse_cli-0.1.0a1/pyproject.toml +67 -0
- metamuse_cli-0.1.0a1/scripts/capture_site.py +971 -0
- metamuse_cli-0.1.0a1/scripts/check_installed_journeys.sh +35 -0
- metamuse_cli-0.1.0a1/scripts/check_site.py +166 -0
- metamuse_cli-0.1.0a1/scripts/ci_cohorts.py +212 -0
- metamuse_cli-0.1.0a1/scripts/configure_demo_workspace.py +38 -0
- metamuse_cli-0.1.0a1/scripts/installed_journeys.py +327 -0
- metamuse_cli-0.1.0a1/scripts/mcp_demo.py +147 -0
- metamuse_cli-0.1.0a1/scripts/pytest_diagnostics.py +117 -0
- metamuse_cli-0.1.0a1/scripts/run_facebook_mutants.py +398 -0
- metamuse_cli-0.1.0a1/scripts/site_lib.py +421 -0
- metamuse_cli-0.1.0a1/scripts/smoke_wheel.sh +227 -0
- metamuse_cli-0.1.0a1/scripts/try_local.py +8 -0
- metamuse_cli-0.1.0a1/site/.nojekyll +0 -0
- metamuse_cli-0.1.0a1/site/404.html +20 -0
- metamuse_cli-0.1.0a1/site/README.md +37 -0
- metamuse_cli-0.1.0a1/site/app.js +95 -0
- metamuse_cli-0.1.0a1/site/favicon.svg +1 -0
- metamuse_cli-0.1.0a1/site/flow.css +495 -0
- metamuse_cli-0.1.0a1/site/flow.js +751 -0
- metamuse_cli-0.1.0a1/site/images/00-hero.png +0 -0
- metamuse_cli-0.1.0a1/site/images/00-hero.txt +9 -0
- metamuse_cli-0.1.0a1/site/images/01-setup.png +0 -0
- metamuse_cli-0.1.0a1/site/images/01-setup.txt +28 -0
- metamuse_cli-0.1.0a1/site/images/02-queue.png +0 -0
- metamuse_cli-0.1.0a1/site/images/02-queue.txt +30 -0
- metamuse_cli-0.1.0a1/site/images/03-search.png +0 -0
- metamuse_cli-0.1.0a1/site/images/03-search.txt +18 -0
- metamuse_cli-0.1.0a1/site/images/04-packet.png +0 -0
- metamuse_cli-0.1.0a1/site/images/04-packet.txt +22 -0
- metamuse_cli-0.1.0a1/site/images/05-approval-preview.png +0 -0
- metamuse_cli-0.1.0a1/site/images/05-approval-preview.txt +20 -0
- metamuse_cli-0.1.0a1/site/images/06-human-approval.png +0 -0
- metamuse_cli-0.1.0a1/site/images/06-human-approval.txt +29 -0
- metamuse_cli-0.1.0a1/site/images/07-fixture-discussion.png +0 -0
- metamuse_cli-0.1.0a1/site/images/07-fixture-discussion.txt +26 -0
- metamuse_cli-0.1.0a1/site/images/08-fixture-follow-up.png +0 -0
- metamuse_cli-0.1.0a1/site/images/08-fixture-follow-up.txt +25 -0
- metamuse_cli-0.1.0a1/site/images/09-host-draft.png +0 -0
- metamuse_cli-0.1.0a1/site/images/09-host-draft.txt +13 -0
- metamuse_cli-0.1.0a1/site/images/10-local-export.png +0 -0
- metamuse_cli-0.1.0a1/site/images/10-local-export.txt +21 -0
- metamuse_cli-0.1.0a1/site/images/11-mcp-worker.png +0 -0
- metamuse_cli-0.1.0a1/site/images/11-mcp-worker.txt +25 -0
- metamuse_cli-0.1.0a1/site/images/12-skill-export.png +0 -0
- metamuse_cli-0.1.0a1/site/images/12-skill-export.txt +19 -0
- metamuse_cli-0.1.0a1/site/images/README.md +232 -0
- metamuse_cli-0.1.0a1/site/images/manifest.json +619 -0
- metamuse_cli-0.1.0a1/site/index.html +59 -0
- metamuse_cli-0.1.0a1/site/lang.js +23 -0
- metamuse_cli-0.1.0a1/site/logo.svg +1 -0
- metamuse_cli-0.1.0a1/site/page.json +812 -0
- metamuse_cli-0.1.0a1/site/robots.txt +3 -0
- metamuse_cli-0.1.0a1/site/sitemap.xml +4 -0
- metamuse_cli-0.1.0a1/site/styles.css +1535 -0
- metamuse_cli-0.1.0a1/skills/metamuse/SKILL.md +61 -0
- metamuse_cli-0.1.0a1/skills/metamuse/references/degradation.md +73 -0
- metamuse_cli-0.1.0a1/skills/metamuse/references/limits.md +29 -0
- metamuse_cli-0.1.0a1/skills/metamuse/references/tools.md +155 -0
- metamuse_cli-0.1.0a1/spikes/muse/associate.py +576 -0
- metamuse_cli-0.1.0a1/spikes/muse/framing.py +541 -0
- metamuse_cli-0.1.0a1/spikes/muse/handshake.py +128 -0
- metamuse_cli-0.1.0a1/spikes/muse/loop.py +294 -0
- metamuse_cli-0.1.0a1/spikes/muse/test_spike.py +779 -0
- metamuse_cli-0.1.0a1/src/metamuse/__init__.py +3 -0
- metamuse_cli-0.1.0a1/src/metamuse/_browser_egress.py +759 -0
- metamuse_cli-0.1.0a1/src/metamuse/_facebook_capture.py +844 -0
- metamuse_cli-0.1.0a1/src/metamuse/_facebook_dom.py +135 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_adapters.py +160 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_associate.py +584 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_codec.py +615 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_components.py +74 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_fixture.py +183 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_handshake_payloads.py +106 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_http.py +658 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_lifecycle.py +1951 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_link.py +392 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_noise.py +249 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_redact.py +387 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_research.py +535 -0
- metamuse_cli-0.1.0a1/src/metamuse/_muse_trust.py +68 -0
- metamuse_cli-0.1.0a1/src/metamuse/app.py +471 -0
- metamuse_cli-0.1.0a1/src/metamuse/cli.py +845 -0
- metamuse_cli-0.1.0a1/src/metamuse/collect.py +2403 -0
- metamuse_cli-0.1.0a1/src/metamuse/config.py +188 -0
- metamuse_cli-0.1.0a1/src/metamuse/connect.py +148 -0
- metamuse_cli-0.1.0a1/src/metamuse/content.py +1060 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/examples/event-comments.jsonl +3 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/migrations/001_initial.sql +261 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/migrations/002_collect_media.sql +105 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/migrations/003_muse_lifecycle.sql +160 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/migrations/004_muse_evidence.sql +26 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/migrations/005_muse_trust.sql +533 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/migrations/006_transcript_removal.sql +4 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/migrations/007_publication.sql +95 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Asset.json +61 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/AuthImportRequest.json +43 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Capability.json +61 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Discussion.json +385 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Draft.json +35 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/DraftRevision.json +154 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Event.json +72 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/EvidenceRef.json +52 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Exchange.json +487 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Export.json +112 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Item.json +88 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/ItemAsset.json +35 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/ItemRevision.json +100 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Job.json +184 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/JobResult.json +60 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/JobStep.json +126 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Message.json +128 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/MuseObservation.json +69 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Packet.json +127 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Permit.json +104 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/PermitCreateRequest.json +100 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Project.json +34 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Publication.json +121 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/PublicationAttempt.json +54 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Source.json +102 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/SourceAsset.json +37 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/TranscriptSegment.json +127 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/envelope.json +377 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/mcp-tools.json +8581 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_collect.input.json +296 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_draft_preview.input.json +23 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_draft_save.input.json +185 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_export.input.json +98 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_inspect.input.json +7 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_job_control.input.json +33 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_job_get.input.json +17 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_job_list.input.json +36 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_muse_close_exchange.input.json +34 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_muse_open.input.json +60 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_muse_read.input.json +48 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_muse_send.input.json +53 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_packet_prepare.input.json +86 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_project_create.input.json +23 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_publication_get.input.json +17 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_publication_preview.input.json +52 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_publication_reconcile.input.json +38 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_publication_submit.input.json +73 -0
- metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_search.input.json +43 -0
- metamuse_cli-0.1.0a1/src/metamuse/demo.py +180 -0
- metamuse_cli-0.1.0a1/src/metamuse/facebook.py +4663 -0
- metamuse_cli-0.1.0a1/src/metamuse/jobs.py +1056 -0
- metamuse_cli-0.1.0a1/src/metamuse/mcp.py +377 -0
- metamuse_cli-0.1.0a1/src/metamuse/media.py +709 -0
- metamuse_cli-0.1.0a1/src/metamuse/models.py +1028 -0
- metamuse_cli-0.1.0a1/src/metamuse/muse.py +2234 -0
- metamuse_cli-0.1.0a1/src/metamuse/paths.py +83 -0
- metamuse_cli-0.1.0a1/src/metamuse/publishing.py +927 -0
- metamuse_cli-0.1.0a1/src/metamuse/remote_media.py +3871 -0
- metamuse_cli-0.1.0a1/src/metamuse/safe_log.py +122 -0
- metamuse_cli-0.1.0a1/src/metamuse/safety.py +5166 -0
- metamuse_cli-0.1.0a1/src/metamuse/schemas.py +82 -0
- metamuse_cli-0.1.0a1/src/metamuse/skill_export.py +139 -0
- metamuse_cli-0.1.0a1/src/metamuse/store.py +2459 -0
- metamuse_cli-0.1.0a1/tests/b16a_folded_context.py +49 -0
- metamuse_cli-0.1.0a1/tests/b16a_folded_headers.py +104 -0
- metamuse_cli-0.1.0a1/tests/b16a_folded_measure.py +99 -0
- metamuse_cli-0.1.0a1/tests/b16a_r3_complexity.py +129 -0
- metamuse_cli-0.1.0a1/tests/b16a_r3_corpus.py +1588 -0
- metamuse_cli-0.1.0a1/tests/b16a_r3_mutations.py +832 -0
- metamuse_cli-0.1.0a1/tests/b16a_r4_complexity.py +176 -0
- metamuse_cli-0.1.0a1/tests/b16a_r4_corpus.py +166 -0
- metamuse_cli-0.1.0a1/tests/b16a_r4_evidence.py +196 -0
- metamuse_cli-0.1.0a1/tests/b16a_r4_mutations.py +500 -0
- metamuse_cli-0.1.0a1/tests/b16a_r5_complexity.py +81 -0
- metamuse_cli-0.1.0a1/tests/b16a_r5_corpus.py +367 -0
- metamuse_cli-0.1.0a1/tests/b16a_r5_memory.py +68 -0
- metamuse_cli-0.1.0a1/tests/b16a_r5_mutations.py +303 -0
- metamuse_cli-0.1.0a1/tests/b16a_r6_complexity.py +61 -0
- metamuse_cli-0.1.0a1/tests/b16a_r6_context.py +275 -0
- metamuse_cli-0.1.0a1/tests/b16a_r6_counterexamples.py +59 -0
- metamuse_cli-0.1.0a1/tests/b16a_r6_measure.py +53 -0
- metamuse_cli-0.1.0a1/tests/b16a_r6_memory.py +68 -0
- metamuse_cli-0.1.0a1/tests/b16a_r6_mutation_run.py +174 -0
- metamuse_cli-0.1.0a1/tests/b16a_r6_mutations.py +767 -0
- metamuse_cli-0.1.0a1/tests/b16a_r6_neighbours.py +306 -0
- metamuse_cli-0.1.0a1/tests/b16a_r7_budget.py +80 -0
- metamuse_cli-0.1.0a1/tests/b16a_r7_class.py +141 -0
- metamuse_cli-0.1.0a1/tests/b16a_r7_complexity.py +54 -0
- metamuse_cli-0.1.0a1/tests/b16a_r7_context.py +191 -0
- metamuse_cli-0.1.0a1/tests/b16a_r7_measure.py +53 -0
- metamuse_cli-0.1.0a1/tests/b16a_r7_memory.py +69 -0
- metamuse_cli-0.1.0a1/tests/b16a_r7_mutations.py +838 -0
- metamuse_cli-0.1.0a1/tests/b16a_r7_orchestrator.py +81 -0
- metamuse_cli-0.1.0a1/tests/b16a_r7_probes.py +266 -0
- metamuse_cli-0.1.0a1/tests/b16a_r7_rates.py +130 -0
- metamuse_cli-0.1.0a1/tests/b16a_r8_cases.py +92 -0
- metamuse_cli-0.1.0a1/tests/b16a_r8_complexity.py +44 -0
- metamuse_cli-0.1.0a1/tests/b16a_r8_context.py +34 -0
- metamuse_cli-0.1.0a1/tests/b16a_r8_faults.py +131 -0
- metamuse_cli-0.1.0a1/tests/b16a_r8_measure.py +87 -0
- metamuse_cli-0.1.0a1/tests/browser_deadline.py +61 -0
- metamuse_cli-0.1.0a1/tests/conftest.py +94 -0
- metamuse_cli-0.1.0a1/tests/core3_fixtures.py +115 -0
- metamuse_cli-0.1.0a1/tests/cpu_growth.py +56 -0
- metamuse_cli-0.1.0a1/tests/facebook_dom_rule.py +154 -0
- metamuse_cli-0.1.0a1/tests/facebook_mutants.py +185 -0
- metamuse_cli-0.1.0a1/tests/facebook_parity.py +278 -0
- metamuse_cli-0.1.0a1/tests/facebook_reviewer8_mutants.py +240 -0
- metamuse_cli-0.1.0a1/tests/facebook_reviewer9_mutants.py +186 -0
- metamuse_cli-0.1.0a1/tests/facebook_round10_mutants.py +133 -0
- metamuse_cli-0.1.0a1/tests/facebook_round11_mutants.py +44 -0
- metamuse_cli-0.1.0a1/tests/facebook_round7_mutants.py +129 -0
- metamuse_cli-0.1.0a1/tests/facebook_round8_mutants.py +273 -0
- metamuse_cli-0.1.0a1/tests/facebook_round9_mutants.py +295 -0
- metamuse_cli-0.1.0a1/tests/fixtures/collect/captions.vtt +4 -0
- metamuse_cli-0.1.0a1/tests/fixtures/collect/comments.jsonl +1 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/README.md +134 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/check_corpus.py +426 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/comments_mixed_bad.jsonl +14 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/comments_tree.jsonl +19 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/media_only.jsonl +4 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/notes.txt +16 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/posts.csv +22 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/posts.json +77 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/posts_bom.csv +22 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/posts_zh.jsonl +10 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/project_b_comments.jsonl +5 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/make_media.py +367 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/manifest.json +735 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/html_as.mp4 +1 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/same_bytes_a.mp4 +0 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/same_bytes_b.mp4 +0 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/tiny.mp4 +0 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/tiny.png +0 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/tiny.wav +0 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/truncated.mp4 +0 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/zero_bytes.mp4 +0 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/search/search_corpus.jsonl +260 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/security/paths.jsonl +18 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/security/prompt_injection.jsonl +8 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/security/secrets.jsonl +8 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/security/urls.jsonl +37 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/bom_crlf.srt +7 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/end_before_start.srt +3 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/header_only.vtt +1 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/html_disguised.vtt +11 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/malformed_timestamp.vtt +4 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/negative_time.vtt +4 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/overlap.vtt +7 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/valid.srt +12 -0
- metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/valid_zh.vtt +11 -0
- metamuse_cli-0.1.0a1/tests/fixtures/facebook/parity/reviewer.json +1614 -0
- metamuse_cli-0.1.0a1/tests/fixtures/facebook/parity/round10-nesting.json +22 -0
- metamuse_cli-0.1.0a1/tests/fixtures/facebook/parity/vocabulary.json +4642 -0
- metamuse_cli-0.1.0a1/tests/test_account_approvals.py +66 -0
- metamuse_cli-0.1.0a1/tests/test_approval_cli.py +161 -0
- metamuse_cli-0.1.0a1/tests/test_approval_review.py +383 -0
- metamuse_cli-0.1.0a1/tests/test_approval_terminal.py +125 -0
- metamuse_cli-0.1.0a1/tests/test_at042_evidence.py +281 -0
- metamuse_cli-0.1.0a1/tests/test_at042_review_fixes.py +580 -0
- metamuse_cli-0.1.0a1/tests/test_at042_slice.py +589 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_backslash_scan.py +95 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_folded_headers.py +67 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_har_form_budget.py +107 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_innermost_quotes.py +150 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_integration_952.py +88 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_key_cache.py +87 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_nested_proofs.py +96 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_preview_refusal.py +62 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_privacy.py +435 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_quoted_boundaries.py +96 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_quoted_options.py +81 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_reconcile_replay.py +46 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round2.py +587 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round3.py +659 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round3_complexity.py +10 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round3_runtime.py +510 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4.py +277 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_auth.py +48 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_complexity.py +30 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_cookie.py +73 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_corpus.py +14 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_extents.py +70 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_form.py +68 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_guidance.py +34 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_keys.py +40 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_placeholders.py +34 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_reconcile.py +148 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_runtime.py +85 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round4_syntax.py +112 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round5_blocks.py +50 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round5_complexity.py +20 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round5_corpus.py +31 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round5_exempt.py +39 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round5_har.py +97 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round5_memory.py +28 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round5_quotes.py +63 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round5_reconcile.py +132 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round5_runtime.py +102 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round5_urls.py +76 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round6_complexity.py +35 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round6_context.py +68 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round6_runtime.py +111 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round6_structure.py +407 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round7_class.py +13 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round7_complexity.py +36 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round7_context.py +41 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round7_d10_policy.py +112 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round7_lock.py +124 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round7_orchestrator.py +20 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round7_structure.py +434 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round8_boundaries.py +118 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round8_complexity.py +51 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_round8_context.py +27 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_span_api.py +422 -0
- metamuse_cli-0.1.0a1/tests/test_b16a_structured_mapping.py +249 -0
- metamuse_cli-0.1.0a1/tests/test_browser_ci.py +32 -0
- metamuse_cli-0.1.0a1/tests/test_ci_b16a_cohort_balance.py +115 -0
- metamuse_cli-0.1.0a1/tests/test_ci_cohorts.py +256 -0
- metamuse_cli-0.1.0a1/tests/test_ci_privacy_load.py +75 -0
- metamuse_cli-0.1.0a1/tests/test_cli.py +159 -0
- metamuse_cli-0.1.0a1/tests/test_collect.py +872 -0
- metamuse_cli-0.1.0a1/tests/test_collect_corpus.py +444 -0
- metamuse_cli-0.1.0a1/tests/test_collect_review.py +769 -0
- metamuse_cli-0.1.0a1/tests/test_connect.py +196 -0
- metamuse_cli-0.1.0a1/tests/test_connected_workflow.py +216 -0
- metamuse_cli-0.1.0a1/tests/test_content.py +964 -0
- metamuse_cli-0.1.0a1/tests/test_content_review.py +616 -0
- metamuse_cli-0.1.0a1/tests/test_contracts.py +170 -0
- metamuse_cli-0.1.0a1/tests/test_core3_review.py +325 -0
- metamuse_cli-0.1.0a1/tests/test_core_guards_review.py +298 -0
- metamuse_cli-0.1.0a1/tests/test_core_migrations_review.py +129 -0
- metamuse_cli-0.1.0a1/tests/test_entrypoint_deadlines.py +137 -0
- metamuse_cli-0.1.0a1/tests/test_export_verifier.py +83 -0
- metamuse_cli-0.1.0a1/tests/test_facebook.py +2401 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_approval.py +237 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_byte_stop.py +175 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_cutoff_observation.py +79 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_cutoff_precedence.py +257 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_guard_failures.py +161 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_popups.py +134 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r10_click.py +36 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r10_composed.py +128 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r10_expansion.py +166 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r10_extractor.py +135 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r10_fixture.py +146 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r10_measure.py +39 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r10_survivors.py +47 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r11_budget.py +97 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r11_closure.py +164 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r11_display.py +39 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r8_capture.py +569 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r8_cutoff.py +425 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r8_workers.py +104 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r9_capture.py +477 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r9_parity.py +117 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_r9_survivors.py +99 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_review.py +1035 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_round5.py +705 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_round6.py +128 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_share.py +160 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_snapshot_case.py +57 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_target_shutdown.py +92 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_transport_stop.py +52 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_visibility.py +152 -0
- metamuse_cli-0.1.0a1/tests/test_facebook_xhr.py +84 -0
- metamuse_cli-0.1.0a1/tests/test_feature_seam.py +912 -0
- metamuse_cli-0.1.0a1/tests/test_getting_started.py +86 -0
- metamuse_cli-0.1.0a1/tests/test_installed_journeys.py +262 -0
- metamuse_cli-0.1.0a1/tests/test_jobs.py +460 -0
- metamuse_cli-0.1.0a1/tests/test_journey.py +569 -0
- metamuse_cli-0.1.0a1/tests/test_journey_startup.py +215 -0
- metamuse_cli-0.1.0a1/tests/test_mcp.py +702 -0
- metamuse_cli-0.1.0a1/tests/test_mcp_worker.py +333 -0
- metamuse_cli-0.1.0a1/tests/test_media.py +760 -0
- metamuse_cli-0.1.0a1/tests/test_muse_associate.py +518 -0
- metamuse_cli-0.1.0a1/tests/test_muse_findings.py +862 -0
- metamuse_cli-0.1.0a1/tests/test_muse_folded_context.py +299 -0
- metamuse_cli-0.1.0a1/tests/test_muse_lifecycle.py +955 -0
- metamuse_cli-0.1.0a1/tests/test_muse_research.py +744 -0
- metamuse_cli-0.1.0a1/tests/test_muse_research_integration.py +83 -0
- metamuse_cli-0.1.0a1/tests/test_muse_research_replay.py +240 -0
- metamuse_cli-0.1.0a1/tests/test_muse_research_write_lock.py +188 -0
- metamuse_cli-0.1.0a1/tests/test_muse_review3.py +345 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round10_handoff.py +292 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round11_retry.py +78 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round12_curl_ownership.py +835 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round3_deadlines.py +51 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round3_hints.py +43 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round3_redact.py +63 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round3_sizes.py +109 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round3_status.py +57 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round3_trust.py +488 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_barrier.py +52 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_bind.py +119 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_checks.py +70 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_deadlines.py +39 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_hints.py +177 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_listeners.py +50 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_provenance.py +36 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_redact.py +108 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_sources.py +22 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_sql.py +157 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_status.py +68 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round4_storage.py +207 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round5_cost.py +83 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round5_growth.py +32 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round5_hints.py +108 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round5_identity.py +96 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round5_keys.py +60 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round5_markers.py +43 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round5_page.py +36 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round5_redact.py +87 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round5_storage.py +160 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round5_strength.py +56 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round6_cost.py +92 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round6_growth.py +53 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round6_oracle.py +101 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round6_redact.py +193 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round6_session.py +276 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round6_storage.py +240 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round7_notary.py +158 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round7_scans.py +38 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round8_notifications.py +186 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round8b_listeners.py +176 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round8c_registration.py +208 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round8d_core_busy.py +376 -0
- metamuse_cli-0.1.0a1/tests/test_muse_round9_pending.py +497 -0
- metamuse_cli-0.1.0a1/tests/test_muse_schema.py +440 -0
- metamuse_cli-0.1.0a1/tests/test_muse_standard.py +1260 -0
- metamuse_cli-0.1.0a1/tests/test_muse_transport.py +1154 -0
- metamuse_cli-0.1.0a1/tests/test_muse_trust.py +459 -0
- metamuse_cli-0.1.0a1/tests/test_publishing.py +913 -0
- metamuse_cli-0.1.0a1/tests/test_pytest_diagnostics.py +423 -0
- metamuse_cli-0.1.0a1/tests/test_r2_core_review.py +335 -0
- metamuse_cli-0.1.0a1/tests/test_readme_walkthrough.py +92 -0
- metamuse_cli-0.1.0a1/tests/test_redaction.py +116 -0
- metamuse_cli-0.1.0a1/tests/test_remote_approval.py +505 -0
- metamuse_cli-0.1.0a1/tests/test_remote_media.py +3890 -0
- metamuse_cli-0.1.0a1/tests/test_remote_normalize.py +52 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r10_derived.py +48 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r10_login.py +108 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r10_metadata.py +179 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r10_removal.py +226 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r10_scan.py +65 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r8.py +230 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r8_unit.py +364 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r9.py +72 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r9_caps.py +42 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r9_docs.py +29 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r9_hosts.py +30 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r9_html.py +28 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r9_scan.py +82 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r9_transport.py +130 -0
- metamuse_cli-0.1.0a1/tests/test_remote_r9_wire.py +187 -0
- metamuse_cli-0.1.0a1/tests/test_remote_review.py +532 -0
- metamuse_cli-0.1.0a1/tests/test_remote_review_unit.py +156 -0
- metamuse_cli-0.1.0a1/tests/test_restore_versions.py +176 -0
- metamuse_cli-0.1.0a1/tests/test_review.py +832 -0
- metamuse_cli-0.1.0a1/tests/test_safe_exception_log.py +247 -0
- metamuse_cli-0.1.0a1/tests/test_safety_paths.py +110 -0
- metamuse_cli-0.1.0a1/tests/test_safety_permits.py +1026 -0
- metamuse_cli-0.1.0a1/tests/test_safety_secrets.py +419 -0
- metamuse_cli-0.1.0a1/tests/test_safety_url.py +267 -0
- metamuse_cli-0.1.0a1/tests/test_schema2_core.py +197 -0
- metamuse_cli-0.1.0a1/tests/test_site_capture.py +559 -0
- metamuse_cli-0.1.0a1/tests/test_site_check.py +357 -0
- metamuse_cli-0.1.0a1/tests/test_skill.py +496 -0
- metamuse_cli-0.1.0a1/tests/test_skill_export.py +125 -0
- metamuse_cli-0.1.0a1/tests/test_sql_policy.py +82 -0
- metamuse_cli-0.1.0a1/tests/test_storage_busy.py +424 -0
- metamuse_cli-0.1.0a1/tests/test_storage_busy_availability.py +64 -0
- metamuse_cli-0.1.0a1/tests/test_storage_busy_boundaries.py +131 -0
- metamuse_cli-0.1.0a1/tests/test_storage_busy_diagnostics.py +104 -0
- metamuse_cli-0.1.0a1/tests/test_storage_busy_idle.py +58 -0
- metamuse_cli-0.1.0a1/tests/test_storage_busy_mcp.py +230 -0
- metamuse_cli-0.1.0a1/tests/test_storage_busy_migration.py +53 -0
- metamuse_cli-0.1.0a1/tests/test_storage_busy_readers.py +80 -0
- metamuse_cli-0.1.0a1/tests/test_storage_busy_reproduction.py +209 -0
- metamuse_cli-0.1.0a1/tests/test_storage_busy_stops.py +169 -0
- metamuse_cli-0.1.0a1/tests/test_store.py +1177 -0
- metamuse_cli-0.1.0a1/tests/test_store_exports.py +159 -0
- metamuse_cli-0.1.0a1/tests/test_store_repeated_sidecars.py +66 -0
- metamuse_cli-0.1.0a1/tests/test_store_sidecar_race.py +28 -0
- metamuse_cli-0.1.0a1/tests/test_store_submission_contention.py +59 -0
- metamuse_cli-0.1.0a1/tests/test_store_unlinked_sidecars.py +132 -0
- metamuse_cli-0.1.0a1/tests/test_transcript_removal.py +148 -0
- metamuse_cli-0.1.0a1/tests/test_workspace_keys.py +120 -0
- metamuse_cli-0.1.0a1/tools/measure_content_search.py +110 -0
- metamuse_cli-0.1.0a1/uv.lock +1009 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches:
|
|
7
|
+
- main
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
env:
|
|
13
|
+
METAMUSE_REQUIRE_BROWSER_TESTS: "1"
|
|
14
|
+
UV_MANAGED_PYTHON: "true"
|
|
15
|
+
|
|
16
|
+
concurrency:
|
|
17
|
+
group: ci-${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.ref || github.run_id }}
|
|
18
|
+
cancel-in-progress: true
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
static-wheel:
|
|
22
|
+
timeout-minutes: 30
|
|
23
|
+
runs-on: ubuntu-24.04
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
26
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
27
|
+
with:
|
|
28
|
+
python-version: "3.12.13"
|
|
29
|
+
- name: Install ffmpeg and ffprobe
|
|
30
|
+
run: |
|
|
31
|
+
sudo apt-get update
|
|
32
|
+
sudo apt-get install -y --no-install-recommends ffmpeg
|
|
33
|
+
- run: uv sync --locked --python 3.12.13 --group dev --extra remote --extra facebook
|
|
34
|
+
- name: Verify managed Python runtime
|
|
35
|
+
run: uv run --locked python -c 'import sys; print(sys.version); print(sys.base_prefix); assert sys.version_info[:3] == (3, 12, 13)'
|
|
36
|
+
- run: uv run ruff check .
|
|
37
|
+
- run: uv run ruff format --check .
|
|
38
|
+
- run: uv run python docs/design/validate_design_pack.py
|
|
39
|
+
- run: |
|
|
40
|
+
uv run python -m metamuse.schemas
|
|
41
|
+
git diff --exit-code
|
|
42
|
+
- run: uv run python tests/fixtures/corpus/check_corpus.py
|
|
43
|
+
- run: scripts/smoke_wheel.sh
|
|
44
|
+
env:
|
|
45
|
+
TMPDIR: ${{ runner.temp }}
|
|
46
|
+
|
|
47
|
+
cohorts:
|
|
48
|
+
timeout-minutes: 30
|
|
49
|
+
runs-on: ubuntu-24.04
|
|
50
|
+
strategy:
|
|
51
|
+
fail-fast: false
|
|
52
|
+
max-parallel: 5
|
|
53
|
+
matrix:
|
|
54
|
+
cohort: [core, muse, media, facebook, privacy]
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
57
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
58
|
+
with:
|
|
59
|
+
python-version: "3.12.13"
|
|
60
|
+
- name: Install ffmpeg and ffprobe
|
|
61
|
+
run: |
|
|
62
|
+
sudo apt-get update
|
|
63
|
+
sudo apt-get install -y --no-install-recommends ffmpeg
|
|
64
|
+
- run: uv sync --locked --python 3.12.13 --group dev --extra remote --extra facebook
|
|
65
|
+
- name: Verify managed Python runtime
|
|
66
|
+
run: uv run --locked python -c 'import sys; print(sys.version); print(sys.base_prefix); assert sys.version_info[:3] == (3, 12, 13)'
|
|
67
|
+
- name: Install Chromium from the locked Playwright package
|
|
68
|
+
run: uv run --locked python -m playwright install --with-deps chromium
|
|
69
|
+
- name: Enable Chromium user namespace sandbox on the hosted runner
|
|
70
|
+
run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
|
|
71
|
+
- name: Collect the full suite and run the ordered cohort
|
|
72
|
+
run: |
|
|
73
|
+
pytest_temp_dir="$(mktemp -d "${RUNNER_TEMP}/metamuse-pytest.XXXXXX")"
|
|
74
|
+
trap 'rm -rf "$pytest_temp_dir"' EXIT
|
|
75
|
+
mkdir -p ci-evidence
|
|
76
|
+
set -o pipefail
|
|
77
|
+
uv run --locked python -u -X faulthandler scripts/ci_cohorts.py run \
|
|
78
|
+
--cohort "${{ matrix.cohort }}" \
|
|
79
|
+
--source-sha "$GITHUB_SHA" \
|
|
80
|
+
--manifest "ci-evidence/${{ matrix.cohort }}.json" -- \
|
|
81
|
+
-q --maxfail=1 -o faulthandler_timeout=0 --basetemp "$pytest_temp_dir" \
|
|
82
|
+
2>&1 | tee "ci-evidence/${{ matrix.cohort }}.log"
|
|
83
|
+
- name: Retain manifest and diagnostic log even on failure
|
|
84
|
+
if: always()
|
|
85
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
86
|
+
with:
|
|
87
|
+
name: ci-${{ github.sha }}-${{ matrix.cohort }}
|
|
88
|
+
path: ci-evidence/
|
|
89
|
+
if-no-files-found: error
|
|
90
|
+
retention-days: 7
|
|
91
|
+
|
|
92
|
+
installed-journeys:
|
|
93
|
+
timeout-minutes: 30
|
|
94
|
+
runs-on: ubuntu-24.04
|
|
95
|
+
steps:
|
|
96
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
97
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
98
|
+
with:
|
|
99
|
+
python-version: "3.12.13"
|
|
100
|
+
- name: Install ffmpeg and ffprobe
|
|
101
|
+
run: |
|
|
102
|
+
sudo apt-get update
|
|
103
|
+
sudo apt-get install -y --no-install-recommends ffmpeg
|
|
104
|
+
- run: uv sync --locked --python 3.12.13 --group dev --extra remote --extra facebook
|
|
105
|
+
- name: Verify managed Python runtime
|
|
106
|
+
run: uv run --locked python -c 'import sys; print(sys.version); print(sys.base_prefix); assert sys.version_info[:3] == (3, 12, 13)'
|
|
107
|
+
- name: Run exact and bounded journeys from the isolated installed wheel
|
|
108
|
+
env:
|
|
109
|
+
CANDIDATE_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
110
|
+
run: |
|
|
111
|
+
mkdir -p "$RUNNER_TEMP/installed-journey-evidence"
|
|
112
|
+
set -o pipefail
|
|
113
|
+
scripts/check_installed_journeys.sh "$GITHUB_SHA" "$RUNNER_TEMP/installed-journey-evidence" \
|
|
114
|
+
2>&1 | tee "$RUNNER_TEMP/installed-journey-evidence/installed.log"
|
|
115
|
+
- name: Retain installed provenance and diagnostics even on failure
|
|
116
|
+
if: always()
|
|
117
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
118
|
+
with:
|
|
119
|
+
name: installed-${{ github.sha }}-journeys
|
|
120
|
+
path: ${{ runner.temp }}/installed-journey-evidence/
|
|
121
|
+
if-no-files-found: error
|
|
122
|
+
retention-days: 7
|
|
123
|
+
|
|
124
|
+
privacy-load:
|
|
125
|
+
timeout-minutes: 30
|
|
126
|
+
runs-on: ubuntu-24.04
|
|
127
|
+
steps:
|
|
128
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
129
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
130
|
+
with:
|
|
131
|
+
python-version: "3.12.13"
|
|
132
|
+
- name: Install ffmpeg and ffprobe
|
|
133
|
+
run: |
|
|
134
|
+
sudo apt-get update
|
|
135
|
+
sudo apt-get install -y --no-install-recommends ffmpeg
|
|
136
|
+
- run: uv sync --locked --python 3.12.13 --group dev --extra remote --extra facebook
|
|
137
|
+
- name: Verify managed Python runtime
|
|
138
|
+
run: uv run --locked python -c 'import sys; print(sys.version); print(sys.base_prefix); assert sys.version_info[:3] == (3, 12, 13)'
|
|
139
|
+
- name: Run five serial final-tree privacy measurements
|
|
140
|
+
env:
|
|
141
|
+
CANDIDATE_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
142
|
+
run: |
|
|
143
|
+
set -euo pipefail
|
|
144
|
+
unset LD_LIBRARY_PATH
|
|
145
|
+
export PATH="$HOME/.local/bin:$PATH"
|
|
146
|
+
evidence="$RUNNER_TEMP/privacy-load-evidence"
|
|
147
|
+
mkdir -p "$evidence"
|
|
148
|
+
printf 'run\tevent\texit_code\n' > "$evidence/results.tsv"
|
|
149
|
+
run=0
|
|
150
|
+
pytest_temp_dir=
|
|
151
|
+
cleanup() {
|
|
152
|
+
status=$?
|
|
153
|
+
printf '%s\tjob_exit\t%s\n' "$run" "$status" >> "$evidence/results.tsv"
|
|
154
|
+
if [ -n "$pytest_temp_dir" ]; then rm -rf -- "$pytest_temp_dir"; fi
|
|
155
|
+
}
|
|
156
|
+
trap cleanup EXIT
|
|
157
|
+
trap 'exit 130' INT
|
|
158
|
+
trap 'exit 143' TERM
|
|
159
|
+
case "$(stat -f -c %T "$RUNNER_TEMP")" in
|
|
160
|
+
tmpfs|ramfs) echo 'Privacy measurements require disk scratch' >&2; exit 1 ;;
|
|
161
|
+
esac
|
|
162
|
+
uv run --locked python -u -X faulthandler - <<'PY' | tee "$evidence/identity.json"
|
|
163
|
+
import hashlib, json, os, subprocess, sys
|
|
164
|
+
from pathlib import Path
|
|
165
|
+
def git(*args):
|
|
166
|
+
return subprocess.check_output(["git", *args], text=True).strip()
|
|
167
|
+
assert sys.version_info[:3] == (3, 12, 13), sys.version
|
|
168
|
+
assert git("rev-parse", "HEAD") == os.environ["GITHUB_SHA"]
|
|
169
|
+
assert not git("status", "--porcelain"), "Privacy measurements require a clean checkout"
|
|
170
|
+
paths = (
|
|
171
|
+
"src/metamuse/safety.py", "src/metamuse/_muse_redact.py", "tests/cpu_growth.py",
|
|
172
|
+
"tests/test_muse_round5_growth.py", "tests/test_muse_round6_growth.py",
|
|
173
|
+
"tests/test_at042_review_fixes.py",
|
|
174
|
+
)
|
|
175
|
+
print(json.dumps({
|
|
176
|
+
"source_commit": git("rev-parse", "HEAD"), "source_tree": git("rev-parse", "HEAD^{tree}"),
|
|
177
|
+
"source_parents": git("show", "-s", "--format=%P", "HEAD").split(),
|
|
178
|
+
"candidate_sha": os.environ["CANDIDATE_SHA"],
|
|
179
|
+
"python_version": sys.version, "python_executable": sys.executable,
|
|
180
|
+
"python_base_prefix": sys.base_prefix,
|
|
181
|
+
"sha256": {path: hashlib.sha256(Path(path).read_bytes()).hexdigest() for path in paths},
|
|
182
|
+
}, sort_keys=True), flush=True)
|
|
183
|
+
PY
|
|
184
|
+
nodes=(
|
|
185
|
+
'tests/test_muse_round5_growth.py::test_r5_5_ordinary_pairs_core_growth'
|
|
186
|
+
'tests/test_muse_round6_growth.py::test_r6_2_adversarial_grammars_linear[k=>-False-text]'
|
|
187
|
+
'tests/test_muse_round6_growth.py::test_r6_2_adversarial_grammars_linear[k=>-True-text]'
|
|
188
|
+
'tests/test_muse_round6_growth.py::test_r6_2_adversarial_grammars_linear[k=>-False-body]'
|
|
189
|
+
'tests/test_muse_round6_growth.py::test_r6_2_adversarial_grammars_linear[k=>-True-body]'
|
|
190
|
+
'tests/test_at042_review_fixes.py::test_b16a_bare_muse_cookie_must_not_leak_into_redacted_bundle'
|
|
191
|
+
)
|
|
192
|
+
for run in 1 2 3 4 5; do
|
|
193
|
+
pytest_temp_dir="$(mktemp -d "$RUNNER_TEMP/metamuse-privacy-load.XXXXXX")"
|
|
194
|
+
printf '%s\tstarted\t\n' "$run" >> "$evidence/results.tsv"
|
|
195
|
+
{
|
|
196
|
+
cat "$evidence/identity.json"
|
|
197
|
+
printf '\nPRIVACY_LOAD_RUN %s\n' "$run"
|
|
198
|
+
uv run --locked python -u -X faulthandler -m pytest -q -s \
|
|
199
|
+
--basetemp "$pytest_temp_dir" "${nodes[@]}"
|
|
200
|
+
} 2>&1 | tee "$evidence/load-$run.log"
|
|
201
|
+
printf '%s\tcompleted\t0\n' "$run" >> "$evidence/results.tsv"
|
|
202
|
+
rm -rf -- "$pytest_temp_dir"
|
|
203
|
+
pytest_temp_dir=
|
|
204
|
+
done
|
|
205
|
+
- name: Retain privacy measurement logs and identity even on failure
|
|
206
|
+
if: always()
|
|
207
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
208
|
+
with:
|
|
209
|
+
name: privacy-load-${{ github.sha }}
|
|
210
|
+
path: ${{ runner.temp }}/privacy-load-evidence/
|
|
211
|
+
if-no-files-found: error
|
|
212
|
+
retention-days: 7
|
|
213
|
+
|
|
214
|
+
check:
|
|
215
|
+
timeout-minutes: 30
|
|
216
|
+
runs-on: ubuntu-24.04
|
|
217
|
+
needs: [static-wheel, cohorts, installed-journeys, privacy-load]
|
|
218
|
+
if: always()
|
|
219
|
+
steps:
|
|
220
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
221
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
222
|
+
with:
|
|
223
|
+
python-version: "3.12.13"
|
|
224
|
+
- run: uv sync --locked --python 3.12.13 --group dev --extra remote --extra facebook
|
|
225
|
+
- name: Verify managed Python runtime
|
|
226
|
+
run: uv run --locked python -c 'import sys; print(sys.version); print(sys.base_prefix); assert sys.version_info[:3] == (3, 12, 13)'
|
|
227
|
+
- name: Download every cohort manifest and log for this source
|
|
228
|
+
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
|
229
|
+
with:
|
|
230
|
+
pattern: ci-${{ github.sha }}-*
|
|
231
|
+
path: ci-evidence
|
|
232
|
+
merge-multiple: true
|
|
233
|
+
- name: Require every job and exact full-suite runtime coverage
|
|
234
|
+
if: always()
|
|
235
|
+
env:
|
|
236
|
+
COHORT_RESULT: ${{ needs.cohorts.result }}
|
|
237
|
+
STATIC_RESULT: ${{ needs.static-wheel.result }}
|
|
238
|
+
INSTALLED_RESULT: ${{ needs.installed-journeys.result }}
|
|
239
|
+
PRIVACY_LOAD_RESULT: ${{ needs.privacy-load.result }}
|
|
240
|
+
run: |
|
|
241
|
+
python3 scripts/ci_cohorts.py verify --manifest-dir ci-evidence --source-sha "$GITHUB_SHA"
|
|
242
|
+
test "$COHORT_RESULT" = success
|
|
243
|
+
test "$STATIC_RESULT" = success
|
|
244
|
+
test "$INSTALLED_RESULT" = success
|
|
245
|
+
test "$PRIVACY_LOAD_RESULT" = success
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
name: Deploy project page to GitHub Pages
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- "site/**"
|
|
8
|
+
- ".github/workflows/pages.yml"
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
pages: write
|
|
14
|
+
id-token: write
|
|
15
|
+
|
|
16
|
+
concurrency:
|
|
17
|
+
group: pages
|
|
18
|
+
cancel-in-progress: false
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
deploy:
|
|
22
|
+
name: Deploy static site
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
timeout-minutes: 10
|
|
25
|
+
environment:
|
|
26
|
+
name: github-pages
|
|
27
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
28
|
+
steps:
|
|
29
|
+
- name: Check out repository
|
|
30
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
31
|
+
with:
|
|
32
|
+
persist-credentials: false
|
|
33
|
+
|
|
34
|
+
- name: Check out page kit
|
|
35
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
36
|
+
with:
|
|
37
|
+
repository: teddashh/teddashh.github.io
|
|
38
|
+
ref: 5e51fb954acef56e9f75b4cfd2b57dc76afcdfd8
|
|
39
|
+
path: .page-kit
|
|
40
|
+
persist-credentials: false
|
|
41
|
+
|
|
42
|
+
- name: Validate site
|
|
43
|
+
env:
|
|
44
|
+
PAGE_KIT_DIR: ${{ github.workspace }}/.page-kit/kit
|
|
45
|
+
run: python3 scripts/check_site.py
|
|
46
|
+
|
|
47
|
+
- name: Configure GitHub Pages
|
|
48
|
+
uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0
|
|
49
|
+
|
|
50
|
+
- name: Upload site artifact
|
|
51
|
+
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
|
|
52
|
+
with:
|
|
53
|
+
path: ./site
|
|
54
|
+
|
|
55
|
+
- name: Deploy to GitHub Pages
|
|
56
|
+
id: deployment
|
|
57
|
+
uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
name: Publish Python package
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
version:
|
|
7
|
+
description: Exact reviewed version from pyproject.toml
|
|
8
|
+
required: true
|
|
9
|
+
default: 0.1.0a1
|
|
10
|
+
type: string
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
concurrency:
|
|
16
|
+
group: publish-pypi
|
|
17
|
+
cancel-in-progress: false
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
build:
|
|
21
|
+
if: github.ref == 'refs/heads/main'
|
|
22
|
+
runs-on: ubuntu-24.04
|
|
23
|
+
timeout-minutes: 15
|
|
24
|
+
permissions:
|
|
25
|
+
contents: read
|
|
26
|
+
checks: read
|
|
27
|
+
env:
|
|
28
|
+
RELEASE_VERSION: ${{ inputs.version }}
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
31
|
+
- name: Configure isolated demo directories
|
|
32
|
+
run: |
|
|
33
|
+
echo "UV_TOOL_DIR=$RUNNER_TEMP/release-tools" >> "$GITHUB_ENV"
|
|
34
|
+
echo "UV_TOOL_BIN_DIR=$RUNNER_TEMP/release-bin" >> "$GITHUB_ENV"
|
|
35
|
+
echo "XDG_DATA_HOME=$RUNNER_TEMP/release-data" >> "$GITHUB_ENV"
|
|
36
|
+
- name: Require successful CI for this exact source commit
|
|
37
|
+
env:
|
|
38
|
+
GH_TOKEN: ${{ github.token }}
|
|
39
|
+
run: |
|
|
40
|
+
gh api "repos/$GITHUB_REPOSITORY/commits/$GITHUB_SHA/check-runs?per_page=100" > "$RUNNER_TEMP/checks.json"
|
|
41
|
+
python3 - <<'PY'
|
|
42
|
+
import json
|
|
43
|
+
import os
|
|
44
|
+
from pathlib import Path
|
|
45
|
+
|
|
46
|
+
checks = json.loads((Path(os.environ['RUNNER_TEMP']) / 'checks.json').read_text())
|
|
47
|
+
passed = any(
|
|
48
|
+
check['name'] == 'check'
|
|
49
|
+
and check['app']['id'] == 15368
|
|
50
|
+
and check['head_sha'] == os.environ['GITHUB_SHA']
|
|
51
|
+
and check['conclusion'] == 'success'
|
|
52
|
+
for check in checks['check_runs']
|
|
53
|
+
)
|
|
54
|
+
if not passed:
|
|
55
|
+
raise SystemExit('The required Actions check has not passed for this commit.')
|
|
56
|
+
PY
|
|
57
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
58
|
+
with:
|
|
59
|
+
python-version: "3.12.13"
|
|
60
|
+
- name: Check version and build both distributions
|
|
61
|
+
run: |
|
|
62
|
+
python3 - <<'PY'
|
|
63
|
+
import os
|
|
64
|
+
import tomllib
|
|
65
|
+
from pathlib import Path
|
|
66
|
+
|
|
67
|
+
project = tomllib.loads(Path('pyproject.toml').read_text())['project']
|
|
68
|
+
if project['version'] != os.environ['RELEASE_VERSION']:
|
|
69
|
+
raise SystemExit('Requested version differs from pyproject.toml.')
|
|
70
|
+
PY
|
|
71
|
+
uv build --no-sources
|
|
72
|
+
- name: Verify metadata and create artifact hashes
|
|
73
|
+
run: |
|
|
74
|
+
python3 - <<'PY'
|
|
75
|
+
import hashlib
|
|
76
|
+
import os
|
|
77
|
+
import tarfile
|
|
78
|
+
import zipfile
|
|
79
|
+
from email.parser import BytesParser
|
|
80
|
+
from pathlib import Path
|
|
81
|
+
|
|
82
|
+
version = os.environ['RELEASE_VERSION']
|
|
83
|
+
expected = {
|
|
84
|
+
f'metamuse_cli-{version}-py3-none-any.whl',
|
|
85
|
+
f'metamuse_cli-{version}.tar.gz',
|
|
86
|
+
}
|
|
87
|
+
files = sorted(p for p in Path('dist').iterdir() if p.name != '.gitignore')
|
|
88
|
+
if {p.name for p in files} != expected:
|
|
89
|
+
raise SystemExit('Expected exactly one wheel and one source distribution.')
|
|
90
|
+
sums = []
|
|
91
|
+
for path in files:
|
|
92
|
+
if path.suffix == '.whl':
|
|
93
|
+
with zipfile.ZipFile(path) as archive:
|
|
94
|
+
name = next(n for n in archive.namelist() if n.endswith('.dist-info/METADATA'))
|
|
95
|
+
metadata = BytesParser().parsebytes(archive.read(name))
|
|
96
|
+
else:
|
|
97
|
+
with tarfile.open(path) as archive:
|
|
98
|
+
metadata = BytesParser().parsebytes(archive.extractfile(f'metamuse_cli-{version}/PKG-INFO').read())
|
|
99
|
+
if metadata['Name'] != 'metamuse-cli' or metadata['Version'] != version:
|
|
100
|
+
raise SystemExit(f'Unexpected package metadata: {path.name}')
|
|
101
|
+
sums.append(f'{hashlib.sha256(path.read_bytes()).hexdigest()} {path.name}')
|
|
102
|
+
Path('dist/SHA256SUMS').write_text('\n'.join(sums) + '\n')
|
|
103
|
+
print('\n'.join(sums))
|
|
104
|
+
PY
|
|
105
|
+
- name: Install the exact release wheel
|
|
106
|
+
run: uv tool install --python 3.12.13 dist/*.whl
|
|
107
|
+
- name: Run bundled example outside the checkout
|
|
108
|
+
working-directory: ${{ runner.temp }}
|
|
109
|
+
run: '"$UV_TOOL_BIN_DIR/metamuse" demo > "$RUNNER_TEMP/release-demo.log"'
|
|
110
|
+
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
111
|
+
with:
|
|
112
|
+
name: pypi-${{ github.sha }}
|
|
113
|
+
path: dist/
|
|
114
|
+
if-no-files-found: error
|
|
115
|
+
retention-days: 90
|
|
116
|
+
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
117
|
+
with:
|
|
118
|
+
name: release-demo-${{ github.sha }}
|
|
119
|
+
path: ${{ runner.temp }}/release-demo.log
|
|
120
|
+
if-no-files-found: error
|
|
121
|
+
retention-days: 90
|
|
122
|
+
|
|
123
|
+
publish:
|
|
124
|
+
needs: build
|
|
125
|
+
runs-on: ubuntu-24.04
|
|
126
|
+
timeout-minutes: 10
|
|
127
|
+
environment:
|
|
128
|
+
name: pypi
|
|
129
|
+
url: https://pypi.org/project/metamuse-cli/${{ inputs.version }}/
|
|
130
|
+
permissions:
|
|
131
|
+
contents: read
|
|
132
|
+
id-token: write
|
|
133
|
+
env:
|
|
134
|
+
RELEASE_VERSION: ${{ inputs.version }}
|
|
135
|
+
steps:
|
|
136
|
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
|
137
|
+
with:
|
|
138
|
+
name: pypi-${{ github.sha }}
|
|
139
|
+
path: dist/
|
|
140
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
141
|
+
- name: Verify downloaded artifact hashes
|
|
142
|
+
working-directory: dist
|
|
143
|
+
run: sha256sum --check SHA256SUMS
|
|
144
|
+
- name: Publish reviewed artifacts through PyPI OIDC
|
|
145
|
+
run: uv publish --trusted-publishing always dist/*.whl dist/*.tar.gz
|
|
146
|
+
- name: Verify PyPI has these exact bytes
|
|
147
|
+
run: |
|
|
148
|
+
python3 - <<'PY'
|
|
149
|
+
import hashlib
|
|
150
|
+
import json
|
|
151
|
+
import os
|
|
152
|
+
import time
|
|
153
|
+
import urllib.error
|
|
154
|
+
import urllib.request
|
|
155
|
+
from pathlib import Path
|
|
156
|
+
|
|
157
|
+
version = os.environ['RELEASE_VERSION']
|
|
158
|
+
expected = {
|
|
159
|
+
p.name: hashlib.sha256(p.read_bytes()).hexdigest()
|
|
160
|
+
for p in Path('dist').iterdir()
|
|
161
|
+
if p.name.endswith(('.whl', '.tar.gz'))
|
|
162
|
+
}
|
|
163
|
+
for attempt in range(6):
|
|
164
|
+
try:
|
|
165
|
+
with urllib.request.urlopen(f'https://pypi.org/pypi/metamuse-cli/{version}/json', timeout=20) as response:
|
|
166
|
+
release = json.load(response)
|
|
167
|
+
actual = {item['filename']: item['digests']['sha256'] for item in release['urls']}
|
|
168
|
+
if actual == expected:
|
|
169
|
+
print(f'PyPI {version}: both file hashes match the reviewed artifacts.')
|
|
170
|
+
break
|
|
171
|
+
except (urllib.error.URLError, TimeoutError):
|
|
172
|
+
pass
|
|
173
|
+
if attempt == 5:
|
|
174
|
+
raise SystemExit('PyPI hashes are unconfirmed; inspect the index before retrying.')
|
|
175
|
+
time.sleep(5)
|
|
176
|
+
PY
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# AGENTS.md — MetaMuse CLI
|
|
2
|
+
|
|
3
|
+
## Product contract (binding; copied from docs/design/AGENTS.md)
|
|
4
|
+
|
|
5
|
+
先讀01_PLAN、02_SPEC、03_SDS,再依04_BACKLOG的B01–B04實作。這是單一工具,不是五個repo launcher。
|
|
6
|
+
|
|
7
|
+
一package、一store、一jobs、一設定。CLI/MCP共用app;不做submodules、runtime git clone、plugin framework或第二個AI orchestrator。
|
|
8
|
+
|
|
9
|
+
主Agent產問題與文案;Muse是協作者,不接管harness或當逐點擊模型。不帶作者策略、人設、F公式、CTA或黃金時段。
|
|
10
|
+
|
|
11
|
+
採用第三方程式先記license/commit/原path;沒授權不可機械翻寫。成熟依賴不重造。public包不含秘密、真實私有內容或部署資料。
|
|
12
|
+
|
|
13
|
+
accepted不等於running;沒worker不得說在背景執行。安全讀取與外部send重試分開,不明送達先對帳。来源保真,partial不冒稱complete,模型內容不能mint permissions。
|
|
14
|
+
|
|
15
|
+
LIVE只在操作者明確授權後執行。缺憑證則fixture+blocked,不編造結果。不因本文件自動建立repo、發布、改visibility或操作帳號。
|
|
16
|
+
|
|
17
|
+
交付每個PR的FR/B/AT、實際命令/證據類別、migration、notice與限制。先離線縱切片,Muse spike早做;不要先做Dashboard。核心models/store/jobs修改先協調owner。
|
|
18
|
+
|
|
19
|
+
Design baseline: `docs/design/` (01_PLAN, 02_SPEC, 03_SDS, 04_BACKLOG, 05_ACCEPTANCE, 06_SOURCES, contracts/). IDs FR-xxx (requirements), Bxx (backlog), AT-xxx (acceptance) come from there. If code and design disagree, either fix the code or update the design docs/contracts in the same commit and call it out in your report. Never maintain two sources of truth.
|
|
20
|
+
|
|
21
|
+
## Multi-agent development protocol
|
|
22
|
+
|
|
23
|
+
Several coding agents (Codex, Grok, Gemini) work in parallel, each in its own git worktree on its own branch. An orchestrator assigns tasks, independently re-runs tests, reviews, and merges into `main`.
|
|
24
|
+
|
|
25
|
+
- Work only inside your assigned worktree/branch and commit there. Never push, add remotes, create hosted repos, publish packages, or touch other worktrees or `main`. This repo is public. Only the orchestrator pushes branches, opens PRs and merges. Keys, account settings, real data and LIVE evidence live in a separate private repo; never read, copy or reference it unless your task prompt explicitly grants access.
|
|
26
|
+
- Ownership: `src/metamuse/models.py`, `store.py`, `jobs.py`, migrations and generated schemas belong to the core owner (B02–B04). Other tasks must not edit them unless their task prompt grants it. If you need a core change, build against the existing API and add a "Core change requests" section to your report (what, why, proposed diff).
|
|
27
|
+
- Extension points that other tasks may use without editing core files are documented in `docs/dev/CORE_API.md` once it exists (operation handler registry, AppContext, error/envelope helpers).
|
|
28
|
+
- Toolchain: Python 3.12 managed by uv. `uv sync`, `uv run pytest -q`, `uv run ruff check .`. No system pip. Add dependencies only with `uv add` and justify each (license, why a mature dependency instead of hand-rolled code).
|
|
29
|
+
- Tests never touch the network or real accounts. LIVE work is out of scope unless a task prompt explicitly authorizes it; without credentials the result is fixture + `blocked`, never an invented success.
|
|
30
|
+
- No secrets, cookies, real private content, hostnames, account settings or personal data in the repo. Fixtures are synthetic and redistributable.
|
|
31
|
+
- License: Apache-2.0 (`LICENSE`). Third-party code only under a compatible license, with provenance and an entry in `THIRD_PARTY_NOTICES.md`.
|
|
32
|
+
- Runtime data lives outside the repo (platformdirs private root); tests use temporary directories.
|
|
33
|
+
- Evidence classes: OFFLINE, FIXTURE, INTEGRATION, MEASURE, LIVE. Mock, schema or `--help` success is never LIVE.
|
|
34
|
+
- Done means: tests green, ruff clean, work committed on your branch, and the report written to the path in your task prompt. The report lists FR/B/AT covered, files changed, exact commands with real results, evidence class, migrations, third-party notices, known limitations, and core change requests.
|
|
35
|
+
- Commit messages: imperative summary line; body lists the B/FR/AT IDs; trailer `Agent: <cli>/<model>`.
|