codeplain 0.3.13.dev42__tar.gz → 0.3.13.dev43__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. codeplain-0.3.13.dev43/.github/workflows/notify-slack-on-main-merge.yml +37 -0
  2. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.github/workflows/publish-dev-to-pypi.yml +52 -19
  3. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.github/workflows/publish-install-script.yml +37 -14
  4. codeplain-0.3.13.dev43/.github/workflows/publish-to-pypi.yml +204 -0
  5. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/PKG-INFO +1 -1
  6. codeplain-0.3.13.dev42/.github/workflows/nofity-slack-on-main-merge.yml +0 -22
  7. codeplain-0.3.13.dev42/.github/workflows/publish-to-pypi.yml +0 -159
  8. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.claude/settings.json +0 -0
  9. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.flake8 +0 -0
  10. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.github/dependabot.yml +0 -0
  11. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.github/workflows/e2e.yml +0 -0
  12. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.github/workflows/lint-and-test.yml +0 -0
  13. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.github/workflows/lint-powershell.yml +0 -0
  14. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.gitignore +0 -0
  15. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.vscode/launch.json +0 -0
  16. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/.vscode/settings.json +0 -0
  17. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/CLAUDE.md +0 -0
  18. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/CONTRIBUTING.md +0 -0
  19. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/LICENSE +0 -0
  20. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/README.md +0 -0
  21. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/change_detection.py +0 -0
  22. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/cli_output/__init__.py +0 -0
  23. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/cli_output/dry_run.py +0 -0
  24. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/cli_output/render_summary.py +0 -0
  25. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/cli_output/status.py +0 -0
  26. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/codeplain_REST_api.py +0 -0
  27. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/concept_utils.py +0 -0
  28. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/config/__init__.py +0 -0
  29. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/config/system_config.yaml +0 -0
  30. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/conformance_fix_journal.py +0 -0
  31. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/diff_utils.py +0 -0
  32. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/docs/generate_cli.py +0 -0
  33. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/docs/plain2code_cli.md +0 -0
  34. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/docs/starting_a_plain_project_from_scratch.md +0 -0
  35. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/event_bus.py +0 -0
  36. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_golang/config.yaml +0 -0
  37. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_golang/harness_tests/hello_world_test.go +0 -0
  38. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_golang/hello_world_golang.plain +0 -0
  39. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_golang/run.sh +0 -0
  40. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_python/config.yaml +0 -0
  41. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_python/harness_tests/hello_world_display/test_hello_world.py +0 -0
  42. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_python/hello_world_python.plain +0 -0
  43. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_python/run.sh +0 -0
  44. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_react/config.yaml +0 -0
  45. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_react/harness_tests/hello_world_display/cypress/e2e/hello_world.cy.ts +0 -0
  46. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_react/harness_tests/hello_world_display/cypress/support/e2e.ts +0 -0
  47. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_react/harness_tests/hello_world_display/cypress.config.ts +0 -0
  48. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_react/harness_tests/hello_world_display/package.json +0 -0
  49. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_react/harness_tests/hello_world_display/tsconfig.json +0 -0
  50. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_react/hello_world_react.plain +0 -0
  51. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/example_hello_world_react/run.sh +0 -0
  52. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/examples/run.sh +0 -0
  53. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/file_utils.py +0 -0
  54. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/git_preflight.py +0 -0
  55. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/git_utils.py +0 -0
  56. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/install/bash/examples.sh +0 -0
  57. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/install/bash/install.sh +0 -0
  58. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/install/bash/walkthrough.sh +0 -0
  59. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/install/powershell/examples.ps1 +0 -0
  60. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/install/powershell/install.ps1 +0 -0
  61. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/install/powershell/walkthrough.ps1 +0 -0
  62. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/memory_management.py +0 -0
  63. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/metadata_utils.py +0 -0
  64. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/module_renderer.py +0 -0
  65. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/partial_rendering.py +0 -0
  66. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/path_resolution.py +0 -0
  67. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code.py +0 -0
  68. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_arguments.py +0 -0
  69. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_cli.md +0 -0
  70. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_console.py +0 -0
  71. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_events.py +0 -0
  72. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_exceptions.py +0 -0
  73. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_logger.py +0 -0
  74. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_nodes.py +0 -0
  75. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_read_config.py +0 -0
  76. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_state.py +0 -0
  77. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_telemetry.py +0 -0
  78. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain2code_utils.py +0 -0
  79. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain_file.py +0 -0
  80. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain_modules.py +0 -0
  81. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/plain_spec.py +0 -0
  82. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/pyproject.toml +0 -0
  83. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/pytest.ini +0 -0
  84. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/__init__.py +0 -0
  85. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/analyze_specification_ambiguity.py +0 -0
  86. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/base_action.py +0 -0
  87. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/commit_conformance_tests_changes.py +0 -0
  88. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/commit_implementation_code_changes.py +0 -0
  89. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/create_dist.py +0 -0
  90. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/distill_conformance_test_memory.py +0 -0
  91. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/exit_with_error.py +0 -0
  92. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/finish_functional_requirement.py +0 -0
  93. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/fix_conformance_test.py +0 -0
  94. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/fix_unit_tests.py +0 -0
  95. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/prepare_repositories.py +0 -0
  96. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/prepare_testing_environment.py +0 -0
  97. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/refactor_code.py +0 -0
  98. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/render_conformance_tests.py +0 -0
  99. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/render_functional_requirement.py +0 -0
  100. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/run_conformance_tests.py +0 -0
  101. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/run_unit_tests.py +0 -0
  102. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/actions/summarize_conformance_tests.py +0 -0
  103. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/agent_tools.py +0 -0
  104. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/code_renderer.py +0 -0
  105. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/conformance_tests.py +0 -0
  106. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/implementation_code_helpers.py +0 -0
  107. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/render_context.py +0 -0
  108. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/render_types.py +0 -0
  109. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/render_utils.py +0 -0
  110. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/state_machine_config.py +0 -0
  111. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/states.py +0 -0
  112. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/render_machine/triggers.py +0 -0
  113. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/requirements.txt +0 -0
  114. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/resources/codeplain_overview.png +0 -0
  115. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/resources/plain_example.png +0 -0
  116. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/standard_template_library/golang-console-app-template.plain +0 -0
  117. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/standard_template_library/python-console-app-template.plain +0 -0
  118. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/standard_template_library/typescript-react-app-boilerplate.plain +0 -0
  119. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/standard_template_library/typescript-react-app-template.plain +0 -0
  120. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/system_config.py +0 -0
  121. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_conformance_tests_cypress.ps1 +0 -0
  122. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_conformance_tests_cypress.sh +0 -0
  123. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_conformance_tests_golang.ps1 +0 -0
  124. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_conformance_tests_golang.sh +0 -0
  125. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_conformance_tests_python.ps1 +0 -0
  126. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_conformance_tests_python.sh +0 -0
  127. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_unittests_flutter.ps1 +0 -0
  128. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_unittests_flutter.sh +0 -0
  129. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_unittests_golang.ps1 +0 -0
  130. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_unittests_golang.sh +0 -0
  131. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_unittests_python.ps1 +0 -0
  132. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_unittests_python.sh +0 -0
  133. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_unittests_react.ps1 +0 -0
  134. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/test_scripts/run_unittests_react.sh +0 -0
  135. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/__init__.py +0 -0
  136. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/conftest.py +0 -0
  137. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/acceptance_tests_warning/main_requiring_acceptance_tests.plain +0 -0
  138. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/acceptance_tests_warning/required_with_acceptance_tests.plain +0 -0
  139. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/imports/circular_imports_1.plain +0 -0
  140. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/imports/circular_imports_2.plain +0 -0
  141. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/imports/circular_imports_main.plain +0 -0
  142. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/imports/diamond_import_1.plain +0 -0
  143. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/imports/diamond_import_2.plain +0 -0
  144. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/imports/diamond_import_common.plain +0 -0
  145. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/imports/diamond_imports_main.plain +0 -0
  146. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/imports/import_with_functionalities.plain +0 -0
  147. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/imports/imports_module_with_functionalities.plain +0 -0
  148. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/imports/non_existent_import.plain +0 -0
  149. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/partial_rendering/pr_code_var.plain +0 -0
  150. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/partial_rendering/pr_implement.plain +0 -0
  151. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/partial_rendering/pr_leaf.plain +0 -0
  152. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/partial_rendering/pr_middle.plain +0 -0
  153. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/partial_rendering/pr_root.plain +0 -0
  154. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/partial_rendering/pr_solo.plain +0 -0
  155. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/add_new_task_modal_specification.yaml +0 -0
  156. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/duplicate_specification_heading.plain +0 -0
  157. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/empty_functional_specs_section.plain +0 -0
  158. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/invalid_specification_order.plain +0 -0
  159. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/missing_non_functional_requirements.plain +0 -0
  160. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/no_functional_specs_section.plain +0 -0
  161. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/plain_source_with_absolute_link.plain +0 -0
  162. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/plain_source_with_missing_link.plain +0 -0
  163. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/plain_source_with_url_link.plain +0 -0
  164. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/task_list_ui_specification.yaml +0 -0
  165. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/task_manager_with_reference_links.plain +0 -0
  166. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfile/without_non_functional_requirement.plain +0 -0
  167. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_acceptance_tests.plain +0 -0
  168. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_acceptance_tests_nondefined.plain +0 -0
  169. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_defined_nondefined.plain +0 -0
  170. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_defined_nondefined_2.plain +0 -0
  171. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_definition.plain +0 -0
  172. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_noconcepts.plain +0 -0
  173. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_nonconcept.plain +0 -0
  174. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_nondefined.plain +0 -0
  175. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_redefinition.plain +0 -0
  176. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_several_concepts.plain +0 -0
  177. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/concept_validation_valid.plain +0 -0
  178. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/cyclic_definitions.plain +0 -0
  179. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts.plain +0 -0
  180. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_base.plain +0 -0
  181. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_defaults_exported.plain +0 -0
  182. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_example.plain +0 -0
  183. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_imported_exported.plain +0 -0
  184. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_inherited_reexported.plain +0 -0
  185. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_malformed.plain +0 -0
  186. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_missing_definition.plain +0 -0
  187. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_missing_definition_example.plain +0 -0
  188. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_multiple_per_bullet.plain +0 -0
  189. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_multiple_per_bullet_undefined.plain +0 -0
  190. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_nested.plain +0 -0
  191. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_nested_example.plain +0 -0
  192. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_no_definitions.plain +0 -0
  193. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_not_declared.plain +0 -0
  194. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_not_declared_example.plain +0 -0
  195. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_transitive_example.plain +0 -0
  196. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_transitive_l1.plain +0 -0
  197. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/exported_concepts_transitive_l2.plain +0 -0
  198. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/plain_file_parser_with_comments.plain +0 -0
  199. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/plain_file_with_comments_indented.plain +0 -0
  200. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/regular_plain_source.plain +0 -0
  201. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/required_concepts.plain +0 -0
  202. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/required_concepts_defs.plain +0 -0
  203. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/required_concepts_example.plain +0 -0
  204. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/required_concepts_l1.plain +0 -0
  205. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/required_concepts_l2.plain +0 -0
  206. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/required_concepts_missing.plain +0 -0
  207. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/required_concepts_module.plain +0 -0
  208. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/required_concepts_partial.plain +0 -0
  209. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/required_concepts_partial_duplicate.plain +0 -0
  210. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/requires_without_definitions_example.plain +0 -0
  211. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/topological_sort.plain +0 -0
  212. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/plainfileparser/topological_sort_not_referenced.plain +0 -0
  213. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/circular_requires_main.plain +0 -0
  214. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/circular_requires_sub.plain +0 -0
  215. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/diamond_requires_1.plain +0 -0
  216. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/diamond_requires_2.plain +0 -0
  217. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/diamond_requires_common.plain +0 -0
  218. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/diamond_requires_main.plain +0 -0
  219. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/independent_requires_1.plain +0 -0
  220. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/independent_requires_2.plain +0 -0
  221. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/independent_requires_main.plain +0 -0
  222. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/non_existent_require.plain +0 -0
  223. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/normal_requires_1.plain +0 -0
  224. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/normal_requires_2.plain +0 -0
  225. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/normal_requires_common.plain +0 -0
  226. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/requires/normal_requires_main.plain +0 -0
  227. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/sample_base64_image.txt +0 -0
  228. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/simple.plain +0 -0
  229. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/templates/block_level_include.plain +0 -0
  230. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/templates/code_variables.plain +0 -0
  231. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/templates/header.plain +0 -0
  232. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/templates/implement.plain +0 -0
  233. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/templates/implement_2.plain +0 -0
  234. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/templates/template_include.plain +0 -0
  235. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/data/templates/test_hardest_problem.plain +0 -0
  236. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/e2e/Dockerfile +0 -0
  237. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/e2e/conftest.py +0 -0
  238. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/e2e/test_hello_world_python.py +0 -0
  239. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/e2e/test_hello_world_python_windows.py +0 -0
  240. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_agent_tools.py +0 -0
  241. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_arg_provenance.py +0 -0
  242. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_change_detection.py +0 -0
  243. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_cli_output.py +0 -0
  244. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_conformance_fix_journal.py +0 -0
  245. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_console_log_styles.py +0 -0
  246. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_distill_conformance_test_memory.py +0 -0
  247. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_dry_run_link_validation.py +0 -0
  248. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_file_utils.py +0 -0
  249. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_fix_unit_tests_action.py +0 -0
  250. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_fix_unit_tests_conformance_context.py +0 -0
  251. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_folder_path_resolution.py +0 -0
  252. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_git_preflight.py +0 -0
  253. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_git_utils.py +0 -0
  254. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_headless_logging.py +0 -0
  255. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_imports.py +0 -0
  256. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_log_file_name_resolution.py +0 -0
  257. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_logging_config_path_resolution.py +0 -0
  258. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_partial_rendering.py +0 -0
  259. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_path_resolution.py +0 -0
  260. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_plain2code.py +0 -0
  261. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_plain2code_state.py +0 -0
  262. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_plain2code_utils.py +0 -0
  263. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_plain_modules.py +0 -0
  264. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_plainfile.py +0 -0
  265. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_plainfileparser.py +0 -0
  266. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_plainspec.py +0 -0
  267. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_prepare_repositories_layout.py +0 -0
  268. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_render_finished_report.py +0 -0
  269. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_render_stop_reason.py +0 -0
  270. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_requires.py +0 -0
  271. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_resolve_config_file.py +0 -0
  272. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_script_path_resolution.py +0 -0
  273. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_system_config.py +0 -0
  274. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_telemetry.py +0 -0
  275. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_terminal_attachment.py +0 -0
  276. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_tui_components.py +0 -0
  277. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_tui_usage.py +0 -0
  278. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tests/test_usage_summary.py +0 -0
  279. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tui/__init__.py +0 -0
  280. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tui/components.py +0 -0
  281. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tui/models.py +0 -0
  282. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tui/plain2code_tui.py +0 -0
  283. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tui/plain_module_render_choice_tui.py +0 -0
  284. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tui/spinner.py +0 -0
  285. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tui/state_handlers.py +0 -0
  286. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tui/styles.css +0 -0
  287. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/tui/widget_helpers.py +0 -0
  288. {codeplain-0.3.13.dev42 → codeplain-0.3.13.dev43}/usage_summary.py +0 -0
@@ -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/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/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
- - name: Notify Slack (success)
131
- if: ${{ success() && env.SLACK_WEBHOOK_URL != '' }}
132
- env:
133
- VERSION: ${{ needs.build.outputs.version }}
134
- run: |
135
- # Spell out the --pre install: a plain "pip install codeplain" will
136
- # NOT pick this up, which otherwise reads as a broken publish.
137
- TEXT="*Codeplain Client*: dev build \`$VERSION\` published to PyPI :test_tube:. Normal installs are unaffected — try it with \`pip install --pre codeplain==$VERSION\`. Pre-release builds talk to \`api.test.codeplain.ai\` by default."
138
- curl -s -X POST "$SLACK_WEBHOOK_URL" \
139
- -H 'Content-type: application/json' \
140
- --data "$(jq -n --arg t "$TEXT" '{text:$t}')"
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: ${{ failure() && env.SLACK_WEBHOOK_URL != '' }}
144
- run: |
145
- curl -s -X POST "$SLACK_WEBHOOK_URL" \
146
- -H 'Content-type: application/json' \
147
- --data "{\"text\":\"*Codeplain Client*: Publishing dev build to PyPI FAILED :x: (commit \`${{ github.sha }}\`). See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.\"}"
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.
@@ -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
- - name: Notify Slack (success)
61
- if: ${{ success() && 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*: Install scripts deployed to R2 :white_check_mark: (\`${GITHUB_SHA:0:7}\`, by *${{ github.actor }}*).\"}"
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: ${{ failure() && env.SLACK_WEBHOOK_URL != '' }}
69
- run: |
70
- curl -s -X POST "$SLACK_WEBHOOK_URL" \
71
- -H 'Content-type: application/json' \
72
- --data "{\"text\":\"*Codeplain Client*: Install script deploy to R2 FAILED :x: (\`${GITHUB_SHA:0:7}\`). Users may be getting a stale installer. See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.\"}"
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,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codeplain
3
- Version: 0.3.13.dev42
3
+ Version: 0.3.13.dev43
4
4
  Summary: Transform plain language specifications into working code
5
5
  License-File: LICENSE
6
6
  Classifier: Environment :: Console
@@ -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>.\"}"