{"id":22367710,"url":"https://github.com/hugojosefson/todo-markdown","last_synced_at":"2026-05-08T18:32:35.523Z","repository":{"id":213841901,"uuid":"735052107","full_name":"hugojosefson/todo-markdown","owner":"hugojosefson","description":"Use markdown docs, to keep track of todo items.","archived":false,"fork":false,"pushed_at":"2025-01-13T21:34:31.000Z","size":357,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-26T15:55:20.271Z","etag":null,"topics":["deno","markdown","todo"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hugojosefson.png","metadata":{"files":{"readme":"README-ast.json","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-23T13:49:01.000Z","updated_at":"2024-10-13T05:21:38.000Z","dependencies_parsed_at":"2024-01-20T22:21:06.040Z","dependency_job_id":"9223ccb0-e2bf-4c3b-977e-6fcf2c6d150f","html_url":"https://github.com/hugojosefson/todo-markdown","commit_stats":null,"previous_names":["hugojosefson/todo-markdown"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hugojosefson/todo-markdown","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hugojosefson%2Ftodo-markdown","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hugojosefson%2Ftodo-markdown/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hugojosefson%2Ftodo-markdown/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hugojosefson%2Ftodo-markdown/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hugojosefson","download_url":"https://codeload.github.com/hugojosefson/todo-markdown/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hugojosefson%2Ftodo-markdown/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32792077,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"ssl_error","status_checked_at":"2026-05-08T08:22:45.650Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deno","markdown","todo"],"created_at":"2024-12-04T18:20:35.357Z","updated_at":"2026-05-08T18:32:35.481Z","avatar_url":"https://github.com/hugojosefson.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"{\n  \"type\": \"root\",\n  \"children\": [\n    {\n      \"type\": \"heading\",\n      \"depth\": 1,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"todo-markdown\"\n        }\n      ]\n    },\n    {\n      \"type\": \"paragraph\",\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"Use markdown docs, to keep track of todo items.\"\n        }\n      ]\n    },\n    {\n      \"type\": \"table\",\n      \"align\": [\n        null\n      ],\n      \"children\": [\n        {\n          \"type\": \"tableRow\",\n          \"children\": [\n            {\n              \"type\": \"tableCell\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"🚧️👷 Under construction 👷🚧️\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 2,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"Ex\"\n        },\n        {\n          \"type\": \"emphasis\",\n          \"children\": [\n            {\n              \"type\": \"text\",\n              \"value\": \"amp\"\n            }\n          ]\n        },\n        {\n          \"type\": \"text\",\n          \"value\": \"le\"\n        }\n      ]\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 3,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"Markdown input\"\n        }\n      ]\n    },\n    {\n      \"type\": \"code\",\n      \"lang\": \"markdown\",\n      \"meta\": null,\n      \"value\": \"# My TODO:s\\n\\n## Urgent\\n\\n- [x] TODO-2 Pay bills\\n- [ ] TODO-1 Buy milk\\n- [x] TODO-3 Call mom\\n- [ ] TODO-5 Buy eggs\\n\\n## [ ] Later\\n\\n- [ ] TODO-? Buy bread\\n- [ ] TODO-7 Eat it all\\n\\n## TODO-? Other\\n\\n- [ ] TODO-xx Do something else\\n- [ ] Do something even elser\\n\\n## [ ] TODO-? Heading with box and placeholder\\n\\n## TODO-10 Heading with task identifier, but no box\"\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 3,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"Markdown output\"\n        }\n      ]\n    },\n    {\n      \"type\": \"code\",\n      \"lang\": \"markdown\",\n      \"meta\": null,\n      \"value\": \"# My TODO:s\\n\\n## Urgent\\n\\n- [x] TODO-2 Pay bills\\n- [ ] TODO-1 Buy milk\\n- [x] TODO-3 Call mom\\n- [ ] TODO-5 Buy eggs\\n\\n## [ ] TODO-11 Later\\n\\n- [ ] TODO-12 Buy bread\\n- [ ] TODO-7 Eat it all\\n\\n## [ ] TODO-13 Other\\n\\n- [ ] TODO-14 Do something else\\n- [ ] TODO-15 Do something even elser\\n\\n## [ ] TODO-16 Heading with box and placeholder\\n\\n## [ ] TODO-10 Heading with task identifier, but no box\"\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 3,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"List of things, that are not tasks\"\n        }\n      ]\n    },\n    {\n      \"type\": \"list\",\n      \"ordered\": false,\n      \"start\": null,\n      \"spread\": false,\n      \"children\": [\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": null,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"This is a normal list item, not a task.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": null,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"This is another.\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"type\": \"list\",\n      \"ordered\": true,\n      \"start\": 1,\n      \"spread\": false,\n      \"children\": [\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": null,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"This is a normal ordered list item, not a task.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": null,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"This is another.\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 2,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"[ ] Features included\"\n        }\n      ]\n    },\n    {\n      \"type\": \"list\",\n      \"ordered\": true,\n      \"start\": 1,\n      \"spread\": false,\n      \"children\": [\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Parses markdown input.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Finds all places where task identifiers are used:\"\n                }\n              ]\n            },\n            {\n              \"type\": \"list\",\n              \"ordered\": false,\n              \"start\": null,\n              \"spread\": false,\n              \"children\": [\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": true,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"text\",\n                          \"value\": \"unordered lists / task lists\"\n                        }\n                      ]\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": true,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"text\",\n                          \"value\": \"ordered lists\"\n                        }\n                      ]\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": true,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"text\",\n                          \"value\": \"headings\"\n                        }\n                      ]\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"In each eligible place, identifies task identifiers based on regex, ex\\n\"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"/\\\\bTODO-\\\\d+\\\\b/\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \".\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"In the existing tasks, finds the highest numbered identifier.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Calculates the next identifier, always higher than the highest existing.\\nIt's OK to skip numbers.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Identifies all text nodes with new todo items, by:\"\n                }\n              ]\n            },\n            {\n              \"type\": \"list\",\n              \"ordered\": false,\n              \"start\": null,\n              \"spread\": false,\n              \"children\": [\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": true,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"- [ ]\"\n                        },\n                        {\n                          \"type\": \"text\",\n                          \"value\": \" syntax without a task identifier,\"\n                        }\n                      ]\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": true,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"# [ ]\"\n                        },\n                        {\n                          \"type\": \"text\",\n                          \"value\": \" syntax without a task identifier,\"\n                        }\n                      ]\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": true,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"text\",\n                          \"value\": \"task identifier placeholder, via regex, ex\\n\"\n                        },\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"\\\\bTODO-(\\\\?+|x+|X+|n+|N+)\\\\b\"\n                        },\n                        {\n                          \"type\": \"text\",\n                          \"value\": \",\"\n                        }\n                      ]\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": false,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"delete\",\n                          \"children\": [\n                            {\n                              \"type\": \"text\",\n                              \"value\": \"copied, already existing task identifier.\"\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"For each text node with a new task, mutates the node to include the next\\nidentifier.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"For each text node with a task identifier, but no box, adds a box.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Processes the markdown from beginning to end, so that new task\\nidentifiers are in order.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Removes \"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"\\\\\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \" before a box and task identifier, if any.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Outputs transformed markdown.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Formats the markdown output.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Supports multiple files, parsing them, and seeing all tasks across all\\nfiles at the same time.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Renames each file to its first top-level heading, if any. Excluding the\\n\"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"#\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \" character, any box, and sets file extension to \"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \".md\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \".\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"When renaming, if a file with the same name already exists, does any\\nrenaming on that file first. If they still collide, concatenates the\\ncontents of the two files.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"When renaming, if a file with the same name already exists, and the\\ncontents are identical, deletes the file, so that it's not duplicated.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"When renaming, updates links to the renamed file, in all files. Ex\\n\"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"[Link description](./old-file-name.md)\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \" →\\n\"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"[Link description](./new-file-name.md)\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \".\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": false,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"delete\",\n                  \"children\": [\n                    {\n                      \"type\": \"text\",\n                      \"value\": \"When updating links to a renamed file, if the link is to a heading, and\\nthe heading is renamed, updates the link to point to the new heading.\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"When updating links to a renamed file, if the link text contains the old\\nfile name without file extension, replaces that part of the link text\\nwith the new file name without file extension.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": false,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"delete\",\n                  \"children\": [\n                    {\n                      \"type\": \"text\",\n                      \"value\": \"Writes a table of contents between any comments \"\n                    },\n                    {\n                      \"type\": \"inlineCode\",\n                      \"value\": \"\u003c!-- toc --\u003e\"\n                    },\n                    {\n                      \"type\": \"text\",\n                      \"value\": \" and\\n\"\n                    },\n                    {\n                      \"type\": \"inlineCode\",\n                      \"value\": \"\u003c!-- /toc --\u003e\"\n                    },\n                    {\n                      \"type\": \"text\",\n                      \"value\": \".\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Does not write unchanged files.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Directory can be a task, its data in \"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"index.md\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \".\"\n                }\n              ]\n            },\n            {\n              \"type\": \"list\",\n              \"ordered\": false,\n              \"start\": null,\n              \"spread\": false,\n              \"children\": [\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": true,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"text\",\n                          \"value\": \"Renames the directory, instead of renaming \"\n                        },\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"index.md\"\n                        },\n                        {\n                          \"type\": \"text\",\n                          \"value\": \".\"\n                        }\n                      ]\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Writes a shallow index to pages+dirs/index.md, between any comments\\n\"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"\u003c!-- index --\u003e\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \" and \"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"\u003c!-- /index --\u003e\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \".\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": true,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"If non-empty directory has no \"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"index.md\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \", creates one with a heading\\n\"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"# ${directoryName}\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \" and a shallow index.\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 3,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"Features requiring a task model\"\n        }\n      ]\n    },\n    {\n      \"type\": \"list\",\n      \"ordered\": true,\n      \"start\": 1,\n      \"spread\": false,\n      \"children\": [\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": false,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"If all sub-tasks of a task are completed, marks the task as completed.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": false,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Finds mentions of tasks, and links to the task's file.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": false,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Finds mentions of tasks, and links to the task's file, and the task's\\nheading.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": false,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Updates link text, if the linked task is renamed.\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 4,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"Task defined in a heading\"\n        }\n      ]\n    },\n    {\n      \"type\": \"list\",\n      \"ordered\": false,\n      \"start\": null,\n      \"spread\": false,\n      \"children\": [\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": false,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"listItem\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \"s are the \"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"includes\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \" of any parent task (heading or \"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"listItem\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \").\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": false,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Interprets and updates task sub-headings:\"\n                }\n              ]\n            },\n            {\n              \"type\": \"list\",\n              \"ordered\": false,\n              \"start\": null,\n              \"spread\": false,\n              \"children\": [\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": false,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"Do ${currentTaskId} after\"\n                        }\n                      ]\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": false,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"Do ${currentTaskId} before\"\n                        }\n                      ]\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": false,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"Description\"\n                        },\n                        {\n                          \"type\": \"text\",\n                          \"value\": \", or text paragraph immediately following a task heading.\"\n                        }\n                      ]\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 4,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"Task defined in a \"\n        },\n        {\n          \"type\": \"inlineCode\",\n          \"value\": \"listItem\"\n        }\n      ]\n    },\n    {\n      \"type\": \"list\",\n      \"ordered\": false,\n      \"start\": null,\n      \"spread\": false,\n      \"children\": [\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": false,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"listItem\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \"s are the \"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"includes\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \" of any parent task (heading or \"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"listItem\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \").\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"listItem\",\n          \"spread\": false,\n          \"checked\": false,\n          \"children\": [\n            {\n              \"type\": \"paragraph\",\n              \"children\": [\n                {\n                  \"type\": \"text\",\n                  \"value\": \"Interprets and updates task sub-\"\n                },\n                {\n                  \"type\": \"inlineCode\",\n                  \"value\": \"listItem[checked=null]\"\n                },\n                {\n                  \"type\": \"text\",\n                  \"value\": \"s\"\n                }\n              ]\n            },\n            {\n              \"type\": \"list\",\n              \"ordered\": false,\n              \"start\": null,\n              \"spread\": false,\n              \"children\": [\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": false,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"Do ${currentTaskId} after\"\n                        },\n                        {\n                          \"type\": \"text\",\n                          \"value\": \" | \"\n                        },\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"Do after\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"list\",\n                      \"ordered\": false,\n                      \"start\": null,\n                      \"spread\": false,\n                      \"children\": [\n                        {\n                          \"type\": \"listItem\",\n                          \"spread\": false,\n                          \"checked\": null,\n                          \"children\": [\n                            {\n                              \"type\": \"paragraph\",\n                              \"children\": [\n                                {\n                                  \"type\": \"inlineCode\",\n                                  \"value\": \"otherTaskId1\"\n                                }\n                              ]\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"listItem\",\n                          \"spread\": false,\n                          \"checked\": null,\n                          \"children\": [\n                            {\n                              \"type\": \"paragraph\",\n                              \"children\": [\n                                {\n                                  \"type\": \"inlineCode\",\n                                  \"value\": \"otherTaskId2\"\n                                }\n                              ]\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"listItem\",\n                          \"spread\": false,\n                          \"checked\": null,\n                          \"children\": [\n                            {\n                              \"type\": \"paragraph\",\n                              \"children\": [\n                                {\n                                  \"type\": \"text\",\n                                  \"value\": \"…\"\n                                }\n                              ]\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"listItem\",\n                  \"spread\": false,\n                  \"checked\": false,\n                  \"children\": [\n                    {\n                      \"type\": \"paragraph\",\n                      \"children\": [\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"Do ${currentTaskId} before\"\n                        },\n                        {\n                          \"type\": \"text\",\n                          \"value\": \" | \"\n                        },\n                        {\n                          \"type\": \"inlineCode\",\n                          \"value\": \"Do before\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"list\",\n                      \"ordered\": false,\n                      \"start\": null,\n                      \"spread\": false,\n                      \"children\": [\n                        {\n                          \"type\": \"listItem\",\n                          \"spread\": false,\n                          \"checked\": null,\n                          \"children\": [\n                            {\n                              \"type\": \"paragraph\",\n                              \"children\": [\n                                {\n                                  \"type\": \"inlineCode\",\n                                  \"value\": \"otherTaskId3\"\n                                }\n                              ]\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"listItem\",\n                          \"spread\": false,\n                          \"checked\": null,\n                          \"children\": [\n                            {\n                              \"type\": \"paragraph\",\n                              \"children\": [\n                                {\n                                  \"type\": \"inlineCode\",\n                                  \"value\": \"otherTaskId4\"\n                                }\n                              ]\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"listItem\",\n                          \"spread\": false,\n                          \"checked\": null,\n                          \"children\": [\n                            {\n                              \"type\": \"paragraph\",\n                              \"children\": [\n                                {\n                                  \"type\": \"text\",\n                                  \"value\": \"…\"\n                                }\n                              ]\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 2,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"Further details\"\n        }\n      ]\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 3,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"Task model\"\n        }\n      ]\n    },\n    {\n      \"type\": \"paragraph\",\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"See \"\n        },\n        {\n          \"type\": \"link\",\n          \"title\": null,\n          \"url\": \"./src/model/task.ts\",\n          \"children\": [\n            {\n              \"type\": \"text\",\n              \"value\": \"src/model/task.ts\"\n            }\n          ]\n        },\n        {\n          \"type\": \"text\",\n          \"value\": \".\"\n        }\n      ]\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 3,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"Where to find task identifiers\"\n        }\n      ]\n    },\n    {\n      \"type\": \"paragraph\",\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"In the Abstract Syntax Tree (AST) of the markdown input, we expect to find task\\nidentifiers in the following places:\"\n        }\n      ]\n    },\n    {\n      \"type\": \"code\",\n      \"lang\": \"css\",\n      \"meta\": null,\n      \"value\": \"listItem \u003e paragraph text\\nheading text\"\n    },\n    {\n      \"type\": \"heading\",\n      \"depth\": 3,\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"AST from this README\"\n        }\n      ]\n    },\n    {\n      \"type\": \"paragraph\",\n      \"children\": [\n        {\n          \"type\": \"text\",\n          \"value\": \"For an example of the AST of this entire README, please see\\n\"\n        },\n        {\n          \"type\": \"link\",\n          \"title\": null,\n          \"url\": \"./README-ast.json\",\n          \"children\": [\n            {\n              \"type\": \"text\",\n              \"value\": \"README-ast.json\"\n            }\n          ]\n        },\n        {\n          \"type\": \"text\",\n          \"value\": \".\"\n        }\n      ]\n    }\n  ]\n}\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhugojosefson%2Ftodo-markdown","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhugojosefson%2Ftodo-markdown","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhugojosefson%2Ftodo-markdown/lists"}