cfengine 0.20.0__tar.gz → 0.22.0__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 (176) hide show
  1. {cfengine-0.20.0 → cfengine-0.22.0}/.github/workflows/pypi-publish.yml +1 -1
  2. {cfengine-0.20.0 → cfengine-0.22.0}/.github/workflows/renovate.yml +1 -1
  3. {cfengine-0.20.0 → cfengine-0.22.0}/.github/workflows/stale.yml +1 -1
  4. {cfengine-0.20.0 → cfengine-0.22.0}/.github/workflows/update-syntax-description.yml +1 -0
  5. cfengine-0.22.0/CHEATSHEET.md +120 -0
  6. {cfengine-0.20.0 → cfengine-0.22.0}/PKG-INFO +4 -2
  7. {cfengine-0.20.0 → cfengine-0.22.0}/README.md +2 -0
  8. {cfengine-0.20.0 → cfengine-0.22.0}/pyproject.toml +1 -1
  9. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine.egg-info/PKG-INFO +4 -2
  10. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine.egg-info/SOURCES.txt +2 -0
  11. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine.egg-info/requires.txt +1 -1
  12. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine.egg-info/scm_file_list.json +136 -134
  13. cfengine-0.22.0/src/cfengine.egg-info/scm_version.json +8 -0
  14. cfengine-0.22.0/src/cfengine_cli/cfengine_wrapper/arg_parse.py +232 -0
  15. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/cfengine_wrapper/cfengine_commands.py +151 -55
  16. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/cfengine_wrapper/cfengine_objects.py +2 -2
  17. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/cfengine_wrapper/cfengine_utils.py +63 -19
  18. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/commands.py +20 -0
  19. cfengine-0.22.0/src/cfengine_cli/initialize_project.py +432 -0
  20. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/main.py +79 -57
  21. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/syntax-description.json +61 -5
  22. {cfengine-0.20.0 → cfengine-0.22.0}/uv.lock +5 -5
  23. cfengine-0.20.0/src/cfengine.egg-info/scm_version.json +0 -8
  24. cfengine-0.20.0/src/cfengine_cli/cfengine_wrapper/arg_parse.py +0 -261
  25. {cfengine-0.20.0 → cfengine-0.22.0}/.github/renovate-config.js +0 -0
  26. {cfengine-0.20.0 → cfengine-0.22.0}/.github/workflows/lint-policy-in-other-repos.yml +0 -0
  27. {cfengine-0.20.0 → cfengine-0.22.0}/.github/workflows/make-check.yml +0 -0
  28. {cfengine-0.20.0 → cfengine-0.22.0}/.gitignore +0 -0
  29. {cfengine-0.20.0 → cfengine-0.22.0}/.python-version +0 -0
  30. {cfengine-0.20.0 → cfengine-0.22.0}/CLAUDE.md +0 -0
  31. {cfengine-0.20.0 → cfengine-0.22.0}/HACKING.md +0 -0
  32. {cfengine-0.20.0 → cfengine-0.22.0}/LICENSE +0 -0
  33. {cfengine-0.20.0 → cfengine-0.22.0}/Makefile +0 -0
  34. {cfengine-0.20.0 → cfengine-0.22.0}/ci/01-install.sh +0 -0
  35. {cfengine-0.20.0 → cfengine-0.22.0}/ci/02-safe-tests.sh +0 -0
  36. {cfengine-0.20.0 → cfengine-0.22.0}/ci/03-unsafe-tests.sh +0 -0
  37. {cfengine-0.20.0 → cfengine-0.22.0}/renovate.json +0 -0
  38. {cfengine-0.20.0 → cfengine-0.22.0}/setup.cfg +0 -0
  39. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine.egg-info/dependency_links.txt +0 -0
  40. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine.egg-info/entry_points.txt +0 -0
  41. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine.egg-info/top_level.txt +0 -0
  42. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/__init__.py +0 -0
  43. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/__main__.py +0 -0
  44. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/cfengine_wrapper/__init__.py +0 -0
  45. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/changelog.py +0 -0
  46. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/deptool-README.md +0 -0
  47. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/deptool.py +0 -0
  48. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/dev.py +0 -0
  49. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/docs.py +0 -0
  50. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/format.py +0 -0
  51. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/lint.py +0 -0
  52. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/lint_csv.py +0 -0
  53. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/lint_yml.py +0 -0
  54. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/masterfiles/__init__.py +0 -0
  55. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/masterfiles/analyze.py +0 -0
  56. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/masterfiles/check_download_matches_git.py +0 -0
  57. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/masterfiles/download.py +0 -0
  58. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/masterfiles/generate_git_tags.py +0 -0
  59. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/masterfiles/generate_release_information.py +0 -0
  60. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/masterfiles/generate_vcf_download.py +0 -0
  61. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/masterfiles/generate_vcf_git_checkout.py +0 -0
  62. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/paths.py +0 -0
  63. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/profile.py +0 -0
  64. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/shell.py +0 -0
  65. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/syntax_tree.py +0 -0
  66. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/up.py +0 -0
  67. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/utils.py +0 -0
  68. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/validate.py +0 -0
  69. {cfengine-0.20.0 → cfengine-0.22.0}/src/cfengine_cli/version.py +0 -0
  70. {cfengine-0.20.0 → cfengine-0.22.0}/tests/README.md +0 -0
  71. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/001_hello_world.expected.cf +0 -0
  72. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/001_hello_world.input.cf +0 -0
  73. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/002_basics.expected.cf +0 -0
  74. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/002_basics.input.cf +0 -0
  75. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/003_wrapping.expected.cf +0 -0
  76. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/003_wrapping.input.cf +0 -0
  77. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/004_comments.expected.cf +0 -0
  78. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/004_comments.input.cf +0 -0
  79. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/005_bundle_comments.expected.cf +0 -0
  80. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/005_bundle_comments.input.cf +0 -0
  81. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/006_remove_empty_comments.expected.cf +0 -0
  82. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/006_remove_empty_comments.input.cf +0 -0
  83. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/007_class_guarded_empty_lines.expected.cf +0 -0
  84. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/007_class_guarded_empty_lines.input.cf +0 -0
  85. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/008_long_string.expected.cf +0 -0
  86. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/008_long_string.input.cf +0 -0
  87. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/009_single_line.expected.cf +0 -0
  88. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/009_single_line.input.cf +0 -0
  89. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/010_stakeholder.expected.cf +0 -0
  90. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/010_stakeholder.input.cf +0 -0
  91. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/011_macros.expected.cf +0 -0
  92. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/011_macros.input.cf +0 -0
  93. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/011_promises.expected.cf +0 -0
  94. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/011_promises.input.cf +0 -0
  95. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/012_sameline_comments.expected.cf +0 -0
  96. {cfengine-0.20.0 → cfengine-0.22.0}/tests/format/012_sameline_comments.input.cf +0 -0
  97. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/001_hello_world.cf +0 -0
  98. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/002_deprecations.expected.txt +0 -0
  99. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/002_deprecations.x.cf +0 -0
  100. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/003_name_lowercase.cf +0 -0
  101. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/003_name_lowercase.expected.txt +0 -0
  102. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/003_name_lowercase.x.cf +0 -0
  103. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/004_block_type.cf +0 -0
  104. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/004_block_type.expected.txt +0 -0
  105. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/004_block_type.x.cf +0 -0
  106. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/005_syntax_error.cf +0 -0
  107. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/005_syntax_error.expected.txt +0 -0
  108. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/005_syntax_error.x.cf +0 -0
  109. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/006_empty_file.expected.txt +0 -0
  110. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/006_empty_file.x.cf +0 -0
  111. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/007_namespace.cf +0 -0
  112. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/007_namespace.expected.txt +0 -0
  113. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/007_namespace.x.cf +0 -0
  114. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/008_bundle_shadows_function.cf +0 -0
  115. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/008_bundle_shadows_function.expected.txt +0 -0
  116. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/008_bundle_shadows_function.x.cf +0 -0
  117. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/009_unknown_function_inside_vars.cf +0 -0
  118. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/009_unknown_function_inside_vars.expected.txt +0 -0
  119. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/009_unknown_function_inside_vars.x.cf +0 -0
  120. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/010_mutually_exclusive_types_vars.cf +0 -0
  121. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/010_mutually_exclusive_types_vars.expected.txt +0 -0
  122. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/010_mutually_exclusive_types_vars.x.cf +0 -0
  123. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/011_invalid_attributes.expected.txt +0 -0
  124. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/011_invalid_attributes.x.cf +0 -0
  125. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/012_function_call_arg_count.cf +0 -0
  126. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/012_function_call_arg_count.expected.txt +0 -0
  127. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/012_function_call_arg_count.x.cf +0 -0
  128. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/013_num_args_body.expected.txt +0 -0
  129. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/013_num_args_body.x.cf +0 -0
  130. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/013_num_args_bundle.expected.txt +0 -0
  131. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/013_num_args_bundle.x.cf +0 -0
  132. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/013_num_args_bundle_body.cf +0 -0
  133. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/014_variadic_func_arg_count.cf +0 -0
  134. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/014_variadic_func_arg_count.expected.txt +0 -0
  135. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/014_variadic_func_arg_count.x.cf +0 -0
  136. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/015_macro_multi_def_bundle.cf +0 -0
  137. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/015_macro_multi_def_bundle.expected.txt +0 -0
  138. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/015_macro_multi_def_bundle.x.cf +0 -0
  139. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/016_half_promises.cf +0 -0
  140. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/016_half_promises.expected.txt +0 -0
  141. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/016_half_promises.x.cf +0 -0
  142. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/017_implies_body.cf +0 -0
  143. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/017_implies_body.expected.txt +0 -0
  144. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/017_implies_body.x.cf +0 -0
  145. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/018_nested_calls.cf +0 -0
  146. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/018_nested_calls.expected.txt +0 -0
  147. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/018_nested_calls.x.cf +0 -0
  148. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/019_bundle_name_expansion.cf +0 -0
  149. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/020_missing_braces.expected.txt +0 -0
  150. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/020_missing_braces.x.cf +0 -0
  151. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/020_missing_semicolon.expected.txt +0 -0
  152. {cfengine-0.20.0 → cfengine-0.22.0}/tests/lint/020_missing_semicolon.x.cf +0 -0
  153. {cfengine-0.20.0 → cfengine-0.22.0}/tests/run-format-tests.sh +0 -0
  154. {cfengine-0.20.0 → cfengine-0.22.0}/tests/run-lint-tests.sh +0 -0
  155. {cfengine-0.20.0 → cfengine-0.22.0}/tests/run-shell-tests.sh +0 -0
  156. {cfengine-0.20.0 → cfengine-0.22.0}/tests/run-up-validate-tests.sh +0 -0
  157. {cfengine-0.20.0 → cfengine-0.22.0}/tests/shell/001-help.sh +0 -0
  158. {cfengine-0.20.0 → cfengine-0.22.0}/tests/shell/002-version.sh +0 -0
  159. {cfengine-0.20.0 → cfengine-0.22.0}/tests/shell/003-format.sh +0 -0
  160. {cfengine-0.20.0 → cfengine-0.22.0}/tests/shell/004-format-check.sh +0 -0
  161. {cfengine-0.20.0 → cfengine-0.22.0}/tests/shell/005-lint.sh +0 -0
  162. {cfengine-0.20.0 → cfengine-0.22.0}/tests/unit/__init__.py +0 -0
  163. {cfengine-0.20.0 → cfengine-0.22.0}/tests/unit/test_changelog.py +0 -0
  164. {cfengine-0.20.0 → cfengine-0.22.0}/tests/unit/test_deps.py +0 -0
  165. {cfengine-0.20.0 → cfengine-0.22.0}/tests/unit/test_format.py +0 -0
  166. {cfengine-0.20.0 → cfengine-0.22.0}/tests/unit/test_lint_csv.py +0 -0
  167. {cfengine-0.20.0 → cfengine-0.22.0}/tests/unit/test_lint_yml.py +0 -0
  168. {cfengine-0.20.0 → cfengine-0.22.0}/tests/unit/test_paths.py +0 -0
  169. {cfengine-0.20.0 → cfengine-0.22.0}/tests/unit/test_utils.py +0 -0
  170. {cfengine-0.20.0 → cfengine-0.22.0}/tests/unit/test_version.py +0 -0
  171. {cfengine-0.20.0 → cfengine-0.22.0}/tests/up-validate/001_complex_config.yaml +0 -0
  172. {cfengine-0.20.0 → cfengine-0.22.0}/tests/up-validate/002_version.x.yaml +0 -0
  173. {cfengine-0.20.0 → cfengine-0.22.0}/tests/up-validate/003_box.x.yaml +0 -0
  174. {cfengine-0.20.0 → cfengine-0.22.0}/tests/up-validate/004_count.x.yaml +0 -0
  175. {cfengine-0.20.0 → cfengine-0.22.0}/tests/up-validate/mocks/cloud_config.json +0 -0
  176. {cfengine-0.20.0 → cfengine-0.22.0}/tests/up-validate/mocks/vagrant +0 -0
@@ -51,4 +51,4 @@ jobs:
51
51
  name: release-dists
52
52
  path: dist/
53
53
  - name: Publish release distributions to PyPI
54
- uses: pypa/gh-action-pypi-publish@v1.14.1
54
+ uses: pypa/gh-action-pypi-publish@v1.14.2
@@ -12,7 +12,7 @@ jobs:
12
12
  - name: Checkout
13
13
  uses: actions/checkout@v7.0.1
14
14
  - name: Self-hosted Renovate
15
- uses: renovatebot/github-action@v46.1.20
15
+ uses: renovatebot/github-action@v46.2.0
16
16
  with:
17
17
  configurationFile: .github/renovate-config.js
18
18
  token: ${{ secrets.RENOVATE_TOKEN }}
@@ -15,7 +15,7 @@ jobs:
15
15
  issues: read
16
16
 
17
17
  steps:
18
- - uses: actions/stale@v10
18
+ - uses: actions/stale@v11
19
19
  with:
20
20
  repo-token: ${{ secrets.GITHUB_TOKEN }}
21
21
  stale-pr-message: "Marking this PR as stale due to inactivity; it will be closed in 7 days."
@@ -24,6 +24,7 @@ jobs:
24
24
  uses: actions/checkout@v7
25
25
  with:
26
26
  ref: "main"
27
+ persist-credentials: false # prevents duplicate Authorization header error with create-pull-request
27
28
  - name: Set up Python 3.12
28
29
  uses: actions/setup-python@v7
29
30
  with:
@@ -0,0 +1,120 @@
1
+ # CFEngine CLI cheatsheet
2
+
3
+ Quick reference for `cfengine COMMANDS`
4
+ For the full command list, run `cfengine help` or `cfengine COMMAND --help`.
5
+
6
+ ## Managing hosts
7
+
8
+ ```bash
9
+ # Save one or more hosts under a group name, for reuse in other commands
10
+ cfengine save --hosts 192.168.56.90 --role hub --name myhub
11
+
12
+ # List all saved host-groups
13
+ cfengine show
14
+
15
+ # Show details about a specific saved host (or group)
16
+ cfengine show --host myhub
17
+
18
+ # Open an interactive SSH session to a saved host
19
+ cfengine connect --hosts myhub
20
+ ```
21
+
22
+ ## Managing cfbs modules
23
+
24
+ These are thin wrappers around the equivalent `cfbs` subcommands, usable from anywhere inside a cfbs project.
25
+
26
+ ```bash
27
+ # Search the build-index for a module
28
+ cfengine search promise-type-git
29
+
30
+ # Add module(s) to the current cfbs project
31
+ cfengine add promise-type-git
32
+
33
+ # Set/update input.json for a module that takes input
34
+ cfengine input promise-type-git
35
+
36
+ # Remove module(s) from the current cfbs project
37
+ cfengine remove promise-type-git
38
+
39
+ # Update the current cfbs project (or specific modules)
40
+ cfengine update
41
+ cfengine update promise-type-git
42
+
43
+ # Show status of the current cfbs project
44
+ cfengine moduleinfo
45
+
46
+ # Show info about specific module(s) (does not require being inside a project)
47
+ cfengine moduleinfo promise-type-git
48
+ ```
49
+
50
+ ## Building and deploying policy sets
51
+
52
+ ```bash
53
+ # Build the policy set from a cfbs project (equivalent to `cfbs build`)
54
+ cfengine build
55
+
56
+ # build -> deploy -> run on the given hub without extra prompts
57
+ cfengine build --hub myhub --non-interactive
58
+
59
+ # Deploy an already-built policy set to a hub
60
+ cfengine deploy --hub myhub
61
+ ```
62
+
63
+ ## Running the CFEngine agent
64
+
65
+ ```bash
66
+ # Default: cf-agent -KIf update.cf && cf-agent -KIf
67
+ # If there is a local installation, this will be used
68
+ cfengine run
69
+
70
+ # Run a specific policy file (resolved locally, or uploaded if not found remotely)
71
+ cfengine run /tmp/some_policy.cf
72
+
73
+ # Run against a specific saved host, instead of being prompted
74
+ cfengine run --host myhub
75
+
76
+ # Chain multiple commands, executed in sequence
77
+ cfengine run /tmp/some_policy.cf /tmp/other_policy.cf
78
+ ```
79
+
80
+ ## Initializing new projects
81
+
82
+ ```bash
83
+ # Build project on top of the default masterfiles (default, same as `cfbs init`)
84
+ cfengine init --policy-set
85
+
86
+ # Initialize an example build project for working on a custom promise type (python)
87
+ cfengine init --promise-type
88
+
89
+ # Initialize an exapmlte module project for build.cfengine.com (or internal use)
90
+ cfengine init --policy-module
91
+
92
+ # Initialize an example policy module that takes input data
93
+ cfengine init --policy-module --with-input
94
+
95
+ # Skip interactive prompts
96
+ cfengine init --promise-module --non-interactive
97
+ ```
98
+
99
+ ## Formatting and linting
100
+
101
+ ```bash
102
+ cfengine format
103
+ cfengine lint
104
+ cfengine lint main.cf
105
+ ```
106
+
107
+ ## Reporting
108
+
109
+ ```bash
110
+ # Refresh reporting data on all known hubs/clients (capped at 25 hosts), optional flag to run agent first.
111
+ cfengine report [--run-agent]
112
+
113
+ # Only refresh a specific hub (and its clients, capped at 25), running the agent first
114
+ cfengine report --hub myhub --run-agent
115
+ ```
116
+
117
+ ---
118
+
119
+ See [README.md](./README.md) for installation and general usage, and [HACKING.md](./HACKING.md) for
120
+ contributing/development info.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cfengine
3
- Version: 0.20.0
3
+ Version: 0.22.0
4
4
  Summary: Human-oriented CLI for interacting with CFEngine policy language, projects, and other CFEngine tools
5
5
  License: GNU GENERAL PUBLIC LICENSE
6
6
  Version 3, 29 June 2007
@@ -694,7 +694,7 @@ Classifier: Programming Language :: Python :: 3.13
694
694
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
695
695
  Requires-Python: >=3.10
696
696
  Description-Content-Type: text/markdown
697
- Requires-Dist: cf-remote>=0.7.3
697
+ Requires-Dist: cf-remote>=0.9.4
698
698
  Requires-Dist: cfbs>=5.5.0
699
699
  Requires-Dist: tree-sitter-cfengine>=1.1.12
700
700
  Requires-Dist: tree-sitter>=0.25
@@ -825,6 +825,8 @@ To ignore the previously saved configuration and apply the current configuration
825
825
  cfengine up --reset config.yaml
826
826
  ```
827
827
 
828
+ See [CHEATSHEET.md](./CHEATSHEET.md) for a fuller command reference.
829
+
828
830
  ## Supported platforms and versions
829
831
 
830
832
  This tool will only support a limited number of platforms, it is not intended to run everywhere CFEngine runs.
@@ -121,6 +121,8 @@ To ignore the previously saved configuration and apply the current configuration
121
121
  cfengine up --reset config.yaml
122
122
  ```
123
123
 
124
+ See [CHEATSHEET.md](./CHEATSHEET.md) for a fuller command reference.
125
+
124
126
  ## Supported platforms and versions
125
127
 
126
128
  This tool will only support a limited number of platforms, it is not intended to run everywhere CFEngine runs.
@@ -10,7 +10,7 @@ readme = "README.md"
10
10
  license = {file = "LICENSE"}
11
11
  requires-python = ">=3.10"
12
12
  dependencies = [
13
- "cf-remote>=0.7.3",
13
+ "cf-remote>=0.9.4",
14
14
  "cfbs>=5.5.0",
15
15
  "tree-sitter-cfengine>=1.1.12",
16
16
  "tree-sitter>=0.25",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cfengine
3
- Version: 0.20.0
3
+ Version: 0.22.0
4
4
  Summary: Human-oriented CLI for interacting with CFEngine policy language, projects, and other CFEngine tools
5
5
  License: GNU GENERAL PUBLIC LICENSE
6
6
  Version 3, 29 June 2007
@@ -694,7 +694,7 @@ Classifier: Programming Language :: Python :: 3.13
694
694
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
695
695
  Requires-Python: >=3.10
696
696
  Description-Content-Type: text/markdown
697
- Requires-Dist: cf-remote>=0.7.3
697
+ Requires-Dist: cf-remote>=0.9.4
698
698
  Requires-Dist: cfbs>=5.5.0
699
699
  Requires-Dist: tree-sitter-cfengine>=1.1.12
700
700
  Requires-Dist: tree-sitter>=0.25
@@ -825,6 +825,8 @@ To ignore the previously saved configuration and apply the current configuration
825
825
  cfengine up --reset config.yaml
826
826
  ```
827
827
 
828
+ See [CHEATSHEET.md](./CHEATSHEET.md) for a fuller command reference.
829
+
828
830
  ## Supported platforms and versions
829
831
 
830
832
  This tool will only support a limited number of platforms, it is not intended to run everywhere CFEngine runs.
@@ -1,5 +1,6 @@
1
1
  .gitignore
2
2
  .python-version
3
+ CHEATSHEET.md
3
4
  CLAUDE.md
4
5
  HACKING.md
5
6
  LICENSE
@@ -35,6 +36,7 @@ src/cfengine_cli/deptool.py
35
36
  src/cfengine_cli/dev.py
36
37
  src/cfengine_cli/docs.py
37
38
  src/cfengine_cli/format.py
39
+ src/cfengine_cli/initialize_project.py
38
40
  src/cfengine_cli/lint.py
39
41
  src/cfengine_cli/lint_csv.py
40
42
  src/cfengine_cli/lint_yml.py
@@ -1,4 +1,4 @@
1
- cf-remote>=0.7.3
1
+ cf-remote>=0.9.4
2
2
  cfbs>=5.5.0
3
3
  tree-sitter-cfengine>=1.1.12
4
4
  tree-sitter>=0.25
@@ -1,166 +1,168 @@
1
1
  {
2
2
  "files": [
3
- "HACKING.md",
4
- "Makefile",
5
- ".python-version",
6
- "pyproject.toml",
7
- "renovate.json",
8
- "LICENSE",
9
- "CLAUDE.md",
10
- "README.md",
11
- "uv.lock",
12
- ".gitignore",
13
3
  ".github/renovate-config.js",
14
- ".github/workflows/renovate.yml",
15
- ".github/workflows/pypi-publish.yml",
16
4
  ".github/workflows/lint-policy-in-other-repos.yml",
17
- ".github/workflows/update-syntax-description.yml",
18
5
  ".github/workflows/make-check.yml",
6
+ ".github/workflows/pypi-publish.yml",
7
+ ".github/workflows/renovate.yml",
19
8
  ".github/workflows/stale.yml",
20
- "tests/run-lint-tests.sh",
21
- "tests/run-up-validate-tests.sh",
22
- "tests/run-format-tests.sh",
23
- "tests/run-shell-tests.sh",
9
+ ".github/workflows/update-syntax-description.yml",
10
+ ".gitignore",
11
+ ".python-version",
12
+ "CHEATSHEET.md",
13
+ "CLAUDE.md",
14
+ "HACKING.md",
15
+ "LICENSE",
16
+ "Makefile",
17
+ "README.md",
18
+ "ci/01-install.sh",
19
+ "ci/02-safe-tests.sh",
20
+ "ci/03-unsafe-tests.sh",
21
+ "pyproject.toml",
22
+ "renovate.json",
23
+ "src/cfengine_cli/__init__.py",
24
+ "src/cfengine_cli/__main__.py",
25
+ "src/cfengine_cli/cfengine_wrapper/__init__.py",
26
+ "src/cfengine_cli/cfengine_wrapper/arg_parse.py",
27
+ "src/cfengine_cli/cfengine_wrapper/cfengine_commands.py",
28
+ "src/cfengine_cli/cfengine_wrapper/cfengine_objects.py",
29
+ "src/cfengine_cli/cfengine_wrapper/cfengine_utils.py",
30
+ "src/cfengine_cli/changelog.py",
31
+ "src/cfengine_cli/commands.py",
32
+ "src/cfengine_cli/deptool-README.md",
33
+ "src/cfengine_cli/deptool.py",
34
+ "src/cfengine_cli/dev.py",
35
+ "src/cfengine_cli/docs.py",
36
+ "src/cfengine_cli/format.py",
37
+ "src/cfengine_cli/initialize_project.py",
38
+ "src/cfengine_cli/lint.py",
39
+ "src/cfengine_cli/lint_csv.py",
40
+ "src/cfengine_cli/lint_yml.py",
41
+ "src/cfengine_cli/main.py",
42
+ "src/cfengine_cli/masterfiles/__init__.py",
43
+ "src/cfengine_cli/masterfiles/analyze.py",
44
+ "src/cfengine_cli/masterfiles/check_download_matches_git.py",
45
+ "src/cfengine_cli/masterfiles/download.py",
46
+ "src/cfengine_cli/masterfiles/generate_git_tags.py",
47
+ "src/cfengine_cli/masterfiles/generate_release_information.py",
48
+ "src/cfengine_cli/masterfiles/generate_vcf_download.py",
49
+ "src/cfengine_cli/masterfiles/generate_vcf_git_checkout.py",
50
+ "src/cfengine_cli/paths.py",
51
+ "src/cfengine_cli/profile.py",
52
+ "src/cfengine_cli/shell.py",
53
+ "src/cfengine_cli/syntax-description.json",
54
+ "src/cfengine_cli/syntax_tree.py",
55
+ "src/cfengine_cli/up.py",
56
+ "src/cfengine_cli/utils.py",
57
+ "src/cfengine_cli/validate.py",
58
+ "src/cfengine_cli/version.py",
24
59
  "tests/README.md",
25
- "tests/up-validate/002_version.x.yaml",
26
- "tests/up-validate/001_complex_config.yaml",
27
- "tests/up-validate/004_count.x.yaml",
28
- "tests/up-validate/003_box.x.yaml",
29
- "tests/up-validate/mocks/cloud_config.json",
30
- "tests/up-validate/mocks/vagrant",
31
- "tests/shell/002-version.sh",
32
- "tests/shell/003-format.sh",
33
- "tests/shell/005-lint.sh",
34
- "tests/shell/004-format-check.sh",
35
- "tests/shell/001-help.sh",
36
- "tests/format/006_remove_empty_comments.input.cf",
37
- "tests/format/006_remove_empty_comments.expected.cf",
38
- "tests/format/008_long_string.expected.cf",
39
- "tests/format/012_sameline_comments.expected.cf",
40
- "tests/format/007_class_guarded_empty_lines.input.cf",
41
- "tests/format/011_promises.expected.cf",
42
- "tests/format/012_sameline_comments.input.cf",
43
- "tests/format/011_macros.input.cf",
44
- "tests/format/008_long_string.input.cf",
45
- "tests/format/005_bundle_comments.input.cf",
46
- "tests/format/002_basics.expected.cf",
47
- "tests/format/009_single_line.expected.cf",
48
- "tests/format/007_class_guarded_empty_lines.expected.cf",
49
60
  "tests/format/001_hello_world.expected.cf",
50
61
  "tests/format/001_hello_world.input.cf",
62
+ "tests/format/002_basics.expected.cf",
63
+ "tests/format/002_basics.input.cf",
64
+ "tests/format/003_wrapping.expected.cf",
51
65
  "tests/format/003_wrapping.input.cf",
52
- "tests/format/010_stakeholder.expected.cf",
53
- "tests/format/011_macros.expected.cf",
54
66
  "tests/format/004_comments.expected.cf",
55
67
  "tests/format/004_comments.input.cf",
56
- "tests/format/010_stakeholder.input.cf",
68
+ "tests/format/005_bundle_comments.expected.cf",
69
+ "tests/format/005_bundle_comments.input.cf",
70
+ "tests/format/006_remove_empty_comments.expected.cf",
71
+ "tests/format/006_remove_empty_comments.input.cf",
72
+ "tests/format/007_class_guarded_empty_lines.expected.cf",
73
+ "tests/format/007_class_guarded_empty_lines.input.cf",
74
+ "tests/format/008_long_string.expected.cf",
75
+ "tests/format/008_long_string.input.cf",
76
+ "tests/format/009_single_line.expected.cf",
57
77
  "tests/format/009_single_line.input.cf",
58
- "tests/format/002_basics.input.cf",
59
- "tests/format/003_wrapping.expected.cf",
78
+ "tests/format/010_stakeholder.expected.cf",
79
+ "tests/format/010_stakeholder.input.cf",
80
+ "tests/format/011_macros.expected.cf",
81
+ "tests/format/011_macros.input.cf",
82
+ "tests/format/011_promises.expected.cf",
60
83
  "tests/format/011_promises.input.cf",
61
- "tests/format/005_bundle_comments.expected.cf",
84
+ "tests/format/012_sameline_comments.expected.cf",
85
+ "tests/format/012_sameline_comments.input.cf",
86
+ "tests/lint/001_hello_world.cf",
87
+ "tests/lint/002_deprecations.expected.txt",
62
88
  "tests/lint/002_deprecations.x.cf",
63
- "tests/lint/018_nested_calls.cf",
64
- "tests/lint/012_function_call_arg_count.x.cf",
65
- "tests/lint/004_block_type.expected.txt",
66
- "tests/lint/009_unknown_function_inside_vars.cf",
67
- "tests/lint/010_mutually_exclusive_types_vars.x.cf",
68
- "tests/lint/014_variadic_func_arg_count.cf",
69
- "tests/lint/013_num_args_bundle.expected.txt",
70
- "tests/lint/017_implies_body.expected.txt",
71
89
  "tests/lint/003_name_lowercase.cf",
72
- "tests/lint/018_nested_calls.x.cf",
73
- "tests/lint/013_num_args_bundle.x.cf",
74
- "tests/lint/011_invalid_attributes.expected.txt",
90
+ "tests/lint/003_name_lowercase.expected.txt",
75
91
  "tests/lint/003_name_lowercase.x.cf",
76
- "tests/lint/007_namespace.expected.txt",
77
- "tests/lint/010_mutually_exclusive_types_vars.cf",
78
- "tests/lint/020_missing_semicolon.x.cf",
79
- "tests/lint/014_variadic_func_arg_count.expected.txt",
80
- "tests/lint/018_nested_calls.expected.txt",
81
- "tests/lint/015_macro_multi_def_bundle.cf",
82
- "tests/lint/020_missing_braces.expected.txt",
83
- "tests/lint/008_bundle_shadows_function.x.cf",
84
- "tests/lint/002_deprecations.expected.txt",
85
- "tests/lint/013_num_args_bundle_body.cf",
86
- "tests/lint/012_function_call_arg_count.cf",
87
- "tests/lint/015_macro_multi_def_bundle.x.cf",
88
- "tests/lint/006_empty_file.x.cf",
89
- "tests/lint/005_syntax_error.x.cf",
90
- "tests/lint/020_missing_braces.x.cf",
91
- "tests/lint/015_macro_multi_def_bundle.expected.txt",
92
- "tests/lint/007_namespace.x.cf",
93
- "tests/lint/017_implies_body.cf",
94
- "tests/lint/020_missing_semicolon.expected.txt",
95
- "tests/lint/007_namespace.cf",
96
- "tests/lint/014_variadic_func_arg_count.x.cf",
97
- "tests/lint/009_unknown_function_inside_vars.x.cf",
98
- "tests/lint/008_bundle_shadows_function.expected.txt",
99
- "tests/lint/012_function_call_arg_count.expected.txt",
100
- "tests/lint/005_syntax_error.cf",
101
92
  "tests/lint/004_block_type.cf",
102
- "tests/lint/008_bundle_shadows_function.cf",
103
- "tests/lint/003_name_lowercase.expected.txt",
104
- "tests/lint/013_num_args_body.expected.txt",
105
- "tests/lint/009_unknown_function_inside_vars.expected.txt",
106
- "tests/lint/016_half_promises.x.cf",
93
+ "tests/lint/004_block_type.expected.txt",
107
94
  "tests/lint/004_block_type.x.cf",
108
- "tests/lint/001_hello_world.cf",
95
+ "tests/lint/005_syntax_error.cf",
109
96
  "tests/lint/005_syntax_error.expected.txt",
97
+ "tests/lint/005_syntax_error.x.cf",
110
98
  "tests/lint/006_empty_file.expected.txt",
99
+ "tests/lint/006_empty_file.x.cf",
100
+ "tests/lint/007_namespace.cf",
101
+ "tests/lint/007_namespace.expected.txt",
102
+ "tests/lint/007_namespace.x.cf",
103
+ "tests/lint/008_bundle_shadows_function.cf",
104
+ "tests/lint/008_bundle_shadows_function.expected.txt",
105
+ "tests/lint/008_bundle_shadows_function.x.cf",
106
+ "tests/lint/009_unknown_function_inside_vars.cf",
107
+ "tests/lint/009_unknown_function_inside_vars.expected.txt",
108
+ "tests/lint/009_unknown_function_inside_vars.x.cf",
109
+ "tests/lint/010_mutually_exclusive_types_vars.cf",
111
110
  "tests/lint/010_mutually_exclusive_types_vars.expected.txt",
111
+ "tests/lint/010_mutually_exclusive_types_vars.x.cf",
112
+ "tests/lint/011_invalid_attributes.expected.txt",
112
113
  "tests/lint/011_invalid_attributes.x.cf",
114
+ "tests/lint/012_function_call_arg_count.cf",
115
+ "tests/lint/012_function_call_arg_count.expected.txt",
116
+ "tests/lint/012_function_call_arg_count.x.cf",
117
+ "tests/lint/013_num_args_body.expected.txt",
113
118
  "tests/lint/013_num_args_body.x.cf",
114
- "tests/lint/017_implies_body.x.cf",
115
- "tests/lint/019_bundle_name_expansion.cf",
119
+ "tests/lint/013_num_args_bundle.expected.txt",
120
+ "tests/lint/013_num_args_bundle.x.cf",
121
+ "tests/lint/013_num_args_bundle_body.cf",
122
+ "tests/lint/014_variadic_func_arg_count.cf",
123
+ "tests/lint/014_variadic_func_arg_count.expected.txt",
124
+ "tests/lint/014_variadic_func_arg_count.x.cf",
125
+ "tests/lint/015_macro_multi_def_bundle.cf",
126
+ "tests/lint/015_macro_multi_def_bundle.expected.txt",
127
+ "tests/lint/015_macro_multi_def_bundle.x.cf",
116
128
  "tests/lint/016_half_promises.cf",
117
129
  "tests/lint/016_half_promises.expected.txt",
118
- "tests/unit/test_lint_csv.py",
119
- "tests/unit/test_changelog.py",
120
- "tests/unit/test_lint_yml.py",
130
+ "tests/lint/016_half_promises.x.cf",
131
+ "tests/lint/017_implies_body.cf",
132
+ "tests/lint/017_implies_body.expected.txt",
133
+ "tests/lint/017_implies_body.x.cf",
134
+ "tests/lint/018_nested_calls.cf",
135
+ "tests/lint/018_nested_calls.expected.txt",
136
+ "tests/lint/018_nested_calls.x.cf",
137
+ "tests/lint/019_bundle_name_expansion.cf",
138
+ "tests/lint/020_missing_braces.expected.txt",
139
+ "tests/lint/020_missing_braces.x.cf",
140
+ "tests/lint/020_missing_semicolon.expected.txt",
141
+ "tests/lint/020_missing_semicolon.x.cf",
142
+ "tests/run-format-tests.sh",
143
+ "tests/run-lint-tests.sh",
144
+ "tests/run-shell-tests.sh",
145
+ "tests/run-up-validate-tests.sh",
146
+ "tests/shell/001-help.sh",
147
+ "tests/shell/002-version.sh",
148
+ "tests/shell/003-format.sh",
149
+ "tests/shell/004-format-check.sh",
150
+ "tests/shell/005-lint.sh",
121
151
  "tests/unit/__init__.py",
122
- "tests/unit/test_version.py",
123
- "tests/unit/test_format.py",
152
+ "tests/unit/test_changelog.py",
124
153
  "tests/unit/test_deps.py",
154
+ "tests/unit/test_format.py",
155
+ "tests/unit/test_lint_csv.py",
156
+ "tests/unit/test_lint_yml.py",
125
157
  "tests/unit/test_paths.py",
126
158
  "tests/unit/test_utils.py",
127
- "ci/03-unsafe-tests.sh",
128
- "ci/02-safe-tests.sh",
129
- "ci/01-install.sh",
130
- "src/cfengine_cli/main.py",
131
- "src/cfengine_cli/syntax_tree.py",
132
- "src/cfengine_cli/dev.py",
133
- "src/cfengine_cli/docs.py",
134
- "src/cfengine_cli/lint_csv.py",
135
- "src/cfengine_cli/profile.py",
136
- "src/cfengine_cli/deptool-README.md",
137
- "src/cfengine_cli/lint.py",
138
- "src/cfengine_cli/__init__.py",
139
- "src/cfengine_cli/shell.py",
140
- "src/cfengine_cli/deptool.py",
141
- "src/cfengine_cli/changelog.py",
142
- "src/cfengine_cli/validate.py",
143
- "src/cfengine_cli/commands.py",
144
- "src/cfengine_cli/up.py",
145
- "src/cfengine_cli/version.py",
146
- "src/cfengine_cli/__main__.py",
147
- "src/cfengine_cli/syntax-description.json",
148
- "src/cfengine_cli/lint_yml.py",
149
- "src/cfengine_cli/format.py",
150
- "src/cfengine_cli/paths.py",
151
- "src/cfengine_cli/utils.py",
152
- "src/cfengine_cli/masterfiles/generate_git_tags.py",
153
- "src/cfengine_cli/masterfiles/generate_release_information.py",
154
- "src/cfengine_cli/masterfiles/download.py",
155
- "src/cfengine_cli/masterfiles/__init__.py",
156
- "src/cfengine_cli/masterfiles/generate_vcf_git_checkout.py",
157
- "src/cfengine_cli/masterfiles/generate_vcf_download.py",
158
- "src/cfengine_cli/masterfiles/analyze.py",
159
- "src/cfengine_cli/masterfiles/check_download_matches_git.py",
160
- "src/cfengine_cli/cfengine_wrapper/cfengine_utils.py",
161
- "src/cfengine_cli/cfengine_wrapper/__init__.py",
162
- "src/cfengine_cli/cfengine_wrapper/arg_parse.py",
163
- "src/cfengine_cli/cfengine_wrapper/cfengine_objects.py",
164
- "src/cfengine_cli/cfengine_wrapper/cfengine_commands.py"
159
+ "tests/unit/test_version.py",
160
+ "tests/up-validate/001_complex_config.yaml",
161
+ "tests/up-validate/002_version.x.yaml",
162
+ "tests/up-validate/003_box.x.yaml",
163
+ "tests/up-validate/004_count.x.yaml",
164
+ "tests/up-validate/mocks/cloud_config.json",
165
+ "tests/up-validate/mocks/vagrant",
166
+ "uv.lock"
165
167
  ]
166
168
  }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.22.0",
3
+ "distance": 0,
4
+ "node": "ga773a4d7ca2cfc6afbd5320f9ad741bc481772ac",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-12"
8
+ }