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 0000000..4d9eb43 Binary files /dev/null and b/build/markdown/doctrees/AGENTS.doctree differ diff --git a/build/markdown/doctrees/CHANGELOG.doctree b/build/markdown/doctrees/CHANGELOG.doctree new file mode 100644 index 0000000..530eb19 Binary files /dev/null and b/build/markdown/doctrees/CHANGELOG.doctree differ diff --git a/build/markdown/doctrees/README.doctree b/build/markdown/doctrees/README.doctree new file mode 100644 index 0000000..ba4bd51 Binary files /dev/null and b/build/markdown/doctrees/README.doctree differ diff --git a/build/markdown/doctrees/environment.pickle b/build/markdown/doctrees/environment.pickle new file mode 100644 index 0000000..cfb9c6f Binary files /dev/null and b/build/markdown/doctrees/environment.pickle differ 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'