campfire-cli 0.1.9__tar.gz → 0.1.11__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 (211) hide show
  1. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/ARCHITECTURE.md +30 -5
  2. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/COMMAND.md +7 -2
  3. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/PKG-INFO +7 -5
  4. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/README.md +6 -4
  5. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/SPEC.md +11 -2
  6. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/pyproject.toml +1 -1
  7. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/__init__.py +1 -1
  8. campfire_cli-0.1.11/src/campfire_cli/alembic/versions/009_document_query_index.py +84 -0
  9. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/SPEC.md +21 -2
  10. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/cli/document_cli.py +43 -20
  11. campfire_cli-0.1.11/src/campfire_cli/app/document/repository/__init__.py +7 -0
  12. campfire_cli-0.1.11/src/campfire_cli/app/document/repository/document_index_repository.py +154 -0
  13. campfire_cli-0.1.11/src/campfire_cli/app/document/schema/__init__.py +25 -0
  14. campfire_cli-0.1.11/src/campfire_cli/app/document/schema/document_schema.py +130 -0
  15. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/document_apply_service.py +111 -69
  16. campfire_cli-0.1.11/src/campfire_cli/app/document/service/document_index_builder.py +293 -0
  17. campfire_cli-0.1.11/src/campfire_cli/app/document/service/document_index_protocol.py +26 -0
  18. campfire_cli-0.1.11/src/campfire_cli/app/document/service/document_index_service.py +318 -0
  19. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/document_move_service.py +40 -83
  20. campfire_cli-0.1.11/src/campfire_cli/app/document/service/document_patch_values.py +94 -0
  21. campfire_cli-0.1.11/src/campfire_cli/app/document/service/document_relocation.py +59 -0
  22. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/document_rule_service.py +10 -6
  23. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/document_service.py +38 -3
  24. campfire_cli-0.1.11/src/campfire_cli/app/maintenance/SPEC.md +19 -0
  25. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/maintenance/repository/maintenance_repository.py +1 -32
  26. campfire_cli-0.1.11/src/campfire_cli/app/maintenance/service/link_service.py +72 -0
  27. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/maintenance/service/maintenance_protocol.py +9 -3
  28. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/maintenance/service/maintenance_service.py +27 -17
  29. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/SPEC.md +2 -2
  30. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/cli/restructure_cli.py +7 -2
  31. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/restructure_service.py +1 -1
  32. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/agent_hints.py +15 -8
  33. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/database/models.py +40 -0
  34. campfire_cli-0.1.11/src/campfire_cli/common/documents/links.py +142 -0
  35. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/documents/markdown.py +8 -1
  36. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/container.py +20 -9
  37. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/defaults/config.yml +3 -0
  38. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/SPEC.md +9 -4
  39. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-context-bootstrap/SKILL.md +6 -2
  40. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-document-capture/SKILL.md +5 -3
  41. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-task-management/SKILL.md +14 -12
  42. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/SKILL.md +7 -4
  43. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-workspace-restructure/SKILL.md +1 -1
  44. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/integration/test_cli.py +425 -0
  45. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_document_apply.py +301 -9
  46. campfire_cli-0.1.11/tests/unit/test_document_index.py +333 -0
  47. campfire_cli-0.1.11/tests/unit/test_migrations.py +51 -0
  48. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/uv.lock +1 -1
  49. campfire_cli-0.1.9/src/campfire_cli/app/document/repository/__init__.py +0 -1
  50. campfire_cli-0.1.9/src/campfire_cli/app/document/schema/__init__.py +0 -13
  51. campfire_cli-0.1.9/src/campfire_cli/app/document/schema/document_schema.py +0 -48
  52. campfire_cli-0.1.9/src/campfire_cli/app/maintenance/SPEC.md +0 -19
  53. campfire_cli-0.1.9/src/campfire_cli/app/maintenance/service/link_service.py +0 -91
  54. campfire_cli-0.1.9/tests/unit/test_migrations.py +0 -24
  55. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/.github/workflows/ci.yml +0 -0
  56. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/.github/workflows/release.yml +0 -0
  57. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/.gitignore +0 -0
  58. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/AGENTS.md +0 -0
  59. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/DECISIONS.md +0 -0
  60. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/LICENSE +0 -0
  61. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/alembic/SPEC.md +0 -0
  62. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/alembic/env.py +0 -0
  63. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/alembic/script.py.mako +0 -0
  64. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/alembic/versions/001_initial_schema.py +0 -0
  65. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/alembic.ini +0 -0
  66. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/scripts/SPEC.md +0 -0
  67. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/__init__.py +0 -0
  68. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/env.py +0 -0
  69. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/script.py.mako +0 -0
  70. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/versions/001_initial_schema.py +0 -0
  71. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/versions/002_workspace_project_registry.py +0 -0
  72. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/versions/003_unified_workspace_state.py +0 -0
  73. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/versions/004_restructure_workspace_domain.py +0 -0
  74. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/versions/005_decision_channel.py +0 -0
  75. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/versions/006_workspace_topology_index.py +0 -0
  76. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/versions/007_workspace_adoption.py +0 -0
  77. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/versions/008_remove_adoption_batches.py +0 -0
  78. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/alembic/versions/__init__.py +0 -0
  79. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/SPEC.md +0 -0
  80. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/__init__.py +0 -0
  81. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/base/SPEC.md +0 -0
  82. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/base/__init__.py +0 -0
  83. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/base/cli/base_cli.py +0 -0
  84. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/base/repository/base_repository.py +0 -0
  85. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/base/schema/base_schema.py +0 -0
  86. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/base/schema/operation_schema.py +0 -0
  87. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/base/service/base_service.py +0 -0
  88. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/decision/SPEC.md +0 -0
  89. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/decision/__init__.py +0 -0
  90. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/decision/cli/decision_cli.py +0 -0
  91. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/decision/repository/decision_repository.py +0 -0
  92. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/decision/schema/decision_schema.py +0 -0
  93. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/decision/service/decision_projection_service.py +0 -0
  94. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/decision/service/decision_service.py +0 -0
  95. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/__init__.py +0 -0
  96. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/cli/__init__.py +0 -0
  97. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/cli/profile_cli.py +0 -0
  98. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/cli/type_cli.py +0 -0
  99. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/repository/document_profile_repository.py +0 -0
  100. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/repository/document_type_repository.py +0 -0
  101. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/__init__.py +0 -0
  102. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/document_profile_service.py +0 -0
  103. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/document_scanner.py +0 -0
  104. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/document_type_service.py +0 -0
  105. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/frontmatter_apply.py +0 -0
  106. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/frontmatter_formatter.py +0 -0
  107. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/frontmatter_plan.py +0 -0
  108. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/kanban_service.py +0 -0
  109. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/profile_registry.py +0 -0
  110. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/type_apply.py +0 -0
  111. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/document/service/type_plan.py +0 -0
  112. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/maintenance/__init__.py +0 -0
  113. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/maintenance/cli/maintenance_cli.py +0 -0
  114. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/maintenance/schema/maintenance_schema.py +0 -0
  115. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/maintenance/service/archive_service.py +0 -0
  116. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/maintenance/service/moc_service.py +0 -0
  117. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/skill/SPEC.md +0 -0
  118. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/skill/__init__.py +0 -0
  119. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/skill/cli/skill_cli.py +0 -0
  120. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/skill/repository/skill_repository.py +0 -0
  121. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/skill/schema/skill_schema.py +0 -0
  122. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/skill/service/skill_service.py +0 -0
  123. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/__init__.py +0 -0
  124. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/cli/__init__.py +0 -0
  125. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/cli/config_cli.py +0 -0
  126. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/cli/domain_cli.py +0 -0
  127. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/cli/project_cli.py +0 -0
  128. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/cli/space_cli.py +0 -0
  129. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/cli/workspace_cli.py +0 -0
  130. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/repository/__init__.py +0 -0
  131. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/repository/manifest_repository.py +0 -0
  132. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/repository/restructure_repository.py +0 -0
  133. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/repository/workspace_repository.py +0 -0
  134. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/schema/__init__.py +0 -0
  135. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/schema/adoption_schema.py +0 -0
  136. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/schema/restructure_schema.py +0 -0
  137. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/schema/workspace_schema.py +0 -0
  138. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/__init__.py +0 -0
  139. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/adoption_service.py +0 -0
  140. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/config_service.py +0 -0
  141. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/domain_restructure_service.py +0 -0
  142. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/project_service.py +0 -0
  143. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/restructure_protocol.py +0 -0
  144. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/restructure_verifier.py +0 -0
  145. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/structure_service.py +0 -0
  146. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/workspace_protocol.py +0 -0
  147. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/app/workspace/service/workspace_service.py +0 -0
  148. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/SPEC.md +0 -0
  149. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/__init__.py +0 -0
  150. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/database/__init__.py +0 -0
  151. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/database/migrations.py +0 -0
  152. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/database/session.py +0 -0
  153. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/documents/__init__.py +0 -0
  154. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/documents/document_types.py +0 -0
  155. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/documents/domain_context.py +0 -0
  156. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/documents/frontmatter_schema.py +0 -0
  157. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/exceptions/__init__.py +0 -0
  158. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/exceptions/base.py +0 -0
  159. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/filesystem/__init__.py +0 -0
  160. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/filesystem/atomic.py +0 -0
  161. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/filesystem/change_set.py +0 -0
  162. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/filesystem/cwd.py +0 -0
  163. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/filesystem/locking.py +0 -0
  164. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/governance/__init__.py +0 -0
  165. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/governance/issues.py +0 -0
  166. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/governance/locking.py +0 -0
  167. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/governance/snapshots.py +0 -0
  168. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/hashing.py +0 -0
  169. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/package_version.py +0 -0
  170. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/reports/__init__.py +0 -0
  171. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/reports/json_report.py +0 -0
  172. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/common/reports/markdown_report.py +0 -0
  173. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/config/SPEC.md +0 -0
  174. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/config/defaults.py +0 -0
  175. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/config/settings.py +0 -0
  176. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/main.py +0 -0
  177. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/__init__.py +0 -0
  178. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/bases/Agent/346/211/247/350/241/214/345/267/245/344/275/234/345/217/260.base" +0 -0
  179. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/bases/SPEC.md +0 -0
  180. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/bases//344/273/273/345/212/241/345/267/245/344/275/234/345/217/260.base" +0 -0
  181. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/bases//345/206/263/347/255/226/345/267/245/344/275/234/345/217/260.base" +0 -0
  182. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/bases//345/276/205/345/275/222/346/241/243/346/226/207/346/241/243.base" +0 -0
  183. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/bases//351/241/271/347/233/256/346/226/207/346/241/243.base" +0 -0
  184. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/defaults/__init__.py +0 -0
  185. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-context-bootstrap/agents/openai.yaml +0 -0
  186. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-conversation-router/SKILL.md +0 -0
  187. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-conversation-router/agents/openai.yaml +0 -0
  188. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-conversation-router/references/inbox-handoff.md +0 -0
  189. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-conversation-router/references/learning-intake.md +0 -0
  190. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-conversation-router/references/task-intake.md +0 -0
  191. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-inbox-triage/SKILL.md +0 -0
  192. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-kanban-board/SKILL.md +0 -0
  193. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/SKILL.md +0 -0
  194. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/agents/openai.yaml +0 -0
  195. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-workspace-adoption/SKILL.md +0 -0
  196. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/references//344/273/273/345/212/241/346/255/243/346/226/207/347/273/223/346/236/204.md" +0 -0
  197. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/src/campfire_cli/resources/skills/campfire-workspace-restructure/references/restructure-spec.md +0 -0
  198. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/SPEC.md +0 -0
  199. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/conftest.py +0 -0
  200. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/perf/test_read_counts.py +0 -0
  201. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/perf/test_resolve_subprocess_count.py +0 -0
  202. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_agent_hints.py +0 -0
  203. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_atomic_write.py +0 -0
  204. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_common_governance.py +0 -0
  205. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_config.py +0 -0
  206. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_domain_context.py +0 -0
  207. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_file_change_executor.py +0 -0
  208. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_frontmatter.py +0 -0
  209. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_kanban_service.py +0 -0
  210. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_package_version.py +0 -0
  211. {campfire_cli-0.1.9 → campfire_cli-0.1.11}/tests/unit/test_repository_boundaries.py +0 -0
@@ -78,6 +78,8 @@ Decision 以 SQLite 当前快照和追加事件为 SSOT。全部状态在 `_协
78
78
 
79
79
  Document App 是所有面向用户和 Agent 的文档命令入口;Profile、类型命名、Frontmatter 和文档规则是其内部能力。Maintenance 只编排跨文档批量维护,Workspace 的 Restructure 用例只处理存量结构重构;两者调用 Document Service,不再从 `common/` 获取文档业务流程。
80
80
 
81
+ Document App 同时拥有设备本地的文档查询投影。Indexer 从 Markdown、Domain 声明、Project 文档根映射和显式链接生成文档记录与确定关系;Repository 只负责按 `workspace_id` 持久化完整快照。组合根从 Workspace Registry 提供当前 Project 映射,Document App 不直接读取 Workspace Repository,也不把每篇文档中可能漂移的重复字段当作物理归属。`document list` 和 `document inspect` 查询前自行轻量 reconcile,不要求 Agent 先运行 Maintenance。Maintenance 只在全量检查或可见生成物同步时触发索引校正,不拥有索引规则,也不是读取命令的前置步骤。
82
+
81
83
  Frontmatter 规则采用声明式 Profile:`base` 是最小公共契约,`knowledge`、`project-doc`、`task` 只允许一层继承。Profile Loader 将配置编译为完整 EffectiveProfile,Resolver 根据文档类型和领域上下文选择 Profile,Validator 与 Formatter 共同消费该结果。字段规则不使用每种文档一个 Python 子类,也不在 Skill 中复制。
82
84
 
83
85
  ### CLI 设计理念:治理原语 + Skill SOP
@@ -118,7 +120,7 @@ Campfire 不是“Markdown 版 kubectl”,而是面向人机协作场景组合
118
120
  命令设计遵循以下约束:
119
121
 
120
122
  1. **对象域优先**:公共入口采用 `campfire <object-domain> <verb>`,例如 `document apply`、`maintenance check`;动词在所属业务对象内保持单义,不为同一行为保留多个别名。
121
- 2. **意图原子、派生显式**:`document apply` 只创建或更新目标文档,`document move` 原子完成单文档移动、目标 Profile 对齐和确定性引用修复;命令只在 MOC、关系页或索引可能变化时返回一个最小 scope 的 `maintenance sync`。
123
+ 2. **意图原子、派生显式**:`document apply` 创建或更新文档,并在显式类型变化时将类型、文件名前缀和确定性引用作为同一变更提交;`document move` 原子完成单文档跨 Domain 移动、目标 Profile 对齐和确定性引用修复。命令只在 MOC、关系页或索引可能变化时返回零或一个可直接执行的最小 scope `maintenance sync`。
122
124
  3. **契约声明式,变更显式**:Profile 是字段、类型、枚举、顺序和条件必填的 SSOT。Agent 提交业务值,CLI 解析有效 Profile 并拒绝猜测;已有文档只修改明确给出的字段或正文操作。
123
125
  4. **写入先证明安全**:写命令默认预览,显式确认后才提交;提交时在锁内复核快照或期望哈希,多文件变更作为一个 ChangeSet 执行,失败回滚,避免静默覆盖和部分写入。
124
126
  5. **人类与 Agent 共用一个契约**:命令和结果只有一套语义。JSON 状态、issues、missing fields 与 follow-up 供 Agent 稳定消费,`tree` 和分层 `-h` 供人类与 Agent 渐进发现,不维护第二套参数目录。
@@ -126,9 +128,21 @@ Campfire 不是“Markdown 版 kubectl”,而是面向人机协作场景组合
126
128
  7. **聚合入口是少数例外**:`setup` 和 `upgrade` 可以编排多个服务,因为它们表达完整安装生命周期;日常内容治理保持原子能力,避免重新出现 `maintenance run` 一类不可审查的聚合入口。
127
129
  8. **参数最小充分、黄金路径唯一**:调用方只提交 CLI 无法可靠推导的事实。已受管的 Workspace、Space、Domain 和 Project 优先使用稳定 id,路径只用于外部输入、未接管来源、显式物理位置或尚无稳定 id 的文档;同一事实不得同时要求 id、完整路径和父级关系。一个常规意图只保留一个公共入口,不用互斥模式参数、兼容别名或要求 Agent 手工拼装底层步骤来表达同一行为。
128
130
 
131
+ ### Agent 可执行契约
132
+
133
+ Campfire 不把“调用方能够猜对未声明契约”作为可靠性前提。Agent 可能不会自行推断字段枚举、补丁值类型、Shell 引号、隐含前置步骤或上一次命令留下的状态;公共接口必须用已有入口提供足以完成当前意图的信息。
134
+
135
+ - 参数帮助说明参数语义和输入格式;列表、结构化补丁等不直观输入至少给出一个可直接使用的例子。
136
+ - 校验失败同时服务机器恢复和人工诊断:稳定错误码、字段与期望类型供程序判断,简短的实际值、示例或修复提示帮助调用方完成下一次正确调用。调用方不得被迫解析易变的自然语言 message。
137
+ - Profile 仍是字段类型、枚举和跨字段规则的唯一事实源。`tree` 只发现能力,Skill 只选择路径,帮助和错误只呈现当前调用所需信息;三者不得复制整套 Profile 或建立平行参数目录。
138
+ - 已知路径的正文小改直接使用文件工具;Frontmatter 契约已知时直接 `document apply`;现有文档的字段类型或合法值未知时使用一次 `document inspect` 后 apply。`tree` 只在不知道 Campfire 是否具有对应能力时使用,不是文档操作的固定前置步骤。
139
+ - CLI 不使用“最近一次 apply”之类的隐式可变状态补偿 Agent 能力。跨命令动作由当前结果中的结构化 `follow_up` 显式描述,输入、对象和作用域在每次调用中均可审查。
140
+
141
+ 这里的“自解释”不是把所有教程塞进一个命令,也不是保证任何 Agent 零读取完成任意任务;它表示完成常规意图所需的契约有唯一来源、最短获取路径和可操作的失败反馈。只有出现新的独立用户意图时才增加命令,单纯的帮助或诊断不足不构成扩张命令面的理由。
142
+
129
143
  横切关注点与业务 SOP 不使用同一种复用手段。哈希复核、写锁、原子替换和失败恢复由显式 ChangeSet Executor 复用;写命令返回的 `follow_up` 由 Skill 消费。不为了复用 Maintenance 而引入 AOP 切面、命令总线、全局钩子或隐式中间件。
130
144
 
131
- 因此,`document apply` 的准确含义是“对一个 Markdown 文档应用经 Profile 校验的显式意图”,不是“把完整声明持续调谐到某个服务端状态”。用户或 Agent 可以直接 edit 已有正文;无论通过 apply 还是 edit 写入,跨文档派生结果都由后续显式 Maintenance 收敛。
145
+ 因此,`document apply` 的准确含义是“对一个 Markdown 文档应用经 Profile 校验的显式意图”,不是“把完整声明持续调谐到某个服务端状态”。创建时文件名可省略类型前缀;显式变更类型时,CLI 负责同步类型、前缀和可确定引用。用户或 Agent 可以直接 edit 唯一路径下的已有正文;只有新建文档、修改 Frontmatter/类型/归属或需要派生治理时才进入 CLI 工作流。
132
146
 
133
147
  ## 5. SSOT 与派生数据
134
148
 
@@ -139,10 +153,21 @@ Campfire 不是“Markdown 版 kubectl”,而是面向人机协作场景组合
139
153
  | 治理规则 | 包内 `config.yml` + `~/.campfire/config.yml` 覆盖 | 校验结果与执行计划 |
140
154
  | Workspace、Project 注册关系 | `~/.campfire/campfire.db` | JSON 导入导出备份 |
141
155
  | Campfire Skills | Python 包内 `resources/skills/` | 全局 Agent Skill 目录 |
142
- | 文档索引、结构重构和维护状态 | `~/.campfire/campfire.db`,按 `workspace_id` 隔离 | JSON 当前快照、有限变更日志 |
156
+ | 文档查询索引 | Workspace Markdown、结构声明与有效治理契约 | `~/.campfire/campfire.db` 中按 `workspace_id` 隔离的可重建投影 |
157
+ | Decision、结构重构批次和维护运行状态 | `~/.campfire/campfire.db` | Markdown 投影、报告与有限变更日志;当前不能仅从 Workspace 重建 |
143
158
 
144
159
  SQLite 中的 Workspace 与 Project 注册数据是结构化事实,文档索引可以从 Markdown 重建;SQLite 不是知识内容的 SSOT。工具状态不写入 Workspace,因而一个 Campfire 安装可以管理多个 Workspace。
145
160
 
161
+ ### 文档查询投影
162
+
163
+ 文档索引 v1 保存列表查询需要的结构化字段、内容哈希、源文件 stat,以及显式 Frontmatter 关联、WikiLink、Markdown Link、Embed 形成的确定关系。它不复制正文,不保存相似度建议,也不把文件 mtime 解释为任务时间。
164
+
165
+ 每次 `document list` 或 `document inspect` 先对账文件清单、size、mtime、有效配置哈希和 Space/Domain 拓扑哈希。stat 只用于筛选变化候选,内容哈希才表示内容版本;新增、修改和删除会在查询前自动 reconcile。候选快照在内存中完成后,通过单个 SQLite 事务替换文档、关系和 generation,中断不能暴露半套新索引。
166
+
167
+ `document list` 只做结构化精确枚举与 AND 筛选;未来正文关键词、模糊匹配、相关性排序或混合检索使用独立 `document search`。`document inspect.relations` 只返回可证明的 declared、outgoing、incoming 和 unresolved;相似文档属于未来独立 suggestions,不能混入确定关系。
168
+
169
+ 索引新鲜度是 CLI 内部读取保障,不生成让 Agent 手工执行的 index follow-up。MOC、关系页等 Workspace 内可见生成物仍由成功写命令按需返回 scoped `maintenance sync`。
170
+
146
171
  ### 设备本地与跨设备边界
147
172
 
148
173
  ```text
@@ -155,7 +180,7 @@ SQLite 中的 Workspace 与 Project 注册数据是结构化事实,文档索
155
180
  ▼ 新设备 attach
156
181
  每台设备独立维护
157
182
  Project local_path
158
- SQLite 索引与运行记录
183
+ SQLite 查询投影与运行记录
159
184
  Decision 与事件
160
185
  Skills 安装路径、锁、缓存和报告
161
186
  ```
@@ -207,7 +232,7 @@ Human / Browser ──> HTTP Adapter ──┘ │
207
232
  3. 规则集中在配置契约和规则引擎,Skill、模板、CLI 不复制枚举定义。
208
233
  4. MOC、Base、关系和报告能生成就不手工维护。
209
234
  5. 有歧义的分类和结构重构进入待确认,不由 Agent 擅自决定。
210
- 6. Markdown 内容可脱离 Campfire 阅读和迁移;SQLite 丢失后可以重建。
235
+ 6. Markdown 内容可脱离 Campfire 阅读和迁移;文档查询投影在 SQLite 丢失后可以重建,Decision 与未完成批次等工作流状态不作此承诺。
211
236
  7. 只有一个用户级 SQLite;所有 Workspace 业务表必须携带 `workspace_id`,Repository 查询不得越界。
212
237
  8. 正式文档必须归入 Domain;Space 不直接替代 Domain,系统区域不伪装成 Space。
213
238
 
@@ -1,6 +1,6 @@
1
1
  # Campfire 稳定命令
2
2
 
3
- 人类与 Agent 先用 `campfire tree` 发现命令,再用任意层级的 `-h` 渐进加载参数。
3
+ `campfire tree` 用于不知道 Campfire 是否具有某项能力时的命令发现,不是已知文档操作的固定前置步骤。具体参数从目标命令的 `-h` 获取;现有文档的 Frontmatter 契约未知时使用一次 `document inspect`,契约已知时直接调用写命令。
4
4
 
5
5
  ```bash
6
6
  campfire setup --path <vault-path> [--id <workspace-id>] --default
@@ -27,6 +27,7 @@ campfire workspace domain rekey --domain <id> --new-id <id> [--confirm]
27
27
  campfire workspace restructure inventory --scope <path> --batch <id>
28
28
  campfire workspace restructure plan --batch <id>
29
29
  campfire workspace project resolve --path "$PWD"
30
+ campfire document list [--project <id>] [--domain <id>] [--type <type>] [--lifecycle <value>]
30
31
  campfire document apply --path <workspace-relative-markdown> --type <type> --set <field=value> [--body-file <path>] [--confirm]
31
32
  campfire document move --path <source> --domain <target-domain-id> [--name <filename>] [--set <field=value>] [--unset <field>] [--expected-hash <sha256>] [--confirm]
32
33
  campfire document inspect --path <file>
@@ -46,4 +47,8 @@ campfire maintenance archive apply [--scope <path>] --confirm
46
47
 
47
48
  Space、Domain、Project 的 `create`/`adopt`,以及文档移动、重构、归档写操作默认先预览;审查通过后才追加 `--confirm`。已注册 Workspace 只通过根级 `campfire --workspace <id> ...` 选择;已声明 Space、Domain 和 Project 使用稳定 ID,CLI 自行推导路径和父子关系。路径参数只用于新位置、具体文件、外部输入和显式扫描范围。
48
49
 
49
- `document apply` 可新建、更新或为已有正文补齐 Frontmatter;`document move` 可在任意已声明 Domain 之间移动单篇文档并对齐可确定的 `domain`/`project`。目标 Profile 缺少语义字段时返回 `missing_fields`,调用方用 `--set`/`--unset` 补齐。只有实际写入成功的结果才可返回一个实际需要的 scoped `maintenance sync` follow-up;预览、阻塞或无派生影响时返回空列表。具体参数以对应命令的 `-h` 为准。
50
+ `document apply` 可新建、更新、为已有正文补齐 Frontmatter,或通过显式 `--type` 原子转换文档类型。创建和类型转换时,CLI 根据文档类型推导文件名前缀,并在结果的 `target` 中返回最终路径;调用方只提交标题或现有路径,不手工同步类型与前缀。`document move` 可在任意已声明 Domain 之间移动单篇文档并对齐可确定的 `domain`/`project`。目标 Profile 缺少语义字段时返回 `missing_fields`,调用方补齐明确业务值。只有实际写入成功的结果才可返回零或一个、且可直接执行的 scoped `maintenance sync` follow-up;Domain 内部路径会归一化为对应 Domain,预览、阻塞或无派生影响时返回空列表。具体参数以对应命令的 `-h` 为准。
51
+
52
+ `--set` 的值类型由有效 Profile 决定,不使用 YAML 隐式类型推断。enum、string 和 date 保留原始字符串,boolean 只接受 `true` 或 `false`,list 只接受严格 JSON 数组。标量可写为 `--set lifecycle=completed`,列表在 Shell 中使用单引号保护,例如 `--set 'tags=["tag1","tag2"]'`。CLI 不把 `tag1,tag2` 猜成列表;格式错误时通过稳定错误码、期望类型和参数示例说明修复方式。字段与枚举不在本命令清单重复登记。
53
+
54
+ `document list` 是 SQLite 查询投影上的精确集合枚举,多个筛选条件使用 AND 语义,`--type task` 不隐式排除任何 lifecycle。`document inspect` 在原有 Profile 和问题上下文之外返回 declared、outgoing、incoming 与 unresolved 确定关系。两条读取命令查询前自动 reconcile;Agent 取得路径后用文件工具读取正文,不需要先跑 Maintenance。未来正文关键词、模糊匹配和相关性排序使用独立 `document search`,不改变 list/inspect 的确定语义。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: campfire-cli
3
- Version: 0.1.9
3
+ Version: 0.1.11
4
4
  Summary: Local-first shared context and governance CLI for humans and agents
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -23,7 +23,7 @@ Description-Content-Type: text/markdown
23
23
  - **写操作默认预览**:先计划、再确认、执行前在治理锁内复核内容哈希,多会话并发不会互相覆盖。
24
24
  - **本地优先**:不绑定云服务、不内置账号;Obsidian Vault 是当前首个存储适配器,Workspace 才是顶层概念。
25
25
 
26
- 产品目标、业务对象、SSOT 与模块边界见 [ARCHITECTURE.md](ARCHITECTURE.md),命令全景用 `campfire tree` 渐进发现。
26
+ 产品目标、业务对象、SSOT 与模块边界见 [ARCHITECTURE.md](ARCHITECTURE.md)。不知道 Campfire 是否具有某项能力时用 `campfire tree` 发现命令;已知文档操作不把 tree 作为固定前置步骤。
27
27
 
28
28
  ## 安装
29
29
 
@@ -94,7 +94,8 @@ campfire maintenance sync [--dry-run] [--scope] # 刷新 MOC 与相关文档页
94
94
  campfire maintenance archive check / apply # 归档候选检查与执行
95
95
 
96
96
  campfire document inspect / check / format # 单篇文档查看、校验、格式化
97
- campfire document apply / move # 单篇文档创建更新、跨 Domain 移动
97
+ campfire document list # 精确枚举和筛选受管文档
98
+ campfire document apply / move # 创建更新、类型转换、跨 Domain 移动
98
99
  campfire document profile list / show / resolve # Frontmatter Profile 规则
99
100
  campfire document type list # 文档类型与前缀
100
101
 
@@ -136,15 +137,16 @@ campfire workspace restructure verify --batch move-001
136
137
 
137
138
  ## 治理模型
138
139
 
140
+ - **本地查询投影**:`document list` 按 Project、Domain、类型和生命周期精确筛选;`document inspect` 返回显式关联、出链、反向链接和失效/歧义引用。两者在查询前自动 reconcile,Agent 无需先运行 Maintenance。SQLite 不复制正文,正文仍由 Agent 按返回路径读取。
139
141
  - **校验分工**:`maintenance check` 统一负责正式文档的 Schema 与枚举校验,并刷新可重建索引;结构声明由 `workspace space/domain check` 校验;`maintenance sync` 只因结构、MOC、路径或并发安全问题阻塞,单篇文档问题不阻止其他领域刷新。
140
142
  - **Frontmatter Profile**:声明式一层继承(`base` 或 `base → knowledge/project-doc/task`),`document profile show` 展示编译后的完整规则;Formatter 只按有效 Profile 排序并保留值,不允许字段由 Validator 报告、不自动删除。
141
143
  - **并发与提交安全**:写入前在治理锁内复核内容哈希,外部变化返回 `concurrent-change` / `source-hash-changed`,拒绝覆盖;多文件写入和路径移动经同一 ChangeSet 提交,失败恢复到执行前。
142
- - **按需后续治理**:写入命令只在实际写入成功且派生内容可能变化时返回一个最小 scope 的 `maintenance sync`;预览和阻塞结果的 `follow_up` 为空。Skill 消费该结果,没有 follow-up 就结束,不固定追加 dry-run 或全量 check。
144
+ - **按需后续治理**:写入命令只在实际写入成功且派生内容可能变化时返回零或一个、且可直接执行的最小 scope `maintenance sync`;预览和阻塞结果的 `follow_up` 为空。位于 Domain 内部的 scope 由 CLI 归一化为有效 Domain。Skill 消费该结果,没有 follow-up 就结束,不固定追加 dry-run 或全量 check。
143
145
  - **配置两层模型**:产品默认契约在包内 `resources/defaults/config.yml`(SSOT),用户只在 `~/.campfire/config.yml` 写覆盖项;Mapping 递归合并,`campfire workspace config check` 验证有效配置。
144
146
 
145
147
  ## Agent 协作
146
148
 
147
- 全局 Skill(`campfire skill list` 查看托管清单,`campfire skill sync` 手动同步)定义了 Agent 的标准工作流:首次读写先 `workspace resolve` 并读取 Workspace 的 `AGENTS.md`;单文档用 `document apply/move`,批量结构调整用 `workspace restructure`,归档用 `maintenance archive`。有歧义的分类和重构进入 Decision,不由 Agent 擅自决定。
149
+ 全局 Skill(`campfire skill list` 查看托管清单,`campfire skill sync` 手动同步)定义了 Agent 的标准工作流:已给出唯一文件路径的正文读取或小改直接使用文件工具;新建文档、修改 Frontmatter/类型/归属或执行结构治理时才加载 bootstrap,并使用 `document apply/move` 等原子命令。Frontmatter 契约已知时直接 apply;现有文档的字段类型或合法值未知时只执行一次 `document inspect` 后 apply。批量结构调整用 `workspace restructure`,归档用 `maintenance archive`。有歧义的分类和重构进入 Decision,不由 Agent 擅自决定。
148
150
 
149
151
  ## 许可
150
152
 
@@ -7,7 +7,7 @@
7
7
  - **写操作默认预览**:先计划、再确认、执行前在治理锁内复核内容哈希,多会话并发不会互相覆盖。
8
8
  - **本地优先**:不绑定云服务、不内置账号;Obsidian Vault 是当前首个存储适配器,Workspace 才是顶层概念。
9
9
 
10
- 产品目标、业务对象、SSOT 与模块边界见 [ARCHITECTURE.md](ARCHITECTURE.md),命令全景用 `campfire tree` 渐进发现。
10
+ 产品目标、业务对象、SSOT 与模块边界见 [ARCHITECTURE.md](ARCHITECTURE.md)。不知道 Campfire 是否具有某项能力时用 `campfire tree` 发现命令;已知文档操作不把 tree 作为固定前置步骤。
11
11
 
12
12
  ## 安装
13
13
 
@@ -78,7 +78,8 @@ campfire maintenance sync [--dry-run] [--scope] # 刷新 MOC 与相关文档页
78
78
  campfire maintenance archive check / apply # 归档候选检查与执行
79
79
 
80
80
  campfire document inspect / check / format # 单篇文档查看、校验、格式化
81
- campfire document apply / move # 单篇文档创建更新、跨 Domain 移动
81
+ campfire document list # 精确枚举和筛选受管文档
82
+ campfire document apply / move # 创建更新、类型转换、跨 Domain 移动
82
83
  campfire document profile list / show / resolve # Frontmatter Profile 规则
83
84
  campfire document type list # 文档类型与前缀
84
85
 
@@ -120,15 +121,16 @@ campfire workspace restructure verify --batch move-001
120
121
 
121
122
  ## 治理模型
122
123
 
124
+ - **本地查询投影**:`document list` 按 Project、Domain、类型和生命周期精确筛选;`document inspect` 返回显式关联、出链、反向链接和失效/歧义引用。两者在查询前自动 reconcile,Agent 无需先运行 Maintenance。SQLite 不复制正文,正文仍由 Agent 按返回路径读取。
123
125
  - **校验分工**:`maintenance check` 统一负责正式文档的 Schema 与枚举校验,并刷新可重建索引;结构声明由 `workspace space/domain check` 校验;`maintenance sync` 只因结构、MOC、路径或并发安全问题阻塞,单篇文档问题不阻止其他领域刷新。
124
126
  - **Frontmatter Profile**:声明式一层继承(`base` 或 `base → knowledge/project-doc/task`),`document profile show` 展示编译后的完整规则;Formatter 只按有效 Profile 排序并保留值,不允许字段由 Validator 报告、不自动删除。
125
127
  - **并发与提交安全**:写入前在治理锁内复核内容哈希,外部变化返回 `concurrent-change` / `source-hash-changed`,拒绝覆盖;多文件写入和路径移动经同一 ChangeSet 提交,失败恢复到执行前。
126
- - **按需后续治理**:写入命令只在实际写入成功且派生内容可能变化时返回一个最小 scope 的 `maintenance sync`;预览和阻塞结果的 `follow_up` 为空。Skill 消费该结果,没有 follow-up 就结束,不固定追加 dry-run 或全量 check。
128
+ - **按需后续治理**:写入命令只在实际写入成功且派生内容可能变化时返回零或一个、且可直接执行的最小 scope `maintenance sync`;预览和阻塞结果的 `follow_up` 为空。位于 Domain 内部的 scope 由 CLI 归一化为有效 Domain。Skill 消费该结果,没有 follow-up 就结束,不固定追加 dry-run 或全量 check。
127
129
  - **配置两层模型**:产品默认契约在包内 `resources/defaults/config.yml`(SSOT),用户只在 `~/.campfire/config.yml` 写覆盖项;Mapping 递归合并,`campfire workspace config check` 验证有效配置。
128
130
 
129
131
  ## Agent 协作
130
132
 
131
- 全局 Skill(`campfire skill list` 查看托管清单,`campfire skill sync` 手动同步)定义了 Agent 的标准工作流:首次读写先 `workspace resolve` 并读取 Workspace 的 `AGENTS.md`;单文档用 `document apply/move`,批量结构调整用 `workspace restructure`,归档用 `maintenance archive`。有歧义的分类和重构进入 Decision,不由 Agent 擅自决定。
133
+ 全局 Skill(`campfire skill list` 查看托管清单,`campfire skill sync` 手动同步)定义了 Agent 的标准工作流:已给出唯一文件路径的正文读取或小改直接使用文件工具;新建文档、修改 Frontmatter/类型/归属或执行结构治理时才加载 bootstrap,并使用 `document apply/move` 等原子命令。Frontmatter 契约已知时直接 apply;现有文档的字段类型或合法值未知时只执行一次 `document inspect` 后 apply。批量结构调整用 `workspace restructure`,归档用 `maintenance archive`。有歧义的分类和重构进入 Decision,不由 Agent 擅自决定。
132
134
 
133
135
  ## 许可
134
136
 
@@ -9,7 +9,7 @@ CLI delivery adapter
9
9
  ↓
10
10
  AppContainer 组合根,承担跨 App 编排
11
11
  ↓
12
- Workspace Restructure / Maintenance Service
12
+ Document / Workspace Restructure / Maintenance Service
13
13
  ↓
14
14
  消费方 Protocol
15
15
  ↓
@@ -29,6 +29,9 @@ SQLite / Filesystem Implementation
29
29
  - CLI 不直接实现业务规则;Service 不依赖 Typer。
30
30
  - 字段、枚举和跨字段不变量统一由 DocumentRuleService 解释;Maintenance 与 Workspace Restructure 不得复制规则值。
31
31
  - Frontmatter Profile 只允许一层 `base` 配置继承;Profile Loader 编译完整规则,Validator 与 Formatter 共用同一个 EffectiveProfile。
32
+ - 公共接口不得依赖调用方猜测未声明契约。参数类型与复杂输入格式必须能从当前命令帮助获得;错误必须同时提供稳定机器字段和可操作的修复信息,但不得为此复制 Profile 枚举或新增平行命令。
33
+ - `tree` 只用于未知能力发现,不是 Agent 执行已知文档操作的固定前置步骤;Skill 必须把已知正文编辑、契约已知的 Frontmatter 写入和契约未知的 `inspect → apply` 分流清楚。
34
+ - 命令不得读取“最近一次操作”等隐式 Session 状态推导对象或作用域;跨命令后续动作只使用当前结果显式返回的结构化 `follow_up`。
32
35
  - 所有写入默认预检,语义计划默认未审批。
33
36
  - 写入用例必须在治理锁内复核生成计划时的内容哈希,发现外部变化时拒绝覆盖。
34
37
 
@@ -38,6 +41,7 @@ SQLite / Filesystem Implementation
38
41
 
39
42
  - 正常输出 indent JSON;错误输出单行 JSON 并写 stderr,退出码非 0。
40
43
  - `status` 字段是 Agent 依赖的公共契约,只允许复用既有词汇,不得发明近义词。命令级词汇:ok、error、blocked、needs-input、needs-review、dry-run、synced、planned、ready、applied、issues-found、formatted、archived、up-to-date。文档、领域与 Decision 各有自己的字段词汇表。需要新状态先在本节登记。
44
+ - 可恢复的输入错误必须包含稳定 `code`、对应字段和机器可读的期望类型;当正确序列化方式不直观时,同时返回示例值或修复提示。自然语言 message 与示例可以演进,不作为调用方分支判断依据。
41
45
  - 前置条件缺失时优先降级执行:能完成的部分照常完成,输出 `needs-input` 并以 `skipped` 字段显式列出被跳过的步骤,而非整体报错退出。
42
46
 
43
47
  ## 升级语义
@@ -106,8 +110,13 @@ Campfire 使用语义化版本:
106
110
  ## Workspace 索引
107
111
 
108
112
  - SQLite `spaces`、`domains`、`documents` 只允许作为可重建本机投影,不得反向覆盖 Markdown SSOT。
113
+ - Document App 拥有文档记录、确定关系、集合查询和单篇关系查询;Repository 只持久化投影,不解释 Profile、Domain 或链接语义。
114
+ - 文档索引保存 schema version、parser version、有效配置 hash、拓扑 hash 和 generation;Domain 声明、Project 文档根映射等任一解释输入变化都必须自动完整重建。
115
+ - `document list` 与 `document inspect` 查询前必须轻量 reconcile。文件 stat 只筛选变化候选,content hash 表示内容版本;调用方不需要先运行 Maintenance。
116
+ - 候选文档与关系快照必须在一个 SQLite 事务中切换,失败继续保留上一完整 generation。
117
+ - `document list` 只做结构化精确筛选;`document inspect` 只返回显式关联和链接形成的确定关系。全文检索、模糊匹配、相关性排序和相似建议不得混入这两个契约。
109
118
  - `setup` 与 `maintenance check` 必须自动刷新完整拓扑和文档索引。
110
- - 写命令只在实际写入成功且派生状态可能变化时返回一个 scoped `maintenance sync` follow-up;预览和阻塞结果必须返回空列表;
119
+ - 索引 reconcile 是读取命令内部保障,不得作为 follow-up 暴露给 Agent。写命令只在实际写入成功且可见派生状态可能变化时返回零或一个可直接执行的 scoped `maintenance sync` follow-up;Domain 内部路径必须归一化为对应 Domain,预览和阻塞结果必须返回空列表;
111
120
  调用方只执行实际返回的 follow-up,不固定追加 check 或全量扫描。
112
121
  - `workspace rebuild` 默认只预览;`--confirm` 后从 Manifest 和 Markdown 完整替换派生索引。
113
122
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "campfire-cli"
3
- version = "0.1.9"
3
+ version = "0.1.11"
4
4
  description = "Local-first shared context and governance CLI for humans and agents"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """Campfire CLI package."""
2
2
 
3
- __version__ = "0.1.9"
3
+ __version__ = "0.1.11"
@@ -0,0 +1,84 @@
1
+ """Expand the rebuildable document query index."""
2
+
3
+ import sqlalchemy as sa
4
+
5
+ from alembic import op
6
+
7
+ revision = "009"
8
+ down_revision = "008"
9
+ branch_labels = None
10
+ depends_on = None
11
+
12
+
13
+ def upgrade() -> None:
14
+ with op.batch_alter_table("documents") as batch:
15
+ batch.add_column(sa.Column("name", sa.String(240)))
16
+ batch.add_column(sa.Column("project_id", sa.String(63)))
17
+ batch.add_column(sa.Column("lifecycle", sa.String(32)))
18
+ batch.add_column(sa.Column("priority", sa.String(32)))
19
+ batch.add_column(sa.Column("assignee_json", sa.Text(), nullable=False, server_default="[]"))
20
+ batch.add_column(sa.Column("due", sa.String(32)))
21
+ batch.add_column(sa.Column("source_updated", sa.String(32)))
22
+ batch.add_column(sa.Column("source_size", sa.Integer()))
23
+ batch.add_column(sa.Column("source_mtime_ns", sa.Integer()))
24
+ batch.add_column(
25
+ sa.Column("queryable", sa.Boolean(), nullable=False, server_default=sa.true())
26
+ )
27
+
28
+ op.create_table(
29
+ "document_edges",
30
+ sa.Column("id", sa.Integer(), primary_key=True),
31
+ sa.Column(
32
+ "workspace_id",
33
+ sa.String(63),
34
+ sa.ForeignKey("workspaces.id", ondelete="CASCADE"),
35
+ nullable=False,
36
+ ),
37
+ sa.Column("source_path", sa.Text(), nullable=False),
38
+ sa.Column("target_path", sa.Text()),
39
+ sa.Column("raw_target", sa.Text(), nullable=False),
40
+ sa.Column("relation_type", sa.String(48), nullable=False),
41
+ sa.Column("resolution", sa.String(24), nullable=False),
42
+ sa.Column("candidates_json", sa.Text(), nullable=False, server_default="[]"),
43
+ sa.Column("line", sa.Integer()),
44
+ )
45
+ op.create_index("ix_document_edges_workspace_id", "document_edges", ["workspace_id"])
46
+ op.create_index("ix_document_edges_source_path", "document_edges", ["source_path"])
47
+ op.create_index("ix_document_edges_target_path", "document_edges", ["target_path"])
48
+
49
+ op.create_table(
50
+ "document_index_state",
51
+ sa.Column(
52
+ "workspace_id",
53
+ sa.String(63),
54
+ sa.ForeignKey("workspaces.id", ondelete="CASCADE"),
55
+ primary_key=True,
56
+ ),
57
+ sa.Column("schema_version", sa.Integer(), nullable=False),
58
+ sa.Column("parser_version", sa.String(32), nullable=False),
59
+ sa.Column("config_hash", sa.String(64), nullable=False),
60
+ sa.Column("topology_hash", sa.String(64), nullable=False),
61
+ sa.Column("generation", sa.Integer(), nullable=False),
62
+ sa.Column("status", sa.String(24), nullable=False),
63
+ sa.Column("rebuilt_at", sa.DateTime(), nullable=False),
64
+ sa.Column("indexed_at", sa.DateTime(), nullable=False),
65
+ )
66
+
67
+
68
+ def downgrade() -> None:
69
+ op.drop_table("document_index_state")
70
+ op.drop_table("document_edges")
71
+ with op.batch_alter_table("documents") as batch:
72
+ for column in (
73
+ "queryable",
74
+ "source_mtime_ns",
75
+ "source_size",
76
+ "source_updated",
77
+ "due",
78
+ "assignee_json",
79
+ "priority",
80
+ "lifecycle",
81
+ "project_id",
82
+ "name",
83
+ ):
84
+ batch.drop_column(column)
@@ -1,6 +1,6 @@
1
1
  # Document App SPEC
2
2
 
3
- 本模块承载面向用户和 Agent 的文档业务能力,包括单篇检查与格式化、类型契约、Profile 契约、命名和 Frontmatter 治理。
3
+ 本模块承载面向用户和 Agent 的文档业务能力,包括单篇检查与格式化、类型契约、Profile 契约、命名与 Frontmatter 治理,以及设备本地可重建的文档查询投影。
4
4
 
5
5
  Document App 负责单篇文档及其规则;Maintenance App 负责检查、派生内容同步和归档;Workspace Restructure 负责存量批量结构重构。纯解析、序列化和路径安全等无业务状态的原子能力保留在 `common/documents/`。
6
6
 
@@ -20,6 +20,9 @@ document/
20
20
  │ ├── document_profile_service.py
21
21
  │ ├── document_type_service.py
22
22
  │ ├── document_service.py
23
+ │ ├── document_index_service.py
24
+ │ ├── document_index_builder.py
25
+ │ ├── document_index_protocol.py
23
26
  │ ├── document_rule_service.py
24
27
  │ ├── document_scanner.py
25
28
  │ ├── profile_registry.py
@@ -29,6 +32,7 @@ document/
29
32
  │ ├── frontmatter_apply.py
30
33
  │ └── frontmatter_formatter.py
31
34
  └── repository/
35
+ ├── document_index_repository.py
32
36
  ├── document_profile_repository.py
33
37
  └── document_type_repository.py
34
38
  ```
@@ -37,19 +41,34 @@ document/
37
41
  - `type`:检查、规划和执行单选类型与文件命名治理。
38
42
  - `frontmatter`:检查、规划、执行和格式化文档属性。
39
43
  - `rule`:统一解释类型、Profile、枚举与跨字段不变量。
40
- - `inspect`:向 Agent 返回单篇文档的 Domain、类型、有效 Profile 和具体问题。
44
+ - `index`:Service 只编排新鲜度、generation 和查询,Builder 只把 Markdown、Domain/Project 上下文与显式链接转换为确定性投影;配置、拓扑或解析器变化时完整重建,普通文件变化时调用时 reconcile。
45
+ - `list`:按 Project、Domain、类型和生命周期对索引做精确 AND 筛选;返回全部生命周期,不读取或复制正文。
46
+ - `inspect`:向 Agent 返回单篇文档的 Domain、类型、有效 Profile、具体问题,以及 declared、outgoing、incoming、unresolved 四类确定关系。
41
47
  - `apply`:根据目标路径和类型解析 Profile,不存在时生成文档,已有 Frontmatter 时只应用显式补丁,无 Frontmatter 时保留正文并补齐完整契约;先完整渲染并校验,追加 `--confirm` 后原子写入。
42
48
  - `move`:在任意已声明 Domain 之间移动或改名一篇文档,按目标 Profile 对齐可确定的 `domain`/`project` 归属,并更新可确定解析的 Wiki、Markdown 和路径引用。目标 Profile 缺少业务字段时返回 `needs-input`,不猜测。
43
49
  - `scanner`:统一解释受管根、忽略目录和豁免文件;Document 与 Maintenance 共用。
44
50
 
45
51
  Document Service 可以被 Workspace Restructure 编排,但不得反向依赖 Maintenance。批量计划文件、运行记录、MOC、Base、归档和重构批次不属于 Document App。
46
52
 
53
+ Markdown 是内容与关系事实源,SQLite 是按 Workspace 隔离的查询投影。Document Index Repository 不解析 Markdown、Profile 或 Domain,只原子持久化文档、关系和 generation 快照。索引不得复制正文;相似度、全文关键词和相关性排序不属于 v1,未来只能以独立 suggestions/search 契约扩展。
54
+
55
+ `list` 与 `inspect` 自行保障查询新鲜度,不返回索引维护 follow-up。文件 size/mtime 只用于发现变化候选,content hash 表示内容版本;Space/Domain 声明、Project 文档根映射或有效治理配置变化必须触发完整重建。Project 归属优先来自 Domain 继承,其次来自组合根注入的已注册 Project 文档根,不信任每篇 Frontmatter 的重复值。MOC 与其他生成文档不作为普通内容节点。
56
+
47
57
  `apply` 与 `move` 只保证目标文档操作自身有效,不触发 Maintenance。结果只在派生状态可能变化时返回一个最小 scope 的 `maintenance sync`;调用方不得固定追加 check。所有写入先生成完整 ChangeSet,再经共享 Executor 在乐观锁内提交;多文件操作失败时恢复提交前内容。
48
58
 
49
59
  包内 `config.yml` 的默认 Profile 与用户级 `~/.campfire/config.yml` 覆盖共同构成当前治理契约。
50
60
 
51
61
  Profile 只允许一层 `base` 继承。Service 将声明配置编译为完整 `EffectiveProfile`;Validator、Formatter 和 CLI 必须消费同一结果,不得复制字段、枚举与值类型。`value_types` 声明不能由 YAML 形状可靠推断的标量类型,当前支持 `string` 和 `boolean`。
52
62
 
63
+ Document 写入接口不得要求 Agent 猜测 Frontmatter 输入契约:
64
+
65
+ - `--set` 是统一的显式字段补丁入口。CLI Adapter 只拆分首个 `=`、拒绝空字段名和重复字段,并保留原始 value;它不解释 Profile,也不使用 YAML 隐式类型推断。
66
+ - Document App 解析一次目标 EffectiveProfile,并由 apply 与 move 共用的值解码器转换补丁:enum、string 和 date 保留原始字符串,boolean 只接受明确的 `true` 或 `false`,list 只接受严格 JSON 数组。
67
+ - Profile 与 Rule Service 继续拥有字段类型、合法值和业务校验,不保存命令行字符串。命令帮助负责 Shell 展示方式,并为列表值给出 `--set 'tags=["tag1","tag2"]'` 形式的最小例子。
68
+ - 输入错误统一返回稳定错误码、字段、实际值、期望类型和可直接照抄的参数示例;apply 与 move 不得分别构造两套解码或诊断。
69
+ - 不因输入格式不直观而增加 `--tags`、`--sources` 等字段专用参数,也不把逗号字符串静默猜成列表。
70
+ - 现有文档的有效 Profile 已由 `document inspect` 返回。Skill 只在字段契约未知时安排一次 `inspect → apply`;契约已知的补丁直接 apply,正文小改不进入本接口。
71
+
53
72
  标准字段用于格式化、补全和校验。默认 `unknown_fields: preserve`:已有业务扩展字段不参与标准排序但必须原样保留,不因尚未建立专属 Profile 而制造全库噪声;确需封闭字段集合的 Profile 可显式设为 `report`。
54
73
 
55
74
  Document 不维护配置副本,也不提供契约同步命令。升级 Python 包会更新默认契约;用户自定义类型和 Profile 只写入 `~/.campfire/config.yml`,并通过 `workspace config check` 验证。
@@ -6,18 +6,13 @@ from pathlib import Path
6
6
  from typing import Any
7
7
 
8
8
  import typer
9
- import yaml
10
9
  from pydantic import BaseModel
11
10
 
12
11
  from campfire_cli.app.document.cli.profile_cli import profile_cli
13
12
  from campfire_cli.app.document.cli.type_cli import type_cli
14
13
  from campfire_cli.app.document.schema import DocumentApplyRequest
15
14
  from campfire_cli.app.document.service.document_service import DocumentService
16
- from campfire_cli.app.workspace.repository.workspace_repository import SqliteWorkspaceRepository
17
- from campfire_cli.app.workspace.service.workspace_service import WorkspaceService
18
15
  from campfire_cli.common.exceptions import AppError
19
- from campfire_cli.common.filesystem.cwd import safe_cwd
20
- from campfire_cli.config.settings import WorkspaceSettings, campfire_home
21
16
 
22
17
  document_cli = typer.Typer(
23
18
  help="创建、检查和维护文档及其规则",
@@ -26,15 +21,18 @@ document_cli = typer.Typer(
26
21
  document_cli.add_typer(profile_cli, name="profile")
27
22
  document_cli.add_typer(type_cli, name="type")
28
23
 
24
+ SET_OPTION_HELP = (
25
+ "设置 Frontmatter 字段,格式 field=value,可重复使用。"
26
+ "值类型由有效 Profile 决定;列表使用严格 JSON,例如 "
27
+ '--set \'tags=["tag1","tag2"]\'。'
28
+ )
29
+
29
30
 
30
31
  def service(ctx: typer.Context) -> DocumentService:
32
+ from campfire_cli.container import AppContainer
33
+
31
34
  selector = ctx.find_root().params.get("workspace")
32
- root = campfire_home()
33
- resolution = WorkspaceService(root, SqliteWorkspaceRepository(root)).resolve(
34
- selector, safe_cwd()
35
- )
36
- settings = WorkspaceSettings.load(resolution.workspace_id, Path(resolution.workspace))
37
- return DocumentService(settings)
35
+ return AppContainer.build(selector).document
38
36
 
39
37
 
40
38
  def invoke(operation: Callable[[], dict[str, Any] | BaseModel]) -> None:
@@ -61,10 +59,29 @@ def kanban_check(ctx: typer.Context, path: str = typer.Option(..., "--path")) ->
61
59
 
62
60
  @document_cli.command("inspect")
63
61
  def inspect(ctx: typer.Context, path: str = typer.Option(..., "--path")) -> None:
64
- """返回 Agent 治理单篇文档所需的类型、Profile、领域和问题上下文。"""
62
+ """返回单篇文档的 Profile、领域、确定关系和问题上下文。"""
65
63
  invoke(lambda: service(ctx).inspect(path))
66
64
 
67
65
 
66
+ @document_cli.command("list")
67
+ def list_documents(
68
+ ctx: typer.Context,
69
+ project: str | None = typer.Option(None, "--project"),
70
+ domain: str | None = typer.Option(None, "--domain"),
71
+ document_type: str | None = typer.Option(None, "--type"),
72
+ lifecycle: str | None = typer.Option(None, "--lifecycle"),
73
+ ) -> None:
74
+ """按 Project、Domain、类型和生命周期列出受管内容文档。"""
75
+ invoke(
76
+ lambda: service(ctx).list(
77
+ project=project,
78
+ domain=domain,
79
+ document_type=document_type,
80
+ lifecycle=lifecycle,
81
+ )
82
+ )
83
+
84
+
68
85
  @document_cli.command("format")
69
86
  def format_document(
70
87
  ctx: typer.Context,
@@ -75,8 +92,8 @@ def format_document(
75
92
  invoke(lambda: service(ctx).format(path, confirm))
76
93
 
77
94
 
78
- def parse_values(items: list[str]) -> dict[str, Any]:
79
- values: dict[str, Any] = {}
95
+ def parse_values(items: list[str]) -> dict[str, str]:
96
+ values: dict[str, str] = {}
80
97
  for item in items:
81
98
  if "=" not in item:
82
99
  raise typer.BadParameter(f"--set 必须使用 field=value:{item}")
@@ -86,7 +103,7 @@ def parse_values(items: list[str]) -> dict[str, Any]:
86
103
  key = key.strip()
87
104
  if key in values:
88
105
  raise typer.BadParameter(f"--set 字段重复:{key}")
89
- values[key] = yaml.safe_load(raw)
106
+ values[key] = raw
90
107
  return values
91
108
 
92
109
 
@@ -95,21 +112,26 @@ def apply_document(
95
112
  ctx: typer.Context,
96
113
  path: str = typer.Option(..., "--path"),
97
114
  document_type: str | None = typer.Option(None, "--type"),
98
- set_values: list[str] | None = typer.Option(None, "--set"),
115
+ set_values: list[str] | None = typer.Option(None, "--set", help=SET_OPTION_HELP),
99
116
  body_file: Path | None = typer.Option(None, "--body-file"),
100
117
  append_section: str | None = typer.Option(None, "--append-section"),
101
118
  replace_body: bool = typer.Option(False, "--replace-body"),
102
119
  expected_hash: str | None = typer.Option(None, "--expected-hash"),
103
120
  confirm: bool = typer.Option(False, "--confirm"),
104
121
  ) -> None:
105
- """预览或应用一篇 Profile 合法文档的创建与补丁。"""
122
+ """预览或应用一篇 Profile 合法文档的创建、补丁与显式类型变更。
123
+
124
+ 创建时文件名可省略类型前缀;CLI 根据 --type 返回并写入最终 target。
125
+ 已有文档的 --type 发生变化时,同一原子操作同步文件名和引用。
126
+ """
127
+ values = parse_values(set_values or [])
106
128
  body = body_file.read_text(encoding="utf-8") if body_file else None
107
129
  invoke(
108
130
  lambda: service(ctx).apply(
109
131
  DocumentApplyRequest(
110
132
  path=path,
111
133
  document_type=document_type,
112
- values=parse_values(set_values or []),
134
+ values=values,
113
135
  body=body,
114
136
  append_section=append_section,
115
137
  replace_body=replace_body,
@@ -126,18 +148,19 @@ def move_document(
126
148
  source: str = typer.Option(..., "--path", help="源文档的 Workspace 相对路径"),
127
149
  target_domain: str = typer.Option(..., "--domain", help="目标 Domain 的稳定 id"),
128
150
  name: str | None = typer.Option(None, "--name", help="可选的新文件名;省略时保持原文件名"),
129
- set_values: list[str] | None = typer.Option(None, "--set"),
151
+ set_values: list[str] | None = typer.Option(None, "--set", help=SET_OPTION_HELP),
130
152
  unset_fields: list[str] | None = typer.Option(None, "--unset"),
131
153
  expected_hash: str | None = typer.Option(None, "--expected-hash"),
132
154
  confirm: bool = typer.Option(False, "--confirm"),
133
155
  ) -> None:
134
156
  """预览或移动一篇文档,并按目标 Domain 契约更新归属与引用。"""
157
+ values = parse_values(set_values or [])
135
158
  invoke(
136
159
  lambda: service(ctx).move(
137
160
  source,
138
161
  target_domain,
139
162
  name=name,
140
- values=parse_values(set_values or []),
163
+ values=values,
141
164
  unset_fields=tuple(unset_fields or []),
142
165
  expected_hash=expected_hash,
143
166
  confirm=confirm,
@@ -0,0 +1,7 @@
1
+ """Document persistence adapters."""
2
+
3
+ from campfire_cli.app.document.repository.document_index_repository import (
4
+ SqliteDocumentIndexRepository,
5
+ )
6
+
7
+ __all__ = ["SqliteDocumentIndexRepository"]