From 37e6a9e818d2a558b596c4360a0e6a01b2e80ace Mon Sep 17 00:00:00 2001 From: Tiara Rodney Date: Sun, 22 Mar 2026 02:19:50 +0100 Subject: [PATCH] chore: migrate dist to build/markdown --- .gitignore | 2 +- build/markdown/doctrees/AGENTS.doctree | Bin 40683 -> 40691 bytes build/markdown/doctrees/CHANGELOG.doctree | Bin 9353 -> 9425 bytes build/markdown/doctrees/README.doctree | Bin 133390 -> 133462 bytes build/markdown/doctrees/environment.pickle | Bin 38774 -> 38778 bytes build/markdown/markdown/AGENTS.md | 6 +- build/markdown/markdown/CHANGELOG.md | 2 +- build/markdown/markdown/README.md | 4 +- dist/doctrees/AGENTS.doctree | Bin 40360 -> 0 bytes dist/doctrees/README.doctree | Bin 114056 -> 0 bytes dist/doctrees/environment.pickle | Bin 37058 -> 0 bytes dist/markdown/AGENTS.md | 103 --- dist/markdown/LICENSE | 392 ------------ dist/markdown/README.md | 698 --------------------- 14 files changed, 7 insertions(+), 1200 deletions(-) delete mode 100644 dist/doctrees/AGENTS.doctree delete mode 100644 dist/doctrees/README.doctree delete mode 100644 dist/doctrees/environment.pickle delete mode 100644 dist/markdown/AGENTS.md delete mode 100644 dist/markdown/LICENSE delete mode 100644 dist/markdown/README.md diff --git a/.gitignore b/.gitignore index c258134..8b23821 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ !/build/markdown/* -/build/ +/build/html /.venv diff --git a/build/markdown/doctrees/AGENTS.doctree b/build/markdown/doctrees/AGENTS.doctree index 4d9eb4321b7927dcd166bb0b34acb7c4a8930864..d67960ced55001ebebf1a804989a2f5f7bfb8052 100644 GIT binary patch delta 334 zcmaF8m+A9fCYA=)sV^q7%w@EkxJZrBa^uOPoIJ+b>B*KUX(kqimX@1malK+mlj9SMi&KkAru6WXWE7<)ro`vuCno|`LbT?mZO)KcD1>USsQwftRFSQQ z{_HGAJI`*}%wgFjCohmxnwgWLpPN{eoswUkr_VJdgFSXihCmNQV)FX%2FBLO1`(R9 vV1<)oBlgPiqv?TZfrwB35G}gdJMsV{*F?`Wg#?H;k>~>iv~B(n{o4ru%n^M~ delta 323 zcmeyom+AFhCYA=)sShTy%w;s2xJZrBY~#tJoIFO_=@u3ihKUBo$w`}MalK+HO?F()%UFR>WNO3u$M$Vsi3(!-LJpPw_Ohqt&Su_QA&KC!qs zwWtK9G(T-h4^K%(QEFmJd`^CHB2Xb`W^Q77W?o`Z<>m~Tg+i$Iit0~cLKWF+=+Dk# zK8t1bW)90PIa&Uc%;FOL+{B{nl>G8MeXc1P?6Ffa1bV>YlQ)JpFt$uS7@@(M08%$O lA!4r#AF2+R2C(pE>&UB&oD)3L6d>xQq7UF#|0DXh69BMwch~>` diff --git a/build/markdown/doctrees/CHANGELOG.doctree b/build/markdown/doctrees/CHANGELOG.doctree index 530eb19d408663ea6b70a2960b786b7edc2305ab..c67dd8e9cf409e8691ef7b0738f10b62b6dd99ff 100644 GIT binary patch delta 474 zcmeD5yy(f&z&iEVM3%XXmJ=7LF+w1Bvm0LKe;qFHLpY= zH?<^j@Q_$uxwm8Pgn^`m_-(l~b zoW}ZLGYe-j3bXic$uSa delta 336 zcmXwxJ4-@g9LD+EdA*%Z9FHFLrTOBUxtO^bvHLlDoxF6_oP&h(Rnq`3<_hBQ3lF=wV3!jx!6RB|J4-sA6*NW3gA z5mK_3mT@C`vF{X+md4R;Ip<$33xrvVjF{DpBY70p)-8H!%vfw*O&lO2wV_f!yRc28 zL-DcUdRoJ)7(iC>>Bkz5aH>XiiVoFQKh;oH0+_S<*iVNMS;K>^@h{`iW^CTft>;#9 z-F43Y4`d_{RZ)}%QPDb)bcDF7CJ06?3~n#sLksbOBSkoL`4QDhthcYfC(J*!0{u!9 MT#mo6^Et!Z!8Eq#ZmSgXUQ_?h#*z{pMAt3*Qnp|Gy_M|_c>J{(qp zdU%L+2`Cni*WE*R0*$>*$GB4gd0;AFe|(%Hg5NL$xiskQ^6-QK$N$h_V3}Xym=&=E z#=&|6D(|K+&n*La@ji`*peunI4y4e^NX8^BY0QhZZ9D-lry;Y!z)9*E*!g(})7*^1 zCLBLd4{>@I55UD8c({>8fAsZg3s(#@arh^eq+2RKq~VfARcz@l{v9$# znfrxP3?*@n+og8Ufc#H(NpmWZg6qgqIG07Iw5;;pQFkMcHiX!^hey&oHG1|!d!^%g zh-Td!-MdotJclu%?c+XZ%cGmw0zUF<0adi^qf=xKN?(_AtN!`MB{17uOVN*ZLRZ*3%UL delta 460 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 diff --git a/dist/doctrees/README.doctree b/dist/doctrees/README.doctree deleted file mode 100644 index 13439b67bd7db50e03216cc1048b7944d97b5b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114056 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�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
  • une!k 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 CHzOzj diff --git a/dist/doctrees/environment.pickle b/dist/doctrees/environment.pickle deleted file mode 100644 index 9a28ee02c893e2c2460a15fda4f0bbac44fed182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37058 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 SeAKIWo?hmKk|~D8!v6;&_k17# diff --git a/dist/markdown/AGENTS.md b/dist/markdown/AGENTS.md deleted file mode 100644 index f5c827f..0000000 --- a/dist/markdown/AGENTS.md +++ /dev/null @@ -1,103 +0,0 @@ -# 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) -todo create --type feature --title "Title" --plan "Description" - -# Start work (must be on develop) -todo start --plan "Planned approach" -# Then create the branch: git checkout -b / - -# Complete work (must be on /) -todo done --summary "What was delivered" - -# Hold or cancel -todo hold --reason "Why" -todo cancel --reason "Why" -``` - -### Querying - -```sh -todo list # list all issues -todo show # show issue details -todo sprints # list sprints -todo issues-in-sprint # issues in a sprint -``` - -### Bugzilla Integration - -```sh -todo init # check products/components exist -todo push # push commits to Bugzilla -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 `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/dist/markdown/LICENSE b/dist/markdown/LICENSE deleted file mode 100644 index 6c5a1fe..0000000 --- a/dist/markdown/LICENSE +++ /dev/null @@ -1,392 +0,0 @@ -Attribution-NoDerivatives 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - - -======================================================================= - -Creative Commons Attribution-NoDerivatives 4.0 International Public -License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-NoDerivatives 4.0 International Public License ("Public -License"). To the extent this Public License may be interpreted as a -contract, You are granted the Licensed Rights in consideration of Your -acceptance of these terms and conditions, and the Licensor grants You -such rights in consideration of benefits the Licensor receives from -making the Licensed Material available under these terms and -conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - c. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - d. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - e. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - f. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - g. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - h. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - i. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - j. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce and reproduce, but not Share, Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material, You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - For the avoidance of doubt, You do not have permission under - this Public License to Share Adapted Material. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database, provided You do not Share - Adapted Material; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material; and - - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - -======================================================================= - -Creative Commons is not a party to its public -licenses. Notwithstanding, Creative Commons may elect to apply one of -its public licenses to material it publishes and in those instances -will be considered the “Licensor.” The text of the Creative Commons -public licenses is dedicated to the public domain under the CC0 Public -Domain Dedication. Except for the limited purpose of indicating that -material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the -public licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/dist/markdown/README.md b/dist/markdown/README.md deleted file mode 100644 index 713a18e..0000000 --- a/dist/markdown/README.md +++ /dev/null @@ -1,698 +0,0 @@ -# Introduction - -This document defines the canonical format, semantics, and processing rules -for the repository-root `TODO` file. The file is a human-friendly, -append-only (allowing modifications) issue tracker that is parsed by TypeScript tooling using a MIME -envelope added at parse time. - -The raw `TODO` file is not a MIME document. A preprocessor wraps it into a -valid `multipart/mixed` MIME message before parsing. - -## Raw File Structure - -The raw `TODO` file consists of a sequence of *parts*, each beginning with: - -```default ---ISSUE -Content-Type: -``` - -Valid part types are: - -* `application/sprints` — defines sprint metadata -* `application/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: - -``` - -### 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. - -### 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) - -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: high-level description of the planned approach. -* After this commit, the issue branch `/` may be created from - `develop`. - -**\`\`todo(): done\`\`** — Complete work. - -* Branch: MUST be on `/`. -* Body: high-level summary of what was delivered. -* 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 -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 -todo start --plan "High-level approach description" -``` - -This produces a `todo(): in-progress` commit. The issue branch -`/` may then be created by the user: - -```default -git checkout -b feature/ -``` - -Completing work (MUST be on `/`): - -```default -todo done --summary "Summary of what was delivered" -``` - -This produces a `todo(): done` commit. The issue branch may then be -merged into `develop` using `--no-ff`. - -Holding an issue (MUST be on `/`): - -```default -todo hold --reason "Blocked on dependency" -``` - -Cancelling an issue (MUST be on `develop` or `/`): - -```default -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 -todo list # list all issues -todo show # show full issue details -todo sprints # list all sprints -todo issues-in-sprint # list issues in a sprint -``` - -### Bugzilla Integration - -Initializing products and components: - -```default -todo init # check what exists -todo init --dry-run # preview changes -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 -todo push # push all unpushed commits -todo push HEAD~3 # push only the last 3 commits -todo push --dry-run # preview without pushing -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: `todo create` -* Transitioning issues: `todo start`, `todo done`, `todo hold`, - `todo cancel` -* Querying: `todo list`, `todo show`, `todo sprints` -* Syncing to Bugzilla: `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.