codeplain 0.3.13.dev42__tar.gz → 0.3.13.dev44__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.
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.github/dependabot.yml +13 -2
- codeplain-0.3.13.dev44/.github/workflows/notify-slack-on-main-merge.yml +37 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.github/workflows/publish-dev-to-pypi.yml +52 -19
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.github/workflows/publish-install-script.yml +37 -14
- codeplain-0.3.13.dev44/.github/workflows/publish-to-pypi.yml +204 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/PKG-INFO +1 -1
- codeplain-0.3.13.dev42/.github/workflows/nofity-slack-on-main-merge.yml +0 -22
- codeplain-0.3.13.dev42/.github/workflows/publish-to-pypi.yml +0 -159
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.claude/settings.json +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.flake8 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.github/workflows/e2e.yml +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.github/workflows/lint-and-test.yml +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.github/workflows/lint-powershell.yml +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.gitignore +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.vscode/launch.json +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.vscode/settings.json +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/CLAUDE.md +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/CONTRIBUTING.md +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/LICENSE +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/README.md +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/change_detection.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/cli_output/__init__.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/cli_output/dry_run.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/cli_output/render_summary.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/cli_output/status.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/codeplain_REST_api.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/concept_utils.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/config/__init__.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/config/system_config.yaml +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/conformance_fix_journal.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/diff_utils.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/docs/generate_cli.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/docs/plain2code_cli.md +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/docs/starting_a_plain_project_from_scratch.md +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/event_bus.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_golang/config.yaml +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_golang/harness_tests/hello_world_test.go +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_golang/hello_world_golang.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_golang/run.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_python/config.yaml +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_python/harness_tests/hello_world_display/test_hello_world.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_python/hello_world_python.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_python/run.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_react/config.yaml +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_react/harness_tests/hello_world_display/cypress/e2e/hello_world.cy.ts +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_react/harness_tests/hello_world_display/cypress/support/e2e.ts +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_react/harness_tests/hello_world_display/cypress.config.ts +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_react/harness_tests/hello_world_display/package.json +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_react/harness_tests/hello_world_display/tsconfig.json +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_react/hello_world_react.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/example_hello_world_react/run.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/examples/run.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/file_utils.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/git_preflight.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/git_utils.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/install/bash/examples.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/install/bash/install.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/install/bash/walkthrough.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/install/powershell/examples.ps1 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/install/powershell/install.ps1 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/install/powershell/walkthrough.ps1 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/memory_management.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/metadata_utils.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/module_renderer.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/partial_rendering.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/path_resolution.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_arguments.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_cli.md +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_console.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_events.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_exceptions.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_logger.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_nodes.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_read_config.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_state.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_telemetry.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain2code_utils.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain_file.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain_modules.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/plain_spec.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/pyproject.toml +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/pytest.ini +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/__init__.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/analyze_specification_ambiguity.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/base_action.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/commit_conformance_tests_changes.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/commit_implementation_code_changes.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/create_dist.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/distill_conformance_test_memory.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/exit_with_error.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/finish_functional_requirement.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/fix_conformance_test.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/fix_unit_tests.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/prepare_repositories.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/prepare_testing_environment.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/refactor_code.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/render_conformance_tests.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/render_functional_requirement.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/run_conformance_tests.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/run_unit_tests.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/actions/summarize_conformance_tests.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/agent_tools.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/code_renderer.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/conformance_tests.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/implementation_code_helpers.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/render_context.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/render_types.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/render_utils.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/state_machine_config.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/states.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/render_machine/triggers.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/requirements.txt +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/resources/codeplain_overview.png +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/resources/plain_example.png +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/standard_template_library/golang-console-app-template.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/standard_template_library/python-console-app-template.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/standard_template_library/typescript-react-app-boilerplate.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/standard_template_library/typescript-react-app-template.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/system_config.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_conformance_tests_cypress.ps1 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_conformance_tests_cypress.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_conformance_tests_golang.ps1 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_conformance_tests_golang.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_conformance_tests_python.ps1 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_conformance_tests_python.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_unittests_flutter.ps1 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_unittests_flutter.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_unittests_golang.ps1 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_unittests_golang.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_unittests_python.ps1 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_unittests_python.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_unittests_react.ps1 +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/test_scripts/run_unittests_react.sh +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/__init__.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/conftest.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/acceptance_tests_warning/main_requiring_acceptance_tests.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/acceptance_tests_warning/required_with_acceptance_tests.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/imports/circular_imports_1.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/imports/circular_imports_2.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/imports/circular_imports_main.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/imports/diamond_import_1.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/imports/diamond_import_2.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/imports/diamond_import_common.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/imports/diamond_imports_main.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/imports/import_with_functionalities.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/imports/imports_module_with_functionalities.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/imports/non_existent_import.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/partial_rendering/pr_code_var.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/partial_rendering/pr_implement.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/partial_rendering/pr_leaf.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/partial_rendering/pr_middle.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/partial_rendering/pr_root.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/partial_rendering/pr_solo.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/add_new_task_modal_specification.yaml +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/duplicate_specification_heading.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/empty_functional_specs_section.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/invalid_specification_order.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/missing_non_functional_requirements.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/no_functional_specs_section.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/plain_source_with_absolute_link.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/plain_source_with_missing_link.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/plain_source_with_url_link.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/task_list_ui_specification.yaml +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/task_manager_with_reference_links.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfile/without_non_functional_requirement.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_acceptance_tests.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_acceptance_tests_nondefined.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_defined_nondefined.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_defined_nondefined_2.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_definition.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_noconcepts.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_nonconcept.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_nondefined.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_redefinition.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_several_concepts.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/concept_validation_valid.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/cyclic_definitions.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_base.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_defaults_exported.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_example.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_imported_exported.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_inherited_reexported.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_malformed.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_missing_definition.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_missing_definition_example.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_multiple_per_bullet.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_multiple_per_bullet_undefined.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_nested.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_nested_example.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_no_definitions.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_not_declared.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_not_declared_example.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_transitive_example.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_transitive_l1.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/exported_concepts_transitive_l2.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/plain_file_parser_with_comments.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/plain_file_with_comments_indented.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/regular_plain_source.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/required_concepts.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/required_concepts_defs.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/required_concepts_example.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/required_concepts_l1.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/required_concepts_l2.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/required_concepts_missing.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/required_concepts_module.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/required_concepts_partial.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/required_concepts_partial_duplicate.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/requires_without_definitions_example.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/topological_sort.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/plainfileparser/topological_sort_not_referenced.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/circular_requires_main.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/circular_requires_sub.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/diamond_requires_1.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/diamond_requires_2.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/diamond_requires_common.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/diamond_requires_main.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/independent_requires_1.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/independent_requires_2.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/independent_requires_main.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/non_existent_require.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/normal_requires_1.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/normal_requires_2.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/normal_requires_common.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/requires/normal_requires_main.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/sample_base64_image.txt +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/simple.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/templates/block_level_include.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/templates/code_variables.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/templates/header.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/templates/implement.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/templates/implement_2.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/templates/template_include.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/data/templates/test_hardest_problem.plain +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/e2e/Dockerfile +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/e2e/conftest.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/e2e/test_hello_world_python.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/e2e/test_hello_world_python_windows.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_agent_tools.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_arg_provenance.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_change_detection.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_cli_output.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_conformance_fix_journal.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_console_log_styles.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_distill_conformance_test_memory.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_dry_run_link_validation.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_file_utils.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_fix_unit_tests_action.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_fix_unit_tests_conformance_context.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_folder_path_resolution.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_git_preflight.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_git_utils.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_headless_logging.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_imports.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_log_file_name_resolution.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_logging_config_path_resolution.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_partial_rendering.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_path_resolution.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_plain2code.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_plain2code_state.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_plain2code_utils.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_plain_modules.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_plainfile.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_plainfileparser.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_plainspec.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_prepare_repositories_layout.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_render_finished_report.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_render_stop_reason.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_requires.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_resolve_config_file.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_script_path_resolution.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_system_config.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_telemetry.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_terminal_attachment.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_tui_components.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_tui_usage.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tests/test_usage_summary.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tui/__init__.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tui/components.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tui/models.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tui/plain2code_tui.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tui/plain_module_render_choice_tui.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tui/spinner.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tui/state_handlers.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tui/styles.css +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/tui/widget_helpers.py +0 -0
- {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/usage_summary.py +0 -0
|
@@ -4,11 +4,22 @@ updates:
|
|
|
4
4
|
directory: "/"
|
|
5
5
|
schedule:
|
|
6
6
|
interval: "weekly"
|
|
7
|
-
|
|
7
|
+
# Skip releases younger than two days. Security updates are never delayed.
|
|
8
|
+
cooldown:
|
|
9
|
+
default-days: 2
|
|
10
|
+
open-pull-requests-limit: 5
|
|
11
|
+
# "chore(deps): ..." — also applies to pip security update PRs.
|
|
8
12
|
commit-message:
|
|
9
|
-
prefix: "
|
|
13
|
+
prefix: "chore"
|
|
14
|
+
include: "scope"
|
|
10
15
|
labels:
|
|
11
16
|
- "dependencies"
|
|
17
|
+
# Routine bumps arrive as one weekly PR; majors stay separate.
|
|
18
|
+
groups:
|
|
19
|
+
pip-minor-and-patch:
|
|
20
|
+
update-types:
|
|
21
|
+
- "minor"
|
|
22
|
+
- "patch"
|
|
12
23
|
|
|
13
24
|
# Keeps the SHA-pinned actions in publish-to-pypi.yml patched.
|
|
14
25
|
- package-ecosystem: "github-actions"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: Notify Slack on Merge to Main
|
|
2
|
+
|
|
3
|
+
# pull_request_target runs this file from main with secrets, so merged PRs from
|
|
4
|
+
# forks post too. Nothing from the PR is checked out or run; the title only
|
|
5
|
+
# reaches the shell through an env var.
|
|
6
|
+
on:
|
|
7
|
+
pull_request_target:
|
|
8
|
+
types: [closed]
|
|
9
|
+
branches:
|
|
10
|
+
- main
|
|
11
|
+
|
|
12
|
+
permissions: {}
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
notify:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
if: github.event.pull_request.merged == true && vars.SLACK_CHANNEL_ID != ''
|
|
18
|
+
steps:
|
|
19
|
+
# Slack reads <, > and & as markup: escape them so a PR title cannot
|
|
20
|
+
# mention @channel or rewrite the link.
|
|
21
|
+
- name: Escape the PR title for Slack
|
|
22
|
+
id: pr
|
|
23
|
+
env:
|
|
24
|
+
TITLE: ${{ github.event.pull_request.title }}
|
|
25
|
+
run: |
|
|
26
|
+
printf 'title=%s\n' "$(printf '%s' "$TITLE" | tr '\r\n' ' ' | sed -e 's/&/\&/g' -e 's/</\</g' -e 's/>/\>/g')" >> "$GITHUB_OUTPUT"
|
|
27
|
+
|
|
28
|
+
- name: Send notification to Slack
|
|
29
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
30
|
+
with:
|
|
31
|
+
method: chat.postMessage
|
|
32
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
33
|
+
errors: true
|
|
34
|
+
# toJSON quotes the title, so quotes and colons in it keep the payload valid.
|
|
35
|
+
payload: |
|
|
36
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
37
|
+
text: ${{ toJSON(format('[Codeplain Client] PR <{0}|#{1}: {2}> was merged to main by `{3}`.', github.event.pull_request.html_url, github.event.pull_request.number, steps.pr.outputs.title, github.actor)) }}
|
|
@@ -110,9 +110,6 @@ jobs:
|
|
|
110
110
|
# authenticate this run — no long-lived API token needed.
|
|
111
111
|
id-token: write
|
|
112
112
|
|
|
113
|
-
env:
|
|
114
|
-
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
115
|
-
|
|
116
113
|
steps:
|
|
117
114
|
- name: Download distribution packages
|
|
118
115
|
uses: actions/download-artifact@v8
|
|
@@ -127,21 +124,57 @@ jobs:
|
|
|
127
124
|
# version should be a no-op, not a red build.
|
|
128
125
|
skip-existing: true
|
|
129
126
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
127
|
+
# End-of-run notices run in their own job: a failed Slack post fails only this
|
|
128
|
+
# job, not the publish or its GitHub deployment, and "Re-run failed jobs"
|
|
129
|
+
# re-posts without publishing again.
|
|
130
|
+
notify:
|
|
131
|
+
name: Notify Slack
|
|
132
|
+
needs: [build, publish-dev]
|
|
133
|
+
if: ${{ !cancelled() && vars.SLACK_CHANNEL_ID != '' }}
|
|
134
|
+
runs-on: ubuntu-latest
|
|
135
|
+
|
|
136
|
+
steps:
|
|
137
|
+
- name: Short SHA
|
|
138
|
+
run: echo "SHORT_SHA=${GITHUB_SHA:0:7}" >> "$GITHUB_ENV"
|
|
139
|
+
|
|
140
|
+
- name: Notify Slack (build failure)
|
|
141
|
+
if: ${{ needs.build.result == 'failure' }}
|
|
142
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
143
|
+
with:
|
|
144
|
+
method: chat.postMessage
|
|
145
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
146
|
+
errors: true
|
|
147
|
+
payload: |
|
|
148
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
149
|
+
text: >-
|
|
150
|
+
*Codeplain Client*: Building the dev build FAILED :x: (commit `${{ env.SHORT_SHA }}`). Nothing was published to PyPI.
|
|
151
|
+
See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.
|
|
141
152
|
|
|
142
153
|
- name: Notify Slack (failure)
|
|
143
|
-
if: ${{
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
154
|
+
if: ${{ needs.publish-dev.result == 'failure' }}
|
|
155
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
156
|
+
with:
|
|
157
|
+
method: chat.postMessage
|
|
158
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
159
|
+
errors: true
|
|
160
|
+
payload: |
|
|
161
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
162
|
+
text: >-
|
|
163
|
+
*Codeplain Client*: Publishing dev build to PyPI FAILED :x: (commit `${{ env.SHORT_SHA }}`).
|
|
164
|
+
See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.
|
|
165
|
+
|
|
166
|
+
# Spell out the --pre install: a plain "pip install codeplain" will
|
|
167
|
+
# NOT pick this up, which otherwise reads as a broken publish.
|
|
168
|
+
- name: Notify Slack (success)
|
|
169
|
+
if: ${{ needs.publish-dev.result == 'success' }}
|
|
170
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
171
|
+
with:
|
|
172
|
+
method: chat.postMessage
|
|
173
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
174
|
+
errors: true
|
|
175
|
+
payload: |
|
|
176
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
177
|
+
text: >-
|
|
178
|
+
*Codeplain Client*: dev build `${{ needs.build.outputs.version }}` published to PyPI :test_tube:.
|
|
179
|
+
Normal installs are unaffected — try it with `pip install --pre codeplain==${{ needs.build.outputs.version }}`.
|
|
180
|
+
Pre-release builds talk to `api.test.codeplain.ai` by default.
|
{codeplain-0.3.13.dev42 → codeplain-0.3.13.dev44}/.github/workflows/publish-install-script.yml
RENAMED
|
@@ -14,9 +14,6 @@ jobs:
|
|
|
14
14
|
name: Upload to Cloudflare R2
|
|
15
15
|
runs-on: ubuntu-latest
|
|
16
16
|
|
|
17
|
-
env:
|
|
18
|
-
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
19
|
-
|
|
20
17
|
steps:
|
|
21
18
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
22
19
|
|
|
@@ -57,17 +54,43 @@ jobs:
|
|
|
57
54
|
--content-type "text/plain"
|
|
58
55
|
echo "✓ examples.ps1 uploaded to R2"
|
|
59
56
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
57
|
+
# End-of-run notices run in their own job: a failed Slack post fails only this
|
|
58
|
+
# job, and "Re-run failed jobs" re-posts without uploading again.
|
|
59
|
+
notify:
|
|
60
|
+
name: Notify Slack
|
|
61
|
+
needs: publish
|
|
62
|
+
if: ${{ !cancelled() && vars.SLACK_CHANNEL_ID != '' }}
|
|
63
|
+
runs-on: ubuntu-latest
|
|
64
|
+
permissions: {}
|
|
65
|
+
|
|
66
|
+
steps:
|
|
67
|
+
- name: Short SHA
|
|
68
|
+
run: echo "SHORT_SHA=${GITHUB_SHA:0:7}" >> "$GITHUB_ENV"
|
|
66
69
|
|
|
67
70
|
- name: Notify Slack (failure)
|
|
68
|
-
if: ${{
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
if: ${{ needs.publish.result == 'failure' }}
|
|
72
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
73
|
+
with:
|
|
74
|
+
method: chat.postMessage
|
|
75
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
76
|
+
errors: true
|
|
77
|
+
payload: |
|
|
78
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
79
|
+
text: >-
|
|
80
|
+
*Codeplain Client*: Install script deploy to R2 FAILED :x: (`${{ env.SHORT_SHA }}`).
|
|
81
|
+
Users may be getting a stale installer.
|
|
82
|
+
See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.
|
|
83
|
+
|
|
84
|
+
- name: Notify Slack (success)
|
|
85
|
+
if: ${{ needs.publish.result == 'success' }}
|
|
86
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
87
|
+
with:
|
|
88
|
+
method: chat.postMessage
|
|
89
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
90
|
+
errors: true
|
|
91
|
+
payload: |
|
|
92
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
93
|
+
text: >-
|
|
94
|
+
*Codeplain Client*: Install scripts deployed to R2 :white_check_mark:
|
|
95
|
+
(`${{ env.SHORT_SHA }}`, by *${{ github.actor }}*).
|
|
73
96
|
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
# Least privilege by default: jobs get no GITHUB_TOKEN scopes unless they
|
|
8
|
+
# opt in below.
|
|
9
|
+
permissions: {}
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
name: Build distribution
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
permissions:
|
|
16
|
+
contents: write
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
20
|
+
with:
|
|
21
|
+
# hatch-vcs derives the version from git tags, so we need full history.
|
|
22
|
+
fetch-depth: 0
|
|
23
|
+
|
|
24
|
+
# Non-fatal: Slack being down must not block the release.
|
|
25
|
+
- name: Notify Slack (start)
|
|
26
|
+
if: ${{ vars.SLACK_CHANNEL_ID != '' }}
|
|
27
|
+
continue-on-error: true
|
|
28
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
29
|
+
with:
|
|
30
|
+
method: chat.postMessage
|
|
31
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
32
|
+
errors: true
|
|
33
|
+
payload: |
|
|
34
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
35
|
+
text: >-
|
|
36
|
+
*Codeplain Client*: Release `${{ github.ref_name }}` published by *${{ github.actor }}*
|
|
37
|
+
— building and publishing to PyPI...
|
|
38
|
+
|
|
39
|
+
- name: Install uv
|
|
40
|
+
# uv provisions its own Python (honoring requires-python), so no
|
|
41
|
+
# separate actions/setup-python step is needed.
|
|
42
|
+
run: |
|
|
43
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
44
|
+
echo "$HOME/.local/bin" >> $GITHUB_PATH
|
|
45
|
+
|
|
46
|
+
- name: Build package
|
|
47
|
+
# hatch-vcs reads the version straight from the release tag.
|
|
48
|
+
run: |
|
|
49
|
+
uv build
|
|
50
|
+
echo "Built distributions:"
|
|
51
|
+
ls -l dist/
|
|
52
|
+
|
|
53
|
+
- name: Store the distribution packages
|
|
54
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
55
|
+
with:
|
|
56
|
+
name: python-package-distributions
|
|
57
|
+
path: dist/
|
|
58
|
+
|
|
59
|
+
- name: Upload assets to GitHub Release
|
|
60
|
+
env:
|
|
61
|
+
GH_TOKEN: ${{ github.token }}
|
|
62
|
+
run: |
|
|
63
|
+
gh release upload ${{ github.ref_name }} dist/* --clobber
|
|
64
|
+
|
|
65
|
+
publish-to-pypi:
|
|
66
|
+
name: Publish to PyPI
|
|
67
|
+
needs: build
|
|
68
|
+
runs-on: ubuntu-latest
|
|
69
|
+
environment:
|
|
70
|
+
name: pypi
|
|
71
|
+
url: https://pypi.org/p/codeplain
|
|
72
|
+
permissions:
|
|
73
|
+
# Mint a short-lived OIDC token so PyPI Trusted Publishing can
|
|
74
|
+
# authenticate this run — no long-lived API token needed.
|
|
75
|
+
id-token: write
|
|
76
|
+
|
|
77
|
+
steps:
|
|
78
|
+
- name: Download distribution packages
|
|
79
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
80
|
+
with:
|
|
81
|
+
name: python-package-distributions
|
|
82
|
+
path: dist/
|
|
83
|
+
|
|
84
|
+
- name: Publish to PyPI
|
|
85
|
+
uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # release/v1
|
|
86
|
+
|
|
87
|
+
# End-of-run notices run in their own job: a failed Slack post fails only this
|
|
88
|
+
# job, not the publish or its GitHub deployment, and "Re-run failed jobs"
|
|
89
|
+
# re-posts without publishing again.
|
|
90
|
+
notify:
|
|
91
|
+
name: Notify Slack
|
|
92
|
+
needs: [build, publish-to-pypi]
|
|
93
|
+
if: ${{ !cancelled() && vars.SLACK_CHANNEL_ID != '' }}
|
|
94
|
+
runs-on: ubuntu-latest
|
|
95
|
+
|
|
96
|
+
steps:
|
|
97
|
+
- name: Notify Slack (build failure)
|
|
98
|
+
if: ${{ needs.build.result == 'failure' }}
|
|
99
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
100
|
+
with:
|
|
101
|
+
method: chat.postMessage
|
|
102
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
103
|
+
errors: true
|
|
104
|
+
payload: |
|
|
105
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
106
|
+
text: >-
|
|
107
|
+
*Codeplain Client*: Build of `${{ github.ref_name }}` FAILED :x:. Nothing was published to PyPI.
|
|
108
|
+
See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.
|
|
109
|
+
|
|
110
|
+
- name: Notify Slack (failure)
|
|
111
|
+
if: ${{ needs.publish-to-pypi.result == 'failure' }}
|
|
112
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
113
|
+
with:
|
|
114
|
+
method: chat.postMessage
|
|
115
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
116
|
+
errors: true
|
|
117
|
+
payload: |
|
|
118
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
119
|
+
text: >-
|
|
120
|
+
*Codeplain Client*: Publishing `${{ github.ref_name }}` to PyPI FAILED :x:.
|
|
121
|
+
See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.
|
|
122
|
+
|
|
123
|
+
# The tag (v0.4.0rc1) without its "v", for the install command below.
|
|
124
|
+
- name: Version from tag
|
|
125
|
+
id: version
|
|
126
|
+
if: ${{ needs.publish-to-pypi.result == 'success' }}
|
|
127
|
+
env:
|
|
128
|
+
TAG: ${{ github.ref_name }}
|
|
129
|
+
run: echo "version=${TAG#v}" >> "$GITHUB_OUTPUT"
|
|
130
|
+
|
|
131
|
+
# GitHub marks the release itself as a pre-release; the tag (v0.4.0rc1)
|
|
132
|
+
# carries the same intent for PEP 440. pip and uv skip pre-releases by
|
|
133
|
+
# default, so "--upgrade" would NOT pick one up. Tell people the command
|
|
134
|
+
# that actually works.
|
|
135
|
+
- name: Notify Slack (pre-release published)
|
|
136
|
+
if: ${{ needs.publish-to-pypi.result == 'success' && github.event.release.prerelease }}
|
|
137
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
138
|
+
with:
|
|
139
|
+
method: chat.postMessage
|
|
140
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
141
|
+
errors: true
|
|
142
|
+
payload: |
|
|
143
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
144
|
+
text: >-
|
|
145
|
+
*Codeplain Client*: pre-release `${{ github.ref_name }}` published to PyPI :test_tube:.
|
|
146
|
+
Normal installs are unaffected — try it with `pip install --pre codeplain==${{ steps.version.outputs.version }}`.
|
|
147
|
+
|
|
148
|
+
- name: Notify Slack (release published)
|
|
149
|
+
if: ${{ needs.publish-to-pypi.result == 'success' && !github.event.release.prerelease }}
|
|
150
|
+
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
151
|
+
with:
|
|
152
|
+
method: chat.postMessage
|
|
153
|
+
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
154
|
+
errors: true
|
|
155
|
+
payload: |
|
|
156
|
+
channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
157
|
+
text: >-
|
|
158
|
+
*Codeplain Client*: `${{ github.ref_name }}` published to PyPI :white_check_mark:.
|
|
159
|
+
Install with `pip install --upgrade codeplain`.
|
|
160
|
+
|
|
161
|
+
# Release pipelines to be turned on only after the rest of the infrastructure
|
|
162
|
+
# is ready.
|
|
163
|
+
#
|
|
164
|
+
# # Runs only after the package is on PyPI. Kept as its own job so the publish job
|
|
165
|
+
# # keeps its minimal permissions and no checkout.
|
|
166
|
+
# linear-release:
|
|
167
|
+
# name: Record release in Linear
|
|
168
|
+
# needs: publish-to-pypi
|
|
169
|
+
# runs-on: ubuntu-latest
|
|
170
|
+
#
|
|
171
|
+
# permissions:
|
|
172
|
+
# contents: read
|
|
173
|
+
#
|
|
174
|
+
# steps:
|
|
175
|
+
# - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
176
|
+
# with:
|
|
177
|
+
# # The scan needs full history.
|
|
178
|
+
# fetch-depth: 0
|
|
179
|
+
#
|
|
180
|
+
# # Non-fatal: the package is already published.
|
|
181
|
+
# - name: Record release in Linear
|
|
182
|
+
# id: linear
|
|
183
|
+
# continue-on-error: true
|
|
184
|
+
# uses: linear/linear-release-action@0a25abab892a91062ebf42260dbb2ce6277aa205 # v0.16.0
|
|
185
|
+
# with:
|
|
186
|
+
# access_key: ${{ secrets.LINEAR_ACCESS_KEY }}
|
|
187
|
+
# version: ${{ github.ref_name }}
|
|
188
|
+
# # Pin the CLI the action downloads, not just the action.
|
|
189
|
+
# cli_version: v0.16.0
|
|
190
|
+
#
|
|
191
|
+
# # continue-on-error keeps the job green, so this checks the step's own
|
|
192
|
+
# # outcome — `failure()` would never fire.
|
|
193
|
+
# - name: Notify Slack (release not recorded)
|
|
194
|
+
# if: ${{ steps.linear.outcome == 'failure' && vars.SLACK_CHANNEL_ID != '' }}
|
|
195
|
+
# uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
196
|
+
# with:
|
|
197
|
+
# method: chat.postMessage
|
|
198
|
+
# token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
199
|
+
# errors: true
|
|
200
|
+
# payload: |
|
|
201
|
+
# channel: ${{ vars.SLACK_CHANNEL_ID }}
|
|
202
|
+
# text: >-
|
|
203
|
+
# *Codeplain Client*: `${{ github.ref_name }}` is on PyPI, but recording it in Linear FAILED :warning:.
|
|
204
|
+
# See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
name: Notify Slack on Merge to Main
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
types: [closed]
|
|
6
|
-
branches:
|
|
7
|
-
- main
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
notify:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
if: github.event.pull_request.merged == true
|
|
13
|
-
steps:
|
|
14
|
-
- name: Send notification to Slack
|
|
15
|
-
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
|
|
16
|
-
with:
|
|
17
|
-
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
18
|
-
webhook-type: incoming-webhook
|
|
19
|
-
payload: |
|
|
20
|
-
{
|
|
21
|
-
"text": ${{ toJSON(format('[Codeplain Client] PR <{0}|#{1}: {2}> was merged to main by `{3}`.', github.event.pull_request.html_url, github.event.pull_request.number, github.event.pull_request.title, github.actor)) }}
|
|
22
|
-
}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
name: Publish to PyPI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
release:
|
|
5
|
-
types: [published]
|
|
6
|
-
|
|
7
|
-
# Least privilege by default: jobs get no GITHUB_TOKEN scopes unless they
|
|
8
|
-
# opt in below.
|
|
9
|
-
permissions: {}
|
|
10
|
-
|
|
11
|
-
jobs:
|
|
12
|
-
build:
|
|
13
|
-
name: Build distribution
|
|
14
|
-
runs-on: ubuntu-latest
|
|
15
|
-
permissions:
|
|
16
|
-
contents: write
|
|
17
|
-
|
|
18
|
-
env:
|
|
19
|
-
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
20
|
-
|
|
21
|
-
steps:
|
|
22
|
-
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
23
|
-
with:
|
|
24
|
-
# hatch-vcs derives the version from git tags, so we need full history.
|
|
25
|
-
fetch-depth: 0
|
|
26
|
-
|
|
27
|
-
- name: Notify Slack (start)
|
|
28
|
-
if: ${{ env.SLACK_WEBHOOK_URL != '' }}
|
|
29
|
-
run: |
|
|
30
|
-
curl -s -X POST "$SLACK_WEBHOOK_URL" \
|
|
31
|
-
-H 'Content-type: application/json' \
|
|
32
|
-
--data "{\"text\":\"*Codeplain Client*: Release \`${{ github.ref_name }}\` published by *${{ github.actor }}* — building and publishing to PyPI...\"}"
|
|
33
|
-
|
|
34
|
-
- name: Install uv
|
|
35
|
-
# uv provisions its own Python (honoring requires-python), so no
|
|
36
|
-
# separate actions/setup-python step is needed.
|
|
37
|
-
run: |
|
|
38
|
-
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
39
|
-
echo "$HOME/.local/bin" >> $GITHUB_PATH
|
|
40
|
-
|
|
41
|
-
- name: Build package
|
|
42
|
-
# hatch-vcs reads the version straight from the release tag.
|
|
43
|
-
run: |
|
|
44
|
-
uv build
|
|
45
|
-
echo "Built distributions:"
|
|
46
|
-
ls -l dist/
|
|
47
|
-
|
|
48
|
-
- name: Store the distribution packages
|
|
49
|
-
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
50
|
-
with:
|
|
51
|
-
name: python-package-distributions
|
|
52
|
-
path: dist/
|
|
53
|
-
|
|
54
|
-
- name: Upload assets to GitHub Release
|
|
55
|
-
env:
|
|
56
|
-
GH_TOKEN: ${{ github.token }}
|
|
57
|
-
run: |
|
|
58
|
-
gh release upload ${{ github.ref_name }} dist/* --clobber
|
|
59
|
-
|
|
60
|
-
- name: Notify Slack (build failure)
|
|
61
|
-
if: ${{ failure() && env.SLACK_WEBHOOK_URL != '' }}
|
|
62
|
-
run: |
|
|
63
|
-
curl -s -X POST "$SLACK_WEBHOOK_URL" \
|
|
64
|
-
-H 'Content-type: application/json' \
|
|
65
|
-
--data "{\"text\":\"*Codeplain Client*: Build of \`${{ github.ref_name }}\` FAILED :x:. Nothing was published to PyPI. See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.\"}"
|
|
66
|
-
|
|
67
|
-
publish-to-pypi:
|
|
68
|
-
name: Publish to PyPI
|
|
69
|
-
needs: build
|
|
70
|
-
runs-on: ubuntu-latest
|
|
71
|
-
environment:
|
|
72
|
-
name: pypi
|
|
73
|
-
url: https://pypi.org/p/codeplain
|
|
74
|
-
permissions:
|
|
75
|
-
# Mint a short-lived OIDC token so PyPI Trusted Publishing can
|
|
76
|
-
# authenticate this run — no long-lived API token needed.
|
|
77
|
-
id-token: write
|
|
78
|
-
|
|
79
|
-
env:
|
|
80
|
-
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
81
|
-
|
|
82
|
-
steps:
|
|
83
|
-
- name: Download distribution packages
|
|
84
|
-
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
85
|
-
with:
|
|
86
|
-
name: python-package-distributions
|
|
87
|
-
path: dist/
|
|
88
|
-
|
|
89
|
-
- name: Publish to PyPI
|
|
90
|
-
uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # release/v1
|
|
91
|
-
|
|
92
|
-
- name: Notify Slack (success)
|
|
93
|
-
if: ${{ success() && env.SLACK_WEBHOOK_URL != '' }}
|
|
94
|
-
env:
|
|
95
|
-
# GitHub marks the release itself as a pre-release; the tag
|
|
96
|
-
# (v0.4.0rc1) carries the same intent for PEP 440.
|
|
97
|
-
IS_PRERELEASE: ${{ github.event.release.prerelease }}
|
|
98
|
-
TAG: ${{ github.ref_name }}
|
|
99
|
-
run: |
|
|
100
|
-
VERSION="${TAG#v}"
|
|
101
|
-
if [ "$IS_PRERELEASE" = "true" ]; then
|
|
102
|
-
# pip and uv skip pre-releases by default, so "--upgrade" would
|
|
103
|
-
# NOT pick this up. Tell people the command that actually works.
|
|
104
|
-
TEXT="*Codeplain Client*: pre-release \`$TAG\` published to PyPI :test_tube:. Normal installs are unaffected — try it with \`pip install --pre codeplain==$VERSION\`."
|
|
105
|
-
else
|
|
106
|
-
TEXT="*Codeplain Client*: \`$TAG\` published to PyPI :white_check_mark:. Install with \`pip install --upgrade codeplain\`."
|
|
107
|
-
fi
|
|
108
|
-
curl -s -X POST "$SLACK_WEBHOOK_URL" \
|
|
109
|
-
-H 'Content-type: application/json' \
|
|
110
|
-
--data "$(jq -n --arg t "$TEXT" '{text:$t}')"
|
|
111
|
-
|
|
112
|
-
- name: Notify Slack (failure)
|
|
113
|
-
if: ${{ failure() && env.SLACK_WEBHOOK_URL != '' }}
|
|
114
|
-
run: |
|
|
115
|
-
curl -s -X POST "$SLACK_WEBHOOK_URL" \
|
|
116
|
-
-H 'Content-type: application/json' \
|
|
117
|
-
--data "{\"text\":\"*Codeplain Client*: Publishing \`${{ github.ref_name }}\` to PyPI FAILED :x:. See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.\"}"
|
|
118
|
-
|
|
119
|
-
# Release pipelines to be turned on only after the rest of the infrastructure
|
|
120
|
-
# is ready.
|
|
121
|
-
#
|
|
122
|
-
# # Runs only after the package is on PyPI. Kept as its own job so the publish job
|
|
123
|
-
# # keeps its minimal permissions and no checkout.
|
|
124
|
-
# linear-release:
|
|
125
|
-
# name: Record release in Linear
|
|
126
|
-
# needs: publish-to-pypi
|
|
127
|
-
# runs-on: ubuntu-latest
|
|
128
|
-
#
|
|
129
|
-
# permissions:
|
|
130
|
-
# contents: read
|
|
131
|
-
#
|
|
132
|
-
# env:
|
|
133
|
-
# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
134
|
-
#
|
|
135
|
-
# steps:
|
|
136
|
-
# - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
137
|
-
# with:
|
|
138
|
-
# # The scan needs full history.
|
|
139
|
-
# fetch-depth: 0
|
|
140
|
-
#
|
|
141
|
-
# # Non-fatal: the package is already published.
|
|
142
|
-
# - name: Record release in Linear
|
|
143
|
-
# id: linear
|
|
144
|
-
# continue-on-error: true
|
|
145
|
-
# uses: linear/linear-release-action@0a25abab892a91062ebf42260dbb2ce6277aa205 # v0.16.0
|
|
146
|
-
# with:
|
|
147
|
-
# access_key: ${{ secrets.LINEAR_ACCESS_KEY }}
|
|
148
|
-
# version: ${{ github.ref_name }}
|
|
149
|
-
# # Pin the CLI the action downloads, not just the action.
|
|
150
|
-
# cli_version: v0.16.0
|
|
151
|
-
#
|
|
152
|
-
# # continue-on-error keeps the job green, so this checks the step's own
|
|
153
|
-
# # outcome — `failure()` would never fire.
|
|
154
|
-
# - name: Notify Slack (release not recorded)
|
|
155
|
-
# if: ${{ steps.linear.outcome == 'failure' && env.SLACK_WEBHOOK_URL != '' }}
|
|
156
|
-
# run: |
|
|
157
|
-
# curl -s -X POST "$SLACK_WEBHOOK_URL" \
|
|
158
|
-
# -H 'Content-type: application/json' \
|
|
159
|
-
# --data "{\"text\":\"*Codeplain Client*: \`${{ github.ref_name }}\` is on PyPI, but recording it in Linear FAILED :warning:. See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.\"}"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|