{"id":34331049,"url":"https://github.com/cfengine/documentation","last_synced_at":"2025-12-17T18:04:39.637Z","repository":{"id":8058857,"uuid":"9470526","full_name":"cfengine/documentation","owner":"cfengine","description":"Documentation for CFEngine","archived":false,"fork":false,"pushed_at":"2025-11-26T16:27:27.000Z","size":126881,"stargazers_count":36,"open_issues_count":4,"forks_count":74,"subscribers_count":17,"default_branch":"master","last_synced_at":"2025-11-28T23:28:03.260Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cfengine.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2013-04-16T11:02:34.000Z","updated_at":"2025-11-26T16:27:31.000Z","dependencies_parsed_at":"2023-10-12T22:08:42.807Z","dependency_job_id":"d2fec8fc-766f-4dcf-bcfd-077aa48e447f","html_url":"https://github.com/cfengine/documentation","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/cfengine/documentation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfengine%2Fdocumentation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfengine%2Fdocumentation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfengine%2Fdocumentation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfengine%2Fdocumentation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cfengine","download_url":"https://codeload.github.com/cfengine/documentation/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfengine%2Fdocumentation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27785322,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-17T02:00:08.291Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-12-17T18:03:16.687Z","updated_at":"2025-12-17T18:04:39.628Z","avatar_url":"https://github.com/cfengine.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CFEngine documentation\n\nThis repository holds the sources for the technical\n[CFEngine documentation](https://docs.cfengine.com/docs/) in\nmarkdown files. If you have a texteditor, know how to write\n[markdown](https://daringfireball.net/projects/markdown/syntax) and\nEnglish and would like to contribute to the CFEngine documentation, then we'd\nlike to invite you to collaborate here!\n\nIf you would like to notify us about incorrect documentation, but don't have\nthe time or the knowledge to make a correction directly here, then you can\nreport the issue in the regular [CFEngine bug\ntracker](https://cfengine.com/dev/projects/core). Use the \"Documentation\"\ncategory when you create bugs. And of course you can search the bug tracker\nfor known issues with the documentation, and help the community of\nCFEngine users by correcting some of them.\n\n## Contributing to the documentation\n\nThe CFEngine documentation is written in regular\n[markdown](https://daringfireball.net/projects/markdown/syntax), with some\nextensions as documented below. Check out the\n[cheatsheet](https://github.com/cfengine/documentation/blob/master/cheatsheet.markdown?plain=1)!\n\nIf you don't know Git, then you can still contribute to the documentation\nusing the GitHub interface as long as you have a GitHub account. Fork this\nrepository (called the _upstream_) using the GitHub web interface, make\nchanges in your fork and create pull requests so that your changes can be\nmerged into the _upstream_ repository.\n\nIt is in general advisable to make small commits that are submitted through\npull requests frequently. Otherwise any structural changes to documentation\ncontent can cause merge conflicts that are hard to resolve.\n\n## Writing guidelines\n\nIn order to make our documentation, blog posts, and website as consistent and easy to understand as possible, for both readers and writers, please follow the guidelines below.\n\n### Spelling\n\nCFEngine documentation follows American spelling, use the [Merriam Webster online dictionary](https://www.merriam-webster.com/) if you are unsure about the spelling of some words.\n\n### Punctuation\n\n**Oxford comma**\n\nIn punctuation, a serial comma (also called Oxford comma) needs to be placed\nimmediately before the conjunction (often \"and\" or \"or\") in a series of three\nor more terms.\n\n_Example:_\n\nI would like crackers, cheese, and garlic.\n\n**The comma as a separator between compound sentences**\n\nUse comma to separate independent clauses when they are joined by any of\nthese seven coordinating conjunctions: and, but, for, or, nor, so, yet.\n\nHowever, the comma can be dropped in the following cases:\n\n- if both independent clauses are quite short, especially if the two clauses\n  are very closely related, and even more so if the subject of both clauses is\n  the same, or\n- if only the first clause is quite short, especially if the two clauses are\n  very closely related, and even more so if the subject of both clauses is the\n  same.\n\n### Headings\n\nThe title you put in the frontmatter will be `\u003ch1\u003e` heading at the top of the post.\nA line like `# Some title` in markdown becomes `\u003ch1\u003eSome title\u003c/h1\u003e` in HTML, `## Some title` becomes `\u003ch2\u003eSome title\u003c/h2\u003e`, etc.\nThere should only be one `\u003ch1\u003e`, so don't use `# Some title` inside your post.\n\nSome other things to remember and avoid:\n\n- Don't use \"Title Case\"; in headings and titles, only capitalize the first word and proper nouns.\n- Don't start a post or article with a heading, like a `## Introduction`, just write your introduction without a separate heading.\n- Don't skip a heading level (Don't go directly from `\u003ch1\u003e` to `\u003ch3\u003e`).\n- Don't make headings bold or italic or put additional styling inside them.\n- Don't put explicit anchor handles in headings, like this:\n  ```markdown\n  ## Video {#video}\n  ```\n  It is unnecessary, as this works the same:\n  ```markdown\n  ## Video\n  ```\n\n(You can link to the specific headings by appending to the end of the URL, `#video` in this case).\n\n### Varied content\n\nTry to include a couple of visually interesting things in every post / article, such as:\n\n- Images / diagrams / screenshots\n- Source code blocks with syntax highlighting (add `cf3`, `json` or similar after the triple backticks)\n- Bulleted / numbered lists\n- Video (Usually nice towards the end)\n\n### Bold, emphasis, and monospace\n\n- Use backticks to print something in a monospace font.\n  - Whenever you are writing something from the terminal, code, JSON files, policy snippets, or similar.\n  - For example: `bundle agent main`, `{}`, `my_bundle.my_variable`, `apt`, `cf-agent`, `/tmp`, `promises.cf`.\n- Use two asterisks to make something bold.\n  - For highlighting an important paragraph / section: **Hint:**, **Tip:**, **Note:**, **Disclaimer:**.\n  - When referring to graphical UI / web page elements: Click the **Save** button.\n- Use underscores to emphasize a word.\n  - For example a word which is extra important or has a special meaning.\n\n### Capitalization\n\nAvoid capitalizing things unnecessarily (features, concepts, titles).\nTitles and headings use sentence case (so don't capitalize each word).\nSome names should always be capitalized in a specific way:\n\n- CFEngine\n- CFEngine Build\n- CFEngine Docs\n- CFEngine Enterprise\n- Linux, macOS, Windows, Unix (and other names of operating systems)\n- Mission Portal\n- UI, CVE, TCP, TLS, API, HTTP, JSON (and other abbreviations)\n\n### Titles and verb tenses\n\nAvoid imperative tense in titles.\nUse `-ing` or nouns instead, some examples:\n\n- What not to do:\n  - \"Write policy\"\n  - \"Manage packages\"\n  - \"Install CFEngine\"\n  - \"Get started\"\n- Titles you can use instead:\n  - \"Policy writing\" (or \"Writing policy\")\n  - \"Package management\" (or \"Managing packages\")\n  - \"CFEngine installation\" (or \"Installing CFEngine\")\n  - \"Getting started\"\n\nSince anything can be managed, \"managing\" tends to be used a lot.\nTry to use other words: \"editing\", \"updating\", \"changing\", \"creating\", \"setting\".\n\n### Code blocks and indentation\n\nUse triple backticks + a language name to enable syntax highlighting.\nUse 2 spaces for indentation, and avoid extra / unnecessary indentation.\nOn smaller devices, code blocks can be as narrow as 46 characters.\nWhen possible, try to break up long lines, to make reading easier, without the user having to scroll horizontally.\n(But don't go to extremes to always fit things within 46 characters).\n\n### File, command, and output blocks\n\nWe have components for specifying commands to run, their output, and files to create, with their filename.\n\nUse these whenever possible.\nSee examples in [the cheatsheet](https://github.com/cfengine/documentation/blob/master/cheatsheet.markdown?plain=1#L229).\n\n### Commands run as root\n\nUse `sudo` to communicate that something should be run as root.\nDon't rely on users understanding your shell prompt to know which commands should be run as root.\n\n### Sentences and wrapping\n\nIt's recommended to wrap after every sentence, with no line length limit - it makes reviews and diffs nicer.\nTo the markdown parser, it doesn't matter how you wrap your sentences, a completely empty line (i.e. two consecutive newline characters) is required for a line break in markdown.\n\n### Tools and automatic formatting\n\nWe use a combination of tools to automatically format the documentation.\nIf you want to run them locally, install them:\n\n```\npipx install cfengine black\nnpm install --global prettier\n```\n\nAnd run the command:\n\n```\ncfengine dev format-docs\n```\n\n## Documentation structure\n\n### Structure\n\nPages are organized hierarchically in category/subcategory relationships,\ncorresponding to the organization of the .markdown files in the repository.\n\nThe content of the file\n\n    documentation/path/of/categories.markdown\n\nwill generate a HTML page\n\n    docs.cfengine.com/docs/version/path-of-categories.html\n\nwith equivalent location in the left-hand navigation tree.\n\nThe documentation generation inserts a link to the source markdown in the\nfooter of each page.\n\nNote: Do not use markdown files prefixed with `.`. They are not picked up by the documentation generator. You can use `.` prefixed page titles.\n\n### META tags\n\nAdditional META tags you should set are:\n\n    title: \"The Title\"\n\nThe title of the page. Quoting is only necessary if the title contains YAML\nkeywords (like \"on\").\n\n    hidden: true\n\nPages that set this tag to `true` will not be part of the navigation structure.\nThe HTML content will however be generated.\n\n    tags: [list, of, tags with space, all lowercase]\n\nKeywords for this page, which will be displayed on top of the page, and used\nwhen generating the tag-pages.\n\n    reviewed: yyyy-mm-dd\n    reviewed-by: github-user\n\nKeeping track of when a documentation page has last been reviewed.\n\n    sorting: number\n\nSort order within the parent category. Tip: make jumps in 10's so that pages\ncan be inserted later.\n\nMETA tag values will be interpreted literally, and cannot contain `:`, `[` and\n`]`.\n\n### Image files\n\nImage files are in the same directory as the markdown files that embed them.\nGive files unique names to avoid overwrites in the generated website.\n\nSee [Style Guide - Charts and graphs](#charts-and-graphs) for style\nrequirements for images.\n\n_Warning:_ It is important for images and other binary files to be marked as a\nbinary file in `.gitattributes`. Binary file patterns not specifically marked\nmay be mangled and corrupted within Git.\n\n### Links\n\nTo link to pages within the documentation, use the syntax:\n\n    [Link text][Page Title]\n\nIf `Link text` is the title of the target page, you can also use this shorthand:\n\n    [Page Title][]\n\nTo link to a section within the target page, use:\n\n    [Link text][Page Title#Section in Page]\n\nTo links to sections within the current page, you can also skip the page title:\n\n    [Go to section][#Section in Current Page]\n\nFor standard URLs and locations to link to, see the\n[mapping](https://github.com/cfengine/documentation/blob/master/generator/_references.md).\n\n#### Automatic linking\n\nThe documentation generator automatically creates links for words in code\nmarkers if that word exists as a page or section title.\n\n    **See also:** `attribute_name`, `function()`\n\nThis will automatically link to the section or page with title\n_attribute_name_. To make explicit links from code words, use\n`code` markers in the link text.\n\n    **See also:** [`attribute_name`][page#attributename]\n\nWhen the word is a function, mark it as such using `()`:\n\n    **See also:** [`classify()`][classify]\n\nSection titles of the form\n\n    ### section title\n\nare included in that automatic linking. To exclude a section header\nfrom that automatic linking, use the form\n\n    ### section title, no linking ###\n\nwhich is otherwise equivalent for the markdown renderer.\n\nTo use keywords in inline code _without_ creating an automatic link, use\ntriple backticks:\n\n    The ```meta``` parameter to this function...\n\nWith single backticks, this would link to the documentation of the `meta` attribute or promise type.\n\n### Custom macros\n\nThe documentation generator will pre-process the markdown content\nbefore passing it to Hugo for the rendering. The pre-processor\nunderstands and replaces the macros. Macros all have the form\n\n`{{\u003c CFEngine_MACRO(parameters) \u003e}}`\n\nand need to be used as a separate line, as the entire line will be\nreplaced by the pre-processor.\n\n#### Quoting policy files\n\nThe following macros read code from a file and inject the text in\nthat file into the documentation. Contol comments in the file\nand regular expressions passed to the macros can be used to specify\nwhich sections of the file should be injected.\n\nThe injected lines will be in a CFEngine code block. Comment lines\n(ie lines starting with `#`) are omitted, unless they start with\n`#@ `, in which case they interrupt the code block and are rendered\nas markdown. All lines between a lines starting with `#[%-%]` and `#[%+%]`\nare skipped.\n\nThe generator searches for `filename` in the `core/examples`\nsubdirectory of WKRDIR.\n\n- `{{\u003c CFEngine_include_example(filename) \u003e}}`\n\nInjects the code from `filename`.\n\n- `{{\u003c CFEngine_include_snippet(filename, begin_rx, end_rx [optional]) \u003e}}`\n\nSearches `filename` for the first line that matches the regular\nexpression `begin_rx`, and injects all lines as a code block from\nthere until the first line that matches `end_rx`. If `end_rx` is\nomitted, all lines until the end of the file will be injected.\n\nIf the line that matches the regular expression is a comment, then\nit is excluded from the quote, otherwise it is included.\n\n- `{{\u003c CFEngine_include_markdown(filename, begin_rx, end_rx [optional]) \u003e}}`\n\nSearches `filename` for the first line that matches the regular\nexpression `begin_rx`, and injects all lines **verbatim** from there\nuntil the first line that matches `end_rx`. If `end_rx` is omitted,\nall lines until the end of the file will be injected.\n\n#### Documenting policy libraries\n\n- `{{\u003c CFEngine_library_include(filename) \u003e}}`\n\nParses the JSON version of the CFEngine policy in `filename` and generates\ndocumentation from it.\n\nThe generator searches for the library in JSON format in the `_generated` subdirectory of\nthe documentation generator. `filename` needs to be provided without file\nextension.\n\nThe generator parses comments between bundle/body\nprototype declaration and the opening `{` as doxygen syntax, supporting\nthe following tags:\n\n    @brief text\n\nGenerates the **Description** section.\n\n    @param attr text\n\nIncludes `text` in the documentation for attribute `attr` within the\n**Arguments** section.\n\n    @return text\n\nGenerates the **Return value** statement.\n\nThe content in `text` is then rendered as standard markdown, and can span\nmultiple lines and paragraphs.\n\n    @ignore\n\nThe generator will completely ignore this body or bundle; no documentation\nwill be emitted.\n\nAll comments before the first doxygen-style tag will be ignored.\n\n#### Documenting CFEngine syntax elements\n\nThe following macros require the syntax map to be generated\nvia `cf-promises -s` into a file `syntax_map.json` within the\n`_generated` subdirectory of the documentation generator.\n\n- `{{\u003c CFEngine_function_prototype(arg1, arg2, ...) \u003e}}`\n\nRenders the prototype of the function that has the same name as the\ntitle of the current page. Parameters `arg1` etc are used for the names\nof the parameters:\n\n```\n**Prototype:** `title(arg1, arg2, ...)`\n\n**Return type:** `type`\n```\n\nUse this before a `**Description:**` section in which the behavior of the\nfunction as well as the individual parameters are then explained.\n\n- `{{\u003c CFEngine_function_attributes(arg1, arg2, ...) \u003e}}`\n\nRenders a list of attributes for the function that has the same name as the\ntitle of the current page. `arg1` etc are used for the parameter names:\n\n```\n**Arguments:**\n\n* `arg1`: `type1`, in the range: `regex`\n* `arg2`: `type2`, one of\n    * `option1`\n    * `option2`\n```\n\nLinks to known keywords are generated automatically.\n\nDocument the individual parameters either directly in the `**Description:**`\nsection, or as a block after using this macro. You cannot use the macro if\nindividual options of option-type parameters need detailed explanation.\n\n- `{{\u003c CFEngine_promise_attribute(default) \u003e}}`\n\nRenders the syntax description of the current promise attribute. The current\nmarkdown needs to comply with the following:\n\nThe current page title is assumed to be the promise type. The current level-3\nheader is assumed to be the attribute name, or - if the current promise\nattribute is a body type - the name of the body. In a body type, the current\nlevel 4 header is interpreted to be the body attribute.\n\n**Example:**\n\n```\n---\ntitle: promise_type\n---\n\n## Attributes\n\n### attribute1\n\n{{\u003c CFEngine_promise_attribute(default) \u003e}}\n\nThis will document \"attribute1\" of \"promise_type\"\n\n### body\n\n#### attribute1\n\n{{\u003c CFEngine_promise_attribute(default) \u003e}}\n\nThis will document \"attribute1\" of \"body\"\n```\n\nThe generated markdown is:\n\n```\n**Type:** `type`\n\n**Allowed input range:** `range`\n\n* `option1`\n* `option2`\n```\n\nIf a `default` parameter is provided, then a `**Default value:**` statement\nis created.\n\n- `{{\u003c CFEngine_function_table() \u003e}}`\n\nRenders a table of built-in functions, grouped by function category.\n\n- `{{\u003c CFEngine_syntax_map(subtree) \u003e}}`\n\nRenders a nested tree of CFEngine words, starting at `subtree`.\n\n#### Other macros\n\n- `{{\u003c CFEngine_redirect(target) \u003e}}`\n\nInjects javascript that redirects the current page to the HTML page for `target`,\nwhich needs to be a title or title#section combination as in regular `[text][title#section]`\nlinks.\n\n## Documenting CFEngine specific concepts\n\n- follow the [Policy style guide](guide/writing-and-serving-policy/policy-style.markdown)\n  in examples and code snippets\n- use the appropriate lexer for syntax highlighting via Chroma\n\n  Most important are the `cf3` lexer, as well as `bash`, `console`,\n  `diff`, `shell-session` and `sql`. But Hugo supports\n  [many more lexers](https://gohugo.io/content-management/syntax-highlighting/#languages)\n\n- avoid custom color schemes and hand-coded HTML\n- document the example after the example code\n\nThe structure of the technical documentation about CFEngine attributes,\nfunctions etc is as follows:\n\n### Promise attributes\n\nPromise attributes are documented within the respective promise types's reference\npage. Level-3 headers are used to start a new attribute (if the promise attribute\nrequires a body template, then see next section).\n\n    ----\n    title: promise-type\n    ----\n\n    ...\n\n    ### Promise Attribute\n\n    **Description:** One line summary.\n\n    Longer explanation on what it does and why it is useful,\n    over multiple paragraphs if necessary.\n\n    {{\u003c CFEngine_promise_attribute(default value) \u003e}}\n\n    More information about special input values.\n\n    **Example:**\n\n    ```f3\n    Some code with\n    cf3 markers\n    for syntax highlighting\n    ```\n\n    If the example requires explanation, do it here. Consider using\n    CFEngine comments within the code directly to explain. Preferably,\n    use the `include_snippet` macro (see above) to inject code from an external\n    .cf file that is known to run and produce the expected output.\n\n    **Notes:**\n\n    Additional information, spanning as many paragraphs as necessary, but mind\n    the style guide.\n\n    **See also:** `related_attribute`, [`attribute`][other_page#attribute]\n\n### Bodies\n\nFor promise attributes with a body type, you can start with an example of that\nbody type, with the most relevant attributes set to self-explanatory values.\n\n    ### attribute\n\n    **Description:** One line summary.\n\n    Longer explanation on what this body template is used for,\n    over multiple paragraphs if necessary.\n\n    {{\u003c CFEngine_promise_attribute() \u003e}}\n\n    **Example:**\n\n    ```cf3\n    body promise_attribute example\n    {\n       attribute1 =\u003e \"value1\";\n       attribute2 =\u003e \"value2\";\n    }\n    ```\n\nStart explaining each attribute in the body then using level4-headings,\nfollowing the style for promise attributes as explained above. Examples\nshould be a code snippet at this point, no need for a complete piece of\nrunnable code.\n\n### Functions\n\nNo header necessary - there is one function per page, and the page's\ntitle is the name of the function.\n\n    {{\u003c CFEngine_function_prototype(parameter1, parameters2, ...) \u003e}}\n\n    **Description:** Returns something based on `parameter1` and `parameter2`.\n\n    Longer explanation on what it does and why it is useful then afterwards.\n\n    Summarize what the function does and reference the most important parameters by\n    name, typical use cases etc.\n\n    Over multiple paragraphs if necessary.\n\n    {{\u003c CFEngine_function_attributes(parameter1, parameter2) \u003e}}\n\n    Explain important attribute values, correlations and limitations.\n\n    **Example:**\n\n    ```cf3\n    Some code with\n    cf3 markers\n    for syntax highlighting\n    ```\n\n    If the example requires explanation, do it here. Consider using\n    CFEngine comments within the code directly to explain, and the `include_snippet`\n    macro to inject code from an external .cf file that is known to work.\n\n    **Notes:**\n\n    Additional information, spanning as many paragraphs as necessary, but mind\n    the style guide.\n\n    **See also:** `related_function()`, `related_attribute`\n\n**Note:** The `function_attributes` macro will generate a simple enumeration of all attributes,\nwith the types and allowed in put range coming from the syntax map, and the names as\nprovided. If you want to explain each attribute directly after it being listed, don't\nuse the macro, and list the attributes explicitly:\n\n    **Arguments:**\n\n    * `named`: valid input\n\n    First argument does this.\n\n    * `parameters`: valid input\n\n    This argument does that.\n\n### Special variables\n\nSpecial variables are documented within the page of their context.\n\n    ### context.variable\n\n    Explanation.\n\n    **See also:** `other_variable`\n\n## Publishing\n\nHugo is used to generate the HTML pages. The toolchain is available at\nhttps://github.com/cfengine/documentation/tree/master/generator. After you compile pages,\nHugo will place all files into the \\_site folder.\n\nCommits in this repository trigger the documentation generator to run, which\nthen updates the contents of https://docs.cfengine.com/docs/\n\nThe documentation generation creates a log file that lists undocumented\nsyntax elements, ambiguous link targets and other stuff that can be improved at\nhttps://docs.cfengine.com/docs/master/cfdoc_log.html\n\n## License\n\nSee the LICENSE file.\n\n# Authors\n\nCFEngine was originally created by Mark Burgess with many contributions from\naround the world. Thanks [everyone](https://github.com/cfengine/core/blob/master/AUTHORS)!\n\n[CFEngine](https://cfengine.com) is sponsored by [Northern.tech AS](https://northern.tech)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcfengine%2Fdocumentation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcfengine%2Fdocumentation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcfengine%2Fdocumentation/lists"}