From c9df481996a2cc62717c2f366f6c91e248480290 Mon Sep 17 00:00:00 2001 From: Tiara Rodney Date: Sun, 22 Mar 2026 02:18:32 +0100 Subject: [PATCH] chore: update document meta --- .gitignore | 1 + AGENTS.md | 6 +- Pipfile | 6 +- Pipfile.lock | 318 +++++---- build/markdown/doctrees/AGENTS.doctree | Bin 0 -> 40683 bytes build/markdown/doctrees/CHANGELOG.doctree | Bin 0 -> 9353 bytes build/markdown/doctrees/README.doctree | Bin 0 -> 133390 bytes build/markdown/doctrees/environment.pickle | Bin 0 -> 38774 bytes build/markdown/markdown/AGENTS.md | 103 +++ build/markdown/markdown/CHANGELOG.md | 13 + build/markdown/markdown/LICENSE | 392 +++++++++++ build/markdown/markdown/README.md | 757 +++++++++++++++++++++ src/CHANGELOG.rst | 6 + src/README.rst | 26 +- src/conf.py | 8 +- 15 files changed, 1504 insertions(+), 132 deletions(-) create mode 100644 build/markdown/doctrees/AGENTS.doctree create mode 100644 build/markdown/doctrees/CHANGELOG.doctree create mode 100644 build/markdown/doctrees/README.doctree create mode 100644 build/markdown/doctrees/environment.pickle create mode 100644 build/markdown/markdown/AGENTS.md create mode 100644 build/markdown/markdown/CHANGELOG.md create mode 100644 build/markdown/markdown/LICENSE create mode 100644 build/markdown/markdown/README.md create mode 100644 src/CHANGELOG.rst diff --git a/.gitignore b/.gitignore index 5278863..c258134 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +!/build/markdown/* /build/ /.venv diff --git a/AGENTS.md b/AGENTS.md index 6cd1696..bdc0556 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,13 +8,13 @@ canonical format for repository-root `TODO` issue tracker files. The agent-consumable specification is located at: ``` -dist/markdown/ +build/markdown/ ``` -Agents MUST read the specification from `dist/markdown/` for programmatic +Agents MUST read the specification from `build/markdown/` for programmatic access. Do NOT parse the RST source under `src/` directly. -If `dist/markdown/` is not available locally, the specification +If `build/markdown/` is not available locally, the specification (including this `AGENTS.md`) can be retrieved from `specs.code.tiararodney.com`: diff --git a/Pipfile b/Pipfile index 3438c1d..6da0049 100644 --- a/Pipfile +++ b/Pipfile @@ -8,6 +8,8 @@ sphinx = "==9.1.0" sphinx-last-updated-by-git = "*" sphinx-markdown-builder = "*" myst-parser = "*" +sphinx-git = "*" +setuptools-scm = "*" [dev-packages] @@ -15,5 +17,5 @@ myst-parser = "*" python_version = "3.13" [scripts] -build-html = "sphinx-build -b html src/ build/html" -build-md = "sphinx-build -M markdown src/ build/" +"build:html" = "sphinx-build -b html src/ build/html" +"build:markdown" = "sphinx-build -M markdown src/ build/markdown" diff --git a/Pipfile.lock b/Pipfile.lock index 19d9fb5..6c56fd8 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "ce91be744fd5b85f6cd10a54b48d6377511e0f39905267dfd090b725d8e4691b" + "sha256": "e7a49482ff3423db3d845d23425dcf91305f643986c8eb6a6ce86f3e8f7c4ac0" }, "pipfile-spec": 6, "requires": { @@ -34,130 +34,146 @@ }, "certifi": { "hashes": [ - "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", - "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120" + "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", + "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7" ], "markers": "python_version >= '3.7'", - "version": "==2026.1.4" + "version": "==2026.2.25" }, "charset-normalizer": { "hashes": [ - "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", - "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", - "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", - "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", - "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", - "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", - "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63", - "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", - "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", - "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", - "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", - "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", - "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", - "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af", - "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", - "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", - "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", - "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", - "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", - "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", - "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576", - "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", - "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", - "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", - "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", - "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", - "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", - "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", - "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", - "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", - "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", - "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", - "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a", - "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", - "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", - "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", - "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", - "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", - "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7", - "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", - "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", - "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", - "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", - "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", - "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", - "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2", - "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", - "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", - "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", - "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", - "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", - "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", - "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", - "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", - "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa", - "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", - "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", - "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", - "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", - "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", - "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", - "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", - "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", - "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", - "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", - "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", - "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", - "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", - "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", - "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", - "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3", - "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", - "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", - "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", - "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", - "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", - "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", - "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf", - "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", - "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", - "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac", - "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", - "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", - "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", - "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", - "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", - "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", - "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4", - "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84", - "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", - "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", - "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", - "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", - "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", - "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", - "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", - "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", - "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", - "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074", - "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3", - "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", - "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", - "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", - "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d", - "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", - "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", - "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", - "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", - "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", - "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", - "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", - "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", - "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608" + "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", + "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", + "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", + "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", + "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", + "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0", + "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", + "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", + "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", + "sha256:1cf0a70018692f85172348fe06d3a4b63f94ecb055e13a00c644d368eb82e5b8", + "sha256:1ed80ff870ca6de33f4d953fda4d55654b9a2b340ff39ab32fa3adbcd718f264", + "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", + "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", + "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4", + "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", + "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", + "sha256:2bd9d128ef93637a5d7a6af25363cf5dec3fa21cf80e68055aad627f280e8afa", + "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95", + "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", + "sha256:2f7fdd9b6e6c529d6a2501a2d36b240109e78a8ceaef5687cfcfa2bbe671d297", + "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", + "sha256:31215157227939b4fb3d740cd23fe27be0439afef67b785a1eb78a3ae69cba9e", + "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", + "sha256:3516bbb8d42169de9e61b8520cbeeeb716f12f4ecfe3fd30a9919aa16c806ca8", + "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0", + "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9", + "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", + "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", + "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", + "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565", + "sha256:461598cd852bfa5a61b09cae2b1c02e2efcd166ee5516e243d540ac24bfa68a7", + "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", + "sha256:48696db7f18afb80a068821504296eb0787d9ce239b91ca15059d1d3eaacf13b", + "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", + "sha256:4d1d02209e06550bdaef34af58e041ad71b88e624f5d825519da3a3308e22687", + "sha256:4f41da960b196ea355357285ad1316a00099f22d0929fe168343b99b254729c9", + "sha256:517ad0e93394ac532745129ceabdf2696b609ec9f87863d337140317ebce1c14", + "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89", + "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", + "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", + "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", + "sha256:54fae94be3d75f3e573c9a1b5402dc593de19377013c9a0e4285e3d402dd3a2a", + "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", + "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", + "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", + "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", + "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", + "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", + "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", + "sha256:659a1e1b500fac8f2779dd9e1570464e012f43e580371470b45277a27baa7532", + "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", + "sha256:69dd852c2f0ad631b8b60cfbe25a28c0058a894de5abb566619c205ce0550eae", + "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", + "sha256:71be7e0e01753a89cf024abf7ecb6bca2c81738ead80d43004d9b5e3f1244e64", + "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", + "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557", + "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", + "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", + "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", + "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", + "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", + "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", + "sha256:802168e03fba8bbc5ce0d866d589e4b1ca751d06edee69f7f3a19c5a9fe6b597", + "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", + "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", + "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", + "sha256:8761ac29b6c81574724322a554605608a9960769ea83d2c73e396f3df896ad54", + "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", + "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", + "sha256:8bc5f0687d796c05b1e28ab0d38a50e6309906ee09375dd3aff6a9c09dd6e8f4", + "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7", + "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", + "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", + "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", + "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", + "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", + "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", + "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", + "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", + "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", + "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", + "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", + "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", + "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", + "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", + "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6", + "sha256:ab30e5e3e706e3063bc6de96b118688cb10396b70bb9864a430f67df98c61ecc", + "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", + "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", + "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", + "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", + "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", + "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", + "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", + "sha256:bf625105bb9eef28a56a943fec8c8a98aeb80e7d7db99bd3c388137e6eb2d237", + "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", + "sha256:c45a03a4c69820a399f1dda9e1d8fbf3562eda46e7720458180302021b08f778", + "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", + "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", + "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", + "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", + "sha256:d08ec48f0a1c48d75d0356cea971921848fb620fdeba805b28f937e90691209f", + "sha256:d1a2ee9c1499fc8f86f4521f27a973c914b211ffa87322f4ee33bb35392da2c5", + "sha256:d5f5d1e9def3405f60e3ca8232d56f35c98fb7bf581efcc60051ebf53cb8b611", + "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", + "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", + "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", + "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b", + "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db", + "sha256:df01808ee470038c3f8dc4f48620df7225c49c2d6639e38f96e6d6ac6e6f7b0e", + "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", + "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd", + "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", + "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", + "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8", + "sha256:e8aeb10fcbe92767f0fa69ad5a72deca50d0dca07fbde97848997d778a50c9fe", + "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058", + "sha256:ecbbd45615a6885fe3240eb9db73b9e62518b611850fdf8ab08bd56de7ad2b17", + "sha256:ee4ec14bc1680d6b0afab9aea2ef27e26d2024f18b24a2d7155a52b60da7e833", + "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", + "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550", + "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", + "sha256:f50498891691e0864dc3da965f340fada0771f6142a378083dc4608f4ea513e2", + "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", + "sha256:f61aa92e4aad0be58eb6eb4e0c21acf32cf8065f4b2cae5665da756c4ceef982", + "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", + "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", + "sha256:f98059e4fcd3e3e4e2d632b7cf81c2faae96c43c60b569e9c621468082f1d104", + "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659" ], "markers": "python_version >= '3.7'", - "version": "==3.4.4" + "version": "==3.4.6" }, "docutils": { "hashes": [ @@ -167,6 +183,22 @@ "markers": "python_version >= '3.9'", "version": "==0.22.4" }, + "gitdb": { + "hashes": [ + "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", + "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf" + ], + "markers": "python_version >= '3.7'", + "version": "==4.0.12" + }, + "gitpython": { + "hashes": [ + "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f", + "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.46" + }, "idna": { "hashes": [ "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", @@ -177,11 +209,11 @@ }, "imagesize": { "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" + "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", + "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" + "markers": "python_version >= '3.10' and python_version < '3.15'", + "version": "==2.0.0" }, "jinja2": { "hashes": [ @@ -430,12 +462,45 @@ "markers": "python_version >= '3.10'", "version": "==4.1.0" }, + "setuptools": { + "hashes": [ + "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", + "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb" + ], + "markers": "python_version >= '3.9'", + "version": "==82.0.1" + }, + "setuptools-scm": { + "hashes": [ + "sha256:1c674ab4665686a0887d7e24c03ab25f24201c213e82ea689d2f3e169ef7ef57", + "sha256:30e8f84d2ab1ba7cb0e653429b179395d0c33775d54807fc5f1dd6671801aef7" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==9.2.2" + }, + "six": { + "hashes": [ + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.17.0" + }, + "smmap": { + "hashes": [ + "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", + "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f" + ], + "markers": "python_version >= '3.7'", + "version": "==5.0.3" + }, "snowballstemmer": { "hashes": [ "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895" ], - "markers": "python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version not in '3.0, 3.1, 3.2'", "version": "==3.0.1" }, "sphinx": { @@ -447,6 +512,13 @@ "markers": "python_version >= '3.12'", "version": "==9.1.0" }, + "sphinx-git": { + "hashes": [ + "sha256:6bf9d837de108c79fb7db585ebd590fd48f4d1f830b540420d0ca675f3b9f800" + ], + "index": "pypi", + "version": "==11.0.0" + }, "sphinx-last-updated-by-git": { "hashes": [ "sha256:6382c8285ac1f222483a58569b78c0371af5e55f7fbf9c01e5e8a72d6fdfa499", diff --git a/build/markdown/doctrees/AGENTS.doctree b/build/markdown/doctrees/AGENTS.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4d9eb4321b7927dcd166bb0b34acb7c4a8930864 GIT binary patch literal 40683 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 literal 0 HcmV?d00001 diff --git a/build/markdown/doctrees/CHANGELOG.doctree b/build/markdown/doctrees/CHANGELOG.doctree new file mode 100644 index 0000000000000000000000000000000000000000..530eb19d408663ea6b70a2960b786b7edc2305ab GIT binary patch literal 9353 zcmcgyU1%KF6_zEfq?IgL{!5+KPNu<$l_t_kEBPnepV(Csx0S6zFfFt-!`+#?d+%y? zW-@cfmS`N@2ZIgwsTo58fj$%peJd3DRw(qXQ0QA93wbH@ArNSx(3gI9es*Smw7HR? z2AP?2?|kQ;bG~!-&Yb(O^7Q?S6UjfhWP4U5xD&3qo=wA8&M85cx+4A{e)Z?^gLp+& z19Cs~qQIiDoWKl=amNm*8{dsr*o6F27&Sw|1z){OU>5uRHW zyi4CR0_r=&qK$@8uN${XU@@byPMNOD68&Ye)9c)IKr+im| z-yB-@RCSvXw@m?_`e0d>B&oeC(6q{4W>f5?U3PIdY7+Jw3}xrwvM=NBJpNw18%OM` z>@`eXNvFyiHRg3`O>h#B+I=tB3w=bO);tijxfL`wXswITtP0QeYN1c9S{PWh?eE^$ zz4_LyAKYAn)iJxclNzd4yN8r;y=UPgdl~N9=zOH7GqZ#qnm2F3)NhYVtm~NYO~m&`zUq|v?Ctzs-UWFZd7U#< zRvGuXU`8*=4DK4lag6O--@~*PMG3QLsK@ns;`9}EtEcYD(bVO^JL=wl%^dX*Tz zgyYI28j}sb)k9SzQm6%q`njI`oGihRh}kUS0e=me;j z%G2NUbY_-}Pk@h~Edj3gRn$u@N<R_6*xVfA`16M%<}|+0Hv?6?(Ar>1D8PoIssEw%k=7|B+a8aFJ9`T~0rx*cFc6L4Y>*Di^T7N?FK8lG$LFpP9+ zIP9;#F~sjTpHXj~1<#CA1m>o8V2~=EZOqosmOI+m;98D-#DpQ*xy&Dg!o z#${uDtFf`sSl<}Ri{}qT%o#ssM&YfGw7sRc{50`|=02tKYi(@BfeibIT>hQ5E*13= zc8uZjAGNVZ+R@|kU^vTME{_$_`HQyZ!m9CH{sj;A579bP>;>B0fCi%JuZ{J%6V%`2}`SIrb5A>6ErE#kvu8jLD@J zwXsz$W!QxseYsQ))L<^|VS8dIORpW{H z6o~&1BG#`q*0;V$Mf_CTR7J#pCT8do@xR*GDu5aG5s5fArMnGKAsb=G7$Tn4#vWV`SJtA1V%U;`+)i!l$K!g{>xKS^&p&(r!Hw%I1sU9GDo%=DHkqhZ6&<=C=Fg%~# zMuCI7Md4XylURFd6sxIV*}*|9PqhHzdV-b)AInA6E_9==x!>}FZv0p-p_#>f)AG8i zD;omvE2)G!G?AF9tzhQOP3X%W$hw{I44SQ8fMy-NN8!;)InRjGyRFERbf3eK0^euD zd{RYLY>E~b)Ggg7feS}sMnFjyk}4u%QDu@^A9t18(7f<$%!*|-60Oy1t0Bkr`TjwZ z27wot_!?k4G*C={ZI+1TiOl&0N+m&w<%NNf0fTK zl3Y>DDMWrqBil3gyNZm+vYL=f&7-k9c9uIj+_7kSfL(+7V6S7s#=9z}9Jq|~p zYGJp4U*$Z(j>57rKUW` zgz&>gtp;(p<{t>=xocj~uEp}KnwhKxGflLyaa;kQat`vnuiLL`>RY97_VjG2LXHH%~PIS#)ap)OfCjI*OiChj3TtW6t z#@o!nAM$6~QT=XtJnRxA`nwUTN(i5wPVUoN)A1~lh35i_I@Sa7r1=hqC+@`4dyx+n zi@d8+!0||$)9Q@FUJUkho76@jH~`K0km~m zX=!{Sr>J``#*qa%mlh>d0g#frHb;sHQxKd0K#{|*#L2;9CF*y9y?`?w@>JhYdS2r} zEXzkZ*bAXj(drG(sA7$SAec9+gz0r>8|9;O9sh;0s>I^Jhvy!|$-tA4ox`OXW-Fmw zEXO24TC_MKi_b-h2dPA*Z$2-zqby11!8*jS+w`1Xn3Jhz286xY)jq^(t~Gh+R3AR7 zcp&1PWAf}ERyKm)Qxq4=i&W`|<$~qmAV+dQ1r=>}JClC^7d(pJ0m*Sv1L=apG9d_& lD(uymKJh|NoWyj2yOtB#ibHJ`&Ussv(5zypZ9>#s`yWsS+VcPa literal 0 HcmV?d00001 diff --git a/build/markdown/doctrees/README.doctree b/build/markdown/doctrees/README.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ba4bd5145258b83de1d356f5f52ebcf08a96a516 GIT binary patch literal 133390 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 literal 0 HcmV?d00001 diff --git a/build/markdown/doctrees/environment.pickle b/build/markdown/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..cfb9c6f037e229286f3722447624c8ea8b077e7d GIT binary patch literal 38774 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 literal 0 HcmV?d00001 diff --git a/build/markdown/markdown/AGENTS.md b/build/markdown/markdown/AGENTS.md new file mode 100644 index 0000000..6651ac8 --- /dev/null +++ b/build/markdown/markdown/AGENTS.md @@ -0,0 +1,103 @@ +# 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`: + +- Specification: `https://specs.code.tiararodney.com/mime-todo/markdown/README.md` +- Agent instructions: `https://specs.code.tiararodney.com/mime-todo/markdown/AGENTS.md` +- Index: `https://specs.code.tiararodney.com/mime-todo/markdown/` + +## 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 +- Module part format (`application/modules`): module names and paths +- Bugzilla tracker part format (`application/bugzilla`): product/component + mappings, sync model, comment format +- Description block and body grammar (80-column wrap, column 14 indent) +- Issue immutability rules +- Status transition state machine and commit conventions +- Branch naming and lifecycle rules tied to issue Type and Status +- Sprint membership logic +- Preprocessor and parser requirements +- Error handling requirements +- CLI reference for spec-compliant issue management + +## Interacting with the TODO File + +Agents MUST use the `@byteb4rb1e/mime-todo` CLI for all interactions +with the `TODO` file. Do NOT edit the file directly or construct +transition commits manually. + +### Issue Lifecycle + +```sh +# Create an issue (must be on develop) +mime-todo create --type feature --title "Title" --plan "Description" + +# Start work (must be on develop) +mime-todo start --acceptance-criteria "What must be true for this to be done" +# Then create the branch: git checkout -b / + +# Complete work (must be on /) +mime-todo done --acceptance "What was delivered against the criteria" + +# Hold or cancel +mime-todo hold --reason "Why" +mime-todo cancel --reason "Why" +``` + +### Querying + +```sh +mime-todo list # list all issues +mime-todo show # show issue details +mime-todo sprints # list sprints +mime-todo issues-in-sprint # issues in a sprint +``` + +### Bugzilla Integration + +```sh +mime-todo init # check products/components exist +mime-todo push # push commits to Bugzilla +mime-todo push --dry-run # preview +``` + +### What Agents MUST NOT Do + +- Edit the `TODO` file directly. +- Construct `todo(): ` commits manually. +- Modify issue fields other than `Status` (and only via the CLI). +- Push to Bugzilla outside of `mime-todo push`. +- Modify the specification files. + +## 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. + +## Maintaining This Repository + +If you are explicitly invoked to maintain this specification repository +(building, publishing, or managing URLs), see `CONTRIBUTING.md` for +instructions. diff --git a/build/markdown/markdown/CHANGELOG.md b/build/markdown/markdown/CHANGELOG.md new file mode 100644 index 0000000..d666895 --- /dev/null +++ b/build/markdown/markdown/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog + +* **Merge branch ‘bugfix/12’** by *Tiara Rodney* at *2026-03-22 01:42:38* +* **fix: replace todo with mime-todo in all CLI references** by *Tiara Rodney* at *2026-03-22 01:42:32* +* **Merge branch ‘feature/10’** by *Tiara Rodney* at *2026-03-22 01:38:33* +* **spec: define AcceptanceCriteria and Acceptance fields on issues** by *Tiara Rodney* at *2026-03-22 01:38:29* +* **chore: update CLI changes** by *Tiara Rodney* at *2026-03-15 04:11:01* + + body is redundant as it is the descritpion of issue +* **update** by *Tiara Rodney* at *2026-03-15 03:39:06* +* **new** by *Tiara Rodney* at *2026-02-10 20:57:47* +* **new** by *Tiara Rodney* at *2026-02-10 20:46:51* +* **new** by *Tiara Rodney* at *2026-02-10 20:27:04* diff --git a/build/markdown/markdown/LICENSE b/build/markdown/markdown/LICENSE new file mode 100644 index 0000000..6c5a1fe --- /dev/null +++ b/build/markdown/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/build/markdown/markdown/README.md b/build/markdown/markdown/README.md new file mode 100644 index 0000000..44271e6 --- /dev/null +++ b/build/markdown/markdown/README.md @@ -0,0 +1,757 @@ +# Document + +Version +: 0.1.dev12+g8881a03cb.d20260322 + +Status +: Draft + +Author +: Tiara Rodney <[tiara@byteb4rb1e.me](mailto:tiara@byteb4rb1e.me)> + +License +: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0/deed.en) + +# Abstract + +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. + +# Specification + +## 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/modules` — defines the repository module structure +* `application/bugzilla` — defines Bugzilla product/component mappings +* `application/issue` — defines a single issue + +Parts may appear in any order in the raw file. The preprocessor will reorder +them so that `application/sprints` appears first, followed by +`application/modules`, then `application/bugzilla`, then all +`application/issue` parts in original order. + +## 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/modules` + +This part defines the repository’s logical module structure. Each module maps +a name to an optional repository-relative path. + +At most one `application/modules` part MAY appear. Multiple +`application/modules` parts MUST be rejected. + +The body MUST begin with: + +```default +Modules: +``` + +followed by one or more module entries. + +### Module Entry Forms + +Compact form: + +```default +- Name: Specification + Path: src +``` + +Expanded form: + +```default +- + Name: Specification + Path: src +``` + +A module without a path (logical grouping): + +```default +- Name: Documentation +``` + +### Module Entry Grammar + +A module 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: ` — unique module identifier. + +Optional keys: + +* `Path: ` — path relative to repository root. + If omitted, the module is a logical grouping without a fixed location. + +## Part: `application/bugzilla` + +This part defines a unidirectional mapping from repository modules to +Bugzilla products and components. The `TODO` file is the source of truth; +Bugzilla is a downstream mirror. + +At most one `application/bugzilla` part MAY appear. Multiple +`application/bugzilla` parts MUST be rejected. + +An `application/bugzilla` part MUST NOT appear unless an +`application/modules` part is also present. + +### Required Fields + +```default +URL: +Mappings: + - Module: + Product: + Component: +``` + +* **URL**: the base URL to the Bugzilla REST API. +* **Mappings**: one or more entries mapping a module name to a Bugzilla + product and component. Every `Module` value MUST reference a module + defined in the `application/modules` part. + +Product and component names containing spaces or special characters are +permitted; tooling MUST URL-encode them when constructing API requests. + +### Mapping Entry Grammar + +A mapping entry begins at a line matching: + +```default +^\s*-\s*(Module:.*)?$ +``` + +Required keys: + +* `Module: ` — references a module name. +* `Product: ` — Bugzilla product name. +* `Component: ` — Bugzilla component name. + +### Sync Model + +Synchronization is unidirectional: `TODO` → Bugzilla. The `TODO` file is +the canonical source of truth. + +When a Bugzilla bug is created for a `TODO` issue, the bug’s `url` field +MUST be set to a resolvable URL pointing to the `TODO` file on the +integration branch. The URL format is host-dependent: + +* Bitbucket: `/src//TODO#` +* GitHub: `/blob//TODO#` +* GitLab: `/-/blob//TODO#` + +The branch in the URL MUST be the integration branch (`develop`), +regardless of which branch the push is initiated from. + +Transition commit messages are pushed as Bugzilla comments. Each comment is +tagged with `git-` (first 7 characters of the commit hash) to +prevent duplicate pushes. A comment tag is applied only after the comment +and any associated status update have both succeeded. + +Work commits from issue branches are also pushed as Bugzilla comments, +forming a threaded work log. Work comments: + +* MUST NOT be pushed unless the issue status is `in-progress`. +* MUST NOT follow a `done` transition comment. + +Comment format (Markdown): + +```default +**** + + + +[``]() +``` + +The commit URL format is host-dependent: + +* Bitbucket: `/commits/` +* GitHub: `/commit/` +* GitLab: `/-/commit/` + +## 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: +Module: # OPTIONAL +Relationships: +DueStart: # OPTIONAL +DueEnd: # OPTIONAL +Description: + +AcceptanceCriteria: # OPTIONAL, set at in-progress + +Acceptance: # OPTIONAL, set at done + +``` + +### 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. +* **Module**: optional. When present, MUST reference a module name defined in + the `application/modules` part. If no `application/modules` part exists, + the field is ignored. +* **Relationships**: + \* Empty: + ```default + Relationships: + ``` + + * Or list: + ```default + Relationships: dependsOn:43, relatesTo:10 + ``` + * Valid kinds: `dependsOn`, `relatesTo`, `blocks`. + * All relationship target IDs MUST reference existing issue IDs in the + same `TODO` file. A target that does not exist MUST be rejected. + * A relationship targeting a `cancelled` issue SHOULD produce a warning + (stale reference). +* **DueStart / DueEnd**: + \* Optional. + \* If only one is present, the other is implicitly equal to it. +* **AcceptanceCriteria**: + \* Optional. Set when transitioning to `in-progress`. + \* Defines what must be true for the issue to be considered done. + \* Follows the same indentation rules as `Description`. + \* `AcceptanceCriteria:` occupies 20 characters. Content begins at column 21. + \* Continuation lines MUST be indented with 20 spaces. + \* Immutable after being set. +* **Acceptance**: + \* Optional. Set when transitioning to `done`. + \* Records what was delivered against the acceptance criteria. + \* Follows the same indentation rules as `Description`. + \* `Acceptance:` occupies 12 characters. Content begins at column 13. + \* Continuation lines MUST be indented with 12 spaces. + \* Immutable after being set. + +### Description Block + +* The first line appears on the same line as `Description:`. +* `Description:` occupies 13 characters. Content begins at column 14. +* Continuation lines MUST be indented with 13 spaces, aligning with column 14. +* Lines MUST NOT exceed 80 columns. Long text MUST be word-wrapped at the + 80-column boundary by the serializer. +* 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. + +### Issue Immutability + +The `Description` field is immutable after the issue is created. To change +the scope of an issue, the issue MUST be cancelled and a new issue created. + +Fields that MAY change after creation: + +* `Status` (via transition commits) +* `AcceptanceCriteria` (set once at `in-progress` transition, immutable after) +* `Acceptance` (set once at `done` transition, immutable after) + +Fields that MUST NOT change after creation: + +* `ID`, `Type`, `Title`, `Priority`, `Created`, `Description`, + `Module` + +## 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`. + +## Status Transition Rules + +### Valid Transitions + +Not all status changes are permitted. The following table defines the +complete set of valid transitions: + +| From | Allowed transitions | +|---------------|-------------------------------------| +| `open` | `in-progress`, `hold`, `cancelled` | +| `in-progress` | `done`, `hold`, `open`, `cancelled` | +| `hold` | `open`, `in-progress`, `cancelled` | +| `done` | `open` | +| `cancelled` | `open` | + +Any transition not listed MUST be rejected. A no-op transition (same status) +is permitted. + +### Transition Commits + +Each status transition MUST be recorded as a dedicated commit that modifies +only the `TODO` file. The commit message MUST follow this format: + +```default +todo(): + + +``` + +Where: + +* `` is the issue’s integer ID. +* `` is the new status value. +* `` is a description whose content depends on the transition. + The body is required for all transitions except `open`, where it is + optional (see Transition Details). + +### Transition Details + +**\`\`todo(): open\`\`** — Issue creation. + +* Branch: MUST be on `develop`. +* Body: optional. If provided, it MUST match the issue’s `Description` + field. Because the description is already recorded in the `TODO` file + itself, the body MAY be omitted to avoid duplication. When omitted, the + commit consists of only the header line. + +**\`\`todo(): in-progress\`\`** — Start work. + +* Branch: MUST be on `develop`. +* Body: the acceptance criteria for the issue. +* The `AcceptanceCriteria` field on the issue is set from the body of + this commit. It defines what must be true for the issue to be considered + done. +* After this commit, the issue branch `/` may be created from + `develop`. + +**\`\`todo(): done\`\`** — Complete work. + +* Branch: MUST be on `/`. +* Body: acceptance statement — what was delivered against the acceptance + criteria. +* The `Acceptance` field on the issue is set from the body of this + commit. +* After this commit, the issue branch may be merged into `develop` using + `--no-ff`. + +**\`\`todo(): hold\`\`** — Pause work. + +* Branch: MUST be on `/`. +* Body: reason for holding. + +**\`\`todo(): cancelled\`\`** — Cancel issue. + +* Branch: MUST be on `develop` or `/`. +* Body: reason for cancellation. +* If the issue is `open` (no branch exists), the commit is on `develop`. +* If the issue is `in-progress` or `hold` (branch exists), the commit + may be on the issue branch. + +### Transition-Only Constraint + +A transition commit MUST modify only the `TODO` file. No other files may +be included in the commit. This ensures that every transition is +independently auditable. + +## 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) + \* `application/modules` appears second (if present) + \* `application/bugzilla` appears third (if present) + \* All `application/issue` parts follow in original order + \* Unknown part types are preserved in original order after issues +* 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/modules` → module parser + \* `application/bugzilla` → Bugzilla tracker parser + \* `application/issue` → issue parser +* Enforce: + \* Field order + \* Required fields + \* Description indentation and column rules + \* Sprint entry grammar + \* Module entry grammar + \* Module references: if `application/modules` is present, every issue `Module` field MUST reference a defined module name + \* Bugzilla mapping references: if `application/bugzilla` is present, every mapping `Module` value MUST reference a defined module name + \* Relationship targets: every target ID MUST reference an existing issue ID + \* Stale relationships: a relationship targeting a `cancelled` issue SHOULD produce a warning +* Produce a `TodoFile` object: + ```default + { + sprints: Sprint[], + issues: Issue[], + modules?: Module[], + bugzilla?: BugzillaTracker + } + ``` + +## 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 +* Multiple `application/modules` parts +* Multiple `application/bugzilla` parts +* `application/bugzilla` without `application/modules` +* Issue `Module` referencing undefined module +* Bugzilla mapping `Module` referencing undefined module +* Relationship target referencing non-existent issue ID +* Invalid status transition +* Duplicate issue IDs + +The parser SHOULD warn on: + +* Relationship targeting a `cancelled` issue (stale reference) + +Errors SHOULD include line numbers when possible. + +## CLI Reference + +The `@byteb4rb1e/mime-todo` CLI is the reference implementation of this +specification. It enforces all format, validation, transition, and commit +rules defined above. Both developers and automated agents MUST use the CLI +to interact with the `TODO` file rather than editing it manually. + +Install: + +```default +npm install -g @byteb4rb1e/mime-todo +``` + +### Issue Lifecycle + +Creating an issue (MUST be on `develop`): + +```default +mime-todo create --type feature --title "Add login" --plan "Implement OAuth2 flow" +``` + +This produces a `todo(): open` commit modifying only the `TODO` file. +The `--plan` text becomes the issue’s `Description` field. The commit +has no body because the description is already recorded in the issue itself. + +Starting work (MUST be on `develop`): + +```default +mime-todo start --acceptance-criteria "What must be true for this to be done" +``` + +This produces a `todo(): in-progress` commit. The +`--acceptance-criteria` text is stored in the issue’s +`AcceptanceCriteria` field and becomes the commit body. The issue branch +`/` may then be created by the user: + +```default +git checkout -b feature/ +``` + +Completing work (MUST be on `/`): + +```default +mime-todo done --acceptance "What was delivered against the criteria" +``` + +This produces a `todo(): done` commit. The `--acceptance` text is +stored in the issue’s `Acceptance` field and becomes the commit body. +The issue branch may then be merged into `develop` using `--no-ff`. + +Holding an issue (MUST be on `/`): + +```default +mime-todo hold --reason "Blocked on dependency" +``` + +Cancelling an issue (MUST be on `develop` or `/`): + +```default +mime-todo cancel --reason "Superseded by issue #5" +``` + +The CLI validates the current branch and the status transition before +committing. Invalid transitions or wrong branches are rejected with an +error. + +### Read-Only Commands + +These commands do not modify the `TODO` file and may be run from any +branch: + +```default +mime-todo list # list all issues +mime-todo show # show full issue details +mime-todo sprints # list all sprints +mime-todo issues-in-sprint # list issues in a sprint +``` + +### Bugzilla Integration + +Initializing products and components: + +```default +mime-todo init # check what exists +mime-todo init --dry-run # preview changes +mime-todo init --confirm --assignee user@example.com # create missing items +``` + +The `init` command reads the `application/bugzilla` part and ensures all +referenced products and components exist on the Bugzilla server. + +Pushing commits to Bugzilla: + +```default +mime-todo push # push all unpushed commits +mime-todo push HEAD~3 # push only the last 3 commits +mime-todo push --dry-run # preview without pushing +mime-todo push --strategy full # re-scan all bugs +``` + +On issue branches, `push` posts work commits as Bugzilla comments. Work +comments are only permitted when the issue is `in-progress` and no +`done` transition has been recorded. + +On `develop`, `push` posts transition commits as Bugzilla comments and +updates the bug’s status accordingly. + +Each comment includes a clickable link to the commit and is tagged with +`git-` for idempotency. Running `push` multiple times is +safe. + +### Agent Usage + +Agents MUST use the CLI for all `TODO` file interactions: + +* Creating issues: `mime-todo create` +* Transitioning issues: `mime-todo start`, `mime-todo done`, `mime-todo hold`, + `mime-todo cancel` +* Querying: `mime-todo list`, `mime-todo show`, `mime-todo sprints` +* Syncing to Bugzilla: `mime-todo push` + +Agents MUST NOT: + +* Edit the `TODO` file directly. +* Construct transition commits manually. +* Modify issue fields other than `Status` (and only via the CLI). +* Push to Bugzilla outside of the CLI’s `push` command. + +## Extensibility + +Defined part types: + +* `application/sprints` — sprint metadata +* `application/modules` — repository module structure +* `application/bugzilla` — Bugzilla product/component mappings +* `application/issue` — single issue + +Future part types MAY be added using: + +```default +application/ +``` + +The preprocessor MUST preserve unknown part types but MUST NOT reorder them. +Unknown types are placed after all defined types. + +# Changelog + +* **Merge branch ‘bugfix/12’** by *Tiara Rodney* at *2026-03-22 01:42:38* +* **fix: replace todo with mime-todo in all CLI references** by *Tiara Rodney* at *2026-03-22 01:42:32* +* **Merge branch ‘feature/10’** by *Tiara Rodney* at *2026-03-22 01:38:33* +* **spec: define AcceptanceCriteria and Acceptance fields on issues** by *Tiara Rodney* at *2026-03-22 01:38:29* +* **chore: update CLI changes** by *Tiara Rodney* at *2026-03-15 04:11:01* + + body is redundant as it is the descritpion of issue +* **update** by *Tiara Rodney* at *2026-03-15 03:39:06* +* **new** by *Tiara Rodney* at *2026-02-10 20:57:47* +* **new** by *Tiara Rodney* at *2026-02-10 20:46:51* +* **new** by *Tiara Rodney* at *2026-02-10 20:27:04* diff --git a/src/CHANGELOG.rst b/src/CHANGELOG.rst new file mode 100644 index 0000000..07e2cb1 --- /dev/null +++ b/src/CHANGELOG.rst @@ -0,0 +1,6 @@ +######### +Changelog +######### + +.. git_changelog:: + :filename_filter: (LICENSE|AGENTS\.md|src/.*\.rst) diff --git a/src/README.rst b/src/README.rst index 0a83008..97a62b6 100644 --- a/src/README.rst +++ b/src/README.rst @@ -3,9 +3,23 @@ AGENTS -############ -Introduction -############ +######## +Document +######## + +Version + |version| +Status + Draft +Author + Tiara Rodney +License + `CC BY-ND 4.0 `_ + + +######## +Abstract +######## This document defines the canonical format, semantics, and processing rules for the repository-root ``TODO`` file. The file is a human-friendly, @@ -15,6 +29,10 @@ 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. +############# +Specification +############# + Raw File Structure ================== @@ -727,3 +745,5 @@ Future part types MAY be added using:: The preprocessor MUST preserve unknown part types but MUST NOT reorder them. Unknown types are placed after all defined types. + +.. include:: CHANGELOG.rst diff --git a/src/conf.py b/src/conf.py index c9ae813..958f3e3 100644 --- a/src/conf.py +++ b/src/conf.py @@ -1,5 +1,8 @@ import datetime +from pathlib import Path + from sphinx.util import logging +from setuptools_scm import get_version logger = logging.getLogger(__name__) @@ -9,13 +12,16 @@ extensions = [ 'sphinx_last_updated_by_git', 'sphinx_markdown_builder', 'myst_parser', + 'sphinx_git', ] templates_path = ["_templates"] project = "MIME TODO" -copyright = "2026, Tiara Rodney" +copyright = "%Y, Tiara Rodney" +version = get_version(root=Path(__file__).parents[1]) +release = version html_title = project html_theme = 'bizstyle'