another-mood 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. another_mood-0.1.0/.claude/settings.json +20 -0
  2. another_mood-0.1.0/.devcontainer/README.md +16 -0
  3. another_mood-0.1.0/.devcontainer/devcontainer-lock.json +24 -0
  4. another_mood-0.1.0/.devcontainer/devcontainer.json +41 -0
  5. another_mood-0.1.0/.github/pull_request_template.md +13 -0
  6. another_mood-0.1.0/.github/workflows/ci.yml +35 -0
  7. another_mood-0.1.0/.github/workflows/fresh-deps.yml +37 -0
  8. another_mood-0.1.0/.gitignore +36 -0
  9. another_mood-0.1.0/.mcp.json +31 -0
  10. another_mood-0.1.0/.pre-commit-config.yaml +9 -0
  11. another_mood-0.1.0/.python-version +1 -0
  12. another_mood-0.1.0/.vscode/extensions.json +15 -0
  13. another_mood-0.1.0/.vscode/mcp.json +9 -0
  14. another_mood-0.1.0/.vscode/settings.json +6 -0
  15. another_mood-0.1.0/CLAUDE.md +1 -0
  16. another_mood-0.1.0/DEVELOPMENT.md +117 -0
  17. another_mood-0.1.0/LICENSE +21 -0
  18. another_mood-0.1.0/Makefile +44 -0
  19. another_mood-0.1.0/PKG-INFO +56 -0
  20. another_mood-0.1.0/README.md +30 -0
  21. another_mood-0.1.0/dev-docs/contents/10-background/10-product.md +88 -0
  22. another_mood-0.1.0/dev-docs/contents/10-background/20-another-mood-original.md +147 -0
  23. another_mood-0.1.0/dev-docs/contents/10-background/index.md +3 -0
  24. another_mood-0.1.0/dev-docs/contents/20-design/10-architecture.md +77 -0
  25. another_mood-0.1.0/dev-docs/contents/20-design/20-app/10-project-structure.md +39 -0
  26. another_mood-0.1.0/dev-docs/contents/20-design/20-app/20-config-spec.md +33 -0
  27. another_mood-0.1.0/dev-docs/contents/20-design/20-app/30-mcp-design.md +165 -0
  28. another_mood-0.1.0/dev-docs/contents/20-design/20-app/40-meta-documentation.md +140 -0
  29. another_mood-0.1.0/dev-docs/contents/20-design/20-app/50-system-dev-docs.md +121 -0
  30. another_mood-0.1.0/dev-docs/contents/20-design/20-app/60-sbdb-manifest.md +217 -0
  31. another_mood-0.1.0/dev-docs/contents/20-design/20-app/index.md +3 -0
  32. another_mood-0.1.0/dev-docs/contents/20-design/30-pipeline.md +31 -0
  33. another_mood-0.1.0/dev-docs/contents/20-design/40-communication/10-json-data-model.md +75 -0
  34. another_mood-0.1.0/dev-docs/contents/20-design/40-communication/20-prose-spec.md +38 -0
  35. another_mood-0.1.0/dev-docs/contents/20-design/40-communication/30-blob-spec.md +43 -0
  36. another_mood-0.1.0/dev-docs/contents/20-design/40-communication/index.md +21 -0
  37. another_mood-0.1.0/dev-docs/contents/20-design/50-normalizer/10-normalizer.md +57 -0
  38. another_mood-0.1.0/dev-docs/contents/20-design/50-normalizer/20-schema-spec.md +130 -0
  39. another_mood-0.1.0/dev-docs/contents/20-design/50-normalizer/30-markdown-parser-spec.md +88 -0
  40. another_mood-0.1.0/dev-docs/contents/20-design/50-normalizer/index.md +3 -0
  41. another_mood-0.1.0/dev-docs/contents/20-design/60-composer/10-query-dsl-spec.md +145 -0
  42. another_mood-0.1.0/dev-docs/contents/20-design/60-composer/20-tap-spec.md +39 -0
  43. another_mood-0.1.0/dev-docs/contents/20-design/60-composer/index.md +3 -0
  44. another_mood-0.1.0/dev-docs/contents/20-design/70-generator/10-generator.md +83 -0
  45. another_mood-0.1.0/dev-docs/contents/20-design/70-generator/20-anchor-spec.md +282 -0
  46. another_mood-0.1.0/dev-docs/contents/20-design/70-generator/30-template-spec.md +51 -0
  47. another_mood-0.1.0/dev-docs/contents/20-design/70-generator/40-paging-spec.md +82 -0
  48. another_mood-0.1.0/dev-docs/contents/20-design/70-generator/50-output-format-spec.md +106 -0
  49. another_mood-0.1.0/dev-docs/contents/20-design/70-generator/60-template-trust-model.md +152 -0
  50. another_mood-0.1.0/dev-docs/contents/20-design/70-generator/index.md +3 -0
  51. another_mood-0.1.0/dev-docs/contents/20-design/index.md +7 -0
  52. another_mood-0.1.0/dev-docs/contents/30-dev/10-setup.md +38 -0
  53. another_mood-0.1.0/dev-docs/contents/30-dev/20-environment.md +103 -0
  54. another_mood-0.1.0/dev-docs/contents/30-dev/30-checks.md +47 -0
  55. another_mood-0.1.0/dev-docs/contents/30-dev/40-style-guide.md +30 -0
  56. another_mood-0.1.0/dev-docs/contents/30-dev/50-release.md +136 -0
  57. another_mood-0.1.0/dev-docs/contents/30-dev/index.md +3 -0
  58. another_mood-0.1.0/dev-docs/contents/index.md +5 -0
  59. another_mood-0.1.0/dev-docs/contents/tasks.yaml +793 -0
  60. another_mood-0.1.0/dev-docs/definition/reports.yaml +19 -0
  61. another_mood-0.1.0/dev-docs/definition/schema.yaml +44 -0
  62. another_mood-0.1.0/dev-docs/definition/templates/index.md +19 -0
  63. another_mood-0.1.0/dev-docs/definition/templates/prose.md +1 -0
  64. another_mood-0.1.0/dev-docs/definition/templates/roadmap.md +21 -0
  65. another_mood-0.1.0/dev-docs/definition/templates/tasks.md +30 -0
  66. another_mood-0.1.0/dev-docs/definition/views/.gitkeep +0 -0
  67. another_mood-0.1.0/dev-docs/definition/views/roadmap.yaml +18 -0
  68. another_mood-0.1.0/dev-docs/definition/views/tasks.yaml +7 -0
  69. another_mood-0.1.0/dev-docs/sbdb.yaml +5 -0
  70. another_mood-0.1.0/docs/catalog.yaml +65 -0
  71. another_mood-0.1.0/docs/guides.md +553 -0
  72. another_mood-0.1.0/docs/index.md +5 -0
  73. another_mood-0.1.0/docs/mcp.md +80 -0
  74. another_mood-0.1.0/docs/reference/cli.md +238 -0
  75. another_mood-0.1.0/docs/reference/index.md +15 -0
  76. another_mood-0.1.0/docs/reference/manifest.md +28 -0
  77. another_mood-0.1.0/docs/reference/reports.md +51 -0
  78. another_mood-0.1.0/docs/reference/schema.md +302 -0
  79. another_mood-0.1.0/docs/reference/schemas/content-schema.yaml +123 -0
  80. another_mood-0.1.0/docs/reference/schemas/manifest-schema.yaml +28 -0
  81. another_mood-0.1.0/docs/reference/schemas/reports-schema.yaml +78 -0
  82. another_mood-0.1.0/docs/reference/schemas/schema-schema.yaml +271 -0
  83. another_mood-0.1.0/docs/reference/schemas/view-schema.yaml +349 -0
  84. another_mood-0.1.0/docs/reference/template.md +464 -0
  85. another_mood-0.1.0/docs/reference/view.md +415 -0
  86. another_mood-0.1.0/pyproject.toml +86 -0
  87. another_mood-0.1.0/showcase/index.yaml +7 -0
  88. another_mood-0.1.0/showcase/japanese-table-design/contents//343/203/206/343/203/274/343/203/226/343/203/253.yaml +101 -0
  89. another_mood-0.1.0/showcase/japanese-table-design/contents//345/236/213/345/257/276/345/277/234.yaml +22 -0
  90. another_mood-0.1.0/showcase/japanese-table-design/definition/reports.yaml +6 -0
  91. another_mood-0.1.0/showcase/japanese-table-design/definition/schema.yaml +71 -0
  92. another_mood-0.1.0/showcase/japanese-table-design/definition/templates/index.md +50 -0
  93. another_mood-0.1.0/showcase/japanese-table-design/definition/templates//343/203/206/343/203/274/343/203/226/343/203/253/350/251/263/347/264/260.md +17 -0
  94. another_mood-0.1.0/showcase/japanese-table-design/definition/views//345/210/227_with_/343/203/211/343/203/241/343/202/244/343/203/263/345/236/213.yaml +20 -0
  95. another_mood-0.1.0/showcase/japanese-table-design/sbdb.yaml +5 -0
  96. another_mood-0.1.0/showcase/music/contents/albums.yaml +81 -0
  97. another_mood-0.1.0/showcase/music/contents/artists.yaml +74 -0
  98. another_mood-0.1.0/showcase/music/contents/background.md +13 -0
  99. another_mood-0.1.0/showcase/music/contents/covers/dawn_cassette.svg +1 -0
  100. another_mood-0.1.0/showcase/music/contents/covers/factory_lullabies.svg +1 -0
  101. another_mood-0.1.0/showcase/music/contents/covers/graphite_summer.svg +1 -0
  102. another_mood-0.1.0/showcase/music/contents/covers/last_train_to_dawn.svg +1 -0
  103. another_mood-0.1.0/showcase/music/contents/covers/neon_after_rain.png +0 -0
  104. another_mood-0.1.0/showcase/music/contents/covers/tidal_atlas.svg +1 -0
  105. another_mood-0.1.0/showcase/music/contents/covers/winter_in_the_machine.svg +1 -0
  106. another_mood-0.1.0/showcase/music/contents/genres.yaml +25 -0
  107. another_mood-0.1.0/showcase/music/contents/labels.yaml +15 -0
  108. another_mood-0.1.0/showcase/music/contents/liner-notes/neon_after_rain.md +9 -0
  109. another_mood-0.1.0/showcase/music/contents/liner-notes/tidal_atlas.md +9 -0
  110. another_mood-0.1.0/showcase/music/contents/liner-notes/winter_in_the_machine.md +7 -0
  111. another_mood-0.1.0/showcase/music/contents/playlist_tracks.yaml +16 -0
  112. another_mood-0.1.0/showcase/music/contents/playlists.yaml +15 -0
  113. another_mood-0.1.0/showcase/music/contents/tracks.yaml +163 -0
  114. another_mood-0.1.0/showcase/music/definition/reports.yaml +23 -0
  115. another_mood-0.1.0/showcase/music/definition/schema.yaml +179 -0
  116. another_mood-0.1.0/showcase/music/definition/templates/album-detail.md +29 -0
  117. another_mood-0.1.0/showcase/music/definition/templates/artist-detail.md +29 -0
  118. another_mood-0.1.0/showcase/music/definition/templates/index.md +115 -0
  119. another_mood-0.1.0/showcase/music/definition/templates/prose.md +2 -0
  120. another_mood-0.1.0/showcase/music/definition/views/albums_by_genre.yaml +32 -0
  121. another_mood-0.1.0/showcase/music/definition/views/artist_members.yaml +15 -0
  122. another_mood-0.1.0/showcase/music/definition/views/discography.yaml +69 -0
  123. another_mood-0.1.0/showcase/music/definition/views/live_albums.yaml +11 -0
  124. another_mood-0.1.0/showcase/music/definition/views/live_tracks.yaml +10 -0
  125. another_mood-0.1.0/showcase/music/definition/views/playlists.yaml +36 -0
  126. another_mood-0.1.0/showcase/music/definition/views/tracklists.yaml +47 -0
  127. another_mood-0.1.0/showcase/music/sbdb.yaml +5 -0
  128. another_mood-0.1.0/showcase/starter/contents/about.md +3 -0
  129. another_mood-0.1.0/showcase/starter/contents/members.yaml +18 -0
  130. another_mood-0.1.0/showcase/starter/definition/reports.yaml +7 -0
  131. another_mood-0.1.0/showcase/starter/definition/schema.yaml +23 -0
  132. another_mood-0.1.0/showcase/starter/definition/templates/by_role.md +6 -0
  133. another_mood-0.1.0/showcase/starter/definition/templates/index.md +17 -0
  134. another_mood-0.1.0/showcase/starter/definition/templates/member.md +5 -0
  135. another_mood-0.1.0/showcase/starter/definition/templates/prose.md +1 -0
  136. another_mood-0.1.0/showcase/starter/definition/views/active_members.yaml +8 -0
  137. another_mood-0.1.0/showcase/starter/definition/views/by_role.yaml +9 -0
  138. another_mood-0.1.0/showcase/starter/sbdb.yaml +5 -0
  139. another_mood-0.1.0/src/another_mood/__init__.py +0 -0
  140. another_mood-0.1.0/src/another_mood/cli.py +289 -0
  141. another_mood-0.1.0/src/another_mood/command.py +302 -0
  142. another_mood-0.1.0/src/another_mood/components/__init__.py +20 -0
  143. another_mood-0.1.0/src/another_mood/components/composer/__init__.py +0 -0
  144. another_mood-0.1.0/src/another_mood/components/composer/composer.py +50 -0
  145. another_mood-0.1.0/src/another_mood/components/docs_catalog/__init__.py +0 -0
  146. another_mood-0.1.0/src/another_mood/components/docs_catalog/catalog.py +98 -0
  147. another_mood-0.1.0/src/another_mood/components/generator/__init__.py +0 -0
  148. another_mood-0.1.0/src/another_mood/components/generator/data_tree.py +443 -0
  149. another_mood-0.1.0/src/another_mood/components/generator/data_tree_filters.py +171 -0
  150. another_mood-0.1.0/src/another_mood/components/generator/edition.py +167 -0
  151. another_mood-0.1.0/src/another_mood/components/generator/generator.py +205 -0
  152. another_mood-0.1.0/src/another_mood/components/generator/inert.py +142 -0
  153. another_mood-0.1.0/src/another_mood/components/generator/meta_templates.py +224 -0
  154. another_mood-0.1.0/src/another_mood/components/generator/omitted.py +23 -0
  155. another_mood-0.1.0/src/another_mood/components/generator/output_formats/__init__.py +0 -0
  156. another_mood-0.1.0/src/another_mood/components/generator/output_formats/heading_shift.py +95 -0
  157. another_mood-0.1.0/src/another_mood/components/generator/output_formats/md.py +276 -0
  158. another_mood-0.1.0/src/another_mood/components/generator/render_processor.py +136 -0
  159. another_mood-0.1.0/src/another_mood/components/generator/template_engine.py +289 -0
  160. another_mood-0.1.0/src/another_mood/components/generator/template_safe.py +27 -0
  161. another_mood-0.1.0/src/another_mood/components/generator/url.py +43 -0
  162. another_mood-0.1.0/src/another_mood/components/manifest/__init__.py +23 -0
  163. another_mood-0.1.0/src/another_mood/components/manifest/manifest.py +178 -0
  164. another_mood-0.1.0/src/another_mood/components/preprocess/__init__.py +0 -0
  165. another_mood-0.1.0/src/another_mood/components/preprocess/content_normalizer.py +178 -0
  166. another_mood-0.1.0/src/another_mood/components/preprocess/data_fk_validator.py +152 -0
  167. another_mood-0.1.0/src/another_mood/components/preprocess/normalize_core.py +125 -0
  168. another_mood-0.1.0/src/another_mood/components/preprocess/prose.py +183 -0
  169. another_mood-0.1.0/src/another_mood/components/preprocess/query_deriver.py +256 -0
  170. another_mood-0.1.0/src/another_mood/components/preprocess/query_normalizer.py +140 -0
  171. another_mood-0.1.0/src/another_mood/components/preprocess/schema_inspector.py +204 -0
  172. another_mood-0.1.0/src/another_mood/components/preprocess/schema_tree.py +307 -0
  173. another_mood-0.1.0/src/another_mood/components/publish/__init__.py +0 -0
  174. another_mood-0.1.0/src/another_mood/components/publish/publish.py +30 -0
  175. another_mood-0.1.0/src/another_mood/components/scaffold/__init__.py +0 -0
  176. another_mood-0.1.0/src/another_mood/components/scaffold/blueprints.py +119 -0
  177. another_mood-0.1.0/src/another_mood/components/shared/__init__.py +0 -0
  178. another_mood-0.1.0/src/another_mood/components/shared/component/__init__.py +0 -0
  179. another_mood-0.1.0/src/another_mood/components/shared/component/build_report.py +212 -0
  180. another_mood-0.1.0/src/another_mood/components/shared/component/component.py +176 -0
  181. another_mood-0.1.0/src/another_mood/components/shared/component/dir_lock.py +137 -0
  182. another_mood-0.1.0/src/another_mood/components/shared/component/errors.py +115 -0
  183. another_mood-0.1.0/src/another_mood/components/shared/data_catalog.py +378 -0
  184. another_mood-0.1.0/src/another_mood/components/shared/file_type.py +25 -0
  185. another_mood-0.1.0/src/another_mood/components/shared/json_data_model.py +219 -0
  186. another_mood-0.1.0/src/another_mood/components/shared/markdown.py +225 -0
  187. another_mood-0.1.0/src/another_mood/components/shared/query.py +554 -0
  188. another_mood-0.1.0/src/another_mood/components/shared/record_predicate.py +208 -0
  189. another_mood-0.1.0/src/another_mood/components/shared/transfer.py +29 -0
  190. another_mood-0.1.0/src/another_mood/components/shared/user_error.py +30 -0
  191. another_mood-0.1.0/src/another_mood/components/shared/user_source/__init__.py +0 -0
  192. another_mood-0.1.0/src/another_mood/components/shared/user_source/diagnostic.py +221 -0
  193. another_mood-0.1.0/src/another_mood/components/shared/user_source/position_resolver.py +97 -0
  194. another_mood-0.1.0/src/another_mood/components/shared/user_source/source_loader.py +281 -0
  195. another_mood-0.1.0/src/another_mood/components/shared/user_source/validator.py +120 -0
  196. another_mood-0.1.0/src/another_mood/components/shared/windows_reserved_name.py +64 -0
  197. another_mood-0.1.0/src/another_mood/components/tap/__init__.py +0 -0
  198. another_mood-0.1.0/src/another_mood/components/tap/tap.py +14 -0
  199. another_mood-0.1.0/src/another_mood/config.py +92 -0
  200. another_mood-0.1.0/src/another_mood/layout.py +109 -0
  201. another_mood-0.1.0/src/another_mood/mcp_server.py +174 -0
  202. another_mood-0.1.0/src/another_mood/pipeline/__init__.py +0 -0
  203. another_mood-0.1.0/src/another_mood/pipeline/adapters/__init__.py +0 -0
  204. another_mood-0.1.0/src/another_mood/pipeline/adapters/hugo.py +67 -0
  205. another_mood-0.1.0/src/another_mood/pipeline/adapters/preparation.py +100 -0
  206. another_mood-0.1.0/src/another_mood/pipeline/adapters/watcher.py +85 -0
  207. another_mood-0.1.0/src/another_mood/pipeline/base.py +132 -0
  208. another_mood-0.1.0/src/another_mood/pipeline/site.py +130 -0
  209. another_mood-0.1.0/src/another_mood/pipeline/stages.py +252 -0
  210. another_mood-0.1.0/src/another_mood/pipeline/workspace.py +35 -0
  211. another_mood-0.1.0/src/another_mood/resources/__init__.py +0 -0
  212. another_mood-0.1.0/src/another_mood/resources/hugo/.gitignore +1 -0
  213. another_mood-0.1.0/src/another_mood/resources/hugo/.hugo_build.lock +0 -0
  214. another_mood-0.1.0/src/another_mood/resources/hugo/hugo.toml +14 -0
  215. another_mood-0.1.0/src/another_mood/resources/hugo/layouts/_default/baseof.html +19 -0
  216. another_mood-0.1.0/src/another_mood/resources/hugo/layouts/_default/list.html +3 -0
  217. another_mood-0.1.0/src/another_mood/resources/hugo/layouts/_default/single.html +3 -0
  218. another_mood-0.1.0/src/another_mood/resources/hugo/layouts/index.html +3 -0
  219. another_mood-0.1.0/src/another_mood/resources/schemas/content-schema.yaml +123 -0
  220. another_mood-0.1.0/src/another_mood/resources/schemas/manifest-schema.yaml +28 -0
  221. another_mood-0.1.0/src/another_mood/resources/schemas/reports-schema.yaml +78 -0
  222. another_mood-0.1.0/src/another_mood/resources/schemas/schema-schema.yaml +271 -0
  223. another_mood-0.1.0/src/another_mood/resources/schemas/view-schema.yaml +349 -0
  224. another_mood-0.1.0/src/another_mood/resources/templates/build_report/build_failure.md +28 -0
  225. another_mood-0.1.0/src/another_mood/resources/templates/build_report/warnings.md +12 -0
  226. another_mood-0.1.0/src/another_mood/resources/templates/cover/index.md +13 -0
  227. another_mood-0.1.0/src/another_mood/resources/templates/meta/data.md +14 -0
  228. another_mood-0.1.0/src/another_mood/resources/templates/meta/entity_def.md +75 -0
  229. another_mood-0.1.0/src/another_mood/resources/templates/meta/index.md +62 -0
  230. another_mood-0.1.0/src/another_mood/resources/templates/meta/record_table.md +29 -0
  231. another_mood-0.1.0/src/another_mood/resources/templates/meta/view_def.md +120 -0
  232. another_mood-0.1.0/src/another_mood/resources/views/meta.yaml +77 -0
  233. another_mood-0.1.0/tests/__init__.py +0 -0
  234. another_mood-0.1.0/tests/components/__init__.py +0 -0
  235. another_mood-0.1.0/tests/components/composer/__init__.py +0 -0
  236. another_mood-0.1.0/tests/components/composer/test_composer.py +271 -0
  237. another_mood-0.1.0/tests/components/docs_catalog/__init__.py +0 -0
  238. another_mood-0.1.0/tests/components/docs_catalog/test_catalog.py +64 -0
  239. another_mood-0.1.0/tests/components/generator/__init__.py +0 -0
  240. another_mood-0.1.0/tests/components/generator/output_formats/__init__.py +0 -0
  241. another_mood-0.1.0/tests/components/generator/output_formats/test_heading_shift.py +71 -0
  242. another_mood-0.1.0/tests/components/generator/output_formats/test_md.py +676 -0
  243. another_mood-0.1.0/tests/components/generator/test_data_tree.py +501 -0
  244. another_mood-0.1.0/tests/components/generator/test_data_tree_filters.py +359 -0
  245. another_mood-0.1.0/tests/components/generator/test_edition.py +205 -0
  246. another_mood-0.1.0/tests/components/generator/test_generator.py +289 -0
  247. another_mood-0.1.0/tests/components/generator/test_inert.py +116 -0
  248. another_mood-0.1.0/tests/components/generator/test_markdown_engine.py +122 -0
  249. another_mood-0.1.0/tests/components/generator/test_meta_templates.py +209 -0
  250. another_mood-0.1.0/tests/components/generator/test_render_processor.py +397 -0
  251. another_mood-0.1.0/tests/components/generator/test_ssti.py +339 -0
  252. another_mood-0.1.0/tests/components/generator/test_template_engine.py +451 -0
  253. another_mood-0.1.0/tests/components/generator/test_template_safe.py +173 -0
  254. another_mood-0.1.0/tests/components/generator/test_url.py +43 -0
  255. another_mood-0.1.0/tests/components/manifest/__init__.py +0 -0
  256. another_mood-0.1.0/tests/components/manifest/test_manifest.py +241 -0
  257. another_mood-0.1.0/tests/components/preprocess/__init__.py +0 -0
  258. another_mood-0.1.0/tests/components/preprocess/test_content_normalizer.py +456 -0
  259. another_mood-0.1.0/tests/components/preprocess/test_data_fk_validator.py +357 -0
  260. another_mood-0.1.0/tests/components/preprocess/test_dict_to_array.py +319 -0
  261. another_mood-0.1.0/tests/components/preprocess/test_normalize_core.py +194 -0
  262. another_mood-0.1.0/tests/components/preprocess/test_prose.py +360 -0
  263. another_mood-0.1.0/tests/components/preprocess/test_query_deriver.py +514 -0
  264. another_mood-0.1.0/tests/components/preprocess/test_query_normalizer.py +315 -0
  265. another_mood-0.1.0/tests/components/preprocess/test_schema_inspector.py +1011 -0
  266. another_mood-0.1.0/tests/components/preprocess/test_schema_tree.py +511 -0
  267. another_mood-0.1.0/tests/components/preprocess/test_schema_tree_integration.py +394 -0
  268. another_mood-0.1.0/tests/components/publish/__init__.py +0 -0
  269. another_mood-0.1.0/tests/components/publish/test_publish.py +89 -0
  270. another_mood-0.1.0/tests/components/scaffold/__init__.py +0 -0
  271. another_mood-0.1.0/tests/components/scaffold/test_blueprints.py +134 -0
  272. another_mood-0.1.0/tests/components/shared/__init__.py +0 -0
  273. another_mood-0.1.0/tests/components/shared/component/__init__.py +0 -0
  274. another_mood-0.1.0/tests/components/shared/component/test_build_report.py +128 -0
  275. another_mood-0.1.0/tests/components/shared/component/test_component.py +205 -0
  276. another_mood-0.1.0/tests/components/shared/component/test_dir_lock.py +160 -0
  277. another_mood-0.1.0/tests/components/shared/component/test_errors.py +247 -0
  278. another_mood-0.1.0/tests/components/shared/test_data_catalog.py +292 -0
  279. another_mood-0.1.0/tests/components/shared/test_file_type.py +66 -0
  280. another_mood-0.1.0/tests/components/shared/test_json_data_model.py +248 -0
  281. another_mood-0.1.0/tests/components/shared/test_markdown.py +200 -0
  282. another_mood-0.1.0/tests/components/shared/test_query.py +1429 -0
  283. another_mood-0.1.0/tests/components/shared/test_record_predicate.py +351 -0
  284. another_mood-0.1.0/tests/components/shared/test_transfer.py +80 -0
  285. another_mood-0.1.0/tests/components/shared/test_user_error.py +9 -0
  286. another_mood-0.1.0/tests/components/shared/test_windows_reserved_name.py +144 -0
  287. another_mood-0.1.0/tests/components/shared/user_source/__init__.py +0 -0
  288. another_mood-0.1.0/tests/components/shared/user_source/test_diagnostic.py +308 -0
  289. another_mood-0.1.0/tests/components/shared/user_source/test_position_resolver.py +109 -0
  290. another_mood-0.1.0/tests/components/shared/user_source/test_source_loader.py +312 -0
  291. another_mood-0.1.0/tests/components/shared/user_source/test_validator.py +137 -0
  292. another_mood-0.1.0/tests/components/tap/__init__.py +0 -0
  293. another_mood-0.1.0/tests/components/tap/test_tap.py +22 -0
  294. another_mood-0.1.0/tests/pipeline/__init__.py +0 -0
  295. another_mood-0.1.0/tests/pipeline/test_preparation.py +218 -0
  296. another_mood-0.1.0/tests/pipeline/test_tap_pipeline.py +28 -0
  297. another_mood-0.1.0/tests/pipeline/test_write_once_sweep.py +178 -0
  298. another_mood-0.1.0/tests/test_command.py +59 -0
  299. another_mood-0.1.0/tests/test_config.py +110 -0
  300. another_mood-0.1.0/tests/test_docs_sync.py +40 -0
  301. another_mood-0.1.0/tests/test_layout.py +148 -0
  302. another_mood-0.1.0/uv.lock +1323 -0
@@ -0,0 +1,20 @@
1
+ {
2
+ "hooks": {
3
+ "PostToolUse": [
4
+ {
5
+ "matcher": "Edit|Write",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "uv run ruff format $CLAUDE_FILE_PATHS"
10
+ }
11
+ ]
12
+ }
13
+ ]
14
+ },
15
+ "permissions": {
16
+ "allow": [
17
+ "mcp__another-mood"
18
+ ]
19
+ }
20
+ }
@@ -0,0 +1,16 @@
1
+ # Dev Container
2
+
3
+ ## 環境仕様
4
+
5
+ - **ベースイメージ**: `mcr.microsoft.com/devcontainers/base:ubuntu`
6
+ - **Python**: uv で管理
7
+ - **Node.js**: npm グローバルツール用(Claude Code CLI, ast-grep)
8
+ - **Go**: MCP Language Server のビルド用
9
+
10
+ 詳細は [dev-docs/contents/dev/environment.md](../dev-docs/contents/30-dev/20-environment.md) を参照。
11
+
12
+ ## 使い方
13
+
14
+ 1. VSCode で「Reopen in Container」を選択
15
+ 2. 初回は postCreateCommand で Claude Code CLI 等が自動インストールされる
16
+ 3. 動作確認は [dev-docs/contents/dev/environment.md の確認手順](../dev-docs/contents/30-dev/20-environment.md#動作確認) を参照
@@ -0,0 +1,24 @@
1
+ {
2
+ "features": {
3
+ "ghcr.io/devcontainers-extra/features/uv:1": {
4
+ "version": "1.0.2",
5
+ "resolved": "ghcr.io/devcontainers-extra/features/uv@sha256:1ac5b9f17a9e9e745933d0ac2ecf758e06ed3da4423cd22c94cce4d482fd2dd8",
6
+ "integrity": "sha256:1ac5b9f17a9e9e745933d0ac2ecf758e06ed3da4423cd22c94cce4d482fd2dd8"
7
+ },
8
+ "ghcr.io/devcontainers/features/github-cli:1": {
9
+ "version": "1.1.0",
10
+ "resolved": "ghcr.io/devcontainers/features/github-cli@sha256:d22f50b70ed75339b4eed1ba9ecde3a1791f90e88d37936517e3bace0bbad671",
11
+ "integrity": "sha256:d22f50b70ed75339b4eed1ba9ecde3a1791f90e88d37936517e3bace0bbad671"
12
+ },
13
+ "ghcr.io/devcontainers/features/go:1": {
14
+ "version": "1.3.4",
15
+ "resolved": "ghcr.io/devcontainers/features/go@sha256:d85e921f91b41340055bb12b325d9d551170ed04b3b832e33530bf42f167c032",
16
+ "integrity": "sha256:d85e921f91b41340055bb12b325d9d551170ed04b3b832e33530bf42f167c032"
17
+ },
18
+ "ghcr.io/devcontainers/features/node:1": {
19
+ "version": "1.7.1",
20
+ "resolved": "ghcr.io/devcontainers/features/node@sha256:8c0de46939b61958041700ee89e3493f3b2e4131a06dc46b4d9423427d06e5f6",
21
+ "integrity": "sha256:8c0de46939b61958041700ee89e3493f3b2e4131a06dc46b4d9423427d06e5f6"
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "another-mood",
3
+ "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
4
+
5
+ "features": {
6
+ "ghcr.io/devcontainers/features/node:1": {},
7
+ "ghcr.io/devcontainers/features/go:1": {},
8
+ "ghcr.io/devcontainers/features/github-cli:1": {},
9
+ "ghcr.io/devcontainers-extra/features/uv:1": {}
10
+ },
11
+
12
+ "customizations": {
13
+ "vscode": {
14
+ "extensions": [
15
+ "anthropic.claude-code",
16
+ "ms-python.python",
17
+ "ms-python.vscode-pylance",
18
+ "ms-python.debugpy",
19
+ "ms-python.python-env-manager",
20
+ "ms-vscode.makefile-tools",
21
+ "charliermarsh.ruff",
22
+ "editorconfig.editorconfig",
23
+ "redhat.vscode-yaml",
24
+ "bierner.markdown-mermaid",
25
+ "github.vscode-github-actions"
26
+ ]
27
+ }
28
+ },
29
+
30
+ "mounts": ["source=another-mood-claude-${devcontainerId},target=/home/vscode/.claude,type=volume"],
31
+
32
+ "postCreateCommand": {
33
+ "claude-home": "sudo chown -R vscode:vscode /home/vscode/.claude",
34
+ "claude-code": "npm install -g @anthropic-ai/claude-code",
35
+ "mcp-language-server": "go install github.com/isaacphi/mcp-language-server@latest",
36
+ "ast-grep": "npm install -g @ast-grep/cli",
37
+ "playwright-deps": "sudo apt-get update && sudo apt-get install -y fonts-noto-cjk && (npx -y playwright install chrome || true) && command -v google-chrome"
38
+ },
39
+
40
+ "remoteUser": "vscode"
41
+ }
@@ -0,0 +1,13 @@
1
+ ## Summary
2
+
3
+ <!-- 1-3 bullets describing what this PR changes and why -->
4
+
5
+ ## Test plan
6
+
7
+ <!-- Bulleted markdown checklist of TODOs for testing -->
8
+
9
+ ## Checks
10
+
11
+ - [ ] `make ci` passes locally
12
+ - [ ] If user-visible behavior changed, `docs/reference/` (and `docs/guides.md` when relevant) are updated to match
13
+ - [ ] If built-in resources under `src/another_mood/resources/schemas/` changed, the corresponding appendix in `docs/reference/` is in sync
@@ -0,0 +1,35 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ ci:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ # Both ends of the supported range: the floor declared by
15
+ # requires-python, and the newest version most users will install on.
16
+ # setup-uv exports UV_PYTHON, which outranks the .python-version file.
17
+ matrix:
18
+ python-version: ["3.12", "3.13"]
19
+ steps:
20
+ - uses: actions/checkout@v6
21
+
22
+ - uses: astral-sh/setup-uv@v7
23
+ with:
24
+ python-version: ${{ matrix.python-version }}
25
+
26
+ - run: uv sync --locked
27
+
28
+ - run: make ci
29
+
30
+ - uses: actions/upload-artifact@v6
31
+ if: always()
32
+ with:
33
+ name: test-reports-py${{ matrix.python-version }}
34
+ path: reports/
35
+ retention-days: 30
@@ -0,0 +1,37 @@
1
+ name: Fresh dependency check
2
+
3
+ # Early-warning, non-blocking counterpart to ci.yml. ci.yml gates PRs against
4
+ # the committed uv.lock; this workflow re-resolves dependencies to the latest
5
+ # versions our constraints allow, mirroring what end users get from
6
+ # `uv tool install` (which ignores uv.lock). It runs on a schedule so an
7
+ # upstream release never reds an unrelated PR — failures here are a signal to
8
+ # bump or cap a dependency before users hit the breakage.
9
+
10
+ on:
11
+ schedule:
12
+ - cron: "0 0 * * 1" # Mondays 00:00 UTC
13
+ workflow_dispatch:
14
+
15
+ jobs:
16
+ # The essential check: reproduce the isolated, freshly-resolved environment
17
+ # of `uv tool install`. Only this path exercises entry-point shim behaviour,
18
+ # so it catches binary-resolution bugs that ci.yml (running via `uv run` in
19
+ # the project .venv) cannot.
20
+ install-smoke:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v6
24
+ - uses: astral-sh/setup-uv@v7
25
+ - name: Build via the `uv tool install` resolution path
26
+ run: uvx --from . --refresh-package another-mood mood build showcase/starter
27
+
28
+ # Complementary: run the full test suite against the latest allowed versions
29
+ # to surface upstream API breakage early.
30
+ fresh-resolution:
31
+ runs-on: ubuntu-latest
32
+ steps:
33
+ - uses: actions/checkout@v6
34
+ - uses: astral-sh/setup-uv@v7
35
+ - name: Resolve to the latest versions our constraints allow
36
+ run: uv sync --upgrade
37
+ - run: make ci
@@ -0,0 +1,36 @@
1
+ # Claude Code local settings
2
+ .claude/settings.local.json
3
+
4
+ # Byte-compiled / optimized / DLL files
5
+ __pycache__/
6
+ *.py[codz]
7
+ *$py.class
8
+
9
+ # Distribution / packaging
10
+ dist/
11
+ *.egg-info/
12
+
13
+ # Unit test / coverage reports
14
+ reports/
15
+ .coverage
16
+ .coverage.*
17
+ .pytest_cache/
18
+
19
+ # Virtual environments
20
+ .venv/
21
+
22
+ # Ruff
23
+ .ruff_cache/
24
+
25
+ # Type checkers
26
+ .mypy_cache/
27
+ .pytype/
28
+
29
+ # another-mood output
30
+ /.another-mood/
31
+
32
+ # Playwright MCP session output (page snapshots, console logs, screenshots)
33
+ /.playwright-mcp/
34
+
35
+ # OS files
36
+ .DS_Store
@@ -0,0 +1,31 @@
1
+ {
2
+ "mcpServers": {
3
+ "language-server": {
4
+ "command": "mcp-language-server",
5
+ "args": [
6
+ "--workspace", "/workspaces/another-mood",
7
+ "-lsp", "pyright-langserver", "--", "--stdio"
8
+ ]
9
+ },
10
+ "ast-grep": {
11
+ "command": "uvx",
12
+ "args": [
13
+ "--from",
14
+ "git+https://github.com/ast-grep/ast-grep-mcp",
15
+ "ast-grep-server"
16
+ ]
17
+ },
18
+ "context7": {
19
+ "command": "npx",
20
+ "args": ["-y", "@upstash/context7-mcp"]
21
+ },
22
+ "another-mood": {
23
+ "command": "uv",
24
+ "args": ["run", "mood-mcp"]
25
+ },
26
+ "playwright": {
27
+ "command": "npx",
28
+ "args": ["-y", "@playwright/mcp@latest", "--headless"]
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,9 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.15.7
4
+ hooks:
5
+ - id: ruff-format
6
+ - repo: https://github.com/gitleaks/gitleaks
7
+ rev: v8.24.2
8
+ hooks:
9
+ - id: gitleaks
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,15 @@
1
+ {
2
+ "recommendations": [
3
+ "anthropic.claude-code",
4
+ "ms-python.python",
5
+ "ms-python.vscode-pylance",
6
+ "ms-python.debugpy",
7
+ "ms-python.python-env-manager",
8
+ "ms-vscode.makefile-tools",
9
+ "charliermarsh.ruff",
10
+ "editorconfig.editorconfig",
11
+ "redhat.vscode-yaml",
12
+ "bierner.markdown-mermaid",
13
+ "github.vscode-github-actions"
14
+ ]
15
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "servers": {
3
+ "another-mood": {
4
+ "type": "stdio",
5
+ "command": "uv",
6
+ "args": ["run", "mood-mcp"]
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "editor.formatOnSave": true,
3
+ "[python]": {
4
+ "editor.defaultFormatter": "charliermarsh.ruff"
5
+ }
6
+ }
@@ -0,0 +1 @@
1
+ @DEVELOPMENT.md
@@ -0,0 +1,117 @@
1
+ # Development Guide
2
+
3
+ ## Conventions (Must Read)
4
+
5
+ ### 開発ワークフロー
6
+
7
+ - 各タスクは「1タスク・1 Git ブランチ」で進める
8
+ - タスク開始時に `make ci` を実行し、開発環境・既存コードが正常な状態であることを確認する。失敗する場合は、環境の問題ならセットアップ節を、コードの問題ならタスク着手前に修正する
9
+ - コミットメッセージ・プルリクエストは **英語**
10
+
11
+ ### セットアップ
12
+
13
+ ツールの動作には [uv](https://docs.astral.sh/uv/) が必要。インストール後 `uv sync` で依存を解決する。
14
+
15
+ このプロジェクト自身が Another Mood でドキュメントを管理している。タスク開始時には `mood build dev-docs` でドキュメントをビルドし、仕様が参照できる状態にする。起点は [.another-mood/dev-docs/output/web/index.md](.another-mood/dev-docs/output/web/index.md)。
16
+
17
+ 利用者向けサンプルプロジェクト群は `showcase/`(`starter` / `music` 等の各テンプレート)にある。`mood build showcase/{name}` でビルドできる。
18
+
19
+ ### ドキュメント
20
+
21
+ ドキュメントは以下の三系統で管理する:
22
+
23
+ - **`docs/`** — 利用者向けリファレンス(外部仕様の正本)。素 Markdown、英語。実装済み機能のみ。文体は簡潔だが、正確さ・網羅性は妥協しない(MCP 経由で LLM が読む UX に直結するため)
24
+ - **`dev-docs/background/`** — 製品ビジョン、ロードマップ、タスクカタログ等の開発判断の根拠。日本語。Another Mood で管理
25
+ - **`dev-docs/design/`** — 設計仕様。日本語。各ファイルは以下の 3 セクション構造(該当があるもののみ):
26
+ - `## External Design` — 利用者から見える振る舞いの設計判断
27
+ - `## Internal Design` — 内部実装の設計判断
28
+ - `## Proposals` — 未実装機能(task に対応)
29
+
30
+ `Proposals` の検討メモは、実装完了時に削除する(部分実装なら残る検討事項のみに絞る)。維持価値のある設計判断は External / Internal Design 節に移すか、code docstring やコミットメッセージで残す。
31
+
32
+ 設計判断の背景・理由は、判断が書かれている場所に直接書く(ADR のように別ファイルに分離しない)。`design/` 内では「## 背景: ...」セクションとして該当箇所の近傍に書き、実装済み機能ではコードの docstring かコミットメッセージで残す。
33
+
34
+ 理由: 仕様と理由が同じ場所にあれば、仕様の変更時に理由も自然に目に入り、更新漏れが起きにくい。別ファイルに分離すると同期コストが発生し、仕様変更で不要になった ADR の削除・更新が漏れやすい。
35
+
36
+ ドキュメントを追加・削除・移動した場合、プルリクを上げる前に以下のインデックスからのリンクを確認・更新する:
37
+
38
+ - [index.md](.another-mood/dev-docs/output/web/index.md) — dev-docs 全体インデックス
39
+ - [docs/index.md](docs/index.md) — 利用者向けトップ
40
+ - [docs/catalog.yaml](docs/catalog.yaml) — MCP 公開対象のカタログ
41
+ - [DEVELOPMENT.md](DEVELOPMENT.md) — 開発者向けポインタ
42
+
43
+ ### 実装
44
+
45
+ - コード内コメントは **英語**
46
+ - ライブラリ導入は、その時点での有力なものを比較検討したうえで決定する。**選定理由はそのライブラリを使うコンポーネントの近傍(`dev-docs/design/` の対応ファイル、実装済みならコードの docstring)に残す**
47
+ - **コードから dev-docs を参照しない**: docstring・コメントに dev-docs のパスや章名を書かない
48
+ - docstring は API の呼び出し側に補足が必要な契約のみ(可能ならシグネチャで表現する)。コメントは将来の保守者への申し送りのみ。設計判断の背景・経緯は `dev-docs/design/` かコミットメッセージへ
49
+
50
+ #### パッケージ構成と依存ルール
51
+
52
+ ```
53
+ another_mood/
54
+ ├── cli.py # CLI エントリポイント
55
+ ├── mcp_server.py # MCP サーバエントリポイント
56
+ ├── command.py # CLI / MCP 共通の操作層(BuildResult 等を返す)
57
+ ├── config.py # 設定
58
+ ├── components/ # ビジネスロジック
59
+ │ ├── shared/ # 共通基盤
60
+ │ ├── preprocess/ # 入力の正規化・スキーマ解釈・クエリ導出
61
+ │ ├── composer/ # 合成: データ + クエリ → ビュー
62
+ │ ├── generator/ # 生成: ビュー + テンプレート → Markdown
63
+ │ ├── publish/ # 出力の書き出し
64
+ │ ├── scaffold/ # プロジェクト初期化・ブループリント
65
+ │ └── docs_catalog/ # バンドル済みドキュメントの目録
66
+ ├── pipeline/ # オーケストレーション: ステージ実行
67
+ │ └── adapters/ # 外部ツール連携(Hugo, watchfiles)
68
+ └── resources/ # 静的リソース
69
+ ```
70
+
71
+ 依存方向: `{cli, mcp_server}` → `command` → `pipeline` → `components/*` → `components/shared`
72
+
73
+ #### コードスタイル
74
+
75
+ - **関数型スタイルを優先**: `for` ループより内包表記、`map/filter` 等。引数・戻り値はイミュータブル型(`dict` → `Mapping`、`list` → `Sequence` 等)
76
+ - **`Any` はなるべく使わない**: `object` 等で型安全性を保つ
77
+ - **命名はモジュール名に合わせる**: `source` モジュールなら `is_source_file`, `build_source`
78
+ - **関数の並び順(Newspaper style)**: 公開 API を先頭、ヘルパーを後ろ。ヘルパーはパイプライン順
79
+ - **`@dataclass` は `frozen=True`**: `__init__` ボイラープレート削減目的、immutable がデフォルト
80
+ - **制御フローは論理の形に合わせる**: 両枝が対等な結果を返す *対称な分岐* は `if/else`(両枝が `return` でも `else` を畳まない)。前提失敗・エラー・エッジを先頭で剥がす *非対称な bail-out* のみ guard clause(早期 `return`)。`else` とインデントは条件付き領域の境界情報なので、機能的に冗長でも残す(*explicit is better than implicit*)。`else` を機械的に除去させる pylint `no-else-return` / ruff `RET505` は採らない(RET は `select` 外)
81
+
82
+ #### テスト
83
+
84
+ - **カバレッジ計測対象**: `components/`。Statements + Branches トータルで 90% 以上
85
+ - **フィクスチャ**: ファイルベース、モジュール隣接型。期待値はテストコード内に記述
86
+
87
+ #### 動作確認 (`mood watch` + Playwright MCP)
88
+
89
+ `showcase/` や `dev-docs/` のテンプレート変更を実機で確認するときは `mood watch <project_dir> --port <port>` でローカルプレビューを上げ、必要なら Playwright MCP でレンダリングを観る。Playwright MCP の作業ファイルはすべて `.gitignore` 済みの `.playwright-mcp/` 配下に集約する:
90
+
91
+ - ページスナップショット / console ログは Playwright MCP が自動でこのディレクトリに出す
92
+ - スクリーンショットは `browser_take_screenshot` の `filename` に `.playwright-mcp/<name>.png` を指定する (デフォルトは cwd 直下に落ちて散らかる)
93
+
94
+ 検証目的のスクショは再現可能なので、コミット前に削除して構わない。
95
+
96
+ #### タスクの進め方
97
+
98
+ 非自明な機能追加・変更では、まず `dev-docs/design/` の対応ファイル `## Proposals` セクション(必要なら新規ファイル)に検討メモを書いて方針を合意してから着手する。以降の手順:
99
+
100
+ 1. 以下をタスクに応じた順序で進める:
101
+ - **showcase/ のテンプレートに入出力例を作成**
102
+ - **単体テストを記述**
103
+ - **実装**
104
+ 2. **showcase/ で動作確認**
105
+ 3. **`docs/` を同期** — ユーザに見える挙動(CLI / スキーマ / クエリ / テンプレートの仕様、内蔵リソース等)が変わった場合に `docs/reference/` 各章および必要に応じて `docs/guides.md` を更新
106
+ 4. **`Proposals` の整理** — 対応ファイルの `## Proposals` から該当の検討メモを削除(部分実装の場合は残る検討事項のみに絞る)。維持価値のある設計判断は External / Internal Design 節に移すか、コードの docstring に残す
107
+ 5. `make ci` を通してコミット → プルリク作成
108
+
109
+ ## Documentation (Reference)
110
+
111
+ ドキュメントの閲覧先は `.another-mood/dev-docs/output/web/`。
112
+
113
+ - [index.md](.another-mood/dev-docs/output/web/index.md) — 仕様・設計
114
+ - [background/product.md](.another-mood/dev-docs/output/web/prose/10-background/10-product.md) — 製品ビジョン
115
+ - [roadmap.md](.another-mood/dev-docs/output/web/roadmap.md) — ロードマップ
116
+ - [tasks.md](.another-mood/dev-docs/output/web/tasks.md) — タスクカタログ
117
+ - [dev/style-guide.md](.another-mood/dev-docs/output/web/prose/30-dev/40-style-guide.md) — 命名・自己定義の表記規約
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kiyofumi Watanabe
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,44 @@
1
+ .PHONY: ci format-check lint typecheck test secrets build-projects format mirror-schemas stats
2
+
3
+ ci: format-check lint typecheck test secrets build-projects
4
+
5
+ format-check:
6
+ uv run ruff format --check .
7
+
8
+ lint:
9
+ uv run ruff check .
10
+
11
+ typecheck:
12
+ uv run pyright --warnings
13
+
14
+ test:
15
+ uv run pytest --cov --cov-fail-under=90 --junitxml=reports/junit.xml --cov-report=xml:reports/coverage.xml --cov-report=html:reports/htmlcov
16
+
17
+ secrets:
18
+ uv run pre-commit run gitleaks --all-files
19
+
20
+ build-projects:
21
+ uv run mood build dev-docs
22
+ @for name in $$(uv run mood blueprint list --names-only); do \
23
+ echo "uv run mood build showcase/$$name"; \
24
+ uv run mood build showcase/$$name || exit 1; \
25
+ done
26
+
27
+ format:
28
+ uv run ruff format .
29
+
30
+ mirror-schemas:
31
+ cp src/another_mood/resources/schemas/*.yaml docs/reference/schemas/
32
+
33
+ # Project-size overview. cloc (the de-facto line counter) is run via the
34
+ # bundled `cloc-python`, fetched and cached by `uvx` — no system install.
35
+ # `--vcs=git` with a path counts only git-tracked files under that area.
36
+ STAT_AREAS = src tests
37
+
38
+ stats:
39
+ @uvx cloc-python --vcs=git .
40
+ @for d in $(STAT_AREAS); do \
41
+ echo ""; \
42
+ echo "== $$d =="; \
43
+ uvx cloc-python --vcs=git "$$d"; \
44
+ done
@@ -0,0 +1,56 @@
1
+ Metadata-Version: 2.4
2
+ Name: another-mood
3
+ Version: 0.1.0
4
+ Summary: A processor of source-based databases, keeping related documents in sync.
5
+ Project-URL: Homepage, https://github.com/watanabe-kf1983/another-mood
6
+ Project-URL: Repository, https://github.com/watanabe-kf1983/another-mood
7
+ Project-URL: Issues, https://github.com/watanabe-kf1983/another-mood/issues
8
+ Project-URL: Documentation, https://github.com/watanabe-kf1983/another-mood/tree/main/docs
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Requires-Python: >=3.12
12
+ Requires-Dist: filelock>=3.25.2
13
+ Requires-Dist: hugo>=0.162.0
14
+ Requires-Dist: markdown-it-py>=4.0.0
15
+ Requires-Dist: markupsafe>=3.0.3
16
+ Requires-Dist: mcp>=1.28.1
17
+ Requires-Dist: minijinja>=2.21.0
18
+ Requires-Dist: packaging>=26.0
19
+ Requires-Dist: pydantic-settings>=2.14.2
20
+ Requires-Dist: pyyaml>=6.0
21
+ Requires-Dist: regex>=2026.4.4
22
+ Requires-Dist: ruamel-yaml>=0.19.1
23
+ Requires-Dist: typer>=0.24.1
24
+ Requires-Dist: watchdog>=6.0.0
25
+ Description-Content-Type: text/markdown
26
+
27
+ # Another Mood
28
+
29
+ A processor of source-based databases, keeping related documents in sync.
30
+
31
+ Requirements specifications, product catalogs, maintenance manuals, training materials — documents like these keep describing the same things in different shapes. Introduce one new thing and you have to chase the same edit through several files, miss one, and let the set drift out of sync.
32
+
33
+ Another Mood keeps that set consistent. You write the data once as **sources** — YAML records and Markdown prose — alongside templates that say how pages are built from them. Edit a source, rebuild, and every page derived from it regenerates together.
34
+
35
+ ## Install
36
+
37
+ Requires Python 3.12 or later.
38
+
39
+ ```bash
40
+ pipx install another-mood
41
+ ```
42
+
43
+ If you use [uv](https://docs.astral.sh/uv/), `uv tool install` takes the same argument and fetches a suitable Python for you. Either way you get the `mood` command on your PATH, along with `mood-mcp` for coding agents.
44
+
45
+ ## Quick start
46
+
47
+ ```bash
48
+ mood init my-project
49
+ mood build my-project
50
+ ```
51
+
52
+ `mood init` scaffolds a small sample database; `mood build` turns it into Markdown and HTML under `.another-mood/my-project/`.
53
+
54
+ ## Documentation
55
+
56
+ [User guide](https://github.com/watanabe-kf1983/another-mood/blob/main/docs/index.md) — concepts and walkthrough, per-feature reference, and how to give coding agents the same operations over MCP. It ships with the package too, so an agent can read it through the MCP server without leaving your project.
@@ -0,0 +1,30 @@
1
+ # Another Mood
2
+
3
+ A processor of source-based databases, keeping related documents in sync.
4
+
5
+ Requirements specifications, product catalogs, maintenance manuals, training materials — documents like these keep describing the same things in different shapes. Introduce one new thing and you have to chase the same edit through several files, miss one, and let the set drift out of sync.
6
+
7
+ Another Mood keeps that set consistent. You write the data once as **sources** — YAML records and Markdown prose — alongside templates that say how pages are built from them. Edit a source, rebuild, and every page derived from it regenerates together.
8
+
9
+ ## Install
10
+
11
+ Requires Python 3.12 or later.
12
+
13
+ ```bash
14
+ pipx install another-mood
15
+ ```
16
+
17
+ If you use [uv](https://docs.astral.sh/uv/), `uv tool install` takes the same argument and fetches a suitable Python for you. Either way you get the `mood` command on your PATH, along with `mood-mcp` for coding agents.
18
+
19
+ ## Quick start
20
+
21
+ ```bash
22
+ mood init my-project
23
+ mood build my-project
24
+ ```
25
+
26
+ `mood init` scaffolds a small sample database; `mood build` turns it into Markdown and HTML under `.another-mood/my-project/`.
27
+
28
+ ## Documentation
29
+
30
+ [User guide](https://github.com/watanabe-kf1983/another-mood/blob/main/docs/index.md) — concepts and walkthrough, per-feature reference, and how to give coding agents the same operations over MCP. It ships with the package too, so an agent can read it through the MCP server without leaving your project.