campfire-cli 0.1.20__tar.gz → 0.1.22__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 (231) hide show
  1. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/ARCHITECTURE.md +4 -2
  2. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/COMMAND.md +4 -2
  3. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/PKG-INFO +6 -2
  4. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/README.md +5 -1
  5. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/SPEC.md +1 -1
  6. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/pyproject.toml +1 -1
  7. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/scripts/quality_check.py +5 -3
  8. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/__init__.py +1 -1
  9. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/SPEC.md +2 -2
  10. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/mutation/document_apply_service.py +6 -1
  11. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/maintenance/SPEC.md +1 -1
  12. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/SPEC.md +4 -0
  13. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/adoption_service.py +2 -6
  14. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/domain_restructure_service.py +2 -6
  15. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/structure_service.py +23 -6
  16. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/workspace_service.py +16 -0
  17. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/documents/markdown.py +13 -2
  18. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/defaults/config.yml +2 -4
  19. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/SPEC.md +4 -2
  20. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-document-capture/SKILL.md +8 -4
  21. campfire_cli-0.1.22/src/campfire_cli/resources/skills/campfire-document-capture/references//344/273/273/345/212/241/344/270/216/350/256/241/345/210/222/346/262/211/346/267/200.md +8 -0
  22. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-task-management/SKILL.md +14 -3
  23. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/SKILL.md +4 -4
  24. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/SKILL.md +7 -6
  25. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-workspace-onboarding/SKILL.md +2 -2
  26. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-workspace-onboarding/references//346/240/207/345/207/206/345/267/245/344/275/234/345/214/272/347/273/223/346/236/204.md +5 -1
  27. campfire_cli-0.1.22/src/campfire_cli/resources/workspace/_/346/250/241/346/235/277/README.md +20 -0
  28. campfire_cli-0.1.22/src/campfire_cli/resources/workspace/_/346/250/241/346/235/277//346/250/241/346/235/277-/344/273/273/345/212/241.md +57 -0
  29. campfire_cli-0.1.22/src/campfire_cli/resources/workspace/_/346/250/241/346/235/277//346/250/241/346/235/277-/347/211/210/346/234/254/345/217/221/345/270/203/346/270/205/345/215/225.md +55 -0
  30. campfire_cli-0.1.22/tests/integration/test_workspace_templates.py +189 -0
  31. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_document_apply.py +55 -1
  32. campfire_cli-0.1.22/tests/unit/test_domain_paths.py +68 -0
  33. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/uv.lock +1 -1
  34. campfire_cli-0.1.20/src/campfire_cli/resources/skills/campfire-document-capture/references//344/273/273/345/212/241/344/270/216/350/256/241/345/210/222/346/262/211/346/267/200.md +0 -8
  35. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/.github/workflows/ci.yml +0 -0
  36. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/.github/workflows/release.yml +0 -0
  37. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/.gitignore +0 -0
  38. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/.python-version +0 -0
  39. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/AGENTS.md +0 -0
  40. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/DECISIONS.md +0 -0
  41. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/LICENSE +0 -0
  42. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/alembic/SPEC.md +0 -0
  43. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/alembic/env.py +0 -0
  44. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/alembic/script.py.mako +0 -0
  45. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/alembic/versions/001_initial_schema.py +0 -0
  46. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/alembic.ini +0 -0
  47. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/scripts/SPEC.md +0 -0
  48. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/scripts/pypi_verify.py +0 -0
  49. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/scripts/release_check.py +0 -0
  50. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/__init__.py +0 -0
  51. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/env.py +0 -0
  52. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/script.py.mako +0 -0
  53. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/001_initial_schema.py +0 -0
  54. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/002_workspace_project_registry.py +0 -0
  55. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/003_unified_workspace_state.py +0 -0
  56. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/004_restructure_workspace_domain.py +0 -0
  57. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/005_decision_channel.py +0 -0
  58. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/006_workspace_topology_index.py +0 -0
  59. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/007_workspace_adoption.py +0 -0
  60. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/008_remove_adoption_batches.py +0 -0
  61. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/009_document_query_index.py +0 -0
  62. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/010_project_domain_identity.py +0 -0
  63. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/011_document_state_model.py +0 -0
  64. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/012_remove_decision_channel.py +0 -0
  65. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/alembic/versions/__init__.py +0 -0
  66. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/SPEC.md +0 -0
  67. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/__init__.py +0 -0
  68. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/base/SPEC.md +0 -0
  69. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/base/__init__.py +0 -0
  70. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/base/cli/base_cli.py +0 -0
  71. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/base/repository/base_repository.py +0 -0
  72. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/base/schema/base_schema.py +0 -0
  73. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/base/schema/operation_schema.py +0 -0
  74. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/base/service/base_service.py +0 -0
  75. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/__init__.py +0 -0
  76. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/cli/__init__.py +0 -0
  77. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/cli/document_cli.py +0 -0
  78. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/cli/profile_cli.py +0 -0
  79. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/cli/type_cli.py +0 -0
  80. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/repository/__init__.py +0 -0
  81. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/repository/document_index_repository.py +0 -0
  82. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/repository/document_profile_repository.py +0 -0
  83. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/repository/document_type_repository.py +0 -0
  84. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/schema/__init__.py +0 -0
  85. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/schema/document_schema.py +0 -0
  86. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/__init__.py +0 -0
  87. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/document_scanner.py +0 -0
  88. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/document_service.py +0 -0
  89. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/index/__init__.py +0 -0
  90. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/index/document_index_builder.py +0 -0
  91. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/index/document_index_protocol.py +0 -0
  92. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/index/document_index_service.py +0 -0
  93. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/mutation/__init__.py +0 -0
  94. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/mutation/document_move_service.py +0 -0
  95. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/mutation/document_relocation.py +0 -0
  96. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/mutation/frontmatter_apply.py +0 -0
  97. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/__init__.py +0 -0
  98. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/document_patch_values.py +0 -0
  99. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/document_profile_service.py +0 -0
  100. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/document_rule_service.py +0 -0
  101. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/document_type_service.py +0 -0
  102. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/frontmatter_formatter.py +0 -0
  103. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/frontmatter_plan.py +0 -0
  104. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/kanban_service.py +0 -0
  105. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/profile_candidates.py +0 -0
  106. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/profile_registry.py +0 -0
  107. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/document/service/rules/type_plan.py +0 -0
  108. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/maintenance/__init__.py +0 -0
  109. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/maintenance/cli/maintenance_cli.py +0 -0
  110. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/maintenance/repository/maintenance_repository.py +0 -0
  111. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/maintenance/schema/maintenance_schema.py +0 -0
  112. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/maintenance/service/maintenance_protocol.py +0 -0
  113. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/maintenance/service/maintenance_service.py +0 -0
  114. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/maintenance/service/moc_service.py +0 -0
  115. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/skill/SPEC.md +0 -0
  116. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/skill/__init__.py +0 -0
  117. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/skill/cli/skill_cli.py +0 -0
  118. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/skill/repository/skill_repository.py +0 -0
  119. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/skill/schema/skill_schema.py +0 -0
  120. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/skill/service/skill_service.py +0 -0
  121. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/__init__.py +0 -0
  122. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/cli/__init__.py +0 -0
  123. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/cli/config_cli.py +0 -0
  124. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/cli/domain_cli.py +0 -0
  125. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/cli/project_cli.py +0 -0
  126. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/cli/restructure_cli.py +0 -0
  127. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/cli/space_cli.py +0 -0
  128. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/cli/workspace_cli.py +0 -0
  129. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/repository/__init__.py +0 -0
  130. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/repository/manifest_repository.py +0 -0
  131. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/repository/restructure_repository.py +0 -0
  132. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/repository/workspace_repository.py +0 -0
  133. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/schema/__init__.py +0 -0
  134. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/schema/adoption_schema.py +0 -0
  135. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/schema/restructure_schema.py +0 -0
  136. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/schema/workspace_schema.py +0 -0
  137. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/__init__.py +0 -0
  138. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/config_service.py +0 -0
  139. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/project_service.py +0 -0
  140. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/restructure_protocol.py +0 -0
  141. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/restructure_service.py +0 -0
  142. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/restructure_verifier.py +0 -0
  143. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/app/workspace/service/workspace_protocol.py +0 -0
  144. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/SPEC.md +0 -0
  145. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/__init__.py +0 -0
  146. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/agent_hints.py +0 -0
  147. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/cli_output.py +0 -0
  148. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/database/__init__.py +0 -0
  149. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/database/migrations.py +0 -0
  150. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/database/models.py +0 -0
  151. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/database/session.py +0 -0
  152. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/documents/__init__.py +0 -0
  153. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/documents/document_types.py +0 -0
  154. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/documents/domain_context.py +0 -0
  155. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/documents/frontmatter_format.py +0 -0
  156. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/documents/frontmatter_schema.py +0 -0
  157. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/documents/related_docs.py +0 -0
  158. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/exceptions/__init__.py +0 -0
  159. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/exceptions/base.py +0 -0
  160. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/filesystem/__init__.py +0 -0
  161. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/filesystem/atomic.py +0 -0
  162. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/filesystem/change_set.py +0 -0
  163. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/filesystem/cwd.py +0 -0
  164. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/filesystem/locking.py +0 -0
  165. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/filesystem/plan.py +0 -0
  166. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/governance/__init__.py +0 -0
  167. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/governance/issues.py +0 -0
  168. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/governance/locking.py +0 -0
  169. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/governance/snapshots.py +0 -0
  170. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/hashing.py +0 -0
  171. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/package_version.py +0 -0
  172. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/reports/__init__.py +0 -0
  173. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/reports/json_report.py +0 -0
  174. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/common/reports/markdown_report.py +0 -0
  175. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/config/SPEC.md +0 -0
  176. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/config/defaults.py +0 -0
  177. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/config/settings.py +0 -0
  178. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/container.py +0 -0
  179. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/main.py +0 -0
  180. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/__init__.py +0 -0
  181. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/bases/SPEC.md +0 -0
  182. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/bases//344/273/273/345/212/241/345/267/245/344/275/234/345/217/260-/344/270/252/344/272/272.base" +0 -0
  183. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/bases//344/273/273/345/212/241/345/267/245/344/275/234/345/217/260-/351/241/271/347/233/256.base" +0 -0
  184. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/bases//345/275/222/346/241/243/346/226/207/346/241/243/345/267/245/344/275/234/345/217/260.base" +0 -0
  185. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/bases//345/276/205/344/272/272/345/206/263/347/255/226/345/267/245/344/275/234/345/217/260.base" +0 -0
  186. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/bases//346/226/207/346/241/243/345/267/245/344/275/234/345/217/260.base" +0 -0
  187. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/defaults/__init__.py +0 -0
  188. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/TEMPLATE.md +0 -0
  189. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-context-bootstrap/SKILL.md +0 -0
  190. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-context-bootstrap/agents/openai.yaml +0 -0
  191. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-conversation-router/SKILL.md +0 -0
  192. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-conversation-router/agents/openai.yaml +0 -0
  193. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-conversation-router/references/inbox-handoff.md +0 -0
  194. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-conversation-router/references/learning-intake.md +0 -0
  195. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-conversation-router/references/task-intake.md +0 -0
  196. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-document-capture/references//345/267/262/346/234/211/346/226/207/346/241/243/346/233/264/346/226/260.md" +0 -0
  197. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-document-capture/references//351/200/232/347/224/250/347/237/245/350/257/206/346/262/211/346/267/200.md" +0 -0
  198. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-document-capture/references//351/227/256/351/242/230/344/270/216/345/206/263/347/255/226/346/262/211/346/267/200.md" +0 -0
  199. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-document-capture/references//351/241/271/347/233/256/345/206/205/345/256/271/346/262/211/346/267/200.md" +0 -0
  200. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-inbox-triage/SKILL.md +0 -0
  201. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-kanban-board/SKILL.md +0 -0
  202. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/agents/openai.yaml +0 -0
  203. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-workspace-adoption/SKILL.md +0 -0
  204. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-workspace-restructure/SKILL.md +0 -0
  205. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/src/campfire_cli/resources/skills/campfire-workspace-restructure/references/restructure-spec.md +0 -0
  206. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/SPEC.md +0 -0
  207. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/conftest.py +0 -0
  208. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/integration/test_cli.py +0 -0
  209. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/integration/test_domain_rename_sync.py +0 -0
  210. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/integration/test_profile_resolution.py +0 -0
  211. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/integration/test_skill_examples.py +0 -0
  212. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/perf/test_read_counts.py +0 -0
  213. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/perf/test_resolve_subprocess_count.py +0 -0
  214. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_agent_hints.py +0 -0
  215. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_atomic_write.py +0 -0
  216. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_base_service.py +0 -0
  217. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_config.py +0 -0
  218. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_document_index.py +0 -0
  219. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_domain_context.py +0 -0
  220. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_file_change_executor.py +0 -0
  221. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_frontmatter.py +0 -0
  222. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_generated_regions.py +0 -0
  223. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_kanban_service.py +0 -0
  224. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_migrations.py +0 -0
  225. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_operation_schema.py +0 -0
  226. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_package_version.py +0 -0
  227. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_pypi_verify.py +0 -0
  228. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_related_docs.py +0 -0
  229. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_release_check.py +0 -0
  230. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_repository_boundaries.py +0 -0
  231. {campfire_cli-0.1.20 → campfire_cli-0.1.22}/tests/unit/test_workspace_manifest.py +0 -0
@@ -40,6 +40,8 @@ Campfire 当前不负责 Agent 调度、实时消息推送或替代 Jira/Notion
40
40
  Schema + 命名 + 生命周期 + 计划/审批/执行 + 链接 + 归档 + 审计
41
41
  ```
42
42
 
43
+ Domain 由声明而不是目录名称决定;`任务/`、`记录/` 可按需要成为 Domain,但 task、record 类型不强制绑定同名目录。真正的系统保留目录由 CLI 管理,不能伪装为 Domain。
44
+
43
45
  Task Channel 借鉴 Go 的原则:**Do not communicate by sharing memory; instead, share memory by communicating.** 多个参与者不依赖各自会话中的隐式记忆,而是通过明确的任务状态与事件共享上下文。它是持久异步 Channel,不承诺实时唤醒;外部 Agent 运行时可在其上增加通知和调度。
44
46
 
45
47
  ## 4. 系统架构
@@ -82,7 +84,7 @@ Document App 同时拥有设备本地的文档查询投影。Indexer 从 Markdow
82
84
 
83
85
  Frontmatter 规则采用声明式 Profile:`base` 是最小公共契约,`task`、`human-request`、`board` 只允许一层继承。Profile Loader 将配置编译为完整 EffectiveProfile,Resolver 根据文档类型选择 Profile,Validator 与 Formatter 共同消费该结果。字段规则不使用每种文档一个 Python 子类,也不在 Skill 中复制。
84
86
 
85
- `template` 直接使用 base Profile,物理存放在 Domain 的 `_模板/`。模板作用域由 Domain 拓扑和路径确定;Skill 从目标 Domain 向祖先查找同名模板并使用最近的一份,系统不建立模板注册表或继承状态。
87
+ `template` 直接使用 base Profile,通用模板集中在 Workspace 根目录 `_模板/`,通过既有系统受管范围参与检查与索引。Domain 内已有模板保留,仅在明确指定时使用。适用类型与裁剪规则写在模板正文;Skill 按需参考,更新时保留合理结构。没有模板也可写作,不建立模板注册表、绑定字段、继承或匹配引擎。
86
88
 
87
89
  ### CLI 设计理念:治理原语 + Skill SOP
88
90
 
@@ -144,7 +146,7 @@ Campfire 不把“调用方能够猜对未声明契约”作为可靠性前提
144
146
 
145
147
  横切关注点与业务 SOP 不使用同一种复用手段。哈希复核、写锁、原子替换和失败恢复由显式 ChangeSet Executor 复用;写命令返回的 `follow_up` 由 Skill 消费。不为了复用 Maintenance 而引入 AOP 切面、命令总线、全局钩子或隐式中间件。
146
148
 
147
- 因此,`document apply` 的准确含义是“对一个 Markdown 文档应用经 Profile 校验的显式意图”,不是“把完整声明持续调谐到某个服务端状态”。创建时文件名可省略类型前缀;显式变更类型时,CLI 负责同步类型、前缀和可确定引用。用户或 Agent 可以直接 edit 唯一路径下的已有正文;只有新建文档、修改 Frontmatter/类型/归属或需要派生治理时才进入 CLI 工作流。
149
+ 因此,`document apply` 的准确含义是“对一个 Markdown 文档应用经 Profile 校验的显式意图”,不是“把完整声明持续调谐到某个服务端状态”。创建时文件名可省略类型前缀,并在 Frontmatter 后提供唯一的 `<!-- CAMPFIRE:BODY -->` 正文锚点;显式变更类型时,CLI 负责同步类型、前缀和可确定引用。用户或 Agent 可以直接 edit 唯一路径下的已有正文;只有新建文档、修改 Frontmatter/类型/归属或需要派生治理时才进入 CLI 工作流。
148
150
 
149
151
  ## 5. SSOT 与派生数据
150
152
 
@@ -42,9 +42,11 @@ campfire base list / show / check / sync
42
42
 
43
43
  Space、Domain、Project 的 `create`/`adopt`,以及文档移动和重构写操作默认先预览;审查通过后才追加 `--confirm`。归档通过 `document apply --set document_status=archived` 修改,且必须先获得用户明确同意。已注册 Workspace 只通过根级 `campfire --workspace <id> ...` 选择;已声明 Space、Domain 和 Project 使用稳定 ID,CLI 自行推导路径和父子关系。路径参数只用于新位置、具体文件、外部输入和显式扫描范围。
44
44
 
45
- `document apply` 可新建、更新、为已有正文补齐 Frontmatter,或通过显式 `--type` 原子转换文档类型。创建或唯一更新时可省略 `.md`;创建和类型转换时还可省略类型前缀。CLI 在 `normalization` 中返回每项标准化,并在 `target` 中返回最终路径;调用方不手工同步类型、前缀与 Markdown 后缀。`document move` 可在任意已声明 Domain 之间移动单篇文档,并对齐目标 Profile 与可确定引用。目标 Profile 缺少语义字段时返回 `missing_fields`,调用方补齐明确业务值。只有实际写入成功的结果才可返回零或一个、且可直接执行的 scoped `maintenance sync` follow-up;Domain 内部路径会归一化为对应 Domain,预览、阻塞或无派生影响时返回空列表。具体参数以对应命令的 `-h` 为准。
45
+ `任务/`、`记录/` 不是系统保留目录,可按组织需要使用 `workspace domain create` 新建或 `workspace domain adopt` 接管;文档类型不强制对应同名 Domain。`_总览`、`generated` 等系统目录仍不能声明为 Domain,错误结果返回命中的 `reserved_directory` 和修复提示。
46
46
 
47
- `template` 使用 base Profile,必须位于 Domain 的 `_模板/`。模板查找与应用由 Skill 按最近 Domain 规则完成,不新增模板专用命令。
47
+ `document apply` 可新建、更新、为已有正文补齐 Frontmatter,或通过显式 `--type` 原子转换文档类型。新建文档在 Frontmatter 后包含唯一的 `<!-- CAMPFIRE:BODY -->`,调用方只在锚点后编辑正文;存量文档不强制迁移。创建或唯一更新时可省略 `.md`;创建和类型转换时还可省略类型前缀。CLI 在 `normalization` 中返回每项标准化,并在 `target` 中返回最终路径;调用方不手工同步类型、前缀与 Markdown 后缀。`document move` 可在任意已声明 Domain 之间移动单篇文档,并对齐目标 Profile 与可确定引用。目标 Profile 缺少语义字段时返回 `missing_fields`,调用方补齐明确业务值。只有实际写入成功的结果才可返回零或一个、且可直接执行的 scoped `maintenance sync` follow-up;Domain 内部路径会归一化为对应 Domain,预览、阻塞或无派生影响时返回空列表。具体参数以对应命令的 `-h` 为准。
48
+
49
+ `workspace create` 默认在根 `_模板/` 写入 README、任务和发布清单模板,仅新建时初始化;setup/upgrade 不同步模板。`template` 使用 base Profile,新增自定义模板可用 `document apply --path '_模板/自定义任务' --type template --set 'description=任务正文参考'` 预览创建。已有 Domain `_模板/` 仍可用,但仅显式指定时采用。模板由文件工具读取和按需参考,不新增模板命令、不强制正文套用。
48
50
 
49
51
  `--set` 的值类型由有效 Profile 决定,不使用 YAML 隐式类型推断。enum、string 和 date 保留原始字符串,boolean 只接受 `true` 或 `false`,list 只接受严格 JSON 数组。标量可写为 `--set task_status=completed`,列表在 Shell 中使用单引号保护,例如 `--set 'tags=["tag1","tag2"]'`。CLI 不把 `tag1,tag2` 猜成列表;格式错误时通过稳定错误码、期望类型和参数示例说明修复方式。字段与枚举不在本命令清单重复登记。
50
52
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: campfire-cli
3
- Version: 0.1.20
3
+ Version: 0.1.22
4
4
  Summary: Local-first shared context and governance CLI for humans and agents
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -79,6 +79,8 @@ Workspace ── Space ── Domain 树 ── 文档
79
79
  | Human request | Agent 需要人类回答的待确认事项 | `_待用户确认/` 中的 `human-request` 文档 |
80
80
  | Generated View | MOC、相关文档页、Base、报告 | 派生数据,能生成就不手工维护 |
81
81
 
82
+ `任务/`、`记录/` 可按实际组织需要成为 Domain,但文档类型不强制对应同名目录,也不要求每个 Project 预建。新建受管文档在 Frontmatter 后提供 `<!-- CAMPFIRE:BODY -->`,Agent 以该锚点定位人工正文;旧文档无需迁移。
83
+
82
84
  设备边界:`.campfire.yaml` 只保存可跨设备同步的稳定身份与逻辑关联(Project id、Git remote、文档 Domain 等),禁止本机绝对路径;新设备执行 `campfire setup --path <vault>` 即可恢复。本机路径绑定、索引、锁与报告都在 `~/.campfire/`(可用 `CAMPFIRE_HOME` 覆盖),按 Workspace 隔离。
83
85
 
84
86
  ## 常用命令
@@ -100,7 +102,9 @@ campfire document type list # 文档类型与前缀
100
102
  campfire base list / show / check / sync # Obsidian Base 治理视图
101
103
  ```
102
104
 
103
- Domain 可在 `_模板/` 中维护基础属性的 `template` 文档。Agent 创建结构化文档时按当前 Domain 到祖先 Domain 的顺序使用最近同名模板;模板只提供正文骨架,不替代目标文档 Profile。
105
+ 通用模板集中在 Workspace 根目录 `_模板/`,方便人类查看维护;模板使用 `template` 类型和基础属性。正文顶部说明适用类型和裁剪规则,Agent 按需参考,不强制套用;更新已有文档优先保留合理结构。局部模板只在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。模板不替代 Profile,也不校验正文。
106
+
107
+ 新建 Workspace 默认附带模板原则 README、任务模板和版本发布清单模板,无需额外参数。模板仅初始化一次,之后由用户维护;setup、upgrade 不覆盖修改,也不补回被删除的模板。实际使用时保留格式规范卡片、替换示例正文,不把模板当成真实任务。
104
108
 
105
109
  结构治理命令默认只输出计划,追加 `--confirm` 才执行:
106
110
 
@@ -63,6 +63,8 @@ Workspace ── Space ── Domain 树 ── 文档
63
63
  | Human request | Agent 需要人类回答的待确认事项 | `_待用户确认/` 中的 `human-request` 文档 |
64
64
  | Generated View | MOC、相关文档页、Base、报告 | 派生数据,能生成就不手工维护 |
65
65
 
66
+ `任务/`、`记录/` 可按实际组织需要成为 Domain,但文档类型不强制对应同名目录,也不要求每个 Project 预建。新建受管文档在 Frontmatter 后提供 `<!-- CAMPFIRE:BODY -->`,Agent 以该锚点定位人工正文;旧文档无需迁移。
67
+
66
68
  设备边界:`.campfire.yaml` 只保存可跨设备同步的稳定身份与逻辑关联(Project id、Git remote、文档 Domain 等),禁止本机绝对路径;新设备执行 `campfire setup --path <vault>` 即可恢复。本机路径绑定、索引、锁与报告都在 `~/.campfire/`(可用 `CAMPFIRE_HOME` 覆盖),按 Workspace 隔离。
67
69
 
68
70
  ## 常用命令
@@ -84,7 +86,9 @@ campfire document type list # 文档类型与前缀
84
86
  campfire base list / show / check / sync # Obsidian Base 治理视图
85
87
  ```
86
88
 
87
- Domain 可在 `_模板/` 中维护基础属性的 `template` 文档。Agent 创建结构化文档时按当前 Domain 到祖先 Domain 的顺序使用最近同名模板;模板只提供正文骨架,不替代目标文档 Profile。
89
+ 通用模板集中在 Workspace 根目录 `_模板/`,方便人类查看维护;模板使用 `template` 类型和基础属性。正文顶部说明适用类型和裁剪规则,Agent 按需参考,不强制套用;更新已有文档优先保留合理结构。局部模板只在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。模板不替代 Profile,也不校验正文。
90
+
91
+ 新建 Workspace 默认附带模板原则 README、任务模板和版本发布清单模板,无需额外参数。模板仅初始化一次,之后由用户维护;setup、upgrade 不覆盖修改,也不补回被删除的模板。实际使用时保留格式规范卡片、替换示例正文,不把模板当成真实任务。
88
92
 
89
93
  结构治理命令默认只输出计划,追加 `--confirm` 才执行:
90
94
 
@@ -35,7 +35,7 @@ SQLite / Filesystem Implementation
35
35
  - 命令不得读取“最近一次操作”等隐式 Session 状态推导对象或作用域;跨命令后续动作只使用当前结果显式返回的结构化 `follow_up`。
36
36
  - 所有写入默认预检,语义计划默认未审批。
37
37
  - 写入用例必须在治理锁内复核生成计划时的内容哈希,发现外部变化时拒绝覆盖。
38
- - Domain 在 `_模板/` 中持有基础 Profile 的 `template` 文档;同名模板仅按目标 Domain 到祖先 Domain 的最近路径选择,不保存继承状态或合并模板。
38
+ - 通用 `template` 文档集中在 Workspace 根目录 `_模板/`,只使用 base Profile。局部模板仅在用户或领域规则明确指定时使用;不逐层查找、不自动覆盖或合并。适用类型和裁剪规则写在模板正文,CLI 不校验正文是否套用模板。
39
39
 
40
40
  代码风格参考 `templates/fastapi-template`,但不引入 HTTP、WebSocket、认证和异步数据库等无关能力。
41
41
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "campfire-cli"
3
- version = "0.1.20"
3
+ version = "0.1.22"
4
4
  description = "Local-first shared context and governance CLI for humans and agents"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -75,15 +75,17 @@ def smoke_test_wheel(version: str, artifact_dir: Path | None = None) -> None:
75
75
  ).stdout.strip()
76
76
  if installed != version:
77
77
  raise SystemExit(f"installed version {installed} does not match {version}")
78
- workspace.mkdir()
79
78
  subprocess.run(
80
- [str(campfire), "setup", "--path", str(workspace), "--id", "smoke"],
79
+ [str(campfire), "workspace", "create", "--path", str(workspace), "--id", "smoke"],
81
80
  cwd=ROOT,
82
81
  check=True,
83
82
  capture_output=True,
84
83
  text=True,
85
84
  env=smoke_environment,
86
85
  )
86
+ for name in ("README.md", "模板-任务.md", "模板-版本发布清单.md"):
87
+ if not (workspace / "_模板" / name).is_file():
88
+ raise SystemExit(f"installed wheel did not initialize template: {name}")
87
89
  output = subprocess.run(
88
90
  [str(campfire), "--workspace", "smoke", "document", "type", "list"],
89
91
  cwd=ROOT,
@@ -103,7 +105,7 @@ def main() -> None:
103
105
  if arguments.artifact_dir is not None and not arguments.release:
104
106
  parser.error("--artifact-dir 只能与 --release 一起使用")
105
107
  run("uv", "run", "ruff", "check", "src", "tests", "scripts")
106
- run("uv", "run", "pytest", "-q", "--durations=10")
108
+ run("uv", "run", "python", "-m", "pytest", "-q", "--durations=10")
107
109
  if arguments.release:
108
110
  version = project_version()
109
111
  check_tag(version)
@@ -1,3 +1,3 @@
1
1
  """Campfire CLI package."""
2
2
 
3
- __version__ = "0.1.20"
3
+ __version__ = "0.1.22"
@@ -34,8 +34,8 @@ document/
34
34
  - `index`:Service 只编排新鲜度、generation 和查询,Builder 只把 Markdown 属性、Domain/Project 上下文与 `related_docs`转换为确定性投影;配置、拓扑或解析器变化时完整重建,普通文件变化时调用时 reconcile。
35
35
  - `list`:按 Project、Domain、类型和生命周期对索引做精确 AND 筛选;返回全部生命周期,不读取或复制正文。
36
36
  - `inspect`:向 Agent 返回单篇文档的 Domain、类型、有效 Profile、具体问题,以及 outgoing、incoming、unresolved 及入度、出度。
37
- - `apply`:根据目标路径和类型解析 Profile,不存在时生成文档,已有 Frontmatter 时只应用显式补丁,无 Frontmatter 时保留正文并补齐完整契约;先完整渲染并校验,追加 `--confirm` 后原子写入。
38
- - `template`:只继承 base Profile,必须位于所属 Domain 的 `_模板/`;Domain 归属由物理路径解析,不在 Frontmatter 复制模板作用域或继承关系。
37
+ - `apply`:根据目标路径和类型解析 Profile,不存在时生成文档并在 Frontmatter 后写入唯一的 `<!-- CAMPFIRE:BODY -->` 正文锚点,已有 Frontmatter 时只应用显式补丁,无 Frontmatter 时保留正文并补齐完整契约;先完整渲染并校验,追加 `--confirm` 后原子写入。存量文档不因缺少锚点而迁移。
38
+ - `template`:只继承 base Profile,集中存放在 Workspace 根目录 `_模板/`,属于无 Domain 的系统受管范围;已有 Domain `_模板/` 仍可用。只校验模板目录和字段,不绑定目标类型、不校验正文结构,不维护继承关系。
39
39
  - `move`:在任意已声明 Domain 之间移动一篇文档,按目标 Profile 对齐可确定的 `domain`/`project` 归属,并只更新 `related_docs` 的精确路径引用。目标 Profile 缺少业务字段时返回 `needs-input`,不猜测。
40
40
  - `rename`:保持一篇文档的物理目录与 Domain 归属不变,根据逻辑标题重算类型前缀文件名,并在同一变更集中更新 `name` 与可确定引用。目标存在时阻止,不覆盖或自动编号。
41
41
  - `scanner`:统一解释受管根、忽略目录和豁免文件;Document 与 Maintenance 共用。
@@ -187,7 +187,12 @@ class DocumentApplyService:
187
187
  [{"code": code, "path": request.path} for code in render_errors],
188
188
  )
189
189
  else:
190
- rendered = render_document(frontmatter, next_body, list(profile.field_order))
190
+ rendered = render_document(
191
+ frontmatter,
192
+ next_body,
193
+ list(profile.field_order),
194
+ include_body_anchor=not exists,
195
+ )
191
196
  issues = self._rules.check_content(self._settings.vault_root, target, rendered, profile)
192
197
  # Rejected assignments already have a precise diagnostic; their fallback values
193
198
  # must not produce contradictory missing-field or value errors.
@@ -4,7 +4,7 @@
4
4
 
5
5
  文档扫描、类型、Profile、任务状态、模板枚举、Frontmatter 顺序、跨字段不变量与确定关系索引均委托 Document App;本模块只负责检查编排、过滤、可见派生内容和报告。全量 check 或 scoped sync 通过消费方维护端口触发 Document Index 校正,不依赖具体 Document Service,也不得实现第二套索引规则。写入通过共享 ChangeSet Executor 复核内容哈希并原子提交。
6
6
 
7
- Domain MOC 只列出该 Domain `_模板/` 中实际存在的模板;Maintenance 不计算或持久化模板继承结果,Agent 按 Domain 祖先路径就近选择。
7
+ Domain MOC 只列出该 Domain `_模板/` 中实际存在的模板;根目录 `_模板/` 通过系统受管范围检查和索引,不虚构 Domain 或 MOC。Maintenance 不计算模板继承;Agent 默认查看根模板,局部模板仅在明确指定时采用。
8
8
 
9
9
  受管范围由当前 Workspace 中实际存在的 `_空间.md` 动态发现,不使用固定 Space 白名单;`scope_roots` 只补充 `_待用户确认/` 等非 Space 系统范围。声明文件由 Workspace App 校验,不计入普通文档问题。
10
10
 
@@ -6,8 +6,12 @@
6
6
 
7
7
  `campfire setup --path <path>` 根据 Manifest 接入已有 Workspace;缺少 Manifest 时必须提供 `--id` 以创建首份 Manifest。`workspace create` 要求目标路径不存在,并创建全局收件箱、带 `_空间.md` 的知识/工作 Space 和治理视图基础目录。两者写入全局 SQLite 注册表,不向 Workspace 写工具状态。
8
8
 
9
+ `workspace create` 从包内 `resources/workspace/` 一次性写入 `_模板/README.md`、任务与版本发布清单模板;日期取创建当天,模板内容仍属于 template,不生成实际任务或发布计划。落地后由用户维护,setup、upgrade 和资源同步均不补写或覆盖。模板不是持续托管的 Base/Skill,不增加同步命令、注册表或正文校验。
10
+
9
11
  `workspace space/domain create` 只创建不存在的新目录;`space adopt` 原地纳管已有 Space,`domain adopt` 可原地声明或把一个 Vault 内外已有目录接管到明确目标。Domain 所属 Space 和最近父 Domain 从目标路径唯一推导;Project 从 Manifest 绑定的根 Domain id 与祖先拓扑推导,Domain 声明不保存 Project。外部来源始终保留。命令默认只输出计划,追加 `--confirm` 才写入。
10
12
 
13
+ 目录名称不决定文档类型或强制归属。`任务/`、`记录/` 可按组织需要创建或接管为 Domain,但不要求每个 Project 预建,也不强制 task、record 文档进入同名 Domain。系统保留目录不能声明为 Space/Domain;拒绝结果必须返回命中的目录名和修复提示。非保留目录直接包含文档或子 Domain 时必须有 `_领域.md`,否则报告 `undeclared-domain-directory`。
14
+
11
15
  `workspace config check` 统一校验包内产品默认值和当前 Workspace 的有效治理契约,包括目录与 Space 冲突、文档类型前缀、Profile 引用和继承、归档策略以及托管资源列表。
12
16
 
13
17
  `workspace restructure` 负责原子命令无法表达的批量文档映射、领域拆分和 Frontmatter Patch:冻结范围、生成带内容哈希的审批计划、更新引用并验证迁移事实。Domain 的 rename/move/merge/delete/rekey 直接位于 `workspace domain`;move 使用目标 Space/Domain id 推导路径,merge 一次完成内容迁移和源领域移除,delete 只删除逻辑空领域。单篇文档移动属于 `document move`,以目标 Domain id 代替目标路径。无 `--spec` 时只推断可确定的文档类型与文件名前缀规范化;没有变化返回 `up-to-date`,任意路径映射或 Frontmatter Patch 必须使用已文档化的 spec。纯移动不得重写文档内容;`verify` 只验证本批次 source/target 结果。该能力属于 Workspace Service,不设独立 App,也不用于日常增量维护。
@@ -17,7 +17,7 @@ from campfire_cli.app.workspace.service.structure_service import (
17
17
  DOMAIN_MARKER,
18
18
  ID_RE,
19
19
  DomainService,
20
- reserved_directories,
20
+ validate_domain_path_parts,
21
21
  )
22
22
  from campfire_cli.app.workspace.service.workspace_protocol import WorkspaceRepositoryProtocol
23
23
  from campfire_cli.common.exceptions import ConfigurationError
@@ -266,11 +266,7 @@ class AdoptionService:
266
266
  space_root = self._settings.vault_root / space.path
267
267
  if target == space_root or space_root not in target.parents:
268
268
  raise ConfigurationError("目标路径必须位于指定 Space 下")
269
- if any(
270
- part in reserved_directories() or part.startswith(".")
271
- for part in target.relative_to(space_root).parts
272
- ):
273
- raise ConfigurationError("目标路径不能使用保留目录")
269
+ validate_domain_path_parts(target.relative_to(space_root).parts, value)
274
270
  return target, space.id
275
271
 
276
272
  @staticmethod
@@ -23,7 +23,7 @@ from campfire_cli.app.workspace.service.structure_service import (
23
23
  ID_RE,
24
24
  DomainService,
25
25
  parse_marker,
26
- reserved_directories,
26
+ validate_domain_path_parts,
27
27
  )
28
28
  from campfire_cli.app.workspace.service.workspace_protocol import WorkspaceRepositoryProtocol
29
29
  from campfire_cli.common.documents.frontmatter_format import render_patch
@@ -537,11 +537,7 @@ class DomainRestructureService:
537
537
  if len(owners) != 1:
538
538
  raise ConfigurationError("Domain 目标路径必须位于唯一一个已声明 Space 下")
539
539
  relative_to_space = target.relative_to(self._settings.vault_root / owners[0].path)
540
- if any(
541
- part in reserved_directories() or part.startswith(".")
542
- for part in relative_to_space.parts
543
- ):
544
- raise ConfigurationError("Domain 目标路径不能使用保留目录")
540
+ validate_domain_path_parts(relative_to_space.parts, value)
545
541
  if target != domain.path and target.exists():
546
542
  raise ConfigurationError(f"目标路径已存在:{value}")
547
543
  return target
@@ -38,6 +38,26 @@ def reserved_directories() -> set[str]:
38
38
  return set(config_section("workspace")["reserved_directories"])
39
39
 
40
40
 
41
+ def validate_domain_path_parts(parts: tuple[str, ...], path: str) -> None:
42
+ reserved = next((part for part in parts if part in reserved_directories()), None)
43
+ if reserved is not None:
44
+ raise ConfigurationError(
45
+ f"Domain 路径命中系统保留目录:{reserved}",
46
+ code="reserved-directory",
47
+ path=path,
48
+ reserved_directory=reserved,
49
+ hint="该名称保留给系统区域或非 Domain 内容;请选择其他 Domain 路径。",
50
+ )
51
+ hidden = next((part for part in parts if part.startswith(".")), None)
52
+ if hidden is not None:
53
+ raise ConfigurationError(
54
+ f"Domain 路径不能包含隐藏目录:{hidden}",
55
+ code="hidden-directory",
56
+ path=path,
57
+ hidden_directory=hidden,
58
+ )
59
+
60
+
41
61
  def parse_marker(path: Path) -> dict[str, str]:
42
62
  text = path.read_text(encoding="utf-8")
43
63
  if not text.startswith("---\n"):
@@ -464,12 +484,9 @@ class DomainService:
464
484
  raise ConfigurationError("Domain path 必须唯一位于一个已声明 Space 下")
465
485
  space = owners[0]
466
486
  space_root = (self.root / space.path).resolve()
467
- if (
468
- target == space_root
469
- or space_root not in target.parents
470
- or any(part in reserved_directories() for part in target.relative_to(space_root).parts)
471
- ):
472
- raise ConfigurationError("Domain path 必须位于指定 Space 下且不能使用保留目录")
487
+ if target == space_root or space_root not in target.parents:
488
+ raise ConfigurationError("Domain path 必须位于指定 Space 下")
489
+ validate_domain_path_parts(target.relative_to(space_root).parts, path)
473
490
  existing = self.discover()[0]
474
491
  if any(item.id == domain_id or item.path == target for item in existing):
475
492
  raise ConfigurationError("Domain id 或已声明路径存在")
@@ -2,6 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  import json
4
4
  import re
5
+ from datetime import date
6
+ from importlib.resources import files
5
7
  from pathlib import Path
6
8
 
7
9
  from campfire_cli.app.workspace.repository.manifest_repository import WorkspaceManifestRepository
@@ -52,6 +54,19 @@ class WorkspaceService:
52
54
  spaces = tuple(Space.model_validate(item) for item in template["spaces"])
53
55
  scaffold = (*template["system_directories"], *(space.path for space in spaces))
54
56
  directories = self._repository.create_scaffold(root, scaffold)
57
+ initial_files: list[str] = []
58
+ today = date.today().isoformat()
59
+ for directory in files("campfire_cli.resources").joinpath("workspace").iterdir():
60
+ if not directory.is_dir():
61
+ continue
62
+ for resource in directory.iterdir():
63
+ if not resource.is_file() or not resource.name.endswith(".md"):
64
+ continue
65
+ target = root / directory.name / resource.name
66
+ atomic_write(
67
+ target, resource.read_text(encoding="utf-8").replace("{{date}}", today)
68
+ )
69
+ initial_files.append(str(target))
55
70
  for space in spaces:
56
71
  atomic_write(
57
72
  root / space.path / "_空间.md",
@@ -59,6 +74,7 @@ class WorkspaceService:
59
74
  )
60
75
  result = self._initialize(request.workspace_id, root, request.make_default)
61
76
  result.created_directories = directories
77
+ result.created.extend(initial_files)
62
78
  self._manifests.save(
63
79
  root,
64
80
  WorkspaceManifest(
@@ -8,6 +8,8 @@ from yaml import YAMLError
8
8
 
9
9
  from campfire_cli.common.documents.document_types import frontmatter_bounds
10
10
 
11
+ BODY_ANCHOR = "<!-- CAMPFIRE:BODY -->"
12
+
11
13
 
12
14
  @dataclass(frozen=True)
13
15
  class MarkdownDocument:
@@ -67,9 +69,18 @@ def _parse_lenient_scalars(raw: str) -> dict[str, Any]:
67
69
  return result
68
70
 
69
71
 
70
- def render_document(frontmatter: dict[str, Any], body: str, field_order: list[str]) -> str:
72
+ def render_document(
73
+ frontmatter: dict[str, Any],
74
+ body: str,
75
+ field_order: list[str],
76
+ *,
77
+ include_body_anchor: bool = False,
78
+ ) -> str:
71
79
  known = [key for key in field_order if key in frontmatter]
72
80
  unknown = [key for key in frontmatter if key not in field_order]
73
81
  ordered = {key: frontmatter[key] for key in [*known, *unknown]}
74
82
  header = yaml.safe_dump(ordered, allow_unicode=True, sort_keys=False).rstrip()
75
- return f"---\n{header}\n---\n{body.lstrip()}"
83
+ rendered_body = body.lstrip()
84
+ if include_body_anchor:
85
+ rendered_body = f"\n{BODY_ANCHOR}\n{rendered_body}"
86
+ return f"---\n{header}\n---\n{rendered_body}"
@@ -5,6 +5,7 @@ workspace:
5
5
  - _收件箱/用户输入
6
6
  - _收件箱/待接管
7
7
  - _待用户确认
8
+ - _模板
8
9
  - 治理视图
9
10
  spaces:
10
11
  - id: knowledge
@@ -37,8 +38,6 @@ workspace:
37
38
  - generated
38
39
  - _总览
39
40
  - _模板
40
- - 记录
41
- - 任务
42
41
  - a_skill
43
42
  governance:
44
43
  version: 1
@@ -52,8 +51,6 @@ governance:
52
51
  - archive
53
52
  - generated
54
53
  project_reserved_directories:
55
- - 任务
56
- - 记录
57
54
  - archive
58
55
  - _总览
59
56
  - _模板
@@ -63,6 +60,7 @@ document_types:
63
60
  space_marker: _空间.md
64
61
  scope_roots:
65
62
  - _待用户确认
63
+ - _模板
66
64
  ignored_directories:
67
65
  - assets
68
66
  - generated
@@ -10,7 +10,7 @@
10
10
  - CLI Profile 负责字段、枚举、类型、顺序和条件必填;Skill 不复制这些契约。
11
11
  - 新建契约未知时使用 `document profile resolve --type <type>`,已有文档使用 inspect;`profile show <name>` 只接受 Profile 名,不假定 type 与 Profile 同名。
12
12
  - 已知唯一存在路径的正文读取和小改直接使用文件工具,不启动 bootstrap。
13
- - 创建正式文档、修改 Frontmatter 或显式变更类型使用 `document apply`。Frontmatter 契约已知时直接 apply;现有文档的字段类型或合法值未知时先执行一次 `document inspect`,不从 `tree`、逐层 help 或全量 Profile 探索开始。
13
+ - 创建正式文档、修改 Frontmatter 或显式变更类型使用 `document apply`。Frontmatter 契约已知时直接 apply;现有文档的字段类型或合法值未知时先执行一次 `document inspect`,不从 `tree`、逐层 help 或全量 Profile 探索开始。新建文档只在 CLI 返回的 `<!-- CAMPFIRE:BODY -->` 锚点后补正文,不用 Frontmatter 分隔符定位;无锚点存量文档仍按解析后的正文范围最小编辑。
14
14
  - Markdown Frontmatter 的 `related_docs` 是受管文档关系唯一 SSOT;Skill 通过 apply 更新该字段,不解析或自动维护正文链接。SQLite、反向关系与关系页都只是可重建投影。
15
15
  - 单篇 rename / move / retype 改变路径时,Skill 带回预览返回的 `expected_hash` 与 `expected_plan`;引用范围变化必须重新预览。
16
16
  - 发现结构化文档集合使用 `document list`,理解单篇文档的确定关系使用 `document inspect`;两者自行 reconcile,不先运行 Maintenance。
@@ -18,6 +18,8 @@
18
18
  - 写入命令保持原子性;Skill 只执行命令实际返回的 scoped `maintenance sync`,诊断或发布验收时再显式 `check`。
19
19
  - 已存在的 Workspace、Space、Domain 和 Project 使用稳定 ID 选择;路径只用于新位置、具体文件、外部输入和显式扫描范围。
20
20
  - 首次 Workspace 接入由 `workspace-onboarding` 路由;它不接管 Domain、不执行日常治理,也不修复损坏的 Manifest。
21
+ - 通用正文模板默认从 Workspace 根目录 `_模板/` 选用,局部模板仅在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。适用类型、使用方式与裁剪规则写在模板正文,不扩充 Profile;无合适模板不阻塞,更新保留已有合理结构。模板不授权猜测事实,也不强制正文布局。
22
+ - 模板只保留必要结构,Agent 可按实际需求扩展或裁剪,不省略用户明确要求、不编造事实、不强制重排已有文档。扩展当前文档不授权修改共享模板;共享模板变更仍需用户确认。Workspace 可在 `_模板/README.md` 维护完整原则,单份模板只写适用类型及特殊说明,不要求每次写作加载 README。
21
23
 
22
24
  ## 编写与维护规则
23
25
 
@@ -38,7 +40,7 @@ Skill 同时面向 Agent 执行与人类审查,使用 [TEMPLATE.md](TEMPLATE.m
38
40
 
39
41
  1. **围绕用户任务。** description 说明何时使用、何时不用;正文写清最短步骤、完成条件和何时停下来询问。新场景优先放入已有 Skill,不因流程的一小步新增 Skill,也不在 Skill 之间来回转交同一检查。
40
42
  2. **只查询缺少的上下文。** 已明确且未发生相关变化的路径、归属和字段契约直接复用;存在歧义或变化时才重新确认。项目事实需要核对项目现状,普通知识沉淀不强制检查代码仓库。沿用用户已给出的授权,只有新增风险或关键歧义才再次询问。
41
- 3. **示例必须能执行。** 假设 Agent 不会自行推断必填参数、枚举、列表格式或 Shell 引号;示例给齐必要输入,注明路径基准、预览、确认和失败语义,并通过实际执行核对关键返回字段。创建文档明确为 apply 创建结构 → 按返回的 `target` 用文件工具补正文 → 按实际 `follow_up` 完成必要维护;不虚构参数,不让 Agent 猜最终路径。
43
+ 3. **示例必须能执行。** 假设 Agent 不会自行推断必填参数、枚举、列表格式或 Shell 引号;示例给齐必要输入,注明路径基准、预览、确认和失败语义,并通过实际执行核对关键返回字段。创建文档明确为 apply 创建结构 → 按返回的 `target` 在 `<!-- CAMPFIRE:BODY -->` 后用文件工具补正文 → 按实际 `follow_up` 完成必要维护;不虚构参数,不让 Agent 猜最终路径。
42
44
  4. **每项规则只有一个来源。** 字段与枚举归 Profile,参数与返回契约归 CLI,目录约定与正文模板归 Workspace。Skill 只说明如何发现、选择和使用,不复制完整字段表,不把个人 Vault 的目录写成通用要求,不让 Agent 手写受管 Frontmatter。
43
45
  5. **按需展开。** 常用步骤和安全边界直接写在 SKILL.md;特殊场景放 references,并写明何时读取。不要求先读完全部 references,不在多个文件重复同一套 SOP。
44
46
  6. **变更同步验证。** CLI 契约变更时检查受影响的 Skill、references 与 Agent Hint,只修改确实受影响的内容。修改托管资源后运行 Skill 检查;涉及安装分发时通过 `campfire skill sync` 同步并核对运行副本,不直接修改副本。标准文档修改本身不要求同步安装。
@@ -40,13 +40,13 @@ CLI 预览结果
40
40
  ├── 有问题 → 修正可确定输入;关键事实缺失则询问,暂不写入
41
41
  └── 无问题且已授权 → 原输入 + 返回哈希(改路径时另带计划摘要)+ confirm
42
42
  ├── 写入失败 → 报告问题,停止后续操作
43
- └── 写入成功 → 新建时按 target 补正文 → 执行实际 follow_up → 回报
43
+ └── 写入成功 → 新建时按 target 在正文锚点后补正文 → 执行实际 follow_up → 回报
44
44
  ```
45
45
 
46
46
  ### 执行步骤
47
47
 
48
48
  - **已知路径,只改人工正文**:读取局部内容与尚未知的局部规则 → 最小 Edit → 核对修改区域。不加载 bootstrap,不调用 apply,不改 Frontmatter 或自动生成区。
49
- - **已授权、主题及目标目录明确的新文档**:契约已知时直接 apply 预览 → 无问题后以相同输入加返回哈希和 `--confirm` → 按返回的 `target` Edit 正文 → 执行实际 follow_up。没有重复、覆盖或事实疑点时不固定查询 Workspace、Project、全部 Domain 或现有文档集合。
49
+ - **已授权、主题及目标目录明确的新文档**:契约已知时直接 apply 预览 → 无问题后以相同输入加返回哈希和 `--confirm` → 按返回的 `target` 在 `<!-- CAMPFIRE:BODY -->` 后 Edit 正文 → 执行实际 follow_up。没有重复、覆盖或事实疑点时不固定查询 Workspace、Project、全部 Domain 或现有文档集合。
50
50
  - **已知文档修改结构**:契约已知直接 apply;字段或枚举未知先 inspect 一次。只改标题使用 rename,跨 Domain 移动使用 move,不手改受管结构。
51
51
 
52
52
  ### 命令示例
@@ -58,7 +58,9 @@ campfire --workspace demo document apply --path "mynote/开发实践/安装验
58
58
  campfire --workspace demo document apply --path "mynote/开发实践/安装验证" --type knowledge --set 'description=安装后通过版本命令验证可用性' --expected-hash missing --confirm
59
59
  ```
60
60
 
61
- 新建预览返回 `status: planned`、`expected_hash: missing`、`target`;确认返回 `status: applied`、`write_performed: true`。已有文档使用实际返回哈希,不套用 `missing`。创建后必须补正文,保留 Frontmatter;没有 `--body` 参数。仅结构创建成功不等于文档内容已经完成。
61
+ 新建预览返回 `status: planned`、`expected_hash: missing`、`target`;确认返回 `status: applied`、`write_performed: true`。已有文档使用实际返回哈希,不套用 `missing`。创建后必须在唯一的 `<!-- CAMPFIRE:BODY -->` 锚点后补正文,保留 Frontmatter 和锚点;没有 `--body` 参数。仅结构创建成功不等于文档内容已经完成。
62
+
63
+ 文档类型不强制对应同名 Domain。需要新增 `任务/`、`记录/` 等组织目录时,不手工创建装有文档但未声明的目录:新目录使用 `workspace domain create`,已有目录使用 `workspace domain adopt`;目标目录不明确时先确认组织意图。
62
64
 
63
65
  文档关系唯一事实源是 Frontmatter 的 `related_docs`。Agent 只通过 apply 修改它,例如 `--set 'related_docs=["[[mywork/项目/技术-登录.md]]"]'`;路径必须是 Workspace 根相对路径,保留 `.md`,不加别名或锚点。正文链接只是正文,不解析、不维护,也不为了关系同步改正文。反向关系由索引计算,不在目标文档重复填写。
64
66
 
@@ -95,7 +97,9 @@ rename、move 或 apply 导致已有文件路径变化时,先预览完整影
95
97
  | 任务或实施计划 | 任务直接使用 campfire-task-management;计划参考[任务与计划沉淀](references/任务与计划沉淀.md) |
96
98
  | 已有文档补充或纠正 | [已有文档更新](references/已有文档更新.md) |
97
99
 
98
- 事实必须区分:证据已验证、用户提供、目标方案、讨论建议与历史记录。推断明确标注,不包装成当前事实。正文模板从目标 Domain 向父 Domain 查找最近同名模板;找不到用最小结构,不虚构章节内容。模板的创建和修改需要用户要求或确认。
100
+ 事实必须区分:证据已验证、用户提供、目标方案、讨论建议与历史记录。推断明确标注,不包装成当前事实。
101
+
102
+ 正文模板默认查看 Workspace 根目录 `_模板/`,局部模板仅明确指定时使用,不逐层探索。模板只保留必要结构,按顶部适用类型选用,可按需扩展或裁剪,但不省略用户明确要求、不编造事实;没有合适模板照常写作,更新不强制重排。扩展当前文档不授权修改共享模板,后者仍需用户要求或确认;不自动复制模板,目录 README 仅按需查阅。
99
103
 
100
104
  Project 的物理归属由 CLI 解析,不表示自动写入任务的 `related_project`。字段与枚举归 Profile,目录约定和模板归 Workspace,Skill 不重复维护。
101
105
 
@@ -0,0 +1,8 @@
1
+ # 任务与计划沉淀
2
+
3
+ - 有明确动作、负责人、状态或完成条件时使用 task。
4
+ - 描述阶段目标、范围、里程碑或发布清单时使用 plan。
5
+ - 只有建议或知识结论时不创建任务。
6
+ - 同一工作已有 task/plan 时更新原文档,不重复创建。
7
+
8
+ Project 和 Domain 按项目内容沉淀路径定位;正文默认参考 Workspace 根目录 `_模板/` 中适用的任务或计划模板,局部模板仅在明确指定时采用,不逐层查找。模板可裁剪,没有合适模板也能写作,维护已有文档不强制重排;字段与枚举只从有效 Profile 获取。任务演变与跨 Session 交接遵循任务管理 Skill,不另建字段或调度状态。
@@ -16,6 +16,7 @@ description: "查询、创建、更新和完成 Campfire 任务文档;按结
16
16
  - 全部任务使用 `campfire document list --type task`;用户指定项目、领域或状态时增加对应筛选,不隐式排除已完成任务。无需先执行 Maintenance。
17
17
  - 用户指定文档时直接使用该路径。项目尚未定位才查询 `workspace project list`;多个候选时询问,不凭相似名称猜测。已知项目但目录未知时使用 `workspace domain list --project <id>`。
18
18
  - 个人任务使用当前 Workspace 人工规则约定的任务 Domain;没有约定或目标不唯一时询问,不硬编码个人 Vault 路径,也不为个人任务搜索代码项目。
19
+ - task 类型不强制进入名为“任务”的 Domain。目标项目已有明确任务 Domain 时复用;需要新建 `任务/` 组织目录时使用 `workspace domain create`,已有普通目录使用 `workspace domain adopt`,不手工留下未声明目录。
19
20
  - `document_status` 表示文档有效性,`task_status` 表示任务进度。`related_project` 必须显式填写有效 Project id;CLI 不自动注入,未填写表示未关联项目。合法字段和候选以当前 Profile 为准。
20
21
 
21
22
  ## SOP
@@ -27,6 +28,8 @@ description: "查询、创建、更新和完成 Campfire 任务文档;按结
27
28
  ├── 只查看 → document list 按明确条件筛选 → 按需读正文
28
29
  ├── 查看关联上下文 → inspect → 同时看 outgoing / incoming → 按需读关联文档
29
30
  ├── 只补进展正文 → Read → Edit → 核对
31
+ ├── 目标实质变化 → 核对授权或询问 → 更新当前目标、验收与关键变更
32
+ ├── 改名 → rename 预览与确认 → 回报新路径
30
33
  └── 创建任务 / 修改任务字段
31
34
  ├── 目标明确 → 复用目标,不重复查项目或领域
32
35
  └── 目标缺失 → 按需定位;多个候选则询问,暂不写入
@@ -35,7 +38,7 @@ description: "查询、创建、更新和完成 Campfire 任务文档;按结
35
38
  ↓
36
39
  有明确关联则一并填写 related_docs;无关联则省略
37
40
  ↓
38
- apply 预览 → 无问题则以返回哈希确认 → 新建时补正文
41
+ apply 预览 → 无问题则以返回哈希确认 → 新建时在正文锚点后补正文
39
42
  ↓
40
43
  仅执行实际 follow_up → 回报路径和结果
41
44
  ```
@@ -45,10 +48,10 @@ description: "查询、创建、更新和完成 Campfire 任务文档;按结
45
48
 
46
49
  ### 执行步骤
47
50
 
48
- 1. 目标和授权明确后,优先使用最近 Domain 的任务模板;没有模板时正文只写任务目标、已知约束和完成条件,不补造事实。
51
+ 1. 目标和授权明确后,默认参考 Workspace 根目录 `_模板/` 的任务模板;局部模板仅明确指定时使用,不逐层查找。模板是最小骨架,可按需扩展或裁剪,不省略用户明确要求或补造事实;无模板照常记录任务。扩展任务正文不授权修改共享模板,后者需单独确认。
49
52
  2. 新建 task 契约未知时运行 `campfire --workspace <id> document profile resolve --type task`;已知时跳过,已有任务用 inspect。type 不一定与 Profile 同名。apply 的 `--path` 必填,接受 Workspace 根相对路径或内部绝对路径,不相对于 cwd。创建可省略类型前缀与 `.md`;标题由路径推导,不传 `title` 字段。
50
53
  3. apply 默认预览。确认计划与授权一致且没有 issues 后,保持原输入并追加返回的 `expected_hash` 与 `--confirm`。失败时按全部 issues / missing_fields 一次修正;缺业务事实才问用户,不猜枚举。
51
- 4. 成功后按 `target` 找到文件,用 Edit 补正文,保留 CLI 生成的 Frontmatter 和自动生成区。没有 `--body` 参数。完成正文后执行结果实际返回的 follow_up,不固定追加 check 或全库扫描。
54
+ 4. 成功后按 `target` 找到文件,只在 `<!-- CAMPFIRE:BODY -->` 锚点后用 Edit 补正文,保留 CLI 生成的 Frontmatter、锚点和自动生成区。没有 `--body` 参数。完成正文后执行结果实际返回的 follow_up,不固定追加 check 或全库扫描。
52
55
 
53
56
  ### 命令示例
54
57
 
@@ -68,6 +71,14 @@ campfire --workspace demo document apply --path "mywork/【Hello World】文档
68
71
  - 完成任务只更新 `task_status`,结果和阻塞原因写正文;不把完成任务等同于归档。设置 `document_status=archived` 必须先取得用户对该文档的明确同意。
69
72
  - 只改标题用 `document rename`,跨 Domain 移动用 `document move`;确认带回预览的 `--expected-hash` 与 `--expected-plan`。不手改文件名与受管字段,遇到并发冲突先重新读取。
70
73
 
74
+ ### 任务演变与交接
75
+
76
+ - 更新已有任务保留合理结构,不强制套模板。当前目标、进展、验收保持最新;关键变更简记日期、原因和确认依据,不堆聊天或调试流水。
77
+ - 授权范围内可调整步骤;目标、范围或验收实质改变先核对已有明确授权,缺少授权再询问。保留有用结果,撤销项标为取消或不再适用,不勾成完成;独立的新目标才拆任务。
78
+ - 收到接手或进展维护请求时重新读取任务,并核对相关代码或成果,不能把上个 Session 的叙述当成最新事实。阶段结束、阻塞或交接时,在授权范围内记录已完成、剩余、阻塞、具体下一步;涉及代码补充必要的仓库、分支和未提交改动位置,不复制完整终端日志。
79
+ - 改名后回报新路径;旧聊天地址不会自动更新。旧路径失效时先定位或询问,不按旧标题重新创建任务。并行 Session 需要明确分工及沟通目标变化,Markdown 不提供锁或通知。
80
+ - 整体任务状态仍由 `task_status` 表达,正文记录进展事实,不维护第二套状态或百分比;任务文档不自动授权发布、删除或超出范围的执行。本 Skill 只维护文档,不调度或执行任务。
81
+
71
82
  ### 创建与更新任务关联
72
83
 
73
84
  - 创建任务时,已明确且已存在的需求、技术方案、问题记录等文档可一并写入 `related_docs`;没有关联就省略,不为填字段全库探索或猜测。路径格式为 `[[Workspace根相对路径.md]]`,不写别名或锚点。
@@ -13,7 +13,7 @@ description: "根据工作日志和上周周报撰写或更新工作周报;适
13
13
 
14
14
  ## 上下文与契约
15
15
 
16
- 已知日志、上周周报或目标路径直接复用。路径未知时按类型查询现有文档,再按需查看 Domain 人工规则,不依赖固定 Space 路径。结构使用 weekly-report 的有效 Profile;正文优先采用最近 Domain 的周报模板。
16
+ 已知日志、上周周报或目标路径直接复用。路径未知时按类型查询现有文档,再按需查看 Domain 人工规则,不依赖固定 Space 路径。结构使用 weekly-report 的有效 Profile;正文默认参考 Workspace 根目录 `_模板/` 的周报模板,局部模板仅明确指定时使用,不逐层查找。可按需裁剪,更新已有周报不强制套模板。
17
17
 
18
18
  ## SOP
19
19
 
@@ -24,7 +24,7 @@ description: "根据工作日志和上周周报撰写或更新工作周报;适
24
24
  |-- 关键材料缺失 -> 说明缺口或询问,不编造成果
25
25
  `-- 材料充分 -> 核对本周日志和上周计划
26
26
  |-- 同周期周报已存在 -> 读取后更新正文
27
- `-- 尚不存在 -> apply 创建结构 -> 按 target 写正文
27
+ `-- 尚不存在 -> apply 创建结构 -> 按 target 在正文锚点后写正文
28
28
  |
29
29
  `-- 核对事实与计划 -> 必要后续 -> 回报
30
30
  ```
@@ -33,8 +33,8 @@ description: "根据工作日志和上周周报撰写或更新工作周报;适
33
33
 
34
34
  1. 定位同周期周报,避免重复创建;已有目标不重新遍历 Workspace。
35
35
  2. 读取本周日志、相关任务或用户材料,核对实际结果、问题和待办;上周周报存在时检查计划承接。首次写周报可明确注明无上周材料,不强制补造。
36
- 3. 依据本地模板组织正文;没有模板时用复盘目标、问题分析、下一步行动计划的最小结构,不写执行流水或虚构指标。
37
- 4. 新建时仅在契约未知时查询 Profile,再 apply 预览、以原输入和返回哈希确认,并按 target Edit 正文。只改已有正文直接 Edit,受管字段变化才 apply。
36
+ 3. 模板只作最小参考,可按需扩展或裁剪,不省略用户明确要求;无模板时用复盘目标、问题分析、下一步行动计划的最小结构,不虚构指标。扩展本篇周报不授权修改共享模板。
37
+ 4. 新建时仅在契约未知时查询 Profile,再 apply 预览、以原输入和返回哈希确认,并按 target 在 `<!-- CAMPFIRE:BODY -->` 后 Edit 正文。只改已有正文直接 Edit,受管字段变化才 apply。
38
38
  5. 核对周期、事实来源、计划表述和历史内容是否保留,只执行实际 follow_up。
39
39
 
40
40
  ### 命令示例
@@ -41,12 +41,13 @@ description: "持续维护 Campfire Workspace 的结构与文档合规;适用
41
41
  ### 执行步骤
42
42
 
43
43
  1. 选择最窄的操作范围。诊断用对应 check;新建 Space/Domain 用 create,已有目录接管用 adopt;不要手写声明。
44
- 2. 修改文档结构时只查询尚未知的 Profile;apply 负责结构,正文由 Edit 维护。新建后用返回的 target 补正文,不手工同步类型前缀。
45
- 3. 只改标题用 rename,跨 Domain 用 move;确认带上预览返回的 `--expected-hash` 和 `--expected-plan`。批量语义迁移使用重构流程,不逐文件绕过计划。
46
- 4. 声明顺序异常时使用诊断返回的 format 修复入口,不把 formatter 列为日常必经步骤。声明标记外的人工正文可直接编辑。
47
- 5. sync 自身直接写入派生物;用户要求预览时才使用 --dry-run,不传不存在的 --confirm。使用实际 follow_up 的 scope 或用户明确的治理范围,不无条件扩大全库。
48
- 6. 只有索引损坏或明确恢复需求才使用 workspace rebuild 预览和确认;不把 rebuild 放入普通维护链。
49
- 7. 模板只从目标 Domain 向祖先查找最近同名文件;不合并模板、不维护继承副本,模板变更需明确授权。
44
+ 2. 修改文档结构时只查询尚未知的 Profile;apply 负责结构,正文由 Edit 维护。新建后用返回的 target 在 `<!-- CAMPFIRE:BODY -->` 后补正文,不手工同步类型前缀。
45
+ 3. `任务/`、`记录/` 可按组织需要声明为 Domain,但文档类型不强制决定目录。新目录使用 create,已有目录使用 adopt;系统保留目录按错误结果中的命中名称和提示处理。
46
+ 4. 只改标题用 rename,跨 Domain 用 move;确认带上预览返回的 `--expected-hash` 和 `--expected-plan`。批量语义迁移使用重构流程,不逐文件绕过计划。
47
+ 5. 声明顺序异常时使用诊断返回的 format 修复入口,不把 formatter 列为日常必经步骤。声明标记外的人工正文可直接编辑。
48
+ 6. sync 自身直接写入派生物;用户要求预览时才使用 --dry-run,不传不存在的 --confirm。使用实际 follow_up 的 scope 或用户明确的治理范围,不无条件扩大全库。
49
+ 7. 只有索引损坏或明确恢复需求才使用 workspace rebuild 预览和确认;不把 rebuild 放入普通维护链。
50
+ 8. 通用模板集中在 Workspace 根目录 `_模板/`,使用 template 类型;局部模板明确指定才使用,不逐层查找。共享模板只留必要结构,顶部写适用类型与特殊说明;完整原则可放目录 README,不逐份复制或强制每次加载。正文可直接编辑但模板变更须获授权,扩展单篇文档不等于授权修改模板,不校验使用者是否套用。
50
51
 
51
52
  ### 命令示例
52
53