campfire-cli 0.1.8__tar.gz → 0.1.9__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 (201) hide show
  1. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/ARCHITECTURE.md +5 -4
  2. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/COMMAND.md +11 -6
  3. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/PKG-INFO +11 -11
  4. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/README.md +10 -10
  5. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/SPEC.md +4 -2
  6. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/pyproject.toml +1 -1
  7. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/__init__.py +1 -1
  8. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/cli/document_cli.py +5 -3
  9. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/document_apply_service.py +30 -12
  10. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/document_move_service.py +9 -8
  11. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/document_service.py +12 -1
  12. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/maintenance/service/maintenance_service.py +1 -1
  13. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/SPEC.md +6 -6
  14. campfire_cli-0.1.9/src/campfire_cli/app/workspace/cli/config_cli.py +25 -0
  15. campfire_cli-0.1.9/src/campfire_cli/app/workspace/cli/domain_cli.py +181 -0
  16. campfire_cli-0.1.9/src/campfire_cli/app/workspace/cli/project_cli.py +189 -0
  17. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/cli/restructure_cli.py +10 -12
  18. campfire_cli-0.1.9/src/campfire_cli/app/workspace/cli/space_cli.py +60 -0
  19. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/cli/workspace_cli.py +12 -4
  20. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/schema/restructure_schema.py +37 -2
  21. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/service/adoption_service.py +29 -21
  22. campfire_cli-0.1.9/src/campfire_cli/app/workspace/service/domain_restructure_service.py +760 -0
  23. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/service/project_service.py +2 -4
  24. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/service/restructure_service.py +102 -15
  25. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/service/structure_service.py +16 -20
  26. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/service/workspace_service.py +2 -6
  27. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/documents/domain_context.py +18 -0
  28. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/filesystem/change_set.py +9 -1
  29. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/container.py +1 -1
  30. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/main.py +7 -7
  31. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/SPEC.md +2 -1
  32. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-context-bootstrap/SKILL.md +2 -2
  33. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-document-capture/SKILL.md +1 -1
  34. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-workspace-adoption/SKILL.md +2 -2
  35. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/SKILL.md +9 -5
  36. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-workspace-restructure/SKILL.md +10 -6
  37. campfire_cli-0.1.9/src/campfire_cli/resources/skills/campfire-workspace-restructure/references/restructure-spec.md +21 -0
  38. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/conftest.py +2 -1
  39. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/integration/test_cli.py +893 -165
  40. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/perf/test_resolve_subprocess_count.py +5 -5
  41. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_document_apply.py +70 -21
  42. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_file_change_executor.py +31 -0
  43. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/uv.lock +1 -1
  44. campfire_cli-0.1.8/src/campfire_cli/app/workspace/cli/config_cli.py +0 -31
  45. campfire_cli-0.1.8/src/campfire_cli/app/workspace/cli/domain_cli.py +0 -177
  46. campfire_cli-0.1.8/src/campfire_cli/app/workspace/cli/project_cli.py +0 -136
  47. campfire_cli-0.1.8/src/campfire_cli/app/workspace/cli/space_cli.py +0 -66
  48. campfire_cli-0.1.8/src/campfire_cli/app/workspace/service/domain_restructure_service.py +0 -365
  49. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/.github/workflows/ci.yml +0 -0
  50. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/.github/workflows/release.yml +0 -0
  51. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/.gitignore +0 -0
  52. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/AGENTS.md +0 -0
  53. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/DECISIONS.md +0 -0
  54. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/LICENSE +0 -0
  55. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/alembic/SPEC.md +0 -0
  56. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/alembic/env.py +0 -0
  57. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/alembic/script.py.mako +0 -0
  58. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/alembic/versions/001_initial_schema.py +0 -0
  59. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/alembic.ini +0 -0
  60. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/scripts/SPEC.md +0 -0
  61. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/__init__.py +0 -0
  62. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/env.py +0 -0
  63. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/script.py.mako +0 -0
  64. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/versions/001_initial_schema.py +0 -0
  65. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/versions/002_workspace_project_registry.py +0 -0
  66. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/versions/003_unified_workspace_state.py +0 -0
  67. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/versions/004_restructure_workspace_domain.py +0 -0
  68. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/versions/005_decision_channel.py +0 -0
  69. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/versions/006_workspace_topology_index.py +0 -0
  70. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/versions/007_workspace_adoption.py +0 -0
  71. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/versions/008_remove_adoption_batches.py +0 -0
  72. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/alembic/versions/__init__.py +0 -0
  73. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/SPEC.md +0 -0
  74. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/__init__.py +0 -0
  75. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/base/SPEC.md +0 -0
  76. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/base/__init__.py +0 -0
  77. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/base/cli/base_cli.py +0 -0
  78. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/base/repository/base_repository.py +0 -0
  79. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/base/schema/base_schema.py +0 -0
  80. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/base/schema/operation_schema.py +0 -0
  81. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/base/service/base_service.py +0 -0
  82. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/decision/SPEC.md +0 -0
  83. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/decision/__init__.py +0 -0
  84. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/decision/cli/decision_cli.py +0 -0
  85. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/decision/repository/decision_repository.py +0 -0
  86. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/decision/schema/decision_schema.py +0 -0
  87. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/decision/service/decision_projection_service.py +0 -0
  88. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/decision/service/decision_service.py +0 -0
  89. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/SPEC.md +0 -0
  90. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/__init__.py +0 -0
  91. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/cli/__init__.py +0 -0
  92. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/cli/profile_cli.py +0 -0
  93. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/cli/type_cli.py +0 -0
  94. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/repository/__init__.py +0 -0
  95. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/repository/document_profile_repository.py +0 -0
  96. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/repository/document_type_repository.py +0 -0
  97. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/schema/__init__.py +0 -0
  98. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/schema/document_schema.py +0 -0
  99. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/__init__.py +0 -0
  100. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/document_profile_service.py +0 -0
  101. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/document_rule_service.py +0 -0
  102. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/document_scanner.py +0 -0
  103. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/document_type_service.py +0 -0
  104. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/frontmatter_apply.py +0 -0
  105. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/frontmatter_formatter.py +0 -0
  106. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/frontmatter_plan.py +0 -0
  107. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/kanban_service.py +0 -0
  108. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/profile_registry.py +0 -0
  109. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/type_apply.py +0 -0
  110. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/document/service/type_plan.py +0 -0
  111. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/maintenance/SPEC.md +0 -0
  112. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/maintenance/__init__.py +0 -0
  113. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/maintenance/cli/maintenance_cli.py +0 -0
  114. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/maintenance/repository/maintenance_repository.py +0 -0
  115. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/maintenance/schema/maintenance_schema.py +0 -0
  116. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/maintenance/service/archive_service.py +0 -0
  117. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/maintenance/service/link_service.py +0 -0
  118. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/maintenance/service/maintenance_protocol.py +0 -0
  119. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/maintenance/service/moc_service.py +0 -0
  120. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/skill/SPEC.md +0 -0
  121. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/skill/__init__.py +0 -0
  122. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/skill/cli/skill_cli.py +0 -0
  123. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/skill/repository/skill_repository.py +0 -0
  124. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/skill/schema/skill_schema.py +0 -0
  125. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/skill/service/skill_service.py +0 -0
  126. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/__init__.py +0 -0
  127. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/cli/__init__.py +0 -0
  128. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/repository/__init__.py +0 -0
  129. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/repository/manifest_repository.py +0 -0
  130. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/repository/restructure_repository.py +0 -0
  131. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/repository/workspace_repository.py +0 -0
  132. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/schema/__init__.py +0 -0
  133. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/schema/adoption_schema.py +0 -0
  134. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/schema/workspace_schema.py +0 -0
  135. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/service/__init__.py +0 -0
  136. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/service/config_service.py +0 -0
  137. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/service/restructure_protocol.py +0 -0
  138. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/service/restructure_verifier.py +0 -0
  139. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/app/workspace/service/workspace_protocol.py +0 -0
  140. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/SPEC.md +0 -0
  141. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/__init__.py +0 -0
  142. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/agent_hints.py +0 -0
  143. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/database/__init__.py +0 -0
  144. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/database/migrations.py +0 -0
  145. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/database/models.py +0 -0
  146. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/database/session.py +0 -0
  147. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/documents/__init__.py +0 -0
  148. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/documents/document_types.py +0 -0
  149. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/documents/frontmatter_schema.py +0 -0
  150. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/documents/markdown.py +0 -0
  151. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/exceptions/__init__.py +0 -0
  152. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/exceptions/base.py +0 -0
  153. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/filesystem/__init__.py +0 -0
  154. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/filesystem/atomic.py +0 -0
  155. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/filesystem/cwd.py +0 -0
  156. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/filesystem/locking.py +0 -0
  157. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/governance/__init__.py +0 -0
  158. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/governance/issues.py +0 -0
  159. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/governance/locking.py +0 -0
  160. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/governance/snapshots.py +0 -0
  161. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/hashing.py +0 -0
  162. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/package_version.py +0 -0
  163. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/reports/__init__.py +0 -0
  164. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/reports/json_report.py +0 -0
  165. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/common/reports/markdown_report.py +0 -0
  166. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/config/SPEC.md +0 -0
  167. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/config/defaults.py +0 -0
  168. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/config/settings.py +0 -0
  169. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/__init__.py +0 -0
  170. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/bases/Agent/346/211/247/350/241/214/345/267/245/344/275/234/345/217/260.base" +0 -0
  171. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/bases/SPEC.md +0 -0
  172. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/bases//344/273/273/345/212/241/345/267/245/344/275/234/345/217/260.base" +0 -0
  173. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/bases//345/206/263/347/255/226/345/267/245/344/275/234/345/217/260.base" +0 -0
  174. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/bases//345/276/205/345/275/222/346/241/243/346/226/207/346/241/243.base" +0 -0
  175. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/bases//351/241/271/347/233/256/346/226/207/346/241/243.base" +0 -0
  176. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/defaults/__init__.py +0 -0
  177. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/defaults/config.yml +0 -0
  178. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-context-bootstrap/agents/openai.yaml +0 -0
  179. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-conversation-router/SKILL.md +0 -0
  180. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-conversation-router/agents/openai.yaml +0 -0
  181. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-conversation-router/references/inbox-handoff.md +0 -0
  182. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-conversation-router/references/learning-intake.md +0 -0
  183. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-conversation-router/references/task-intake.md +0 -0
  184. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-inbox-triage/SKILL.md +0 -0
  185. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-kanban-board/SKILL.md +0 -0
  186. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-task-management/SKILL.md +0 -0
  187. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/SKILL.md +0 -0
  188. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/agents/openai.yaml +0 -0
  189. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/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
  190. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/SPEC.md +0 -0
  191. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/perf/test_read_counts.py +0 -0
  192. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_agent_hints.py +0 -0
  193. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_atomic_write.py +0 -0
  194. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_common_governance.py +0 -0
  195. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_config.py +0 -0
  196. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_domain_context.py +0 -0
  197. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_frontmatter.py +0 -0
  198. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_kanban_service.py +0 -0
  199. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_migrations.py +0 -0
  200. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_package_version.py +0 -0
  201. {campfire_cli-0.1.8 → campfire_cli-0.1.9}/tests/unit/test_repository_boundaries.py +0 -0
@@ -97,7 +97,7 @@ Campfire 不是“Markdown 版 kubectl”,而是面向人机协作场景组合
97
97
  | --- | --- | --- |
98
98
  | 语义原子性 | 一条命令只表达一个可以用一句话说清的用户意图 | `document move` 表达“在已声明 Domain 之间正确移动一篇文档” |
99
99
  | 一致性原子性 | 为保持该意图不变量而必须一起变更的事实,属于同一个变更集;整体成功或恢复到执行前 | 移动文档时同步修复可确定解析的引用 |
100
- | 可组合原子性 | 不相关的派生治理不隐式执行;命令用结构化 `follow_up` 声明必要步骤,由 Skill 决定组合顺序 | `document apply` 只在必要时返回一个 scoped `maintenance sync` |
100
+ | 可组合原子性 | 不相关的派生治理不隐式执行;只有实际写入成功的结果用结构化 `follow_up` 声明必要步骤,由 Skill 决定组合顺序 | `document apply` 预览时 `follow_up` 为空,写入后只在必要时返回一个 scoped `maintenance sync` |
101
101
 
102
102
  命令副作用按下列边界分类:
103
103
 
@@ -124,6 +124,7 @@ Campfire 不是“Markdown 版 kubectl”,而是面向人机协作场景组合
124
124
  5. **人类与 Agent 共用一个契约**:命令和结果只有一套语义。JSON 状态、issues、missing fields 与 follow-up 供 Agent 稳定消费,`tree` 和分层 `-h` 供人类与 Agent 渐进发现,不维护第二套参数目录。
125
125
  6. **语义与机制分层**:人类决定高风险取舍,Agent 理解正文和业务语义,Skill 规定加载时机、事实门禁与 SOP,CLI 只执行可确定验证的治理机制。歧义进入 Decision,不为“自动化成功”而猜测。
126
126
  7. **聚合入口是少数例外**:`setup` 和 `upgrade` 可以编排多个服务,因为它们表达完整安装生命周期;日常内容治理保持原子能力,避免重新出现 `maintenance run` 一类不可审查的聚合入口。
127
+ 8. **参数最小充分、黄金路径唯一**:调用方只提交 CLI 无法可靠推导的事实。已受管的 Workspace、Space、Domain 和 Project 优先使用稳定 id,路径只用于外部输入、未接管来源、显式物理位置或尚无稳定 id 的文档;同一事实不得同时要求 id、完整路径和父级关系。一个常规意图只保留一个公共入口,不用互斥模式参数、兼容别名或要求 Agent 手工拼装底层步骤来表达同一行为。
127
128
 
128
129
  横切关注点与业务 SOP 不使用同一种复用手段。哈希复核、写锁、原子替换和失败恢复由显式 ChangeSet Executor 复用;写命令返回的 `follow_up` 由 Skill 消费。不为了复用 Maintenance 而引入 AOP 切面、命令总线、全局钩子或隐式中间件。
129
130
 
@@ -163,7 +164,7 @@ Project 的逻辑身份可以跨设备保持一致,但 `local_path` 是机器
163
164
 
164
165
  可移植元数据由 Vault 根目录唯一的 `.campfire.yaml` 承载并随 Git 或文件同步;不得提交 `campfire.db` 来共享状态。Manifest 使用稳定的 `workspace.id`,保存 Workspace 名称、治理版本,以及 Project 的 id、名称、文档领域、Git remote、默认分支和状态,明确禁止 `local_path`。现有 `_空间.md` 与 `_领域.md` 继续分别承载 Space 和 Domain 事实,避免在 Manifest 重复维护。Decision 当前保持本地,不属于该 Manifest。
165
166
 
166
- 新设备执行 `campfire setup --workspace <vault>`:读取 Manifest、注册本机路径、恢复 Project 逻辑元数据、同步类型/Profile/Skills/Bases 并执行健康检查。无法自动确定的项目源码路径显示为 `unbound_projects`,再用 `campfire workspace project bind` 完成本机绑定。整个流程可重复执行。
167
+ 新设备执行 `campfire setup --path <vault>`:读取 Manifest、注册本机路径、恢复 Project 逻辑元数据、同步类型/Profile/Skills/Bases 并执行健康检查。已注册 Workspace 只通过根级 `campfire --workspace <id> ...` 显式选择。无法自动确定的项目源码路径显示为 `unbound_projects`,再用 `campfire workspace project bind` 完成本机绑定。整个流程可重复执行。
167
168
 
168
169
  ### 领域结构重构
169
170
 
@@ -172,10 +173,10 @@ Domain 的机器身份、显示名称和物理位置是三个独立维度:
172
173
  ```text
173
174
  domain_id 稳定身份,普通重命名和移动不改变
174
175
  name 人类可读名称,通过 domain rename 修改
175
- path Workspace 内物理位置,通过 domain move 或显式目录重命名修改
176
+ path Workspace 内物理位置,通过 domain move 修改
176
177
  ```
177
178
 
178
- `domain rename`、`domain move` 和高风险的 `domain rekey` 是领域级事务,不应拆成大量逐文件迁移。路径变化必须联动 `_领域.md`、Project `document_domain`、`.campfire.yaml` 和路径引用;`rekey` 必须联动直接子领域的 `parent_domain`。所有命令默认预览,显式 `--confirm` 后执行。
179
+ `domain rename`、`domain move`、`domain merge`、`domain delete` 和高风险的 `domain rekey` 是领域级意图原子事务,不应拆成大量逐文件迁移。路径变化必须联动 `_领域.md`、Project `document_domain`、`.campfire.yaml` 和路径引用;`rekey` 必须联动直接子领域的 `parent_domain`。`merge` 把源 Domain 的受管内容迁入目标 Domain,并在不变量满足时移除源 Domain;`delete` 只删除没有内容、附件、子 Domain 或 Project 绑定的逻辑空 Domain。它们不是跨业务聚合入口,内部必须复用同一 ChangeSet、快照复核和失败恢复边界。所有命令默认预览,显式 `--confirm` 后执行。
179
180
 
180
181
  SQLite 中的 `spaces`、`domains` 与 `documents` 是本机查询投影,不是新的事实源。`setup`、`maintenance check` 和领域重构会自动从 `.campfire.yaml`、`_空间.md`、`_领域.md` 与内容文档刷新这些表;`workspace rebuild --confirm` 只提供低频的完整恢复入口。
181
182
 
@@ -3,7 +3,7 @@
3
3
  人类与 Agent 先用 `campfire tree` 发现命令,再用任意层级的 `-h` 渐进加载参数。
4
4
 
5
5
  ```bash
6
- campfire setup --workspace <vault-path> [--id <workspace-id>] --default
6
+ campfire setup --path <vault-path> [--id <workspace-id>] --default
7
7
  campfire upgrade
8
8
  campfire skill sync
9
9
  campfire base sync
@@ -17,15 +17,18 @@ campfire workspace space check --space <space-id>
17
17
  campfire workspace config check
18
18
  campfire workspace domain list
19
19
  campfire workspace domain check
20
- campfire workspace domain adopt --source <folder> --target-path <path> --id <id> --name <name> --space <id> --type <type> --governance <policy> [--parent <id>] [--project <id>] [--confirm]
21
- campfire workspace domain rename --domain <id> --name <name> [--rename-directory|--target-path <path>] [--project-name <name>] [--confirm]
22
- campfire workspace domain move --domain <id> --target-path <path> [--parent-domain <id>] [--confirm]
20
+ campfire workspace domain create --id <id> --name <name> --path <workspace-relative-path> --type <type> [--governance <policy>] [--project <id>] [--confirm]
21
+ campfire workspace domain adopt --source <folder> --id <id> --name <name> --type <type> [--target-path <path>] [--governance <policy>] [--project <id>] [--confirm]
22
+ campfire workspace domain rename --domain <id> --name <name> [--confirm]
23
+ campfire workspace domain move --domain <id> --target <space-or-domain-id> [--confirm]
24
+ campfire workspace domain merge --source <id> --target <id> [--confirm]
25
+ campfire workspace domain delete --domain <id> [--confirm]
23
26
  campfire workspace domain rekey --domain <id> --new-id <id> [--confirm]
24
27
  campfire workspace restructure inventory --scope <path> --batch <id>
25
28
  campfire workspace restructure plan --batch <id>
26
29
  campfire workspace project resolve --path "$PWD"
27
30
  campfire document apply --path <workspace-relative-markdown> --type <type> --set <field=value> [--body-file <path>] [--confirm]
28
- campfire document move --from <source> --to <target> [--set <field=value>] [--unset <field>] [--expected-hash <sha256>] [--confirm]
31
+ campfire document move --path <source> --domain <target-domain-id> [--name <filename>] [--set <field=value>] [--unset <field>] [--expected-hash <sha256>] [--confirm]
29
32
  campfire document inspect --path <file>
30
33
  campfire document type list
31
34
  campfire document profile list
@@ -41,4 +44,6 @@ campfire maintenance archive check [--scope <path>]
41
44
  campfire maintenance archive apply [--scope <path>] --confirm
42
45
  ```
43
46
 
44
- Space、Domain、Project 的 `create`/`adopt`,以及文档移动、重构、归档写操作默认先预览;审查通过后才追加 `--confirm`。`document apply` 可新建、更新或为已有正文补齐 Frontmatter;`document move` 可在任意已声明 Domain 之间移动单篇文档并对齐可确定的 `domain`/`project`。目标 Profile 缺少语义字段时返回 `missing_fields`,调用方用 `--set`/`--unset` 补齐。写命令只返回实际需要的一个 scoped `maintenance sync` follow-up,没有派生影响时返回空列表。具体参数以对应命令的 `-h` 为准。
47
+ Space、Domain、Project 的 `create`/`adopt`,以及文档移动、重构、归档写操作默认先预览;审查通过后才追加 `--confirm`。已注册 Workspace 只通过根级 `campfire --workspace <id> ...` 选择;已声明 Space、Domain 和 Project 使用稳定 ID,CLI 自行推导路径和父子关系。路径参数只用于新位置、具体文件、外部输入和显式扫描范围。
48
+
49
+ `document apply` 可新建、更新或为已有正文补齐 Frontmatter;`document move` 可在任意已声明 Domain 之间移动单篇文档并对齐可确定的 `domain`/`project`。目标 Profile 缺少语义字段时返回 `missing_fields`,调用方用 `--set`/`--unset` 补齐。只有实际写入成功的结果才可返回一个实际需要的 scoped `maintenance sync` follow-up;预览、阻塞或无派生影响时返回空列表。具体参数以对应命令的 `-h` 为准。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: campfire-cli
3
- Version: 0.1.8
3
+ Version: 0.1.9
4
4
  Summary: Local-first shared context and governance CLI for humans and agents
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -49,7 +49,7 @@ uv tool install --editable /path/to/campfire-cli
49
49
 
50
50
  ```bash
51
51
  # 1. 接入已有 Vault(目录已存在,含或不含 .campfire.yaml)
52
- campfire setup --workspace /path/to/vault --default
52
+ campfire setup --path /path/to/vault --default
53
53
 
54
54
  # 2. 或者从零创建新 Workspace(初始化目录结构并注册)
55
55
  campfire workspace create --id personal --path /path/to/vault --default
@@ -59,7 +59,7 @@ campfire maintenance check --summary
59
59
  campfire maintenance sync --dry-run
60
60
  ```
61
61
 
62
- 不指定 `--workspace` 运行 `campfire setup` 是降级执行而不是报错:仍会同步全局 Skill 与提示词路标,输出接入引导,并显式列出被跳过的 Manifest 相关步骤。
62
+ 不指定 `--path` 运行 `campfire setup` 是降级执行而不是报错:仍会同步全局 Skill 与提示词路标,输出接入引导,并显式列出被跳过的 Manifest 相关步骤。
63
63
 
64
64
  `setup` 与 `skill sync` 会向 `~/.claude/CLAUDE.md`、`~/.agents/AGENTS.md` 注入幂等的 campfire 路标块(带注释标记、不触碰块外内容;`CAMPFIRE_AGENT_HINT_PATH` 可覆盖目标),并把托管 Skill 同步到 `~/.claude/skills`、`~/.agents/skills`(`CAMPFIRE_SKILL_TARGETS` 可覆盖)。Agent 冷启动时由此知道本机装有 campfire。
65
65
 
@@ -79,7 +79,7 @@ Workspace ── Space ── Domain 树 ── 文档
79
79
  | Decision | 需要人类或高级 Agent 回答的持久判断 | 全局 SQLite,投影到 `_协作/decisions/` |
80
80
  | Generated View | MOC、相关文档页、Base、报告 | 派生数据,能生成就不手工维护 |
81
81
 
82
- 设备边界:`.campfire.yaml` 只保存可跨设备同步的稳定身份与逻辑关联(Project id、Git remote、文档 Domain 等),禁止本机绝对路径;新设备执行 `campfire setup --workspace <vault>` 即可恢复。本机路径绑定、索引、Decision、锁与报告都在 `~/.campfire/`(可用 `CAMPFIRE_HOME` 覆盖),按 Workspace 隔离。
82
+ 设备边界:`.campfire.yaml` 只保存可跨设备同步的稳定身份与逻辑关联(Project id、Git remote、文档 Domain 等),禁止本机绝对路径;新设备执行 `campfire setup --path <vault>` 即可恢复。本机路径绑定、索引、Decision、锁与报告都在 `~/.campfire/`(可用 `CAMPFIRE_HOME` 覆盖),按 Workspace 隔离。
83
83
 
84
84
  ## 常用命令
85
85
 
@@ -106,9 +106,9 @@ campfire decision create / list / answer / close # 持久决策通道
106
106
  ```bash
107
107
  campfire workspace space create --id research --name "研究" --path myresearch --type research
108
108
  campfire workspace domain create --id wiki --name "Wiki" --path "mywork/项目/wiki" \
109
- --space work --type knowledge-domain --governance project-docs --confirm
110
- campfire workspace project adopt --id example --workspace personal \
111
- --name "Example" --document-domain "work/example" --local-path /path/to/repo
109
+ --type knowledge-domain --confirm
110
+ campfire --workspace personal workspace project adopt --id example \
111
+ --name "Example" --domain project-example --local-path /path/to/repo
112
112
  campfire workspace rebuild --confirm # 索引损坏时从 SSOT 完整恢复
113
113
  ```
114
114
 
@@ -118,12 +118,12 @@ campfire workspace rebuild --confirm # 索引损坏时从 SSOT 完
118
118
 
119
119
  ```bash
120
120
  campfire workspace domain adopt --source /path/to/folder --target-path "mynote/新领域" \
121
- --id knowledge-new --name "新领域" --space knowledge \
121
+ --id knowledge-new --name "新领域" \
122
122
  --type knowledge-domain --governance knowledge-docs
123
123
  # 审查同一份结构化计划后,对相同命令追加 --confirm
124
124
  ```
125
125
 
126
- 单篇文档在已声明 Domain 之间移动使用 `document move`。批量文档或 Domain 结构重构先冻结范围,再传入 YAML/JSON 意图规格(含 Frontmatter 修改),逐项审查 `approved` 后执行:
126
+ 单篇文档在已声明 Domain 之间移动使用 `document move --path <source> --domain <target-domain-id> [--name <filename>]`。常见 Domain 调整直接使用 `domain move/merge/delete`;只有批量文档映射、领域拆分或 Frontmatter Patch 才进入持久批次:
127
127
 
128
128
  ```bash
129
129
  campfire workspace restructure inventory --scope work --batch move-001
@@ -132,14 +132,14 @@ campfire workspace restructure apply --batch move-001 --confirm
132
132
  campfire workspace restructure verify --batch move-001
133
133
  ```
134
134
 
135
- 领域三个维度独立演进:`domain rename`(显示名)、`domain move`(物理路径)、`domain rekey`(稳定身份,高风险)。领域级命令联动 `_领域.md`、子领域、Project、`.campfire.yaml` 与路径引用。
135
+ 领域三个维度独立演进:`domain rename`(显示名)、`domain move --target <space-or-domain-id>`(物理位置)、`domain rekey`(稳定身份,高风险)。领域合并和逻辑空领域删除分别使用 `domain merge`、`domain delete`;领域级命令联动 `_领域.md`、子领域、Project、`.campfire.yaml` 与路径引用。
136
136
 
137
137
  ## 治理模型
138
138
 
139
139
  - **校验分工**:`maintenance check` 统一负责正式文档的 Schema 与枚举校验,并刷新可重建索引;结构声明由 `workspace space/domain check` 校验;`maintenance sync` 只因结构、MOC、路径或并发安全问题阻塞,单篇文档问题不阻止其他领域刷新。
140
140
  - **Frontmatter Profile**:声明式一层继承(`base` 或 `base → knowledge/project-doc/task`),`document profile show` 展示编译后的完整规则;Formatter 只按有效 Profile 排序并保留值,不允许字段由 Validator 报告、不自动删除。
141
141
  - **并发与提交安全**:写入前在治理锁内复核内容哈希,外部变化返回 `concurrent-change` / `source-hash-changed`,拒绝覆盖;多文件写入和路径移动经同一 ChangeSet 提交,失败恢复到执行前。
142
- - **按需后续治理**:写入命令只在派生内容可能变化时返回一个最小 scope 的 `maintenance sync`;Skill 消费该结果,没有 follow-up 就结束,不固定追加 dry-run 或全量 check。
142
+ - **按需后续治理**:写入命令只在实际写入成功且派生内容可能变化时返回一个最小 scope 的 `maintenance sync`;预览和阻塞结果的 `follow_up` 为空。Skill 消费该结果,没有 follow-up 就结束,不固定追加 dry-run 或全量 check。
143
143
  - **配置两层模型**:产品默认契约在包内 `resources/defaults/config.yml`(SSOT),用户只在 `~/.campfire/config.yml` 写覆盖项;Mapping 递归合并,`campfire workspace config check` 验证有效配置。
144
144
 
145
145
  ## Agent 协作
@@ -33,7 +33,7 @@ uv tool install --editable /path/to/campfire-cli
33
33
 
34
34
  ```bash
35
35
  # 1. 接入已有 Vault(目录已存在,含或不含 .campfire.yaml)
36
- campfire setup --workspace /path/to/vault --default
36
+ campfire setup --path /path/to/vault --default
37
37
 
38
38
  # 2. 或者从零创建新 Workspace(初始化目录结构并注册)
39
39
  campfire workspace create --id personal --path /path/to/vault --default
@@ -43,7 +43,7 @@ campfire maintenance check --summary
43
43
  campfire maintenance sync --dry-run
44
44
  ```
45
45
 
46
- 不指定 `--workspace` 运行 `campfire setup` 是降级执行而不是报错:仍会同步全局 Skill 与提示词路标,输出接入引导,并显式列出被跳过的 Manifest 相关步骤。
46
+ 不指定 `--path` 运行 `campfire setup` 是降级执行而不是报错:仍会同步全局 Skill 与提示词路标,输出接入引导,并显式列出被跳过的 Manifest 相关步骤。
47
47
 
48
48
  `setup` 与 `skill sync` 会向 `~/.claude/CLAUDE.md`、`~/.agents/AGENTS.md` 注入幂等的 campfire 路标块(带注释标记、不触碰块外内容;`CAMPFIRE_AGENT_HINT_PATH` 可覆盖目标),并把托管 Skill 同步到 `~/.claude/skills`、`~/.agents/skills`(`CAMPFIRE_SKILL_TARGETS` 可覆盖)。Agent 冷启动时由此知道本机装有 campfire。
49
49
 
@@ -63,7 +63,7 @@ Workspace ── Space ── Domain 树 ── 文档
63
63
  | Decision | 需要人类或高级 Agent 回答的持久判断 | 全局 SQLite,投影到 `_协作/decisions/` |
64
64
  | Generated View | MOC、相关文档页、Base、报告 | 派生数据,能生成就不手工维护 |
65
65
 
66
- 设备边界:`.campfire.yaml` 只保存可跨设备同步的稳定身份与逻辑关联(Project id、Git remote、文档 Domain 等),禁止本机绝对路径;新设备执行 `campfire setup --workspace <vault>` 即可恢复。本机路径绑定、索引、Decision、锁与报告都在 `~/.campfire/`(可用 `CAMPFIRE_HOME` 覆盖),按 Workspace 隔离。
66
+ 设备边界:`.campfire.yaml` 只保存可跨设备同步的稳定身份与逻辑关联(Project id、Git remote、文档 Domain 等),禁止本机绝对路径;新设备执行 `campfire setup --path <vault>` 即可恢复。本机路径绑定、索引、Decision、锁与报告都在 `~/.campfire/`(可用 `CAMPFIRE_HOME` 覆盖),按 Workspace 隔离。
67
67
 
68
68
  ## 常用命令
69
69
 
@@ -90,9 +90,9 @@ campfire decision create / list / answer / close # 持久决策通道
90
90
  ```bash
91
91
  campfire workspace space create --id research --name "研究" --path myresearch --type research
92
92
  campfire workspace domain create --id wiki --name "Wiki" --path "mywork/项目/wiki" \
93
- --space work --type knowledge-domain --governance project-docs --confirm
94
- campfire workspace project adopt --id example --workspace personal \
95
- --name "Example" --document-domain "work/example" --local-path /path/to/repo
93
+ --type knowledge-domain --confirm
94
+ campfire --workspace personal workspace project adopt --id example \
95
+ --name "Example" --domain project-example --local-path /path/to/repo
96
96
  campfire workspace rebuild --confirm # 索引损坏时从 SSOT 完整恢复
97
97
  ```
98
98
 
@@ -102,12 +102,12 @@ campfire workspace rebuild --confirm # 索引损坏时从 SSOT 完
102
102
 
103
103
  ```bash
104
104
  campfire workspace domain adopt --source /path/to/folder --target-path "mynote/新领域" \
105
- --id knowledge-new --name "新领域" --space knowledge \
105
+ --id knowledge-new --name "新领域" \
106
106
  --type knowledge-domain --governance knowledge-docs
107
107
  # 审查同一份结构化计划后,对相同命令追加 --confirm
108
108
  ```
109
109
 
110
- 单篇文档在已声明 Domain 之间移动使用 `document move`。批量文档或 Domain 结构重构先冻结范围,再传入 YAML/JSON 意图规格(含 Frontmatter 修改),逐项审查 `approved` 后执行:
110
+ 单篇文档在已声明 Domain 之间移动使用 `document move --path <source> --domain <target-domain-id> [--name <filename>]`。常见 Domain 调整直接使用 `domain move/merge/delete`;只有批量文档映射、领域拆分或 Frontmatter Patch 才进入持久批次:
111
111
 
112
112
  ```bash
113
113
  campfire workspace restructure inventory --scope work --batch move-001
@@ -116,14 +116,14 @@ campfire workspace restructure apply --batch move-001 --confirm
116
116
  campfire workspace restructure verify --batch move-001
117
117
  ```
118
118
 
119
- 领域三个维度独立演进:`domain rename`(显示名)、`domain move`(物理路径)、`domain rekey`(稳定身份,高风险)。领域级命令联动 `_领域.md`、子领域、Project、`.campfire.yaml` 与路径引用。
119
+ 领域三个维度独立演进:`domain rename`(显示名)、`domain move --target <space-or-domain-id>`(物理位置)、`domain rekey`(稳定身份,高风险)。领域合并和逻辑空领域删除分别使用 `domain merge`、`domain delete`;领域级命令联动 `_领域.md`、子领域、Project、`.campfire.yaml` 与路径引用。
120
120
 
121
121
  ## 治理模型
122
122
 
123
123
  - **校验分工**:`maintenance check` 统一负责正式文档的 Schema 与枚举校验,并刷新可重建索引;结构声明由 `workspace space/domain check` 校验;`maintenance sync` 只因结构、MOC、路径或并发安全问题阻塞,单篇文档问题不阻止其他领域刷新。
124
124
  - **Frontmatter Profile**:声明式一层继承(`base` 或 `base → knowledge/project-doc/task`),`document profile show` 展示编译后的完整规则;Formatter 只按有效 Profile 排序并保留值,不允许字段由 Validator 报告、不自动删除。
125
125
  - **并发与提交安全**:写入前在治理锁内复核内容哈希,外部变化返回 `concurrent-change` / `source-hash-changed`,拒绝覆盖;多文件写入和路径移动经同一 ChangeSet 提交,失败恢复到执行前。
126
- - **按需后续治理**:写入命令只在派生内容可能变化时返回一个最小 scope 的 `maintenance sync`;Skill 消费该结果,没有 follow-up 就结束,不固定追加 dry-run 或全量 check。
126
+ - **按需后续治理**:写入命令只在实际写入成功且派生内容可能变化时返回一个最小 scope 的 `maintenance sync`;预览和阻塞结果的 `follow_up` 为空。Skill 消费该结果,没有 follow-up 就结束,不固定追加 dry-run 或全量 check。
127
127
  - **配置两层模型**:产品默认契约在包内 `resources/defaults/config.yml`(SSOT),用户只在 `~/.campfire/config.yml` 写覆盖项;Mapping 递归合并,`campfire workspace config check` 验证有效配置。
128
128
 
129
129
  ## Agent 协作
@@ -96,16 +96,18 @@ Campfire 使用语义化版本:
96
96
 
97
97
  - `domain_id`、`name` 和 `path` 分别表示稳定身份、显示名称和物理位置,不得隐式绑定。
98
98
  - 普通 rename 和 move 不得改变 `domain_id`;只有显式 `domain rekey` 可以修改稳定身份。
99
- - 修改领域名称不得默认修改 Project 名称;必须由 `--project-name` 明确表达。
99
+ - 修改领域名称不得修改 Project 名称;Project 展示名称只能由 `workspace project update --name` 显式修改。
100
100
  - 领域路径变化必须同步 Project `document_domain`、`.campfire.yaml` 和路径引用。
101
101
  - `rekey` 必须同步直接子领域的 `parent_domain`。
102
+ - `move` 的目标必须使用 Space 或 Domain 稳定 id;`merge` 和 `delete` 不得退化为 Agent 手工移动、删除声明与清理索引。
103
+ - 已受管对象使用稳定 id,路径参数只用于新位置、具体文件、外部输入与扫描范围;不得同时要求可推导的 id、路径和父级关系。
102
104
  - 领域级写入默认只预览,只有显式 `--confirm` 才执行。
103
105
 
104
106
  ## Workspace 索引
105
107
 
106
108
  - SQLite `spaces`、`domains`、`documents` 只允许作为可重建本机投影,不得反向覆盖 Markdown SSOT。
107
109
  - `setup` 与 `maintenance check` 必须自动刷新完整拓扑和文档索引。
108
- - 写命令只在派生状态可能变化时返回一个 scoped `maintenance sync` follow-up;
110
+ - 写命令只在实际写入成功且派生状态可能变化时返回一个 scoped `maintenance sync` follow-up;预览和阻塞结果必须返回空列表;
109
111
  调用方只执行实际返回的 follow-up,不固定追加 check 或全量扫描。
110
112
  - `workspace rebuild` 默认只预览;`--confirm` 后从 Manifest 和 Markdown 完整替换派生索引。
111
113
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "campfire-cli"
3
- version = "0.1.8"
3
+ version = "0.1.9"
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.8"
3
+ __version__ = "0.1.9"
@@ -123,8 +123,9 @@ def apply_document(
123
123
  @document_cli.command("move")
124
124
  def move_document(
125
125
  ctx: typer.Context,
126
- source: str = typer.Option(..., "--from"),
127
- target: str = typer.Option(..., "--to"),
126
+ source: str = typer.Option(..., "--path", help="源文档的 Workspace 相对路径"),
127
+ target_domain: str = typer.Option(..., "--domain", help="目标 Domain 的稳定 id"),
128
+ name: str | None = typer.Option(None, "--name", help="可选的新文件名;省略时保持原文件名"),
128
129
  set_values: list[str] | None = typer.Option(None, "--set"),
129
130
  unset_fields: list[str] | None = typer.Option(None, "--unset"),
130
131
  expected_hash: str | None = typer.Option(None, "--expected-hash"),
@@ -134,7 +135,8 @@ def move_document(
134
135
  invoke(
135
136
  lambda: service(ctx).move(
136
137
  source,
137
- target,
138
+ target_domain,
139
+ name=name,
138
140
  values=parse_values(set_values or []),
139
141
  unset_fields=tuple(unset_fields or []),
140
142
  expected_hash=expected_hash,
@@ -4,7 +4,10 @@ from datetime import date
4
4
  from pathlib import Path
5
5
  from typing import Any
6
6
 
7
- from campfire_cli.app.base.schema.operation_schema import maintenance_sync_follow_up
7
+ from campfire_cli.app.base.schema.operation_schema import (
8
+ CommandFollowUp,
9
+ maintenance_sync_follow_up,
10
+ )
8
11
  from campfire_cli.app.document.schema import (
9
12
  DocumentApplyRequest,
10
13
  DocumentApplyResult,
@@ -165,7 +168,13 @@ class DocumentApplyService:
165
168
  expected={path: None if actual_hash == "missing" else actual_hash},
166
169
  )
167
170
  )
168
- return result.model_copy(update={"status": "applied", "write_performed": True})
171
+ return result.model_copy(
172
+ update={
173
+ "status": "applied",
174
+ "write_performed": True,
175
+ "follow_up": self._follow_up(request, exists, parsed.has_frontmatter),
176
+ }
177
+ )
169
178
 
170
179
  def _creation_defaults(self, path: Path, document_type: str, today: str) -> dict[str, Any]:
171
180
  prefix = self._settings.document_types["types"][document_type]["prefix"]
@@ -223,11 +232,6 @@ class DocumentApplyService:
223
232
  issues: list[dict[str, Any]],
224
233
  missing_fields: list[str] | None = None,
225
234
  ) -> DocumentApplyResult:
226
- scope = Path(request.path).parent.as_posix()
227
- derived_fields = {"name", "type", "status", "lifecycle", "domain", "project", "related"}
228
- needs_sync = not exists or not had_frontmatter
229
- needs_sync = needs_sync or bool(set(request.values) & derived_fields)
230
- needs_sync = needs_sync or request.body is not None
231
235
  return DocumentApplyResult(
232
236
  status=status,
233
237
  workspace_id=self._settings.workspace_id,
@@ -237,9 +241,23 @@ class DocumentApplyService:
237
241
  expected_hash=expected_hash,
238
242
  issues=issues,
239
243
  missing_fields=missing_fields or [],
240
- follow_up=(
241
- maintenance_sync_follow_up(self._settings.workspace_id, [scope])
242
- if not issues and needs_sync
243
- else []
244
- ),
244
+ )
245
+
246
+ def _follow_up(
247
+ self,
248
+ request: DocumentApplyRequest,
249
+ exists: bool,
250
+ had_frontmatter: bool,
251
+ ) -> list[CommandFollowUp]:
252
+ derived_fields = {"name", "type", "status", "lifecycle", "domain", "project", "related"}
253
+ needs_sync = not exists or not had_frontmatter
254
+ needs_sync = needs_sync or bool(set(request.values) & derived_fields)
255
+ needs_sync = needs_sync or request.body is not None
256
+ return (
257
+ maintenance_sync_follow_up(
258
+ self._settings.workspace_id,
259
+ [Path(request.path).parent.as_posix()],
260
+ )
261
+ if needs_sync
262
+ else []
245
263
  )
@@ -200,6 +200,14 @@ class DocumentMoveService:
200
200
  frontmatter_changes[field] = after
201
201
 
202
202
  status = "needs-input" if missing_fields else "blocked" if issues else "ready"
203
+ follow_up = maintenance_sync_follow_up(
204
+ self._settings.workspace_id,
205
+ (
206
+ context.root.relative_to(self._settings.vault_root).as_posix()
207
+ for context in (source_domain, target_domain)
208
+ if context is not None
209
+ ),
210
+ )
203
211
  result = DocumentMoveResult(
204
212
  status=status,
205
213
  workspace_id=self._settings.workspace_id,
@@ -212,14 +220,6 @@ class DocumentMoveService:
212
220
  frontmatter_changes=frontmatter_changes,
213
221
  issues=issues,
214
222
  missing_fields=missing_fields,
215
- follow_up=maintenance_sync_follow_up(
216
- self._settings.workspace_id,
217
- (
218
- context.root.relative_to(self._settings.vault_root).as_posix()
219
- for context in (source_domain, target_domain)
220
- if context is not None
221
- ),
222
- ),
223
223
  )
224
224
  if issues or not confirm:
225
225
  return result
@@ -240,6 +240,7 @@ class DocumentMoveService:
240
240
  "status": "moved",
241
241
  "write_performed": True,
242
242
  "updated_references": updated_references,
243
+ "follow_up": follow_up,
243
244
  }
244
245
  )
245
246
 
@@ -18,6 +18,7 @@ from campfire_cli.app.document.service.kanban_service import (
18
18
  renderability_result,
19
19
  )
20
20
  from campfire_cli.app.document.service.profile_registry import ProfileRegistry
21
+ from campfire_cli.common.documents.domain_context import DomainContextError, resolve_domain_by_id
21
22
  from campfire_cli.common.documents.markdown import parse_document
22
23
  from campfire_cli.common.exceptions import ConfigurationError, GovernanceBlockedError
23
24
  from campfire_cli.common.filesystem import atomic_write, safe_path
@@ -137,13 +138,23 @@ class DocumentService:
137
138
  def move(
138
139
  self,
139
140
  source: str,
140
- target: str,
141
+ target_domain: str,
141
142
  *,
143
+ name: str | None = None,
142
144
  values: dict[str, Any] | None = None,
143
145
  unset_fields: tuple[str, ...] = (),
144
146
  expected_hash: str | None = None,
145
147
  confirm: bool = False,
146
148
  ) -> DocumentMoveResult:
149
+ source_path = safe_path(self._settings.vault_root, source)
150
+ target_name = name or source_path.name
151
+ if Path(target_name).name != target_name or not target_name.endswith(".md"):
152
+ raise ConfigurationError("document move 的 --name 必须是 Markdown 文件名")
153
+ try:
154
+ domain = resolve_domain_by_id(self._settings.vault_root, target_domain)
155
+ except DomainContextError as exc:
156
+ raise ConfigurationError(f"目标 Domain 不存在或不唯一:{exc.detail}") from exc
157
+ target = (domain.root / target_name).relative_to(self._settings.vault_root).as_posix()
147
158
  return self._movement.move(
148
159
  source,
149
160
  target,
@@ -159,7 +159,7 @@ class MaintenanceService:
159
159
  if domain.path == scope_path or scope_path in domain.path.parents
160
160
  ]
161
161
  issues = [issue for issue in issues if self._path_matches_scope(issue["path"], scope)]
162
- if not domains:
162
+ if not domains and not scope_path.exists():
163
163
  return self._sync_blocked("scope-missing", scope, scope)
164
164
  if issues:
165
165
  return MaintenanceResult(
@@ -2,17 +2,17 @@
2
2
 
3
3
  本模块管理 Workspace、Space、Domain、Project 注册表和 Workspace 初始化。Workspace id 与 Project id 是本机治理状态的稳定键;路径只是可变定位信息。用户级 `CAMPFIRE_HOME/campfire.db` 是唯一数据库,保存注册数据、文档索引和工作流状态;每个 Workspace 只保留配置与人类可审阅的运行产物,不再拥有独立数据库。所有工具状态均位于 `CAMPFIRE_HOME`,不得向目标 Workspace 创建工具状态目录。
4
4
 
5
- 解析优先级为显式 `--workspace`、当前目录所属的已注册 Workspace、默认 Workspace。写操作仍由具体业务模块执行。
5
+ 解析优先级为根级显式 `--workspace <id>`、当前目录所属的已注册 Workspace、默认 Workspace。显式值只接受稳定 Workspace id,不接受路径;叶命令不得重复暴露 Workspace 选择器。写操作仍由具体业务模块执行。
6
6
 
7
- `campfire setup --workspace <path>` 根据 Manifest 接入已有 Workspace;缺少 Manifest 时必须提供 `--id` 以创建首份 Manifest。`workspace create` 要求目标路径不存在,并创建全局收件箱、带 `_空间.md` 的知识/工作 Space 和治理视图基础目录。两者写入全局 SQLite 注册表,不向 Workspace 写工具状态。
7
+ `campfire setup --path <path>` 根据 Manifest 接入已有 Workspace;缺少 Manifest 时必须提供 `--id` 以创建首份 Manifest。`workspace create` 要求目标路径不存在,并创建全局收件箱、带 `_空间.md` 的知识/工作 Space 和治理视图基础目录。两者写入全局 SQLite 注册表,不向 Workspace 写工具状态。
8
8
 
9
- `workspace space/domain create` 只创建不存在的新目录;`space adopt` 原地纳管已有 Space,`domain adopt` 可原地声明或把一个 Vault 内外已有目录接管到明确目标。外部来源始终保留。命令默认只输出计划,追加 `--confirm` 才写入。
9
+ `workspace space/domain create` 只创建不存在的新目录;`space adopt` 原地纳管已有 Space,`domain adopt` 可原地声明或把一个 Vault 内外已有目录接管到明确目标。Domain 所属 Space 和最近父 Domain 从目标路径唯一推导,嵌套 Domain 继承 governance/Project;外部来源始终保留。命令默认只输出计划,追加 `--confirm` 才写入。
10
10
 
11
11
  `workspace config check` 统一校验包内产品默认值和当前 Workspace 的有效治理契约,包括目录与 Space 冲突、文档类型前缀、Profile 引用和继承、归档策略以及托管资源列表。
12
12
 
13
- `workspace restructure` 负责一次性改变已有 Workspace 的批量文档结构:冻结范围、生成带内容哈希的审批计划、执行批量跨领域移动或改名、更新引用并验证迁移事实。Domain 自身的 rename/move/rekey 直接位于 `workspace domain`。单篇文档移动属于 `document move`。纯移动不得重写文档内容;`verify` 只验证本批次 source/target 结果。该能力属于 Workspace Service,不设独立 App,也不用于日常增量维护。
13
+ `workspace restructure` 负责原子命令无法表达的批量文档映射、领域拆分和 Frontmatter Patch:冻结范围、生成带内容哈希的审批计划、更新引用并验证迁移事实。Domain 的 rename/move/merge/delete/rekey 直接位于 `workspace domain`;move 使用目标 Space/Domain id 推导路径,merge 一次完成内容迁移和源领域移除,delete 只删除逻辑空领域。单篇文档移动属于 `document move`,以目标 Domain id 代替目标路径。纯移动不得重写文档内容;`verify` 只验证本批次 source/target 结果。该能力属于 Workspace Service,不设独立 App,也不用于日常增量维护。
14
14
 
15
- Adoption、文档批量 Restructure 与 Domain Restructure 均使用共享 ChangeSet Executor 提交文件写入和路径移动,并在协调的 Repository 写入失败时补偿恢复。Workspace Service 不调用 Maintenance Service;成功结果只在必要时以轻量 `follow_up` 返回一个 scoped `maintenance sync`。
15
+ Adoption、文档批量 Restructure 与 Domain Restructure 均使用共享 ChangeSet Executor 提交文件写入和路径移动,并在协调的 Repository 写入失败时补偿恢复。Workspace Service 不调用 Maintenance Service;实际写入成功的结果只在必要时以轻量 `follow_up` 返回一个 scoped `maintenance sync`,预览和阻塞结果不返回可执行后续。
16
16
 
17
17
  Space 是 Workspace 根下以 `_空间.md` 声明的顶级内容容器;Domain 位于 Space 内,以 `_领域.md` 声明并可任意嵌套。子 Domain 必须处于父 Domain 路径下、属于同一 Space 并继承 governance。`_收件箱` 与 `治理视图` 是系统区域,不是 Space。Maintenance 只消费本模块发现的结构,不维护第二套领域规则。
18
18
 
@@ -22,6 +22,6 @@ Project 是 Workspace 连接的外部工作资源,记录稳定 id、显示名
22
22
 
23
23
  `project resolve` 只按规范化后的本地 Git 根目录和 remote 识别已注册 Project,不凭目录名称猜测;零匹配和多匹配都返回可判断状态。`project check` 只报告源码路径、remote、默认分支和文档领域的漂移,不自动更新稳定身份或归属。
24
24
 
25
- `project create` 用于新 Project onboarding,默认只返回计划,追加 `--confirm` 后通过 Domain Service 创建工作 Space 内的项目根 Domain 并注册 Project。初始化不虚构业务子领域;已存在文档中心使用 `project adopt` 接入。
25
+ `project create --path` 用于新 Project onboarding,默认只返回计划,追加 `--confirm` 后通过 Domain Service 创建工作 Space 内的项目根 Domain 并注册 Project。初始化不虚构业务子领域;已存在文档中心使用 `project adopt --domain <id>` 接入,更新只提交显式给出的字段。
26
26
 
27
27
  注册数据只通过 CLI 和 SQLite 维护。JSON 仅用于显式 export/import;import 默认只预检,必须使用 `--confirm` 才替换当前注册数据。不读取旧 JSON 注册表,不维护双事实源。
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+
5
+ import typer
6
+
7
+ from campfire_cli.app.workspace.cli.workspace_cli import emit, invoke, resolution
8
+ from campfire_cli.app.workspace.service.config_service import WorkspaceConfigService
9
+ from campfire_cli.config.settings import WorkspaceSettings
10
+
11
+ config_cli = typer.Typer(
12
+ help="检查 Workspace 治理配置契约",
13
+ context_settings={"help_option_names": ["-h", "--help"]},
14
+ )
15
+
16
+
17
+ def service(ctx: typer.Context) -> WorkspaceConfigService:
18
+ resolved = resolution(ctx)
19
+ settings = WorkspaceSettings.load(resolved.workspace_id, Path(resolved.workspace))
20
+ return WorkspaceConfigService(settings)
21
+
22
+
23
+ @config_cli.command("check")
24
+ def check(ctx: typer.Context) -> None:
25
+ emit(invoke(lambda: service(ctx).check()))