From b3aa59243ad15003ca0eac3bd8a9815384ddf4ae Mon Sep 17 00:00:00 2001 From: Tiara Rodney Date: Tue, 10 Feb 2026 20:27:04 +0100 Subject: [PATCH] new --- AGENTS.md | 39 +++ CLAUDE.md | 1 + Pipfile | 3 +- Pipfile.lock | 116 ++++++++- dist/doctrees/AGENTS.doctree | Bin 0 -> 28431 bytes dist/doctrees/README.doctree | Bin 0 -> 44309 bytes dist/doctrees/environment.pickle | Bin 0 -> 27696 bytes dist/markdown/AGENTS.md | 39 +++ dist/markdown/LICENSE | 392 +++++++++++++++++++++++++++++++ dist/markdown/README.md | 292 +++++++++++++++++++++++ src/AGENTS.rst | 2 + src/README.rst | 5 + src/conf.py | 1 + 13 files changed, 887 insertions(+), 3 deletions(-) create mode 100644 AGENTS.md create mode 120000 CLAUDE.md create mode 100644 dist/doctrees/AGENTS.doctree create mode 100644 dist/doctrees/README.doctree create mode 100644 dist/doctrees/environment.pickle create mode 100644 dist/markdown/AGENTS.md create mode 100644 dist/markdown/LICENSE create mode 100644 dist/markdown/README.md create mode 100644 src/AGENTS.rst diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5bed565 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,39 @@ +# MIME TODO Specification — Agent Instructions + +This directory contains the MIME TODO specification, which defines the +canonical format for repository-root `TODO` issue tracker files. + +## Consuming the Specification + +The agent-consumable specification is located at: + +``` +dist/markdown/ +``` + +Agents MUST read the specification from `dist/markdown/` for programmatic +access. Do NOT parse the RST source under `src/` directly. + +If `dist/markdown/` is not available locally, the specification +(including this `AGENTS.md`) can be retrieved from +`specs.code.tiararodney.com`, which provides HTML indexes that can be +traversed to locate the applicable markdown files. + +## What This Spec Defines + +- MIME envelope structure and preprocessing rules +- Issue part format (`application/issue`): field ordering, field semantics, + valid values for Type, Status, Priority, and Relationships +- Sprint part format (`application/sprints`): entry grammar, date ranges +- Description block and body grammar +- Branch naming and lifecycle rules tied to issue Type and Status +- Sprint membership logic +- Preprocessor and parser requirements +- Error handling requirements + +## Rules for Agents + +- Do NOT modify the specification files. +- Do NOT modify the RST source under `src/`. +- Changes to this specification MUST be made upstream in the vendor + repository. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 0000000..47dc3e3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/Pipfile b/Pipfile index 8b0d4be..3438c1d 100644 --- a/Pipfile +++ b/Pipfile @@ -7,6 +7,7 @@ name = "pypi" sphinx = "==9.1.0" sphinx-last-updated-by-git = "*" sphinx-markdown-builder = "*" +myst-parser = "*" [dev-packages] @@ -15,4 +16,4 @@ python_version = "3.13" [scripts] build-html = "sphinx-build -b html src/ build/html" -build-md = "sphinx-build -M markdown src/ build/" +build-md = "sphinx-build -M markdown src/ build/" diff --git a/Pipfile.lock b/Pipfile.lock index 8728da3..19d9fb5 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a889c35529339553277566894ad1f7630f478a0a996bee97ad7e704e938b9146" + "sha256": "ce91be744fd5b85f6cd10a54b48d6377511e0f39905267dfd090b725d8e4691b" }, "pipfile-spec": 6, "requires": { @@ -191,6 +191,14 @@ "markers": "python_version >= '3.7'", "version": "==3.1.6" }, + "markdown-it-py": { + "hashes": [ + "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", + "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3" + ], + "markers": "python_version >= '3.10'", + "version": "==4.0.0" + }, "markupsafe": { "hashes": [ "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", @@ -286,6 +294,31 @@ "markers": "python_version >= '3.9'", "version": "==3.0.3" }, + "mdit-py-plugins": { + "hashes": [ + "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", + "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6" + ], + "markers": "python_version >= '3.10'", + "version": "==0.5.0" + }, + "mdurl": { + "hashes": [ + "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" + ], + "markers": "python_version >= '3.7'", + "version": "==0.1.2" + }, + "myst-parser": { + "hashes": [ + "sha256:ab31e516024918296e169139072b81592336f2fef55b8986aa31c9f04b5f7211", + "sha256:f6f231452c56e8baa662cc352c548158f6a16fcbd6e3800fc594978002b94f3a" + ], + "index": "pypi", + "markers": "python_version >= '3.11'", + "version": "==5.0.0" + }, "packaging": { "hashes": [ "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", @@ -302,6 +335,85 @@ "markers": "python_version >= '3.8'", "version": "==2.19.2" }, + "pyyaml": { + "hashes": [ + "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", + "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", + "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", + "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", + "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", + "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", + "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", + "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", + "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", + "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", + "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", + "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6", + "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", + "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", + "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", + "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", + "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", + "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", + "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295", + "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", + "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", + "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", + "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", + "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", + "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", + "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", + "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", + "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b", + "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", + "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", + "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", + "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", + "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369", + "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", + "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", + "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", + "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", + "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", + "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", + "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", + "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", + "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", + "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", + "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", + "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", + "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", + "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", + "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", + "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", + "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4", + "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", + "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", + "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", + "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", + "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", + "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", + "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", + "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", + "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", + "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", + "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", + "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f", + "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", + "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", + "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", + "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", + "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", + "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", + "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", + "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3", + "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", + "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", + "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0" + ], + "markers": "python_version >= '3.8'", + "version": "==6.0.3" + }, "requests": { "hashes": [ "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", @@ -323,7 +435,7 @@ "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895" ], - "markers": "python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==3.0.1" }, "sphinx": { diff --git a/dist/doctrees/AGENTS.doctree b/dist/doctrees/AGENTS.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8bdfec24537f7918d91126d101965e840ebe55b1 GIT binary patch literal 28431 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%0DSQpM(x>>)PDd9jdE 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 literal 0 HcmV?d00001 diff --git a/dist/doctrees/environment.pickle b/dist/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..5dc94bf29c06da50bca7fcb4217e5b031985ad0b GIT binary patch literal 27696 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 z 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 UPX3X>bLkpQ=W^*mdoGv$4<*yHo&W#< literal 0 HcmV?d00001 diff --git a/dist/markdown/AGENTS.md b/dist/markdown/AGENTS.md new file mode 100644 index 0000000..f27ba41 --- /dev/null +++ b/dist/markdown/AGENTS.md @@ -0,0 +1,39 @@ +# MIME TODO Specification — Agent Instructions + +This directory contains the MIME TODO specification, which defines the +canonical format for repository-root `TODO` issue tracker files. + +## Consuming the Specification + +The agent-consumable specification is located at: + +```default +dist/markdown/ +``` + +Agents MUST read the specification from `dist/markdown/` for programmatic +access. Do NOT parse the RST source under `src/` directly. + +If `dist/markdown/` is not available locally, the specification +(including this `AGENTS.md`) can be retrieved from +`specs.code.tiararodney.com`, which provides HTML indexes that can be +traversed to locate the applicable markdown files. + +## What This Spec Defines + +- MIME envelope structure and preprocessing rules +- Issue part format (`application/issue`): field ordering, field semantics, + valid values for Type, Status, Priority, and Relationships +- Sprint part format (`application/sprints`): entry grammar, date ranges +- Description block and body grammar +- Branch naming and lifecycle rules tied to issue Type and Status +- Sprint membership logic +- Preprocessor and parser requirements +- Error handling requirements + +## Rules for Agents + +- Do NOT modify the specification files. +- Do NOT modify the RST source under `src/`. +- Changes to this specification MUST be made upstream in the vendor + repository. diff --git a/dist/markdown/LICENSE b/dist/markdown/LICENSE new file mode 100644 index 0000000..6c5a1fe --- /dev/null +++ b/dist/markdown/LICENSE @@ -0,0 +1,392 @@ +Attribution-NoDerivatives 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + + +======================================================================= + +Creative Commons Attribution-NoDerivatives 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NoDerivatives 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + c. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + d. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + e. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + f. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + g. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + h. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + i. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + j. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce and reproduce, but not Share, Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material, You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + For the avoidance of doubt, You do not have permission under + this Public License to Share Adapted Material. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database, provided You do not Share + Adapted Material; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/dist/markdown/README.md b/dist/markdown/README.md new file mode 100644 index 0000000..cf57e27 --- /dev/null +++ b/dist/markdown/README.md @@ -0,0 +1,292 @@ +# Introduction + +This document defines the canonical format, semantics, and processing rules +for the repository-root `TODO` file. The file is a human-friendly, +append-only (allowing modifications) issue tracker that is parsed by TypeScript tooling using a MIME +envelope added at parse time. + +The raw `TODO` file is not a MIME document. A preprocessor wraps it into a +valid `multipart/mixed` MIME message before parsing. + +## Raw File Structure + +The raw `TODO` file consists of a sequence of *parts*, each beginning with: + +```default +--ISSUE +Content-Type: +``` + +Valid part types are: + +* `application/sprints` — defines sprint metadata +* `application/issue` — defines a single issue + +Parts may appear in any order in the raw file. The preprocessor will reorder +them so that the `application/sprints` part appears first. + +## MIME Envelope (Added by Preprocessor) + +Before parsing, the preprocessor wraps the raw file into a MIME multipart +message. + +Prolog added by the preprocessor: + +```default +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="ISSUE" +``` + +Each raw `--ISSUE` boundary becomes a MIME boundary. The preprocessor +extracts each part’s `Content-Type` and body, reorders parts, and emits a +final closing boundary: + +```default +--ISSUE-- +``` + +The resulting MIME message is parsed using a standard MIME parser. + +## Part: `application/sprints` + +This part defines sprint metadata. + +The body MUST begin with: + +```default +Sprints: +``` + +followed by one or more sprint entries. + +### Sprint Entry Forms + +Both compact and expanded forms are valid. + +Compact form: + +```default +- Name: Sprint 1 + Range: 2026-02-01..2026-02-14 +``` + +Expanded form: + +```default +- + Name: Sprint 1 + Range: 2026-02-01..2026-02-14 +``` + +### Sprint Entry Grammar + +A sprint entry begins at a line matching: + +```default +^\s*-\s*(Name:.*)?$ +``` + +Key–value lines inside an entry match: + +```default +^\s+[A-Za-z][A-Za-z0-9]*:\s*(.*)$ +``` + +Required keys: + +* `Name: ` +* `Range: ..` + +The `Range` defines a closed interval `[start, end]`. + +## Part: `application/issue` + +Each issue is represented as a structured block with strict field ordering. + +### Required Field Order + +The following fields MUST appear in exactly this order: + +```default +ID: +Type: +Title: +Status: +Priority: +Created: +Relationships: +DueStart: # OPTIONAL +DueEnd: # OPTIONAL +Description: + +``` + +### Field Semantics + +* **ID**: unique integer, strictly increasing. +* **Type**: one of `feature`, `bugfix`, `hotfix`. + \* `feature` and `bugfix` issues target the integration branch (`develop`). + \* `hotfix` issues target the stable branch (`main` or `master`). +* **Status**: one of `open`, `in-progress`, `done`, `hold`, `cancelled`. +* **Priority**: one of `low`, `medium`, `high`. +* **Created**: ISO date. +* **Relationships**: + \* Empty: + ```default + Relationships: + ``` + + * Or list: + ```default + Relationships: dependsOn:43, relatesTo:10 + ``` + * Valid kinds: `dependsOn`, `relatesTo`, `blocks`, `causedBy`. +* **DueStart / DueEnd**: + \* Optional. + \* If only one is present, the other is implicitly equal to it. + +### Description Block + +* The first line appears on the same line as `Description:`. +* Continuation lines: + \* Must begin with whitespace. + \* Must align indentation consistently. +* No blank lines allowed inside the description block. + +### Body + +Any lines after the description block are considered free-form body text. +The body MUST NOT contain another `ID:` field or a MIME boundary. + +## Git Workflow Rules + +### Branch Naming + +Branches for issues MUST follow: + +```default +/ +``` + +Examples: + +```default +feature/12 +bugfix/7 +``` + +### Modification Rules + +* All edits to `TODO` MUST occur on `develop`. +* Feature/bugfix/hotfix branches MUST rebase changes from `develop`. + +### Branch Lifecycle + +* A branch MUST NOT exist before its issue is created. +* A branch MUST be named exactly `/`. +* A branch MAY merge only when the issue status is `done`. + +## Sprint Membership Logic + +Given: + +* Sprint interval `[S_start, S_end]` +* Issue interval `[I_start, I_end]` + +### Normalization + +* Only `DueEnd` → `I_start = I_end = DueEnd` +* Only `DueStart` → `I_start = I_end = DueStart` +* Neither → issue is not sprint-bound + +### Membership Condition + +An issue belongs to a sprint if: + +```default +I_start ≤ S_end AND I_end ≥ S_start +``` + +### Current Sprint for Date D + +1. All sprints where `S_start ≤ D ≤ S_end`. +2. If multiple match, choose the one with the latest `S_start`. +3. If none match, no active sprint. + +## Preprocessor Requirements + +The preprocessor MUST: + +* Read the raw `TODO` file. +* Split into parts using `--ISSUE`. +* Extract each part’s `Content-Type` and body. +* Reorder parts so that: + \* `application/sprints` appears first (if present) + \* All `application/issue` parts follow in original order +* Emit a MIME message with: + \* `MIME-Version: 1.0` + \* `Content-Type: multipart/mixed; boundary="ISSUE"` + \* Each part wrapped as: + ```default + --ISSUE + Content-Type: + + + ``` + + * Final boundary: + ```default + --ISSUE-- + ``` + +## Parser Requirements + +The parser MUST: + +* Use a MIME parser to extract parts. +* Dispatch based on `Content-Type`: + \* `application/sprints` → sprint parser + \* `application/issue` → issue parser +* Enforce: + \* Field order + \* Required fields + \* Description indentation rules + \* Sprint entry grammar +* Produce a `TodoFile` object: + ```default + { + sprints: Sprint[], + issues: Issue[] + } + ``` + +## Error Handling + +The parser MUST reject: + +* Missing or malformed `Content-Type` headers +* Unknown MIME types +* Missing required issue fields +* Incorrect field order +* Invalid sprint ranges +* Invalid date formats +* Multiple `application/sprints` parts +* Duplicate issue IDs + +Errors SHOULD include line numbers when possible. + +## Extensibility + +Future part types MAY be added using: + +```default +application/ +``` + +Examples: + +* `application/metadata` +* `application/changelog` +* `application/epilog` + +The preprocessor MUST preserve unknown part types but MUST NOT reorder them. diff --git a/src/AGENTS.rst b/src/AGENTS.rst new file mode 100644 index 0000000..5c51f88 --- /dev/null +++ b/src/AGENTS.rst @@ -0,0 +1,2 @@ +.. include:: ../AGENTS.md + :parser: myst_parser.sphinx_ diff --git a/src/README.rst b/src/README.rst index 1db5be9..2ea57b5 100644 --- a/src/README.rst +++ b/src/README.rst @@ -1,3 +1,8 @@ +.. toctree:: + :hidden: + + AGENTS + ############ Introduction ############ diff --git a/src/conf.py b/src/conf.py index dec17cd..c9ae813 100644 --- a/src/conf.py +++ b/src/conf.py @@ -8,6 +8,7 @@ extensions = [ 'sphinx.ext.todo', 'sphinx_last_updated_by_git', 'sphinx_markdown_builder', + 'myst_parser', ]