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.
- another_mood-0.1.0/.claude/settings.json +20 -0
- another_mood-0.1.0/.devcontainer/README.md +16 -0
- another_mood-0.1.0/.devcontainer/devcontainer-lock.json +24 -0
- another_mood-0.1.0/.devcontainer/devcontainer.json +41 -0
- another_mood-0.1.0/.github/pull_request_template.md +13 -0
- another_mood-0.1.0/.github/workflows/ci.yml +35 -0
- another_mood-0.1.0/.github/workflows/fresh-deps.yml +37 -0
- another_mood-0.1.0/.gitignore +36 -0
- another_mood-0.1.0/.mcp.json +31 -0
- another_mood-0.1.0/.pre-commit-config.yaml +9 -0
- another_mood-0.1.0/.python-version +1 -0
- another_mood-0.1.0/.vscode/extensions.json +15 -0
- another_mood-0.1.0/.vscode/mcp.json +9 -0
- another_mood-0.1.0/.vscode/settings.json +6 -0
- another_mood-0.1.0/CLAUDE.md +1 -0
- another_mood-0.1.0/DEVELOPMENT.md +117 -0
- another_mood-0.1.0/LICENSE +21 -0
- another_mood-0.1.0/Makefile +44 -0
- another_mood-0.1.0/PKG-INFO +56 -0
- another_mood-0.1.0/README.md +30 -0
- another_mood-0.1.0/dev-docs/contents/10-background/10-product.md +88 -0
- another_mood-0.1.0/dev-docs/contents/10-background/20-another-mood-original.md +147 -0
- another_mood-0.1.0/dev-docs/contents/10-background/index.md +3 -0
- another_mood-0.1.0/dev-docs/contents/20-design/10-architecture.md +77 -0
- another_mood-0.1.0/dev-docs/contents/20-design/20-app/10-project-structure.md +39 -0
- another_mood-0.1.0/dev-docs/contents/20-design/20-app/20-config-spec.md +33 -0
- another_mood-0.1.0/dev-docs/contents/20-design/20-app/30-mcp-design.md +165 -0
- another_mood-0.1.0/dev-docs/contents/20-design/20-app/40-meta-documentation.md +140 -0
- another_mood-0.1.0/dev-docs/contents/20-design/20-app/50-system-dev-docs.md +121 -0
- another_mood-0.1.0/dev-docs/contents/20-design/20-app/60-sbdb-manifest.md +217 -0
- another_mood-0.1.0/dev-docs/contents/20-design/20-app/index.md +3 -0
- another_mood-0.1.0/dev-docs/contents/20-design/30-pipeline.md +31 -0
- another_mood-0.1.0/dev-docs/contents/20-design/40-communication/10-json-data-model.md +75 -0
- another_mood-0.1.0/dev-docs/contents/20-design/40-communication/20-prose-spec.md +38 -0
- another_mood-0.1.0/dev-docs/contents/20-design/40-communication/30-blob-spec.md +43 -0
- another_mood-0.1.0/dev-docs/contents/20-design/40-communication/index.md +21 -0
- another_mood-0.1.0/dev-docs/contents/20-design/50-normalizer/10-normalizer.md +57 -0
- another_mood-0.1.0/dev-docs/contents/20-design/50-normalizer/20-schema-spec.md +130 -0
- another_mood-0.1.0/dev-docs/contents/20-design/50-normalizer/30-markdown-parser-spec.md +88 -0
- another_mood-0.1.0/dev-docs/contents/20-design/50-normalizer/index.md +3 -0
- another_mood-0.1.0/dev-docs/contents/20-design/60-composer/10-query-dsl-spec.md +145 -0
- another_mood-0.1.0/dev-docs/contents/20-design/60-composer/20-tap-spec.md +39 -0
- another_mood-0.1.0/dev-docs/contents/20-design/60-composer/index.md +3 -0
- another_mood-0.1.0/dev-docs/contents/20-design/70-generator/10-generator.md +83 -0
- another_mood-0.1.0/dev-docs/contents/20-design/70-generator/20-anchor-spec.md +282 -0
- another_mood-0.1.0/dev-docs/contents/20-design/70-generator/30-template-spec.md +51 -0
- another_mood-0.1.0/dev-docs/contents/20-design/70-generator/40-paging-spec.md +82 -0
- another_mood-0.1.0/dev-docs/contents/20-design/70-generator/50-output-format-spec.md +106 -0
- another_mood-0.1.0/dev-docs/contents/20-design/70-generator/60-template-trust-model.md +152 -0
- another_mood-0.1.0/dev-docs/contents/20-design/70-generator/index.md +3 -0
- another_mood-0.1.0/dev-docs/contents/20-design/index.md +7 -0
- another_mood-0.1.0/dev-docs/contents/30-dev/10-setup.md +38 -0
- another_mood-0.1.0/dev-docs/contents/30-dev/20-environment.md +103 -0
- another_mood-0.1.0/dev-docs/contents/30-dev/30-checks.md +47 -0
- another_mood-0.1.0/dev-docs/contents/30-dev/40-style-guide.md +30 -0
- another_mood-0.1.0/dev-docs/contents/30-dev/50-release.md +136 -0
- another_mood-0.1.0/dev-docs/contents/30-dev/index.md +3 -0
- another_mood-0.1.0/dev-docs/contents/index.md +5 -0
- another_mood-0.1.0/dev-docs/contents/tasks.yaml +793 -0
- another_mood-0.1.0/dev-docs/definition/reports.yaml +19 -0
- another_mood-0.1.0/dev-docs/definition/schema.yaml +44 -0
- another_mood-0.1.0/dev-docs/definition/templates/index.md +19 -0
- another_mood-0.1.0/dev-docs/definition/templates/prose.md +1 -0
- another_mood-0.1.0/dev-docs/definition/templates/roadmap.md +21 -0
- another_mood-0.1.0/dev-docs/definition/templates/tasks.md +30 -0
- another_mood-0.1.0/dev-docs/definition/views/.gitkeep +0 -0
- another_mood-0.1.0/dev-docs/definition/views/roadmap.yaml +18 -0
- another_mood-0.1.0/dev-docs/definition/views/tasks.yaml +7 -0
- another_mood-0.1.0/dev-docs/sbdb.yaml +5 -0
- another_mood-0.1.0/docs/catalog.yaml +65 -0
- another_mood-0.1.0/docs/guides.md +553 -0
- another_mood-0.1.0/docs/index.md +5 -0
- another_mood-0.1.0/docs/mcp.md +80 -0
- another_mood-0.1.0/docs/reference/cli.md +238 -0
- another_mood-0.1.0/docs/reference/index.md +15 -0
- another_mood-0.1.0/docs/reference/manifest.md +28 -0
- another_mood-0.1.0/docs/reference/reports.md +51 -0
- another_mood-0.1.0/docs/reference/schema.md +302 -0
- another_mood-0.1.0/docs/reference/schemas/content-schema.yaml +123 -0
- another_mood-0.1.0/docs/reference/schemas/manifest-schema.yaml +28 -0
- another_mood-0.1.0/docs/reference/schemas/reports-schema.yaml +78 -0
- another_mood-0.1.0/docs/reference/schemas/schema-schema.yaml +271 -0
- another_mood-0.1.0/docs/reference/schemas/view-schema.yaml +349 -0
- another_mood-0.1.0/docs/reference/template.md +464 -0
- another_mood-0.1.0/docs/reference/view.md +415 -0
- another_mood-0.1.0/pyproject.toml +86 -0
- another_mood-0.1.0/showcase/index.yaml +7 -0
- 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
- another_mood-0.1.0/showcase/japanese-table-design/contents//345/236/213/345/257/276/345/277/234.yaml +22 -0
- another_mood-0.1.0/showcase/japanese-table-design/definition/reports.yaml +6 -0
- another_mood-0.1.0/showcase/japanese-table-design/definition/schema.yaml +71 -0
- another_mood-0.1.0/showcase/japanese-table-design/definition/templates/index.md +50 -0
- 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
- 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
- another_mood-0.1.0/showcase/japanese-table-design/sbdb.yaml +5 -0
- another_mood-0.1.0/showcase/music/contents/albums.yaml +81 -0
- another_mood-0.1.0/showcase/music/contents/artists.yaml +74 -0
- another_mood-0.1.0/showcase/music/contents/background.md +13 -0
- another_mood-0.1.0/showcase/music/contents/covers/dawn_cassette.svg +1 -0
- another_mood-0.1.0/showcase/music/contents/covers/factory_lullabies.svg +1 -0
- another_mood-0.1.0/showcase/music/contents/covers/graphite_summer.svg +1 -0
- another_mood-0.1.0/showcase/music/contents/covers/last_train_to_dawn.svg +1 -0
- another_mood-0.1.0/showcase/music/contents/covers/neon_after_rain.png +0 -0
- another_mood-0.1.0/showcase/music/contents/covers/tidal_atlas.svg +1 -0
- another_mood-0.1.0/showcase/music/contents/covers/winter_in_the_machine.svg +1 -0
- another_mood-0.1.0/showcase/music/contents/genres.yaml +25 -0
- another_mood-0.1.0/showcase/music/contents/labels.yaml +15 -0
- another_mood-0.1.0/showcase/music/contents/liner-notes/neon_after_rain.md +9 -0
- another_mood-0.1.0/showcase/music/contents/liner-notes/tidal_atlas.md +9 -0
- another_mood-0.1.0/showcase/music/contents/liner-notes/winter_in_the_machine.md +7 -0
- another_mood-0.1.0/showcase/music/contents/playlist_tracks.yaml +16 -0
- another_mood-0.1.0/showcase/music/contents/playlists.yaml +15 -0
- another_mood-0.1.0/showcase/music/contents/tracks.yaml +163 -0
- another_mood-0.1.0/showcase/music/definition/reports.yaml +23 -0
- another_mood-0.1.0/showcase/music/definition/schema.yaml +179 -0
- another_mood-0.1.0/showcase/music/definition/templates/album-detail.md +29 -0
- another_mood-0.1.0/showcase/music/definition/templates/artist-detail.md +29 -0
- another_mood-0.1.0/showcase/music/definition/templates/index.md +115 -0
- another_mood-0.1.0/showcase/music/definition/templates/prose.md +2 -0
- another_mood-0.1.0/showcase/music/definition/views/albums_by_genre.yaml +32 -0
- another_mood-0.1.0/showcase/music/definition/views/artist_members.yaml +15 -0
- another_mood-0.1.0/showcase/music/definition/views/discography.yaml +69 -0
- another_mood-0.1.0/showcase/music/definition/views/live_albums.yaml +11 -0
- another_mood-0.1.0/showcase/music/definition/views/live_tracks.yaml +10 -0
- another_mood-0.1.0/showcase/music/definition/views/playlists.yaml +36 -0
- another_mood-0.1.0/showcase/music/definition/views/tracklists.yaml +47 -0
- another_mood-0.1.0/showcase/music/sbdb.yaml +5 -0
- another_mood-0.1.0/showcase/starter/contents/about.md +3 -0
- another_mood-0.1.0/showcase/starter/contents/members.yaml +18 -0
- another_mood-0.1.0/showcase/starter/definition/reports.yaml +7 -0
- another_mood-0.1.0/showcase/starter/definition/schema.yaml +23 -0
- another_mood-0.1.0/showcase/starter/definition/templates/by_role.md +6 -0
- another_mood-0.1.0/showcase/starter/definition/templates/index.md +17 -0
- another_mood-0.1.0/showcase/starter/definition/templates/member.md +5 -0
- another_mood-0.1.0/showcase/starter/definition/templates/prose.md +1 -0
- another_mood-0.1.0/showcase/starter/definition/views/active_members.yaml +8 -0
- another_mood-0.1.0/showcase/starter/definition/views/by_role.yaml +9 -0
- another_mood-0.1.0/showcase/starter/sbdb.yaml +5 -0
- another_mood-0.1.0/src/another_mood/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/cli.py +289 -0
- another_mood-0.1.0/src/another_mood/command.py +302 -0
- another_mood-0.1.0/src/another_mood/components/__init__.py +20 -0
- another_mood-0.1.0/src/another_mood/components/composer/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/composer/composer.py +50 -0
- another_mood-0.1.0/src/another_mood/components/docs_catalog/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/docs_catalog/catalog.py +98 -0
- another_mood-0.1.0/src/another_mood/components/generator/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/generator/data_tree.py +443 -0
- another_mood-0.1.0/src/another_mood/components/generator/data_tree_filters.py +171 -0
- another_mood-0.1.0/src/another_mood/components/generator/edition.py +167 -0
- another_mood-0.1.0/src/another_mood/components/generator/generator.py +205 -0
- another_mood-0.1.0/src/another_mood/components/generator/inert.py +142 -0
- another_mood-0.1.0/src/another_mood/components/generator/meta_templates.py +224 -0
- another_mood-0.1.0/src/another_mood/components/generator/omitted.py +23 -0
- another_mood-0.1.0/src/another_mood/components/generator/output_formats/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/generator/output_formats/heading_shift.py +95 -0
- another_mood-0.1.0/src/another_mood/components/generator/output_formats/md.py +276 -0
- another_mood-0.1.0/src/another_mood/components/generator/render_processor.py +136 -0
- another_mood-0.1.0/src/another_mood/components/generator/template_engine.py +289 -0
- another_mood-0.1.0/src/another_mood/components/generator/template_safe.py +27 -0
- another_mood-0.1.0/src/another_mood/components/generator/url.py +43 -0
- another_mood-0.1.0/src/another_mood/components/manifest/__init__.py +23 -0
- another_mood-0.1.0/src/another_mood/components/manifest/manifest.py +178 -0
- another_mood-0.1.0/src/another_mood/components/preprocess/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/preprocess/content_normalizer.py +178 -0
- another_mood-0.1.0/src/another_mood/components/preprocess/data_fk_validator.py +152 -0
- another_mood-0.1.0/src/another_mood/components/preprocess/normalize_core.py +125 -0
- another_mood-0.1.0/src/another_mood/components/preprocess/prose.py +183 -0
- another_mood-0.1.0/src/another_mood/components/preprocess/query_deriver.py +256 -0
- another_mood-0.1.0/src/another_mood/components/preprocess/query_normalizer.py +140 -0
- another_mood-0.1.0/src/another_mood/components/preprocess/schema_inspector.py +204 -0
- another_mood-0.1.0/src/another_mood/components/preprocess/schema_tree.py +307 -0
- another_mood-0.1.0/src/another_mood/components/publish/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/publish/publish.py +30 -0
- another_mood-0.1.0/src/another_mood/components/scaffold/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/scaffold/blueprints.py +119 -0
- another_mood-0.1.0/src/another_mood/components/shared/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/shared/component/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/shared/component/build_report.py +212 -0
- another_mood-0.1.0/src/another_mood/components/shared/component/component.py +176 -0
- another_mood-0.1.0/src/another_mood/components/shared/component/dir_lock.py +137 -0
- another_mood-0.1.0/src/another_mood/components/shared/component/errors.py +115 -0
- another_mood-0.1.0/src/another_mood/components/shared/data_catalog.py +378 -0
- another_mood-0.1.0/src/another_mood/components/shared/file_type.py +25 -0
- another_mood-0.1.0/src/another_mood/components/shared/json_data_model.py +219 -0
- another_mood-0.1.0/src/another_mood/components/shared/markdown.py +225 -0
- another_mood-0.1.0/src/another_mood/components/shared/query.py +554 -0
- another_mood-0.1.0/src/another_mood/components/shared/record_predicate.py +208 -0
- another_mood-0.1.0/src/another_mood/components/shared/transfer.py +29 -0
- another_mood-0.1.0/src/another_mood/components/shared/user_error.py +30 -0
- another_mood-0.1.0/src/another_mood/components/shared/user_source/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/shared/user_source/diagnostic.py +221 -0
- another_mood-0.1.0/src/another_mood/components/shared/user_source/position_resolver.py +97 -0
- another_mood-0.1.0/src/another_mood/components/shared/user_source/source_loader.py +281 -0
- another_mood-0.1.0/src/another_mood/components/shared/user_source/validator.py +120 -0
- another_mood-0.1.0/src/another_mood/components/shared/windows_reserved_name.py +64 -0
- another_mood-0.1.0/src/another_mood/components/tap/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/components/tap/tap.py +14 -0
- another_mood-0.1.0/src/another_mood/config.py +92 -0
- another_mood-0.1.0/src/another_mood/layout.py +109 -0
- another_mood-0.1.0/src/another_mood/mcp_server.py +174 -0
- another_mood-0.1.0/src/another_mood/pipeline/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/pipeline/adapters/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/pipeline/adapters/hugo.py +67 -0
- another_mood-0.1.0/src/another_mood/pipeline/adapters/preparation.py +100 -0
- another_mood-0.1.0/src/another_mood/pipeline/adapters/watcher.py +85 -0
- another_mood-0.1.0/src/another_mood/pipeline/base.py +132 -0
- another_mood-0.1.0/src/another_mood/pipeline/site.py +130 -0
- another_mood-0.1.0/src/another_mood/pipeline/stages.py +252 -0
- another_mood-0.1.0/src/another_mood/pipeline/workspace.py +35 -0
- another_mood-0.1.0/src/another_mood/resources/__init__.py +0 -0
- another_mood-0.1.0/src/another_mood/resources/hugo/.gitignore +1 -0
- another_mood-0.1.0/src/another_mood/resources/hugo/.hugo_build.lock +0 -0
- another_mood-0.1.0/src/another_mood/resources/hugo/hugo.toml +14 -0
- another_mood-0.1.0/src/another_mood/resources/hugo/layouts/_default/baseof.html +19 -0
- another_mood-0.1.0/src/another_mood/resources/hugo/layouts/_default/list.html +3 -0
- another_mood-0.1.0/src/another_mood/resources/hugo/layouts/_default/single.html +3 -0
- another_mood-0.1.0/src/another_mood/resources/hugo/layouts/index.html +3 -0
- another_mood-0.1.0/src/another_mood/resources/schemas/content-schema.yaml +123 -0
- another_mood-0.1.0/src/another_mood/resources/schemas/manifest-schema.yaml +28 -0
- another_mood-0.1.0/src/another_mood/resources/schemas/reports-schema.yaml +78 -0
- another_mood-0.1.0/src/another_mood/resources/schemas/schema-schema.yaml +271 -0
- another_mood-0.1.0/src/another_mood/resources/schemas/view-schema.yaml +349 -0
- another_mood-0.1.0/src/another_mood/resources/templates/build_report/build_failure.md +28 -0
- another_mood-0.1.0/src/another_mood/resources/templates/build_report/warnings.md +12 -0
- another_mood-0.1.0/src/another_mood/resources/templates/cover/index.md +13 -0
- another_mood-0.1.0/src/another_mood/resources/templates/meta/data.md +14 -0
- another_mood-0.1.0/src/another_mood/resources/templates/meta/entity_def.md +75 -0
- another_mood-0.1.0/src/another_mood/resources/templates/meta/index.md +62 -0
- another_mood-0.1.0/src/another_mood/resources/templates/meta/record_table.md +29 -0
- another_mood-0.1.0/src/another_mood/resources/templates/meta/view_def.md +120 -0
- another_mood-0.1.0/src/another_mood/resources/views/meta.yaml +77 -0
- another_mood-0.1.0/tests/__init__.py +0 -0
- another_mood-0.1.0/tests/components/__init__.py +0 -0
- another_mood-0.1.0/tests/components/composer/__init__.py +0 -0
- another_mood-0.1.0/tests/components/composer/test_composer.py +271 -0
- another_mood-0.1.0/tests/components/docs_catalog/__init__.py +0 -0
- another_mood-0.1.0/tests/components/docs_catalog/test_catalog.py +64 -0
- another_mood-0.1.0/tests/components/generator/__init__.py +0 -0
- another_mood-0.1.0/tests/components/generator/output_formats/__init__.py +0 -0
- another_mood-0.1.0/tests/components/generator/output_formats/test_heading_shift.py +71 -0
- another_mood-0.1.0/tests/components/generator/output_formats/test_md.py +676 -0
- another_mood-0.1.0/tests/components/generator/test_data_tree.py +501 -0
- another_mood-0.1.0/tests/components/generator/test_data_tree_filters.py +359 -0
- another_mood-0.1.0/tests/components/generator/test_edition.py +205 -0
- another_mood-0.1.0/tests/components/generator/test_generator.py +289 -0
- another_mood-0.1.0/tests/components/generator/test_inert.py +116 -0
- another_mood-0.1.0/tests/components/generator/test_markdown_engine.py +122 -0
- another_mood-0.1.0/tests/components/generator/test_meta_templates.py +209 -0
- another_mood-0.1.0/tests/components/generator/test_render_processor.py +397 -0
- another_mood-0.1.0/tests/components/generator/test_ssti.py +339 -0
- another_mood-0.1.0/tests/components/generator/test_template_engine.py +451 -0
- another_mood-0.1.0/tests/components/generator/test_template_safe.py +173 -0
- another_mood-0.1.0/tests/components/generator/test_url.py +43 -0
- another_mood-0.1.0/tests/components/manifest/__init__.py +0 -0
- another_mood-0.1.0/tests/components/manifest/test_manifest.py +241 -0
- another_mood-0.1.0/tests/components/preprocess/__init__.py +0 -0
- another_mood-0.1.0/tests/components/preprocess/test_content_normalizer.py +456 -0
- another_mood-0.1.0/tests/components/preprocess/test_data_fk_validator.py +357 -0
- another_mood-0.1.0/tests/components/preprocess/test_dict_to_array.py +319 -0
- another_mood-0.1.0/tests/components/preprocess/test_normalize_core.py +194 -0
- another_mood-0.1.0/tests/components/preprocess/test_prose.py +360 -0
- another_mood-0.1.0/tests/components/preprocess/test_query_deriver.py +514 -0
- another_mood-0.1.0/tests/components/preprocess/test_query_normalizer.py +315 -0
- another_mood-0.1.0/tests/components/preprocess/test_schema_inspector.py +1011 -0
- another_mood-0.1.0/tests/components/preprocess/test_schema_tree.py +511 -0
- another_mood-0.1.0/tests/components/preprocess/test_schema_tree_integration.py +394 -0
- another_mood-0.1.0/tests/components/publish/__init__.py +0 -0
- another_mood-0.1.0/tests/components/publish/test_publish.py +89 -0
- another_mood-0.1.0/tests/components/scaffold/__init__.py +0 -0
- another_mood-0.1.0/tests/components/scaffold/test_blueprints.py +134 -0
- another_mood-0.1.0/tests/components/shared/__init__.py +0 -0
- another_mood-0.1.0/tests/components/shared/component/__init__.py +0 -0
- another_mood-0.1.0/tests/components/shared/component/test_build_report.py +128 -0
- another_mood-0.1.0/tests/components/shared/component/test_component.py +205 -0
- another_mood-0.1.0/tests/components/shared/component/test_dir_lock.py +160 -0
- another_mood-0.1.0/tests/components/shared/component/test_errors.py +247 -0
- another_mood-0.1.0/tests/components/shared/test_data_catalog.py +292 -0
- another_mood-0.1.0/tests/components/shared/test_file_type.py +66 -0
- another_mood-0.1.0/tests/components/shared/test_json_data_model.py +248 -0
- another_mood-0.1.0/tests/components/shared/test_markdown.py +200 -0
- another_mood-0.1.0/tests/components/shared/test_query.py +1429 -0
- another_mood-0.1.0/tests/components/shared/test_record_predicate.py +351 -0
- another_mood-0.1.0/tests/components/shared/test_transfer.py +80 -0
- another_mood-0.1.0/tests/components/shared/test_user_error.py +9 -0
- another_mood-0.1.0/tests/components/shared/test_windows_reserved_name.py +144 -0
- another_mood-0.1.0/tests/components/shared/user_source/__init__.py +0 -0
- another_mood-0.1.0/tests/components/shared/user_source/test_diagnostic.py +308 -0
- another_mood-0.1.0/tests/components/shared/user_source/test_position_resolver.py +109 -0
- another_mood-0.1.0/tests/components/shared/user_source/test_source_loader.py +312 -0
- another_mood-0.1.0/tests/components/shared/user_source/test_validator.py +137 -0
- another_mood-0.1.0/tests/components/tap/__init__.py +0 -0
- another_mood-0.1.0/tests/components/tap/test_tap.py +22 -0
- another_mood-0.1.0/tests/pipeline/__init__.py +0 -0
- another_mood-0.1.0/tests/pipeline/test_preparation.py +218 -0
- another_mood-0.1.0/tests/pipeline/test_tap_pipeline.py +28 -0
- another_mood-0.1.0/tests/pipeline/test_write_once_sweep.py +178 -0
- another_mood-0.1.0/tests/test_command.py +59 -0
- another_mood-0.1.0/tests/test_config.py +110 -0
- another_mood-0.1.0/tests/test_docs_sync.py +40 -0
- another_mood-0.1.0/tests/test_layout.py +148 -0
- 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 @@
|
|
|
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 @@
|
|
|
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.
|