cartograph-cli 0.7.3__tar.gz → 0.7.4__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 (235) hide show
  1. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/PKG-INFO +1 -1
  2. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/pyproject.toml +1 -1
  3. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/cli.py +88 -40
  4. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/config.py +16 -1
  5. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_cli_contract.py +2 -2
  6. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_search.py +35 -0
  7. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/.githooks/pre-push +0 -0
  8. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/.github/FUNDING.yml +0 -0
  9. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/.github/workflows/fresh-install.yml +0 -0
  10. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/.github/workflows/publish.yml +0 -0
  11. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/.github/workflows/test.yml +0 -0
  12. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/.gitignore +0 -0
  13. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/CLAUDE.md +0 -0
  14. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/CONTRIBUTING.md +0 -0
  15. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/LICENSE +0 -0
  16. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/README.md +0 -0
  17. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/VALIDATION.md +0 -0
  18. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/architect.mmd +0 -0
  19. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/architect.py +0 -0
  20. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_graph_cycles_python/.cartograph_source +0 -0
  21. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_graph_cycles_python/.validation_stamp.json +0 -0
  22. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_graph_cycles_python/examples/example_usage.py +0 -0
  23. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_graph_cycles_python/src/__init__.py +0 -0
  24. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_graph_cycles_python/src/graph_cycles.py +0 -0
  25. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_graph_cycles_python/tests/test_graph_cycles.py +0 -0
  26. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_graph_cycles_python/widget.json +0 -0
  27. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_mermaid_graph_renderer_python/.validation_stamp.json +0 -0
  28. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_mermaid_graph_renderer_python/examples/example_usage.py +0 -0
  29. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_mermaid_graph_renderer_python/src/__init__.py +0 -0
  30. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_mermaid_graph_renderer_python/src/mermaid_graph_renderer.py +0 -0
  31. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_mermaid_graph_renderer_python/tests/test_mermaid_graph_renderer.py +0 -0
  32. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_mermaid_graph_renderer_python/widget.json +0 -0
  33. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_python_module_loader_python/examples/example_usage.py +0 -0
  34. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_python_module_loader_python/src/__init__.py +0 -0
  35. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_python_module_loader_python/src/python_module_loader.py +0 -0
  36. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_python_module_loader_python/tests/test_python_module_loader.py +0 -0
  37. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/cg_universal_python_module_loader_python/widget.json +0 -0
  38. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_agent_cli_python/.cartograph_source +0 -0
  39. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_agent_cli_python/examples/example_usage.py +0 -0
  40. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_agent_cli_python/src/__init__.py +0 -0
  41. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_agent_cli_python/src/agent_cli.py +0 -0
  42. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_agent_cli_python/tests/test_agent_cli.py +0 -0
  43. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_agent_cli_python/widget.json +0 -0
  44. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_archive_manifest_consistency_python/examples/example_usage.py +0 -0
  45. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_archive_manifest_consistency_python/src/__init__.py +0 -0
  46. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_archive_manifest_consistency_python/src/archive_manifest_consistency.py +0 -0
  47. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_archive_manifest_consistency_python/tests/test_archive_manifest_consistency.py +0 -0
  48. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_archive_manifest_consistency_python/widget.json +0 -0
  49. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_binary_resolver_python/.validation_stamp.json +0 -0
  50. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_binary_resolver_python/examples/example_usage.py +0 -0
  51. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_binary_resolver_python/src/__init__.py +0 -0
  52. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_binary_resolver_python/src/binary_resolver.py +0 -0
  53. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_binary_resolver_python/tests/test_binary_resolver.py +0 -0
  54. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_binary_resolver_python/widget.json +0 -0
  55. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_command_catalog_python/.validation_stamp.json +0 -0
  56. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_command_catalog_python/examples/example_usage.py +0 -0
  57. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_command_catalog_python/src/__init__.py +0 -0
  58. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_command_catalog_python/src/command_catalog.py +0 -0
  59. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_command_catalog_python/tests/test_command_catalog.py +0 -0
  60. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_command_catalog_python/widget.json +0 -0
  61. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_directory_tarball_python/examples/example_usage.py +0 -0
  62. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_directory_tarball_python/src/__init__.py +0 -0
  63. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_directory_tarball_python/src/directory_tarball.py +0 -0
  64. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_directory_tarball_python/tests/test_directory_tarball.py +0 -0
  65. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_directory_tarball_python/widget.json +0 -0
  66. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_file_stamp_python/.validation_stamp.json +0 -0
  67. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_file_stamp_python/examples/example_usage.py +0 -0
  68. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_file_stamp_python/src/__init__.py +0 -0
  69. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_file_stamp_python/src/file_stamp.py +0 -0
  70. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_file_stamp_python/tests/test_file_stamp.py +0 -0
  71. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_file_stamp_python/widget.json +0 -0
  72. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_http_endpoint_registry_python/.validation_stamp.json +0 -0
  73. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_http_endpoint_registry_python/examples/example_usage.py +0 -0
  74. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_http_endpoint_registry_python/src/__init__.py +0 -0
  75. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_http_endpoint_registry_python/src/http_endpoint_registry.py +0 -0
  76. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_http_endpoint_registry_python/tests/test_http_endpoint_registry.py +0 -0
  77. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_http_endpoint_registry_python/widget.json +0 -0
  78. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_openapi_generator_python/.validation_stamp.json +0 -0
  79. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_openapi_generator_python/examples/example_usage.py +0 -0
  80. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_openapi_generator_python/src/__init__.py +0 -0
  81. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_openapi_generator_python/src/openapi_generator.py +0 -0
  82. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_openapi_generator_python/tests/test_openapi_generator.py +0 -0
  83. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_openapi_generator_python/widget.json +0 -0
  84. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_pinned_deps_resolver_python/examples/example_usage.py +0 -0
  85. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_pinned_deps_resolver_python/src/__init__.py +0 -0
  86. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_pinned_deps_resolver_python/src/pinned_deps_resolver.py +0 -0
  87. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_pinned_deps_resolver_python/tests/test_pinned_deps_resolver.py +0 -0
  88. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_pinned_deps_resolver_python/widget.json +0 -0
  89. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_prefix_router_python/examples/example_usage.py +0 -0
  90. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_prefix_router_python/src/__init__.py +0 -0
  91. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_prefix_router_python/src/prefix_router.py +0 -0
  92. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_prefix_router_python/tests/test_prefix_router.py +0 -0
  93. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_prefix_router_python/widget.json +0 -0
  94. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_urllib_client_python/.validation_stamp.json +0 -0
  95. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_urllib_client_python/examples/example_usage.py +0 -0
  96. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_urllib_client_python/src/__init__.py +0 -0
  97. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_urllib_client_python/src/urllib_client.py +0 -0
  98. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_urllib_client_python/tests/test_urllib_client.py +0 -0
  99. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_urllib_client_python/widget.json +0 -0
  100. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_version_bump_policy_python/examples/example_usage.py +0 -0
  101. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_version_bump_policy_python/src/__init__.py +0 -0
  102. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_version_bump_policy_python/src/version_bump_policy.py +0 -0
  103. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_version_bump_policy_python/tests/test_version_bump_policy.py +0 -0
  104. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/infra_version_bump_policy_python/widget.json +0 -0
  105. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_block_walker_python/.validation_stamp.json +0 -0
  106. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_block_walker_python/examples/example_usage.py +0 -0
  107. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_block_walker_python/src/__init__.py +0 -0
  108. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_block_walker_python/src/block_walker.py +0 -0
  109. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_block_walker_python/tests/test_block_walker.py +0 -0
  110. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_block_walker_python/widget.json +0 -0
  111. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_build_artifact_ignore_python/.validation_stamp.json +0 -0
  112. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_build_artifact_ignore_python/examples/example_usage.py +0 -0
  113. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_build_artifact_ignore_python/src/__init__.py +0 -0
  114. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_build_artifact_ignore_python/src/build_artifact_ignore.py +0 -0
  115. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_build_artifact_ignore_python/tests/test_build_artifact_ignore.py +0 -0
  116. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_build_artifact_ignore_python/widget.json +0 -0
  117. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_list_paginator_python/.validation_stamp.json +0 -0
  118. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_list_paginator_python/examples/example_usage.py +0 -0
  119. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_list_paginator_python/src/__init__.py +0 -0
  120. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_list_paginator_python/src/list_paginator.py +0 -0
  121. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_list_paginator_python/tests/test_list_paginator.py +0 -0
  122. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_list_paginator_python/widget.json +0 -0
  123. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_ttl_disk_cache_python/.validation_stamp.json +0 -0
  124. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_ttl_disk_cache_python/examples/example_usage.py +0 -0
  125. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_ttl_disk_cache_python/src/__init__.py +0 -0
  126. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_ttl_disk_cache_python/src/ttl_disk_cache.py +0 -0
  127. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_ttl_disk_cache_python/tests/test_ttl_disk_cache.py +0 -0
  128. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/cg/universal_ttl_disk_cache_python/widget.json +0 -0
  129. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/docs/languages/nim.md +0 -0
  130. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-1024.png +0 -0
  131. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-128.png +0 -0
  132. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-256.png +0 -0
  133. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-512.png +0 -0
  134. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-black-1024.png +0 -0
  135. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-black-128.png +0 -0
  136. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-black-256.png +0 -0
  137. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-black-512.png +0 -0
  138. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-black.svg +0 -0
  139. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-white-1024.png +0 -0
  140. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-white-128.png +0 -0
  141. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-white-256.png +0 -0
  142. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-white-512.png +0 -0
  143. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph-white.svg +0 -0
  144. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/logo/logo-cartograph.svg +0 -0
  145. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/pytest.ini +0 -0
  146. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/scripts/bump_version.sh +0 -0
  147. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/scripts/preflight.sh +0 -0
  148. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/__init__.py +0 -0
  149. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/__main__.py +0 -0
  150. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/architect/__init__.py +0 -0
  151. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/architect/loader.py +0 -0
  152. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/architect/markdown.py +0 -0
  153. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/architect/mutate.py +0 -0
  154. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/architect/paths.py +0 -0
  155. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/architect/renderer.py +0 -0
  156. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/architect/scaffold.py +0 -0
  157. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/architect/schema.py +0 -0
  158. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/architect/validator.py +0 -0
  159. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/auth.py +0 -0
  160. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/blueprint_checkin.py +0 -0
  161. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/blueprint_deps.py +0 -0
  162. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/blueprint_install.py +0 -0
  163. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/blueprint_publish.py +0 -0
  164. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/blueprint_status.py +0 -0
  165. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/blueprint_validator.py +0 -0
  166. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/blueprints.py +0 -0
  167. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/checkin.py +0 -0
  168. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/cloud.py +0 -0
  169. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/contamination.py +0 -0
  170. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/dashboard.py +0 -0
  171. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/dashboard_ui.py +0 -0
  172. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/engine.py +0 -0
  173. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/inspector.py +0 -0
  174. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/installer.py +0 -0
  175. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/__init__.py +0 -0
  176. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/angular.py +0 -0
  177. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/base.py +0 -0
  178. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/javascript.py +0 -0
  179. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/nim.py +0 -0
  180. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/openscad.py +0 -0
  181. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/php.py +0 -0
  182. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/python.py +0 -0
  183. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/registry.py +0 -0
  184. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/scanners/js_scanner.js +0 -0
  185. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/scanners/nim_scanner.nim +0 -0
  186. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/systemverilog.py +0 -0
  187. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/languages/terraform.py +0 -0
  188. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/library_config.json +0 -0
  189. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/manifest.py +0 -0
  190. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/rules.py +0 -0
  191. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/scaffolding/__init__.py +0 -0
  192. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/search/__init__.py +0 -0
  193. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/search/filters.py +0 -0
  194. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/search/hybrid.py +0 -0
  195. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/search/ngram.py +0 -0
  196. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/search/synonyms.json +0 -0
  197. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/search/tfidf.py +0 -0
  198. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/trust.py +0 -0
  199. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/update_check.py +0 -0
  200. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/validation_stamp.py +0 -0
  201. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/src/cartograph/validator.py +0 -0
  202. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/__init__.py +0 -0
  203. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/cloud_health.py +0 -0
  204. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/conftest.py +0 -0
  205. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/fresh_install/Dockerfile +0 -0
  206. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/fresh_install/test_fresh_install.sh +0 -0
  207. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_auth.py +0 -0
  208. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprint_checkin.py +0 -0
  209. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprint_contamination.py +0 -0
  210. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprint_create.py +0 -0
  211. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprint_deps.py +0 -0
  212. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprint_install.py +0 -0
  213. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprint_languages.py +0 -0
  214. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprint_publish.py +0 -0
  215. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprint_search_inspect.py +0 -0
  216. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprint_status.py +0 -0
  217. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprint_validator.py +0 -0
  218. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_blueprints.py +0 -0
  219. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_checkin.py +0 -0
  220. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_checkin_publish.py +0 -0
  221. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_cloud_zip.py +0 -0
  222. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_config.py +0 -0
  223. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_contamination.py +0 -0
  224. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_create.py +0 -0
  225. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_inspect.py +0 -0
  226. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_install.py +0 -0
  227. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_language_engines.py +0 -0
  228. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_library_integrity.py +0 -0
  229. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_loading.py +0 -0
  230. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_manifest.py +0 -0
  231. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_rules.py +0 -0
  232. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_setup.py +0 -0
  233. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_update_check.py +0 -0
  234. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_upgrade.py +0 -0
  235. {cartograph_cli-0.7.3 → cartograph_cli-0.7.4}/tests/test_validate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cartograph-cli
3
- Version: 0.7.3
3
+ Version: 0.7.4
4
4
  Summary: Widget library manager for AI agents — CLI
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "cartograph-cli"
7
- version = "0.7.3"
7
+ version = "0.7.4"
8
8
  description = "Widget library manager for AI agents — CLI"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -217,12 +217,19 @@ def _search_registries(query, domain_filter, language_filter, top_k,
217
217
  widgets.append(w)
218
218
  return widgets
219
219
 
220
- # Public registry (None = default URL)
221
- all_widgets.extend(_fetch(_PUBLIC_REGISTRY_PREFIX, None))
222
-
223
- # Company registries
224
- for reg in get_registries():
225
- all_widgets.extend(_fetch(reg["prefix"], reg["url"]))
220
+ # Fan-out order is display order (registry order = registry ranking, and
221
+ # fetch order = pool order). The home registry (publish-registry) speaks
222
+ # first; remaining registries keep config order with public cg last.
223
+ # With no home configured, publish-registry defaults to cg, so the
224
+ # public registry leads as before.
225
+ from .config import get_value
226
+ home_prefix, _ = get_value("publish-registry")
227
+ entries = [(reg["prefix"], reg["url"]) for reg in get_registries()]
228
+ entries.append((_PUBLIC_REGISTRY_PREFIX, None))
229
+ entries.sort(key=lambda e: e[0] != home_prefix) # stable: home first
230
+
231
+ for prefix, url in entries:
232
+ all_widgets.extend(_fetch(prefix, url))
226
233
 
227
234
  # If the filter named registries that don't exist, surface that as an
228
235
  # error so the agent isn't silently empty-handed.
@@ -234,6 +241,27 @@ def _search_registries(query, domain_filter, language_filter, top_k,
234
241
  return all_widgets, errors, scoped_prefixes
235
242
 
236
243
 
244
+ # Search rows are bounded so total payload size is predictable for agents:
245
+ # top_k x bounded-row = hard ceiling. Search is the brochure rack, not the
246
+ # brochure - the full description lives behind `inspect`.
247
+ _SEARCH_DESC_LIMIT = 200
248
+
249
+
250
+ def _search_row(w):
251
+ """Bound a search result row for display.
252
+
253
+ Drops review-trend noise and truncates the description at a word
254
+ boundary. Applies identically to local and registry rows so both
255
+ payloads obey the same row contract.
256
+ """
257
+ row = {k: v for k, v in w.items() if k != "trend"}
258
+ desc = row.get("description")
259
+ if isinstance(desc, str) and len(desc) > _SEARCH_DESC_LIMIT:
260
+ cut = desc[:_SEARCH_DESC_LIMIT].rsplit(" ", 1)[0].rstrip(" ,;:.")
261
+ row["description"] = cut + "..."
262
+ return row
263
+
264
+
237
265
  def cmd_search(args):
238
266
  # Validate flag combinations before any work
239
267
  registries_filter = getattr(args, "registries", None) or None
@@ -278,13 +306,14 @@ def cmd_search(args):
278
306
 
279
307
  local_widgets = local.get("results", [])
280
308
 
281
- # Dedup registry results: same (registry_prefix, base_id) → highest relevance wins.
309
+ # Dedup registry results: same (registry_prefix, base_id) → first occurrence
310
+ # wins. The registry's response order IS its ranking, so the first time a
311
+ # widget appears is the registry's strongest opinion of it.
282
312
  # Same base_id across DIFFERENT registries stays separate (different install targets).
283
313
  seen_registry = {}
284
314
  for w in registry_widgets:
285
315
  key = (w.get("registry_prefix", ""), _base_id(w))
286
- existing = seen_registry.get(key)
287
- if existing is None or w.get("relevance_score", 0) > existing.get("relevance_score", 0):
316
+ if key not in seen_registry:
288
317
  seen_registry[key] = w
289
318
 
290
319
  # Only suppress a local widget if the cloud version belongs to the current user.
@@ -315,47 +344,66 @@ def cmd_search(args):
315
344
  seen_local[bid] = w
316
345
 
317
346
  local_sorted = sorted(seen_local.values(), key=lambda w: w.get("relevance_score", 0), reverse=True)
318
- # All registry results pooled and sorted by relevance
319
- registry_sorted = sorted(seen_registry.values(), key=lambda w: w.get("relevance_score", 0), reverse=True)
320
-
321
- # Local fills first; all registries combined share the remaining half.
347
+ # Registry results stay in received order: each registry owns its own
348
+ # ranking, and cross-registry relevance scores aren't comparable anyway.
349
+ # Order is fetch order (public first, then config order), each registry's
350
+ # block in the order it returned.
351
+ registry_ordered = list(seen_registry.values())
352
+
353
+ # One pool fills its slate first; the other shares the remaining budget,
354
+ # capped at half so it can never be invisible-by-default. search-priority
355
+ # picks who goes first: 'local' (default — your own validated widgets win)
356
+ # or 'registry' (orgs that want the vetted registry versions fronted).
322
357
  # When the agent explicitly scoped to one or more registries, that's a
323
- # signal of intent — drop the cap so the requested registries fill
324
- # whatever local didn't.
358
+ # signal of intent — drop the registry cap so the requested registries
359
+ # fill whatever local didn't.
360
+ from .config import get_value
361
+ registry_first = get_value("search-priority")[0] == "registry"
325
362
  explicit_registry_scope = registries_filter is not None
326
363
  _REGISTRY_CAP = (args.top_k if explicit_registry_scope
327
364
  else args.top_k // 2)
328
- if local_sorted and registry_sorted:
329
- local_take = min(len(local_sorted), args.top_k)
330
- registry_take = min(len(registry_sorted), args.top_k - local_take, _REGISTRY_CAP)
331
- elif local_sorted:
365
+ if not local_sorted or not registry_ordered:
332
366
  local_take = min(len(local_sorted), args.top_k)
333
- registry_take = 0
367
+ registry_take = min(len(registry_ordered), args.top_k)
368
+ elif registry_first:
369
+ registry_take = min(len(registry_ordered), args.top_k)
370
+ local_take = min(len(local_sorted), args.top_k - registry_take, args.top_k // 2)
334
371
  else:
335
- local_take = 0
336
- registry_take = min(len(registry_sorted), args.top_k)
372
+ local_take = min(len(local_sorted), args.top_k)
373
+ registry_take = min(len(registry_ordered), args.top_k - local_take, _REGISTRY_CAP)
337
374
 
338
- combined = local_sorted[:local_take] + registry_sorted[:registry_take]
375
+ local_results = [_search_row(w) for w in local_sorted[:local_take]]
376
+ registry_results = [_search_row(w) for w in registry_ordered[:registry_take]]
339
377
 
340
- merged = {
341
- "local_count": local_take,
342
- "registry_count": registry_take,
343
- "widgets": combined,
344
- }
378
+ # Payload key order mirrors priority — agents read top-down.
379
+ local_block = {"count": local_take, "widgets": local_results}
380
+ registry_block = {"count": registry_take, "widgets": registry_results}
381
+ if registry_first:
382
+ payload = {"registry": registry_block, "local": local_block}
383
+ else:
384
+ payload = {"local": local_block, "registry": registry_block}
385
+ # No silent caps: when the budget cut matches from a pool, say how many,
386
+ # so the agent knows there is more to see (raise --top-k or scope with
387
+ # --registry / --local-only). Registry 'omitted' counts what we received
388
+ # and dropped; registries themselves return at most top_k each.
389
+ local_omitted = len(local_sorted) - local_take
390
+ registry_omitted = len(registry_ordered) - registry_take
391
+ if local_omitted > 0:
392
+ payload["local"]["omitted"] = local_omitted
393
+ if registry_omitted > 0:
394
+ payload["registry"]["omitted"] = registry_omitted
345
395
  if registry_errors:
346
- merged["registry_errors"] = registry_errors
347
-
348
- if not combined:
349
- out({
350
- "local_count": 0,
351
- "registry_count": 0,
352
- "widgets": [],
353
- "message": f"No widgets found for \'{args.query}\'.",
354
- "suggestion": "Try broadening your search by removing --domain or --language filters." if args.domain or args.language else "Run \'cartograph doctor\' to check available language engines."
355
- })
356
- return
396
+ payload["registry_errors"] = registry_errors
397
+
398
+ if not local_results and not registry_results:
399
+ payload["message"] = f"No widgets found for '{args.query}'."
400
+ payload["suggestion"] = (
401
+ "Try broadening your search by removing --domain or --language filters."
402
+ if args.domain or args.language
403
+ else "Run 'cartograph doctor' to check available language engines."
404
+ )
357
405
 
358
- out(merged)
406
+ out(payload)
359
407
 
360
408
 
361
409
  def cmd_inspect(args):
@@ -31,6 +31,7 @@ _DEFAULTS = {
31
31
  "show_unavailable": True,
32
32
  "cloud": True,
33
33
  "auto_update": True,
34
+ "search_priority": "local",
34
35
  },
35
36
  "publish": {
36
37
  "auto_publish": False,
@@ -55,7 +56,11 @@ _SCHEMA = {
55
56
  "Show widgets for languages not installed on this machine"),
56
57
  "publish-registry": ("publish", "registry", "str", None,
57
58
  "Default registry prefix for --publish on local widgets (e.g. myorg). "
58
- "Defaults to the public registry (cg) if not set."),
59
+ "Defaults to the public registry (cg) if not set. "
60
+ "Also ranks that registry first in search results."),
61
+ "search-priority": ("library", "search_priority", "str", ["local", "registry"],
62
+ "Which pool fills the search budget first: your local library "
63
+ "or the registry pool"),
59
64
  }
60
65
 
61
66
 
@@ -224,6 +229,16 @@ def _known_engine_binaries() -> list[tuple[str, str]]:
224
229
  return sorted(pairs)
225
230
 
226
231
 
232
+ def config_keys() -> list[str]:
233
+ """Return all settable config keys (excluding the dynamic paths.* namespace).
234
+
235
+ Public accessor so downstream surfaces (MCP server, agent tooling) can
236
+ derive their key enums from the CLI instead of hardcoding a copy that
237
+ drifts when new settings land.
238
+ """
239
+ return sorted(_SCHEMA)
240
+
241
+
227
242
  def list_values() -> list[dict]:
228
243
  """Return all config keys with current values and defaults."""
229
244
  config = load_config()
@@ -67,8 +67,8 @@ def test_search_emits_json(cli_env, tmp_path):
67
67
  rc, stdout, stderr = _run(["search", "http"], cli_env, str(tmp_path))
68
68
  result = _parse_json_stdout(stdout, stderr)
69
69
  assert isinstance(result, dict)
70
- # Should surface the http-client fixture widget
71
- widgets = result.get("widgets") or result.get("results") or []
70
+ # Should surface the http-client fixture widget in the local payload
71
+ widgets = (result.get("local") or {}).get("widgets") or []
72
72
  ids = [w.get("id") for w in widgets]
73
73
  assert "http-client" in ids, f"search did not find http-client: {ids}"
74
74
 
@@ -80,3 +80,38 @@ def test_search_empty_library():
80
80
  def test_search_top_k_respected(carto):
81
81
  result = carto.search("backend", top_k=2)
82
82
  assert len(result["results"]) <= 2
83
+
84
+
85
+ # ---------------------------------------------------------------------------
86
+ # Search row contract (cli._search_row) — bounded rows for predictable payload
87
+ # ---------------------------------------------------------------------------
88
+
89
+ def test_search_row_drops_trend():
90
+ from cartograph.cli import _search_row
91
+ row = _search_row({"id": "x", "trend": "up", "rating": 4.5})
92
+ assert "trend" not in row
93
+ assert row["rating"] == 4.5
94
+
95
+
96
+ def test_search_row_truncates_long_description_at_word_boundary():
97
+ from cartograph.cli import _search_row, _SEARCH_DESC_LIMIT
98
+ desc = "word " * 100 # 500 chars
99
+ row = _search_row({"id": "x", "description": desc})
100
+ assert row["description"].endswith("...")
101
+ assert len(row["description"]) <= _SEARCH_DESC_LIMIT + 3
102
+ # No mid-word cut: everything before the ellipsis is whole words
103
+ assert row["description"][:-3].split(" ")[-1] == "word"
104
+
105
+
106
+ def test_search_row_keeps_short_description_untouched():
107
+ from cartograph.cli import _search_row
108
+ row = _search_row({"id": "x", "description": "Short and sweet."})
109
+ assert row["description"] == "Short and sweet."
110
+
111
+
112
+ def test_search_row_does_not_mutate_input():
113
+ from cartograph.cli import _search_row
114
+ original = {"id": "x", "trend": "up", "description": "d" * 999}
115
+ _search_row(original)
116
+ assert original["trend"] == "up"
117
+ assert len(original["description"]) == 999
File without changes
File without changes
File without changes