code-agnostic 0.3.17__tar.gz → 0.3.18__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 (169) hide show
  1. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/PKG-INFO +4 -1
  2. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/README.md +3 -0
  3. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/__init__.py +1 -1
  4. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/apps_service.py +2 -1
  5. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/codex/schema.json +325 -50
  6. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/apply.py +8 -2
  7. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/plan.py +14 -3
  8. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/planner.py +25 -22
  9. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/tui/renderers.py +13 -4
  10. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic.egg-info/PKG-INFO +4 -1
  11. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/pyproject.toml +1 -1
  12. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_apply_apps.py +37 -3
  13. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_apply_codex.py +4 -2
  14. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_plan.py +12 -0
  15. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_workspace_config_sync.py +5 -1
  16. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/LICENSE +0 -0
  17. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/__main__.py +0 -0
  18. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/agents/__init__.py +0 -0
  19. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/agents/claude.py +0 -0
  20. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/agents/codex.py +0 -0
  21. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/agents/compilers.py +0 -0
  22. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/agents/copilot.py +0 -0
  23. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/agents/models.py +0 -0
  24. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/agents/opencode.py +0 -0
  25. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/agents/parser.py +0 -0
  26. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/__init__.py +0 -0
  27. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/app_id.py +0 -0
  28. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/claude/__init__.py +0 -0
  29. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/claude/config_repository.py +0 -0
  30. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/claude/mapper.py +0 -0
  31. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/claude/service.py +0 -0
  32. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/codex/__init__.py +0 -0
  33. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/codex/config_repository.py +0 -0
  34. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/codex/mapper.py +0 -0
  35. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/codex/schema_repository.py +0 -0
  36. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/codex/service.py +0 -0
  37. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/__init__.py +0 -0
  38. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/compiled_planning.py +0 -0
  39. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/framework.py +0 -0
  40. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/interfaces/__init__.py +0 -0
  41. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/interfaces/mapper.py +0 -0
  42. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/interfaces/repositories.py +0 -0
  43. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/interfaces/service.py +0 -0
  44. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/loader.py +0 -0
  45. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/models.py +0 -0
  46. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/schema.py +0 -0
  47. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/symlink_planning.py +0 -0
  48. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/common/utils.py +0 -0
  49. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/copilot/__init__.py +0 -0
  50. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/copilot/config_repository.py +0 -0
  51. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/copilot/mapper.py +0 -0
  52. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/copilot/service.py +0 -0
  53. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/cursor/__init__.py +0 -0
  54. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/cursor/config_repository.py +0 -0
  55. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/cursor/mapper.py +0 -0
  56. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/cursor/schema.json +0 -0
  57. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/cursor/schema_repository.py +0 -0
  58. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/cursor/service.py +0 -0
  59. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/opencode/__init__.py +0 -0
  60. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/opencode/config_repository.py +0 -0
  61. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/opencode/mapper.py +0 -0
  62. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/opencode/schema.json +0 -0
  63. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/opencode/schema_repository.py +0 -0
  64. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/apps/opencode/service.py +0 -0
  65. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/__init__.py +0 -0
  66. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/aliases.py +0 -0
  67. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/__init__.py +0 -0
  68. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/agents.py +0 -0
  69. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/apps.py +0 -0
  70. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/explain_lossiness.py +0 -0
  71. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/import_.py +0 -0
  72. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/mcp.py +0 -0
  73. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/projects.py +0 -0
  74. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/restore.py +0 -0
  75. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/rules.py +0 -0
  76. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/skills.py +0 -0
  77. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/status.py +0 -0
  78. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/validate.py +0 -0
  79. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/commands/workspaces.py +0 -0
  80. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/helpers.py +0 -0
  81. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/cli/options.py +0 -0
  82. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/constants.py +0 -0
  83. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/core/__init__.py +0 -0
  84. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/core/project_repository.py +0 -0
  85. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/core/repository.py +0 -0
  86. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/core/workspace_repository.py +0 -0
  87. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/errors.py +0 -0
  88. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/executor.py +0 -0
  89. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/generated_artifacts.py +0 -0
  90. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/git_exclude_service.py +0 -0
  91. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/imports/__init__.py +0 -0
  92. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/imports/adapters.py +0 -0
  93. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/imports/filesystem.py +0 -0
  94. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/imports/models.py +0 -0
  95. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/imports/service.py +0 -0
  96. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/lossiness.py +0 -0
  97. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/mcp_service.py +0 -0
  98. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/models.py +0 -0
  99. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/project_artifacts.py +0 -0
  100. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/rules/__init__.py +0 -0
  101. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/rules/compilers.py +0 -0
  102. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/rules/models.py +0 -0
  103. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/rules/parser.py +0 -0
  104. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/rules/repository.py +0 -0
  105. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/skills/__init__.py +0 -0
  106. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/skills/compilers.py +0 -0
  107. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/skills/install_sources.py +0 -0
  108. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/skills/models.py +0 -0
  109. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/skills/parser.py +0 -0
  110. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/spec/__init__.py +0 -0
  111. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/spec/loaders.py +0 -0
  112. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/spec/schemas/agent.v1.schema.json +0 -0
  113. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/spec/schemas/mcp.base.schema.json +0 -0
  114. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/spec/schemas/mcp.v1.schema.json +0 -0
  115. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/spec/schemas/rule.v1.schema.json +0 -0
  116. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/spec/schemas/skill.v1.schema.json +0 -0
  117. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/status.py +0 -0
  118. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/tui/__init__.py +0 -0
  119. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/tui/enums.py +0 -0
  120. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/tui/import_selector.py +0 -0
  121. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/tui/sections.py +0 -0
  122. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/tui/tables.py +0 -0
  123. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/utils.py +0 -0
  124. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/validation.py +0 -0
  125. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/workspace_artifacts.py +0 -0
  126. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic/workspaces.py +0 -0
  127. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic.egg-info/SOURCES.txt +0 -0
  128. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic.egg-info/dependency_links.txt +0 -0
  129. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic.egg-info/entry_points.txt +0 -0
  130. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic.egg-info/requires.txt +0 -0
  131. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/code_agnostic.egg-info/top_level.txt +0 -0
  132. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/setup.cfg +0 -0
  133. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_agents.py +0 -0
  134. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_aliases.py +0 -0
  135. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_apply_cursor.py +0 -0
  136. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_apply_target.py +0 -0
  137. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_apps.py +0 -0
  138. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_explain_lossiness.py +0 -0
  139. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_flags.py +0 -0
  140. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_git_exclude.py +0 -0
  141. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_import.py +0 -0
  142. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_import_interactive.py +0 -0
  143. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_mcp.py +0 -0
  144. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_module_organization.py +0 -0
  145. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_projects.py +0 -0
  146. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_restore.py +0 -0
  147. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_rules.py +0 -0
  148. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_skills.py +0 -0
  149. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_status.py +0 -0
  150. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_validate.py +0 -0
  151. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_workspace_resolution.py +0 -0
  152. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_cli_workspaces.py +0 -0
  153. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_common_mcp_to_dto.py +0 -0
  154. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_common_repository.py +0 -0
  155. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_compiled_planning.py +0 -0
  156. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_dto_to_common_mcp.py +0 -0
  157. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_git_exclude_service.py +0 -0
  158. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_mcp_service.py +0 -0
  159. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_planner_executor.py +0 -0
  160. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_planner_rules.py +0 -0
  161. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_project_config_sync.py +0 -0
  162. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_skill_install_sources.py +0 -0
  163. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_symlink_planning.py +0 -0
  164. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_sync_plan_model.py +0 -0
  165. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_transactional_executor.py +0 -0
  166. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_utils.py +0 -0
  167. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_version.py +0 -0
  168. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_workspace_repo_status.py +0 -0
  169. {code_agnostic-0.3.17 → code_agnostic-0.3.18}/tests/test_workspaces.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-agnostic
3
- Version: 0.3.17
3
+ Version: 0.3.18
4
4
  Summary: Centralized hub for LLM coding config: MCP, skills, rules, and agents.
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -305,7 +305,10 @@ code-agnostic workspaces list
305
305
 
306
306
  Prevent synced paths from showing up in `git status`. Managed per-workspace with customizable patterns.
307
307
 
308
+ Writing `.git/info/exclude` is always explicit — `apply` does **not** touch it by default. Opt in per run with `apply --apply-excludes`, or use the standalone command:
309
+
308
310
  ```bash
311
+ code-agnostic apply --apply-excludes # apply + write excludes
309
312
  code-agnostic workspaces git-exclude # all workspaces
310
313
  code-agnostic workspaces git-exclude -w myproject # one workspace
311
314
  code-agnostic workspaces exclude-add --pattern "*.generated" -w myproject
@@ -280,7 +280,10 @@ code-agnostic workspaces list
280
280
 
281
281
  Prevent synced paths from showing up in `git status`. Managed per-workspace with customizable patterns.
282
282
 
283
+ Writing `.git/info/exclude` is always explicit — `apply` does **not** touch it by default. Opt in per run with `apply --apply-excludes`, or use the standalone command:
284
+
283
285
  ```bash
286
+ code-agnostic apply --apply-excludes # apply + write excludes
284
287
  code-agnostic workspaces git-exclude # all workspaces
285
288
  code-agnostic workspaces git-exclude -w myproject # one workspace
286
289
  code-agnostic workspaces exclude-add --pattern "*.generated" -w myproject
@@ -1,3 +1,3 @@
1
1
  __all__ = ["__version__"]
2
2
 
3
- __version__ = "0.3.17"
3
+ __version__ = "0.3.18"
@@ -84,7 +84,7 @@ class AppsService:
84
84
  apps = self.load_apps()
85
85
  return [name for name in self.available_apps() if apps.get(name, False)]
86
86
 
87
- def plan_for_target(self, target: str) -> SyncPlan:
87
+ def plan_for_target(self, target: str, *, apply_excludes: bool = False) -> SyncPlan:
88
88
  normalized = target.lower()
89
89
  if normalized != "all" and not self.is_enabled(normalized):
90
90
  return SyncPlan([], [], [f"{normalized} is disabled for sync."])
@@ -94,6 +94,7 @@ class AppsService:
94
94
  core=self.core_repository,
95
95
  app_services=app_services,
96
96
  include_workspace=True,
97
+ include_git_excludes=apply_excludes,
97
98
  ).build()
98
99
  if normalized == "all":
99
100
  if (