falsiflow 0.1.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.
- falsiflow-0.1.2/.github/ISSUE_TEMPLATE/bug_report.yml +58 -0
- falsiflow-0.1.2/.github/ISSUE_TEMPLATE/claim_gate_request.yml +58 -0
- falsiflow-0.1.2/.github/ISSUE_TEMPLATE/config.yml +8 -0
- falsiflow-0.1.2/.github/ISSUE_TEMPLATE/feature_request.yml +52 -0
- falsiflow-0.1.2/.github/PULL_REQUEST_TEMPLATE.md +27 -0
- falsiflow-0.1.2/.github/dependabot.yml +17 -0
- falsiflow-0.1.2/.github/workflows/falsiflow-cross-platform.yml +69 -0
- falsiflow-0.1.2/.github/workflows/falsiflow-external-evidence.yml +269 -0
- falsiflow-0.1.2/.github/workflows/falsiflow-pages.yml +54 -0
- falsiflow-0.1.2/.github/workflows/falsiflow-publish.yml +57 -0
- falsiflow-0.1.2/.github/workflows/falsiflow-scorecard.yml +37 -0
- falsiflow-0.1.2/.github/workflows/falsiflow.yml +363 -0
- falsiflow-0.1.2/.github/workflows/smoke.yml +13 -0
- falsiflow-0.1.2/CHANGELOG.md +164 -0
- falsiflow-0.1.2/CITATION.cff +17 -0
- falsiflow-0.1.2/CODE_OF_CONDUCT.md +44 -0
- falsiflow-0.1.2/CONTRIBUTING.md +96 -0
- falsiflow-0.1.2/GOVERNANCE.md +68 -0
- falsiflow-0.1.2/LICENSE +21 -0
- falsiflow-0.1.2/MANIFEST.in +38 -0
- falsiflow-0.1.2/Makefile +57 -0
- falsiflow-0.1.2/PKG-INFO +1236 -0
- falsiflow-0.1.2/README.md +1174 -0
- falsiflow-0.1.2/RELEASE.md +256 -0
- falsiflow-0.1.2/RESPONSIBLE_USE.md +46 -0
- falsiflow-0.1.2/ROADMAP.md +70 -0
- falsiflow-0.1.2/SECURITY.md +72 -0
- falsiflow-0.1.2/SUPPORT.md +51 -0
- falsiflow-0.1.2/action.yml +221 -0
- falsiflow-0.1.2/docs/assets/falsiflow_30_second_demo.svg +61 -0
- falsiflow-0.1.2/docs/assets/falsiflow_proof_strip.svg +66 -0
- falsiflow-0.1.2/docs/falsiflow_1k_launch_plan.md +105 -0
- falsiflow-0.1.2/docs/falsiflow_adapter_profiles.md +94 -0
- falsiflow-0.1.2/docs/falsiflow_adoption_priorities.md +142 -0
- falsiflow-0.1.2/docs/falsiflow_architecture.md +111 -0
- falsiflow-0.1.2/docs/falsiflow_casebook_check.md +107 -0
- falsiflow-0.1.2/docs/falsiflow_cli_reference.md +1207 -0
- falsiflow-0.1.2/docs/falsiflow_data_contract.md +162 -0
- falsiflow-0.1.2/docs/falsiflow_demo_pr_playbook.md +189 -0
- falsiflow-0.1.2/docs/falsiflow_github_action_examples.md +260 -0
- falsiflow-0.1.2/docs/falsiflow_positioning.md +204 -0
- falsiflow-0.1.2/docs/falsiflow_public_casebook.md +246 -0
- falsiflow-0.1.2/docs/falsiflow_pypi_trusted_publishing.md +104 -0
- falsiflow-0.1.2/docs/falsiflow_rag_quality_gate_proposal.md +155 -0
- falsiflow-0.1.2/docs/falsiflow_security_posture.md +84 -0
- falsiflow-0.1.2/docs/falsiflow_template_authoring.md +132 -0
- falsiflow-0.1.2/docs/falsiflow_troubleshooting.md +204 -0
- falsiflow-0.1.2/docs/launch_articles/benchmarks_should_fail_builds.md +51 -0
- falsiflow-0.1.2/docs/launch_articles/evidence_gates_for_product_metrics.md +50 -0
- falsiflow-0.1.2/docs/launch_articles/stop_shipping_unverifiable_ai_eval_claims.md +53 -0
- falsiflow-0.1.2/examples/README.md +296 -0
- falsiflow-0.1.2/falsiflow/__init__.py +5 -0
- falsiflow-0.1.2/falsiflow/adapters.py +664 -0
- falsiflow-0.1.2/falsiflow/adoption.py +775 -0
- falsiflow-0.1.2/falsiflow/browser_demo.py +1228 -0
- falsiflow-0.1.2/falsiflow/bundle.py +806 -0
- falsiflow-0.1.2/falsiflow/casebook_check.py +426 -0
- falsiflow-0.1.2/falsiflow/claim_check.py +344 -0
- falsiflow-0.1.2/falsiflow/cli.py +2544 -0
- falsiflow-0.1.2/falsiflow/core.py +4072 -0
- falsiflow-0.1.2/falsiflow/demo.py +104 -0
- falsiflow-0.1.2/falsiflow/discovery.py +331 -0
- falsiflow-0.1.2/falsiflow/doctor.py +392 -0
- falsiflow-0.1.2/falsiflow/local_server.py +261 -0
- falsiflow-0.1.2/falsiflow/public_release.py +1805 -0
- falsiflow-0.1.2/falsiflow/quickstart.py +147 -0
- falsiflow-0.1.2/falsiflow/release.py +1783 -0
- falsiflow-0.1.2/falsiflow/scaffold.py +574 -0
- falsiflow-0.1.2/falsiflow/template_check.py +230 -0
- falsiflow-0.1.2/falsiflow/template_discovery.py +102 -0
- falsiflow-0.1.2/falsiflow/template_gallery.py +289 -0
- falsiflow-0.1.2/falsiflow/template_install.py +472 -0
- falsiflow-0.1.2/falsiflow/template_pack.py +544 -0
- falsiflow-0.1.2/falsiflow/template_provenance.py +343 -0
- falsiflow-0.1.2/falsiflow/template_registry.py +373 -0
- falsiflow-0.1.2/falsiflow/template_release.py +521 -0
- falsiflow-0.1.2/falsiflow/templates/ai_claim_evaluation/evidence_pass_demo.csv +19 -0
- falsiflow-0.1.2/falsiflow/templates/ai_claim_evaluation/evidence_placeholder_demo.csv +2 -0
- falsiflow-0.1.2/falsiflow/templates/ai_claim_evaluation/project.json +222 -0
- falsiflow-0.1.2/falsiflow/templates/ai_claim_evaluation/source_files/ai_eval_raw_export.csv +14 -0
- falsiflow-0.1.2/falsiflow/templates/ai_claim_evaluation/template.json +9 -0
- falsiflow-0.1.2/falsiflow/templates/biointerface_coatings/evidence_pass_demo.csv +15 -0
- falsiflow-0.1.2/falsiflow/templates/biointerface_coatings/evidence_placeholder_demo.csv +2 -0
- falsiflow-0.1.2/falsiflow/templates/biointerface_coatings/project.json +186 -0
- falsiflow-0.1.2/falsiflow/templates/biointerface_coatings/source_files/coating_raw_export.csv +15 -0
- falsiflow-0.1.2/falsiflow/templates/biointerface_coatings/template.json +9 -0
- falsiflow-0.1.2/falsiflow/templates/neural_materials/evidence_pass_demo.csv +20 -0
- falsiflow-0.1.2/falsiflow/templates/neural_materials/evidence_placeholder_demo.csv +3 -0
- falsiflow-0.1.2/falsiflow/templates/neural_materials/project.json +222 -0
- falsiflow-0.1.2/falsiflow/templates/neural_materials/source_files/demo_raw_export.csv +20 -0
- falsiflow-0.1.2/falsiflow/templates/neural_materials/template.json +9 -0
- falsiflow-0.1.2/falsiflow/templates/product_metric_launch/evidence_pass_demo.csv +15 -0
- falsiflow-0.1.2/falsiflow/templates/product_metric_launch/evidence_placeholder_demo.csv +2 -0
- falsiflow-0.1.2/falsiflow/templates/product_metric_launch/project.json +211 -0
- falsiflow-0.1.2/falsiflow/templates/product_metric_launch/source_files/product_metric_raw_export.csv +15 -0
- falsiflow-0.1.2/falsiflow/templates/product_metric_launch/template.json +9 -0
- falsiflow-0.1.2/falsiflow/templates/rfq_vendor_evidence/evidence_pass_demo.csv +10 -0
- falsiflow-0.1.2/falsiflow/templates/rfq_vendor_evidence/evidence_placeholder_demo.csv +2 -0
- falsiflow-0.1.2/falsiflow/templates/rfq_vendor_evidence/project.json +142 -0
- falsiflow-0.1.2/falsiflow/templates/rfq_vendor_evidence/source_files/vendor_reply_record.csv +10 -0
- falsiflow-0.1.2/falsiflow/templates/rfq_vendor_evidence/template.json +9 -0
- falsiflow-0.1.2/falsiflow/templates/wetware_support_hardware/evidence_pass_demo.csv +14 -0
- falsiflow-0.1.2/falsiflow/templates/wetware_support_hardware/evidence_placeholder_demo.csv +2 -0
- falsiflow-0.1.2/falsiflow/templates/wetware_support_hardware/project.json +171 -0
- falsiflow-0.1.2/falsiflow/templates/wetware_support_hardware/source_files/hardware_raw_export.csv +14 -0
- falsiflow-0.1.2/falsiflow/templates/wetware_support_hardware/template.json +9 -0
- falsiflow-0.1.2/falsiflow.egg-info/PKG-INFO +1236 -0
- falsiflow-0.1.2/falsiflow.egg-info/SOURCES.txt +113 -0
- falsiflow-0.1.2/falsiflow.egg-info/dependency_links.txt +1 -0
- falsiflow-0.1.2/falsiflow.egg-info/entry_points.txt +2 -0
- falsiflow-0.1.2/falsiflow.egg-info/top_level.txt +1 -0
- falsiflow-0.1.2/pyproject.toml +74 -0
- falsiflow-0.1.2/scripts/install_local.ps1 +110 -0
- falsiflow-0.1.2/scripts/install_local.sh +162 -0
- falsiflow-0.1.2/setup.cfg +4 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a reproducible Falsiflow failure or regression.
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug", "needs-triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for reporting a concrete failure. Please include commands and generated artifacts when you can.
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: command
|
|
12
|
+
attributes:
|
|
13
|
+
label: Command or workflow
|
|
14
|
+
description: Paste the exact command, Make target, CI job, or browser workflow that failed.
|
|
15
|
+
placeholder: falsiflow release-check --out-dir data/falsiflow/release_check --force
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: expected
|
|
20
|
+
attributes:
|
|
21
|
+
label: Expected result
|
|
22
|
+
description: What status, artifact, report, or behavior did you expect?
|
|
23
|
+
placeholder: release_ready with package_ready, dist_ready, and release_validation_ready.
|
|
24
|
+
validations:
|
|
25
|
+
required: true
|
|
26
|
+
- type: textarea
|
|
27
|
+
id: actual
|
|
28
|
+
attributes:
|
|
29
|
+
label: Actual result
|
|
30
|
+
description: Include the first failing status, traceback, report excerpt, or CI link.
|
|
31
|
+
placeholder: release_blocked because sdist_required_files failed.
|
|
32
|
+
validations:
|
|
33
|
+
required: true
|
|
34
|
+
- type: textarea
|
|
35
|
+
id: environment
|
|
36
|
+
attributes:
|
|
37
|
+
label: Environment
|
|
38
|
+
description: Include OS, Python version, install method, and whether this was local, pipx, or CI.
|
|
39
|
+
placeholder: macOS 15, Python 3.12, editable install with python3 -m pip install -e .
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
42
|
+
- type: textarea
|
|
43
|
+
id: artifacts
|
|
44
|
+
attributes:
|
|
45
|
+
label: Relevant artifacts
|
|
46
|
+
description: Link or paste paths for release_check.json, adoption_check.json, claim_check.json, bundle verification, or template verification reports.
|
|
47
|
+
placeholder: data/falsiflow/release_check/release_check.json
|
|
48
|
+
validations:
|
|
49
|
+
required: false
|
|
50
|
+
- type: checkboxes
|
|
51
|
+
id: boundaries
|
|
52
|
+
attributes:
|
|
53
|
+
label: Checks before filing
|
|
54
|
+
options:
|
|
55
|
+
- label: I checked that this is not a claim that Falsiflow should treat as scientific proof, safety proof, regulatory approval, or clinical validation.
|
|
56
|
+
required: true
|
|
57
|
+
- label: I removed secrets, private raw data, and credentials from shared logs or artifacts.
|
|
58
|
+
required: true
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: Claim gate or template request
|
|
2
|
+
description: Request a new evidence-gated workflow, starter template, or template review.
|
|
3
|
+
title: "[Claim gate]: "
|
|
4
|
+
labels: ["template", "evidence-gate", "needs-triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: decision
|
|
8
|
+
attributes:
|
|
9
|
+
label: Decision to gate
|
|
10
|
+
description: What claim, handoff, or project decision should Falsiflow block until evidence is ready?
|
|
11
|
+
placeholder: Advance a coating candidate only when adhesion, cytotoxicity, impedance drift, and source provenance pass configured thresholds.
|
|
12
|
+
validations:
|
|
13
|
+
required: true
|
|
14
|
+
- type: textarea
|
|
15
|
+
id: evidence
|
|
16
|
+
attributes:
|
|
17
|
+
label: Required evidence
|
|
18
|
+
description: List the evidence rows, metadata, source files, and derived metrics this gate needs.
|
|
19
|
+
placeholder: adhesion_mpa with raw test export, cytotoxicity_percent with lab report source, impedance_drift_percent derived from day 0 and day 30 measurements.
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
- type: textarea
|
|
23
|
+
id: thresholds
|
|
24
|
+
attributes:
|
|
25
|
+
label: Acceptance rules
|
|
26
|
+
description: Describe the thresholds or review rules that should control claim_ready.
|
|
27
|
+
placeholder: adhesion_mpa >= 2.0, cytotoxicity_percent <= 10, impedance_drift_percent <= 15, every required source file present.
|
|
28
|
+
validations:
|
|
29
|
+
required: true
|
|
30
|
+
- type: dropdown
|
|
31
|
+
id: stage
|
|
32
|
+
attributes:
|
|
33
|
+
label: Current stage
|
|
34
|
+
options:
|
|
35
|
+
- Idea only
|
|
36
|
+
- Draft project.json exists
|
|
37
|
+
- Template files exist
|
|
38
|
+
- Template pack exists
|
|
39
|
+
- Template release bundle exists
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
42
|
+
- type: textarea
|
|
43
|
+
id: artifacts
|
|
44
|
+
attributes:
|
|
45
|
+
label: Existing artifacts
|
|
46
|
+
description: Link or describe any project.json, evidence CSV, raw source file, template pack, lockfile, attestation, policy, release bundle, or verification report.
|
|
47
|
+
placeholder: examples/falsiflow/my_template/project.json and evidence_pass_demo.csv
|
|
48
|
+
validations:
|
|
49
|
+
required: false
|
|
50
|
+
- type: checkboxes
|
|
51
|
+
id: boundaries
|
|
52
|
+
attributes:
|
|
53
|
+
label: Responsible-use boundary
|
|
54
|
+
options:
|
|
55
|
+
- label: I understand `claim_ready` means supplied evidence passed configured gates, not that the underlying scientific or commercial claim is independently true.
|
|
56
|
+
required: true
|
|
57
|
+
- label: I can provide non-sensitive sample evidence or sanitized fixtures for tests.
|
|
58
|
+
required: false
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Responsible-use boundary
|
|
4
|
+
url: https://github.com/AzurLiu/falsiflow/blob/main/RESPONSIBLE_USE.md
|
|
5
|
+
about: Read how to interpret Falsiflow readiness before relying on a claim.
|
|
6
|
+
- name: Security and integrity reports
|
|
7
|
+
url: https://github.com/AzurLiu/falsiflow/blob/main/SECURITY.md
|
|
8
|
+
about: Report provenance, bundle verification, path handling, or supply-chain issues privately.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose a CLI, template, documentation, or workflow improvement.
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement", "needs-triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: Problem
|
|
10
|
+
description: What adoption, review, template-authoring, or evidence-gate problem should this solve?
|
|
11
|
+
placeholder: New users can run the quickstart, but template authors need a clearer install verification path.
|
|
12
|
+
validations:
|
|
13
|
+
required: true
|
|
14
|
+
- type: textarea
|
|
15
|
+
id: proposal
|
|
16
|
+
attributes:
|
|
17
|
+
label: Proposed change
|
|
18
|
+
description: Describe the command, report, template, documentation, or CI behavior you want.
|
|
19
|
+
placeholder: Add a command that verifies a template release bundle and writes a Markdown review card.
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
- type: dropdown
|
|
23
|
+
id: area
|
|
24
|
+
attributes:
|
|
25
|
+
label: Area
|
|
26
|
+
options:
|
|
27
|
+
- First-run experience
|
|
28
|
+
- Audit reports
|
|
29
|
+
- Starter templates
|
|
30
|
+
- Release and packaging
|
|
31
|
+
- Local browser app
|
|
32
|
+
- Documentation
|
|
33
|
+
- Security or provenance
|
|
34
|
+
validations:
|
|
35
|
+
required: true
|
|
36
|
+
- type: textarea
|
|
37
|
+
id: success
|
|
38
|
+
attributes:
|
|
39
|
+
label: Success criteria
|
|
40
|
+
description: What command, artifact, status, or documentation would show the feature is complete?
|
|
41
|
+
placeholder: adoption-check reports adoption_ready and release-check still reports release_ready.
|
|
42
|
+
validations:
|
|
43
|
+
required: true
|
|
44
|
+
- type: checkboxes
|
|
45
|
+
id: contribution
|
|
46
|
+
attributes:
|
|
47
|
+
label: Contribution path
|
|
48
|
+
options:
|
|
49
|
+
- label: I can help test this with `falsiflow quickstart`, `falsiflow doctor`, `falsiflow adoption-check`, or `falsiflow release-check`.
|
|
50
|
+
required: false
|
|
51
|
+
- label: I can open a pull request using `.github/PULL_REQUEST_TEMPLATE.md`.
|
|
52
|
+
required: false
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
## What Changed
|
|
2
|
+
|
|
3
|
+
Describe the user-visible behavior, command, report, template, packaging, or documentation change.
|
|
4
|
+
|
|
5
|
+
## Verification
|
|
6
|
+
|
|
7
|
+
Paste the commands you ran and the final status:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
python3 -m py_compile falsiflow/core.py falsiflow/cli.py falsiflow/adapters.py falsiflow/casebook_check.py scripts/falsiflow.py scripts/falsiflow_tests/regress_falsiflow_core.py
|
|
11
|
+
python3 scripts/falsiflow_tests/regress_falsiflow_core.py
|
|
12
|
+
falsiflow adoption-check --out-dir data/falsiflow/adoption_check --force
|
|
13
|
+
falsiflow release-check --out-dir data/falsiflow/release_check --force
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Evidence Boundary
|
|
17
|
+
|
|
18
|
+
- [ ] This change does not make `claim_ready` bypass missing provenance, placeholder evidence, malformed configuration, or failed gates.
|
|
19
|
+
- [ ] New public commands or JSON fields are documented and covered by tests or release-check expectations.
|
|
20
|
+
- [ ] Template distribution changes were checked with `template-check`, `template-pack`, `verify-template-pack`, `template-release`, `verify-template-release`, and `template-install` where applicable.
|
|
21
|
+
- [ ] Security-sensitive changes preserve bundle verification, SHA-256 integrity, path handling, and source-file provenance.
|
|
22
|
+
- [ ] Responsible use remains clear: Falsiflow readiness is not proof of safety, efficacy, regulatory compliance, or experimental truth.
|
|
23
|
+
|
|
24
|
+
## Release Impact
|
|
25
|
+
|
|
26
|
+
- [ ] `CHANGELOG.md`, `README.md`, `RELEASE.md`, `SECURITY.md`, or `RESPONSIBLE_USE.md` were updated when relevant.
|
|
27
|
+
- [ ] `adoption-check` and `release-check` pass, or this PR explains why they cannot run in the current environment.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "github-actions"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
labels:
|
|
8
|
+
- "dependencies"
|
|
9
|
+
- "github-actions"
|
|
10
|
+
|
|
11
|
+
- package-ecosystem: "pip"
|
|
12
|
+
directory: "/"
|
|
13
|
+
schedule:
|
|
14
|
+
interval: "weekly"
|
|
15
|
+
labels:
|
|
16
|
+
- "dependencies"
|
|
17
|
+
- "python"
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
name: Falsiflow Cross Platform
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches:
|
|
7
|
+
- main
|
|
8
|
+
- master
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
smoke:
|
|
16
|
+
name: ${{ matrix.os }}
|
|
17
|
+
runs-on: ${{ matrix.os }}
|
|
18
|
+
strategy:
|
|
19
|
+
fail-fast: false
|
|
20
|
+
matrix:
|
|
21
|
+
os:
|
|
22
|
+
- ubuntu-latest
|
|
23
|
+
- macos-latest
|
|
24
|
+
- windows-latest
|
|
25
|
+
|
|
26
|
+
steps:
|
|
27
|
+
- name: Checkout public repository
|
|
28
|
+
shell: bash
|
|
29
|
+
run: |
|
|
30
|
+
git init .
|
|
31
|
+
git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
|
|
32
|
+
git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
|
|
33
|
+
git checkout --detach "${GITHUB_SHA}"
|
|
34
|
+
- uses: actions/setup-python@v6
|
|
35
|
+
with:
|
|
36
|
+
python-version: "3.11"
|
|
37
|
+
- name: Compile
|
|
38
|
+
run: |
|
|
39
|
+
python -m py_compile falsiflow/core.py falsiflow/cli.py falsiflow/adapters.py falsiflow/release.py falsiflow/adoption.py falsiflow/casebook_check.py falsiflow/bundle.py falsiflow/browser_demo.py falsiflow/demo.py falsiflow/discovery.py falsiflow/local_server.py falsiflow/public_release.py falsiflow/claim_check.py falsiflow/doctor.py falsiflow/quickstart.py falsiflow/scaffold.py falsiflow/template_discovery.py falsiflow/template_gallery.py falsiflow/template_check.py falsiflow/template_pack.py falsiflow/template_registry.py falsiflow/template_provenance.py falsiflow/template_release.py falsiflow/template_install.py scripts/falsiflow.py scripts/falsiflow_tests/regress_falsiflow_core.py
|
|
40
|
+
- name: Local installer smoke (Unix)
|
|
41
|
+
if: runner.os != 'Windows'
|
|
42
|
+
shell: bash
|
|
43
|
+
run: |
|
|
44
|
+
scripts/install_local.sh --from-local . --prefix "$RUNNER_TEMP/falsiflow_install" --check
|
|
45
|
+
- name: Local installer smoke (Windows)
|
|
46
|
+
if: runner.os == 'Windows'
|
|
47
|
+
shell: pwsh
|
|
48
|
+
run: |
|
|
49
|
+
./scripts/install_local.ps1 -FromLocal . -Prefix "$env:RUNNER_TEMP/falsiflow_install" -Check
|
|
50
|
+
- name: pipx smoke
|
|
51
|
+
shell: bash
|
|
52
|
+
run: |
|
|
53
|
+
python -m pip install --user pipx
|
|
54
|
+
python -m pipx install --force .
|
|
55
|
+
python -m pipx run --spec . falsiflow selftest --json > "$RUNNER_TEMP/falsiflow_pipx_selftest.json"
|
|
56
|
+
- name: Browser entry smoke
|
|
57
|
+
shell: bash
|
|
58
|
+
run: |
|
|
59
|
+
python scripts/falsiflow.py start --out-dir "$RUNNER_TEMP/falsiflow_start" --check --json
|
|
60
|
+
python scripts/falsiflow.py demo-package --out-dir "$RUNNER_TEMP/falsiflow_public_demo" --force --json
|
|
61
|
+
- name: External readiness smoke
|
|
62
|
+
shell: bash
|
|
63
|
+
env:
|
|
64
|
+
FALSIFLOW_REPO_URL: https://github.com/${{ github.repository }}
|
|
65
|
+
FALSIFLOW_PUBLIC_DEMO_URL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/
|
|
66
|
+
FALSIFLOW_PIPX_VALIDATED: "1"
|
|
67
|
+
FALSIFLOW_WINDOWS_VALIDATED: ${{ runner.os == 'Windows' && '1' || '0' }}
|
|
68
|
+
run: |
|
|
69
|
+
python scripts/falsiflow.py external-check --out-dir "$RUNNER_TEMP/falsiflow_external_check" --force --json
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
name: Falsiflow External Evidence
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
public_demo_url:
|
|
7
|
+
description: "Hosted public demo URL to verify, for example https://OWNER.github.io/falsiflow/"
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
repo_url:
|
|
11
|
+
description: "Public repository URL. Defaults to the current GitHub repository."
|
|
12
|
+
required: false
|
|
13
|
+
type: string
|
|
14
|
+
pypi_package_url:
|
|
15
|
+
description: "Published PyPI project URL, for example https://pypi.org/project/falsiflow/"
|
|
16
|
+
required: true
|
|
17
|
+
type: string
|
|
18
|
+
expected_version:
|
|
19
|
+
description: "Expected PyPI package version, for example 0.1.2. Defaults to pyproject.toml."
|
|
20
|
+
required: false
|
|
21
|
+
type: string
|
|
22
|
+
|
|
23
|
+
permissions:
|
|
24
|
+
contents: read
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
pipx-smoke:
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
steps:
|
|
30
|
+
- name: Checkout public repository
|
|
31
|
+
shell: bash
|
|
32
|
+
run: |
|
|
33
|
+
git init .
|
|
34
|
+
git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
|
|
35
|
+
git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
|
|
36
|
+
git checkout --detach "${GITHUB_SHA}"
|
|
37
|
+
- uses: actions/setup-python@v6
|
|
38
|
+
with:
|
|
39
|
+
python-version: "3.11"
|
|
40
|
+
- name: pipx install and browser-entry smoke
|
|
41
|
+
shell: bash
|
|
42
|
+
run: |
|
|
43
|
+
python -m pip install --user pipx
|
|
44
|
+
python -m pipx install --force .
|
|
45
|
+
python -m pipx run --spec . falsiflow start --out-dir "$RUNNER_TEMP/falsiflow_start" --check --json > "$RUNNER_TEMP/falsiflow_pipx_start.json"
|
|
46
|
+
- name: Upload pipx smoke artifact
|
|
47
|
+
uses: actions/upload-artifact@v7
|
|
48
|
+
with:
|
|
49
|
+
name: falsiflow-pipx-smoke
|
|
50
|
+
path: ${{ runner.temp }}/falsiflow_pipx_start.json
|
|
51
|
+
|
|
52
|
+
pipx-public-package:
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/setup-python@v6
|
|
56
|
+
with:
|
|
57
|
+
python-version: "3.11"
|
|
58
|
+
- name: pipx public package smoke
|
|
59
|
+
shell: bash
|
|
60
|
+
run: |
|
|
61
|
+
python -m pip install --user pipx
|
|
62
|
+
python -m pipx run --spec falsiflow falsiflow start --out-dir "$RUNNER_TEMP/falsiflow_public_package_start" --check --json > "$RUNNER_TEMP/falsiflow_public_package_start.json"
|
|
63
|
+
- name: Upload public package pipx smoke artifact
|
|
64
|
+
uses: actions/upload-artifact@v7
|
|
65
|
+
with:
|
|
66
|
+
name: falsiflow-pipx-public-package-smoke
|
|
67
|
+
path: ${{ runner.temp }}/falsiflow_public_package_start.json
|
|
68
|
+
|
|
69
|
+
windows-powershell:
|
|
70
|
+
runs-on: windows-latest
|
|
71
|
+
steps:
|
|
72
|
+
- name: Checkout public repository
|
|
73
|
+
shell: bash
|
|
74
|
+
run: |
|
|
75
|
+
git init .
|
|
76
|
+
git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
|
|
77
|
+
git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
|
|
78
|
+
git checkout --detach "${GITHUB_SHA}"
|
|
79
|
+
- uses: actions/setup-python@v6
|
|
80
|
+
with:
|
|
81
|
+
python-version: "3.11"
|
|
82
|
+
- name: PowerShell installer smoke
|
|
83
|
+
shell: pwsh
|
|
84
|
+
run: |
|
|
85
|
+
./scripts/install_local.ps1 -FromLocal . -Prefix "$env:RUNNER_TEMP/falsiflow_install" -Check
|
|
86
|
+
|
|
87
|
+
evidence-summary:
|
|
88
|
+
needs:
|
|
89
|
+
- pipx-smoke
|
|
90
|
+
- pipx-public-package
|
|
91
|
+
- windows-powershell
|
|
92
|
+
runs-on: ubuntu-latest
|
|
93
|
+
steps:
|
|
94
|
+
- name: Checkout public repository
|
|
95
|
+
shell: bash
|
|
96
|
+
run: |
|
|
97
|
+
git init .
|
|
98
|
+
git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
|
|
99
|
+
git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
|
|
100
|
+
git checkout --detach "${GITHUB_SHA}"
|
|
101
|
+
- uses: actions/setup-python@v6
|
|
102
|
+
with:
|
|
103
|
+
python-version: "3.11"
|
|
104
|
+
- name: Verify hosted demo URL
|
|
105
|
+
shell: bash
|
|
106
|
+
env:
|
|
107
|
+
FALSIFLOW_PUBLIC_DEMO_URL: ${{ inputs.public_demo_url }}
|
|
108
|
+
run: |
|
|
109
|
+
test -n "$FALSIFLOW_PUBLIC_DEMO_URL"
|
|
110
|
+
curl -fsSL "$FALSIFLOW_PUBLIC_DEMO_URL" -o "$RUNNER_TEMP/falsiflow_public_demo_index.html"
|
|
111
|
+
grep -E "Falsiflow|Launchpad|Try" "$RUNNER_TEMP/falsiflow_public_demo_index.html"
|
|
112
|
+
- name: Verify PyPI project URL
|
|
113
|
+
shell: bash
|
|
114
|
+
env:
|
|
115
|
+
FALSIFLOW_PYPI_PACKAGE_URL: ${{ inputs.pypi_package_url }}
|
|
116
|
+
FALSIFLOW_EXPECTED_VERSION: ${{ inputs.expected_version }}
|
|
117
|
+
run: |
|
|
118
|
+
test -n "$FALSIFLOW_PYPI_PACKAGE_URL"
|
|
119
|
+
python - <<'PY'
|
|
120
|
+
import os
|
|
121
|
+
from urllib.parse import urlparse
|
|
122
|
+
|
|
123
|
+
url = os.environ["FALSIFLOW_PYPI_PACKAGE_URL"].strip()
|
|
124
|
+
parsed = urlparse(url)
|
|
125
|
+
expected_path = "/project/falsiflow/"
|
|
126
|
+
if parsed.scheme != "https" or parsed.netloc != "pypi.org" or parsed.path.rstrip("/") + "/" != expected_path:
|
|
127
|
+
raise SystemExit(f"Expected https://pypi.org/project/falsiflow/, got {url}")
|
|
128
|
+
PY
|
|
129
|
+
curl -fsSL "https://pypi.org/pypi/falsiflow/json" -o "$RUNNER_TEMP/falsiflow_pypi_project.json"
|
|
130
|
+
python - <<'PY'
|
|
131
|
+
import json
|
|
132
|
+
import os
|
|
133
|
+
import pathlib
|
|
134
|
+
import tomllib
|
|
135
|
+
|
|
136
|
+
root = pathlib.Path.cwd()
|
|
137
|
+
expected_version = os.environ.get("FALSIFLOW_EXPECTED_VERSION", "").strip()
|
|
138
|
+
if not expected_version:
|
|
139
|
+
with (root / "pyproject.toml").open("rb") as handle:
|
|
140
|
+
expected_version = str(tomllib.load(handle).get("project", {}).get("version", "")).strip()
|
|
141
|
+
if not expected_version:
|
|
142
|
+
raise SystemExit("Expected PyPI package version was empty")
|
|
143
|
+
|
|
144
|
+
runner_temp = pathlib.Path(os.environ["RUNNER_TEMP"])
|
|
145
|
+
payload = json.loads((runner_temp / "falsiflow_pypi_project.json").read_text(encoding="utf-8"))
|
|
146
|
+
info = payload.get("info", {})
|
|
147
|
+
if str(info.get("name", "")).lower() != "falsiflow":
|
|
148
|
+
raise SystemExit("PyPI JSON did not describe the falsiflow package")
|
|
149
|
+
published_version = str(info.get("version", "")).strip()
|
|
150
|
+
if not published_version:
|
|
151
|
+
raise SystemExit("PyPI JSON did not include a released version")
|
|
152
|
+
if published_version != expected_version:
|
|
153
|
+
raise SystemExit(f"Expected PyPI version {expected_version}, got {published_version}")
|
|
154
|
+
(runner_temp / "falsiflow_expected_version.txt").write_text(expected_version, encoding="utf-8")
|
|
155
|
+
(runner_temp / "falsiflow_pypi_version.txt").write_text(published_version, encoding="utf-8")
|
|
156
|
+
PY
|
|
157
|
+
- name: Write structured external evidence
|
|
158
|
+
shell: bash
|
|
159
|
+
env:
|
|
160
|
+
FALSIFLOW_REPO_URL_INPUT: ${{ inputs.repo_url }}
|
|
161
|
+
FALSIFLOW_PUBLIC_DEMO_URL: ${{ inputs.public_demo_url }}
|
|
162
|
+
FALSIFLOW_PYPI_PACKAGE_URL: ${{ inputs.pypi_package_url }}
|
|
163
|
+
FALSIFLOW_EXPECTED_VERSION: ${{ inputs.expected_version }}
|
|
164
|
+
FALSIFLOW_WORKFLOW_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
|
165
|
+
FALSIFLOW_REPOSITORY: ${{ github.repository }}
|
|
166
|
+
run: |
|
|
167
|
+
python - <<'PY'
|
|
168
|
+
import json
|
|
169
|
+
import os
|
|
170
|
+
import pathlib
|
|
171
|
+
import tomllib
|
|
172
|
+
|
|
173
|
+
runner_temp = pathlib.Path(os.environ["RUNNER_TEMP"])
|
|
174
|
+
|
|
175
|
+
def text_file_or_empty(name: str) -> str:
|
|
176
|
+
path = runner_temp / name
|
|
177
|
+
return path.read_text(encoding="utf-8").strip() if path.exists() else ""
|
|
178
|
+
|
|
179
|
+
expected_version = text_file_or_empty("falsiflow_expected_version.txt") or os.environ.get("FALSIFLOW_EXPECTED_VERSION", "").strip()
|
|
180
|
+
if not expected_version:
|
|
181
|
+
with pathlib.Path("pyproject.toml").open("rb") as handle:
|
|
182
|
+
expected_version = str(tomllib.load(handle).get("project", {}).get("version", "")).strip()
|
|
183
|
+
published_version = text_file_or_empty("falsiflow_pypi_version.txt")
|
|
184
|
+
if not published_version:
|
|
185
|
+
payload = json.loads((runner_temp / "falsiflow_pypi_project.json").read_text(encoding="utf-8"))
|
|
186
|
+
published_version = str(payload.get("info", {}).get("version", "")).strip()
|
|
187
|
+
|
|
188
|
+
repo_url = os.environ.get("FALSIFLOW_REPO_URL_INPUT") or f"https://github.com/{os.environ['FALSIFLOW_REPOSITORY']}"
|
|
189
|
+
demo_url = os.environ["FALSIFLOW_PUBLIC_DEMO_URL"]
|
|
190
|
+
pypi_url = os.environ["FALSIFLOW_PYPI_PACKAGE_URL"]
|
|
191
|
+
workflow_url = os.environ["FALSIFLOW_WORKFLOW_URL"]
|
|
192
|
+
evidence = {
|
|
193
|
+
"status": "external_evidence_ready",
|
|
194
|
+
"version": 1,
|
|
195
|
+
"instructions": "Generated by the Falsiflow External Evidence workflow after public demo, PyPI package, checkout pipx, public-package pipx, and Windows smoke checks passed.",
|
|
196
|
+
"checks": {
|
|
197
|
+
"public_repo_url": {
|
|
198
|
+
"status": "passed",
|
|
199
|
+
"url": repo_url,
|
|
200
|
+
"evidence_url": workflow_url,
|
|
201
|
+
"notes": "Workflow ran from the public GitHub repository.",
|
|
202
|
+
},
|
|
203
|
+
"public_demo_url": {
|
|
204
|
+
"status": "passed",
|
|
205
|
+
"url": demo_url,
|
|
206
|
+
"evidence_url": workflow_url,
|
|
207
|
+
"artifact": "falsiflow_public_demo_index.html",
|
|
208
|
+
"notes": "curl fetched the hosted static demo and found Falsiflow launch text.",
|
|
209
|
+
},
|
|
210
|
+
"pypi_package_url": {
|
|
211
|
+
"status": "passed",
|
|
212
|
+
"url": pypi_url,
|
|
213
|
+
"evidence_url": workflow_url,
|
|
214
|
+
"artifact": "falsiflow_pypi_project.json",
|
|
215
|
+
"verification_url": "https://pypi.org/pypi/falsiflow/json",
|
|
216
|
+
"expected_version": expected_version,
|
|
217
|
+
"published_version": published_version,
|
|
218
|
+
"notes": "curl fetched the PyPI JSON API and confirmed the published package name and version matched the expected release.",
|
|
219
|
+
},
|
|
220
|
+
"pipx_smoke": {
|
|
221
|
+
"status": "passed",
|
|
222
|
+
"command": "python -m pipx install --force . && python -m pipx run --spec . falsiflow start --check --json",
|
|
223
|
+
"workflow_url": workflow_url,
|
|
224
|
+
"artifact": "falsiflow_pipx_start.json",
|
|
225
|
+
"notes": "Ubuntu checkout-based pipx install and browser-entry smoke passed.",
|
|
226
|
+
},
|
|
227
|
+
"pipx_public_package": {
|
|
228
|
+
"status": "passed",
|
|
229
|
+
"command": "python -m pipx run --spec falsiflow falsiflow start --check --json",
|
|
230
|
+
"workflow_url": workflow_url,
|
|
231
|
+
"artifact": "falsiflow_public_package_start.json",
|
|
232
|
+
"notes": "Ubuntu pipx run from the published package passed.",
|
|
233
|
+
},
|
|
234
|
+
"windows_powershell": {
|
|
235
|
+
"status": "passed",
|
|
236
|
+
"command": ".\\scripts\\install_local.ps1 -FromLocal . -Check",
|
|
237
|
+
"workflow_url": workflow_url,
|
|
238
|
+
"notes": "Windows PowerShell installer smoke passed.",
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
}
|
|
242
|
+
pathlib.Path("falsiflow_external_evidence.json").write_text(json.dumps(evidence, indent=2, sort_keys=True), encoding="utf-8")
|
|
243
|
+
PY
|
|
244
|
+
- name: Verify external readiness with structured evidence
|
|
245
|
+
shell: bash
|
|
246
|
+
env:
|
|
247
|
+
FALSIFLOW_REPO_URL: ${{ inputs.repo_url || format('https://github.com/{0}', github.repository) }}
|
|
248
|
+
FALSIFLOW_PUBLIC_DEMO_URL: ${{ inputs.public_demo_url }}
|
|
249
|
+
FALSIFLOW_PYPI_PACKAGE_URL: ${{ inputs.pypi_package_url }}
|
|
250
|
+
run: |
|
|
251
|
+
python scripts/falsiflow.py external-check \
|
|
252
|
+
--out-dir falsiflow_external_check \
|
|
253
|
+
--evidence falsiflow_external_evidence.json \
|
|
254
|
+
--force \
|
|
255
|
+
--strict \
|
|
256
|
+
--json > falsiflow_external_readiness.stdout.json
|
|
257
|
+
- name: Upload external evidence artifact
|
|
258
|
+
uses: actions/upload-artifact@v7
|
|
259
|
+
with:
|
|
260
|
+
name: falsiflow-external-evidence
|
|
261
|
+
path: |
|
|
262
|
+
falsiflow_external_evidence.json
|
|
263
|
+
falsiflow_external_readiness.stdout.json
|
|
264
|
+
falsiflow_external_check/external_readiness.json
|
|
265
|
+
falsiflow_external_check/external_readiness.md
|
|
266
|
+
${{ runner.temp }}/falsiflow_public_demo_index.html
|
|
267
|
+
${{ runner.temp }}/falsiflow_pypi_project.json
|
|
268
|
+
${{ runner.temp }}/falsiflow_expected_version.txt
|
|
269
|
+
${{ runner.temp }}/falsiflow_pypi_version.txt
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: Falsiflow Pages Demo
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
pages: write
|
|
9
|
+
id-token: write
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: pages
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
build:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout public repository
|
|
20
|
+
shell: bash
|
|
21
|
+
run: |
|
|
22
|
+
git init .
|
|
23
|
+
git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
|
|
24
|
+
git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
|
|
25
|
+
git checkout --detach "${GITHUB_SHA}"
|
|
26
|
+
- uses: actions/setup-python@v6
|
|
27
|
+
with:
|
|
28
|
+
python-version: "3.11"
|
|
29
|
+
- name: Configure Pages
|
|
30
|
+
uses: actions/configure-pages@v6
|
|
31
|
+
with:
|
|
32
|
+
enablement: true
|
|
33
|
+
- name: Build public demo package
|
|
34
|
+
run: |
|
|
35
|
+
python scripts/falsiflow.py demo-package \
|
|
36
|
+
--out-dir public_demo \
|
|
37
|
+
--force \
|
|
38
|
+
--json > /tmp/falsiflow_demo_package.json
|
|
39
|
+
cp /tmp/falsiflow_demo_package.json public_demo/demo_package_summary.stdout.json
|
|
40
|
+
- name: Upload Pages artifact
|
|
41
|
+
uses: actions/upload-pages-artifact@v5
|
|
42
|
+
with:
|
|
43
|
+
path: public_demo
|
|
44
|
+
|
|
45
|
+
deploy:
|
|
46
|
+
needs: build
|
|
47
|
+
runs-on: ubuntu-latest
|
|
48
|
+
environment:
|
|
49
|
+
name: github-pages
|
|
50
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
51
|
+
steps:
|
|
52
|
+
- name: Deploy to GitHub Pages
|
|
53
|
+
id: deployment
|
|
54
|
+
uses: actions/deploy-pages@v5
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
name: Falsiflow Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
release:
|
|
6
|
+
types:
|
|
7
|
+
- published
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
id-token: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
build-dist:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout public repository
|
|
18
|
+
shell: bash
|
|
19
|
+
run: |
|
|
20
|
+
git init .
|
|
21
|
+
git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
|
|
22
|
+
git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
|
|
23
|
+
git checkout --detach "${GITHUB_SHA}"
|
|
24
|
+
- uses: actions/setup-python@v6
|
|
25
|
+
with:
|
|
26
|
+
python-version: "3.11"
|
|
27
|
+
- name: Build and check distributions
|
|
28
|
+
run: |
|
|
29
|
+
python -m pip install --upgrade build twine
|
|
30
|
+
python -m build
|
|
31
|
+
python -m twine check dist/*
|
|
32
|
+
- name: Release check
|
|
33
|
+
run: |
|
|
34
|
+
python scripts/falsiflow.py release-check \
|
|
35
|
+
--out-dir /tmp/falsiflow_release_check \
|
|
36
|
+
--json > /tmp/falsiflow_release_check.json
|
|
37
|
+
- name: Upload distribution artifact
|
|
38
|
+
uses: actions/upload-artifact@v7
|
|
39
|
+
with:
|
|
40
|
+
name: falsiflow-dist
|
|
41
|
+
path: dist/*
|
|
42
|
+
|
|
43
|
+
publish-pypi:
|
|
44
|
+
if: github.event_name == 'release'
|
|
45
|
+
needs: build-dist
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
environment:
|
|
48
|
+
name: pypi
|
|
49
|
+
url: https://pypi.org/project/falsiflow/
|
|
50
|
+
steps:
|
|
51
|
+
- name: Download distribution artifact
|
|
52
|
+
uses: actions/download-artifact@v8
|
|
53
|
+
with:
|
|
54
|
+
name: falsiflow-dist
|
|
55
|
+
path: dist
|
|
56
|
+
- name: Publish to PyPI
|
|
57
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|