campfire-cli 0.1.22__tar.gz → 0.1.23__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 (233) hide show
  1. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/ARCHITECTURE.md +1 -1
  2. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/COMMAND.md +1 -1
  3. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/PKG-INFO +2 -2
  4. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/README.md +1 -1
  5. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/pyproject.toml +1 -1
  6. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/__init__.py +1 -1
  7. campfire_cli-0.1.23/src/campfire_cli/app/base/SPEC.md +3 -0
  8. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/service/base_service.py +1 -1
  9. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/document_scanner.py +18 -4
  10. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/mutation/document_move_service.py +1 -5
  11. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/service/maintenance_service.py +1 -1
  12. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/SPEC.md +2 -2
  13. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/restructure_service.py +3 -3
  14. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/structure_service.py +5 -10
  15. campfire_cli-0.1.23/src/campfire_cli/resources/bases/SPEC.md +3 -0
  16. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/defaults/config.yml +7 -31
  17. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/SKILL.md +1 -1
  18. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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 +2 -2
  19. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/integration/test_cli.py +1 -1
  20. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/integration/test_domain_rename_sync.py +2 -0
  21. campfire_cli-0.1.23/tests/unit/test_document_scanner.py +33 -0
  22. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_domain_paths.py +18 -1
  23. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/uv.lock +1 -1
  24. campfire_cli-0.1.22/src/campfire_cli/app/base/SPEC.md +0 -3
  25. campfire_cli-0.1.22/src/campfire_cli/resources/bases/SPEC.md +0 -3
  26. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/.github/workflows/ci.yml +0 -0
  27. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/.github/workflows/release.yml +0 -0
  28. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/.gitignore +0 -0
  29. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/.python-version +0 -0
  30. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/AGENTS.md +0 -0
  31. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/DECISIONS.md +0 -0
  32. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/LICENSE +0 -0
  33. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/SPEC.md +0 -0
  34. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/alembic/SPEC.md +0 -0
  35. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/alembic/env.py +0 -0
  36. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/alembic/script.py.mako +0 -0
  37. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/alembic/versions/001_initial_schema.py +0 -0
  38. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/alembic.ini +0 -0
  39. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/scripts/SPEC.md +0 -0
  40. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/scripts/pypi_verify.py +0 -0
  41. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/scripts/quality_check.py +0 -0
  42. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/scripts/release_check.py +0 -0
  43. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/__init__.py +0 -0
  44. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/env.py +0 -0
  45. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/script.py.mako +0 -0
  46. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/001_initial_schema.py +0 -0
  47. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/002_workspace_project_registry.py +0 -0
  48. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/003_unified_workspace_state.py +0 -0
  49. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/004_restructure_workspace_domain.py +0 -0
  50. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/005_decision_channel.py +0 -0
  51. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/006_workspace_topology_index.py +0 -0
  52. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/007_workspace_adoption.py +0 -0
  53. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/008_remove_adoption_batches.py +0 -0
  54. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/009_document_query_index.py +0 -0
  55. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/010_project_domain_identity.py +0 -0
  56. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/011_document_state_model.py +0 -0
  57. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/012_remove_decision_channel.py +0 -0
  58. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/alembic/versions/__init__.py +0 -0
  59. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/SPEC.md +0 -0
  60. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/__init__.py +0 -0
  61. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/__init__.py +0 -0
  62. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/cli/base_cli.py +0 -0
  63. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/repository/base_repository.py +0 -0
  64. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/schema/base_schema.py +0 -0
  65. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/base/schema/operation_schema.py +0 -0
  66. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/SPEC.md +0 -0
  67. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/__init__.py +0 -0
  68. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/cli/__init__.py +0 -0
  69. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/cli/document_cli.py +0 -0
  70. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/cli/profile_cli.py +0 -0
  71. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/cli/type_cli.py +0 -0
  72. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/repository/__init__.py +0 -0
  73. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/repository/document_index_repository.py +0 -0
  74. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/repository/document_profile_repository.py +0 -0
  75. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/repository/document_type_repository.py +0 -0
  76. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/schema/__init__.py +0 -0
  77. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/schema/document_schema.py +0 -0
  78. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/__init__.py +0 -0
  79. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/document_service.py +0 -0
  80. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/index/__init__.py +0 -0
  81. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/index/document_index_builder.py +0 -0
  82. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/index/document_index_protocol.py +0 -0
  83. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/index/document_index_service.py +0 -0
  84. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/mutation/__init__.py +0 -0
  85. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/mutation/document_apply_service.py +0 -0
  86. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/mutation/document_relocation.py +0 -0
  87. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/mutation/frontmatter_apply.py +0 -0
  88. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/__init__.py +0 -0
  89. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/document_patch_values.py +0 -0
  90. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/document_profile_service.py +0 -0
  91. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/document_rule_service.py +0 -0
  92. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/document_type_service.py +0 -0
  93. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/frontmatter_formatter.py +0 -0
  94. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/frontmatter_plan.py +0 -0
  95. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/kanban_service.py +0 -0
  96. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/profile_candidates.py +0 -0
  97. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/profile_registry.py +0 -0
  98. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/document/service/rules/type_plan.py +0 -0
  99. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/SPEC.md +0 -0
  100. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/__init__.py +0 -0
  101. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/cli/maintenance_cli.py +0 -0
  102. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/repository/maintenance_repository.py +0 -0
  103. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/schema/maintenance_schema.py +0 -0
  104. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/service/maintenance_protocol.py +0 -0
  105. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/maintenance/service/moc_service.py +0 -0
  106. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/SPEC.md +0 -0
  107. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/__init__.py +0 -0
  108. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/cli/skill_cli.py +0 -0
  109. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/repository/skill_repository.py +0 -0
  110. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/schema/skill_schema.py +0 -0
  111. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/skill/service/skill_service.py +0 -0
  112. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/__init__.py +0 -0
  113. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/__init__.py +0 -0
  114. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/config_cli.py +0 -0
  115. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/domain_cli.py +0 -0
  116. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/project_cli.py +0 -0
  117. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/restructure_cli.py +0 -0
  118. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/space_cli.py +0 -0
  119. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/cli/workspace_cli.py +0 -0
  120. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/repository/__init__.py +0 -0
  121. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/repository/manifest_repository.py +0 -0
  122. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/repository/restructure_repository.py +0 -0
  123. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/repository/workspace_repository.py +0 -0
  124. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/schema/__init__.py +0 -0
  125. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/schema/adoption_schema.py +0 -0
  126. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/schema/restructure_schema.py +0 -0
  127. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/schema/workspace_schema.py +0 -0
  128. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/__init__.py +0 -0
  129. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/adoption_service.py +0 -0
  130. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/config_service.py +0 -0
  131. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/domain_restructure_service.py +0 -0
  132. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/project_service.py +0 -0
  133. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/restructure_protocol.py +0 -0
  134. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/restructure_verifier.py +0 -0
  135. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/workspace_protocol.py +0 -0
  136. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/app/workspace/service/workspace_service.py +0 -0
  137. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/SPEC.md +0 -0
  138. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/__init__.py +0 -0
  139. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/agent_hints.py +0 -0
  140. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/cli_output.py +0 -0
  141. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/database/__init__.py +0 -0
  142. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/database/migrations.py +0 -0
  143. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/database/models.py +0 -0
  144. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/database/session.py +0 -0
  145. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/__init__.py +0 -0
  146. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/document_types.py +0 -0
  147. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/domain_context.py +0 -0
  148. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/frontmatter_format.py +0 -0
  149. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/frontmatter_schema.py +0 -0
  150. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/markdown.py +0 -0
  151. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/documents/related_docs.py +0 -0
  152. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/exceptions/__init__.py +0 -0
  153. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/exceptions/base.py +0 -0
  154. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/__init__.py +0 -0
  155. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/atomic.py +0 -0
  156. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/change_set.py +0 -0
  157. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/cwd.py +0 -0
  158. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/locking.py +0 -0
  159. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/filesystem/plan.py +0 -0
  160. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/governance/__init__.py +0 -0
  161. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/governance/issues.py +0 -0
  162. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/governance/locking.py +0 -0
  163. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/governance/snapshots.py +0 -0
  164. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/hashing.py +0 -0
  165. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/package_version.py +0 -0
  166. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/reports/__init__.py +0 -0
  167. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/reports/json_report.py +0 -0
  168. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/common/reports/markdown_report.py +0 -0
  169. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/config/SPEC.md +0 -0
  170. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/config/defaults.py +0 -0
  171. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/config/settings.py +0 -0
  172. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/container.py +0 -0
  173. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/main.py +0 -0
  174. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/__init__.py +0 -0
  175. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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
  176. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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
  177. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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
  178. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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
  179. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/bases//346/226/207/346/241/243/345/267/245/344/275/234/345/217/260.base" +0 -0
  180. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/defaults/__init__.py +0 -0
  181. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/SPEC.md +0 -0
  182. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/TEMPLATE.md +0 -0
  183. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-context-bootstrap/SKILL.md +0 -0
  184. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-context-bootstrap/agents/openai.yaml +0 -0
  185. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-conversation-router/SKILL.md +0 -0
  186. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-conversation-router/agents/openai.yaml +0 -0
  187. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-conversation-router/references/inbox-handoff.md +0 -0
  188. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-conversation-router/references/learning-intake.md +0 -0
  189. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-conversation-router/references/task-intake.md +0 -0
  190. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-document-capture/SKILL.md +0 -0
  191. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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 -0
  192. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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
  193. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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
  194. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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
  195. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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
  196. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-inbox-triage/SKILL.md +0 -0
  197. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-kanban-board/SKILL.md +0 -0
  198. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-task-management/SKILL.md +0 -0
  199. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/SKILL.md +0 -0
  200. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/agents/openai.yaml +0 -0
  201. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-adoption/SKILL.md +0 -0
  202. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-onboarding/SKILL.md +0 -0
  203. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-restructure/SKILL.md +0 -0
  204. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/skills/campfire-workspace-restructure/references/restructure-spec.md +0 -0
  205. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/workspace/_/346/250/241/346/235/277/README.md" +0 -0
  206. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/src/campfire_cli/resources/workspace/_/346/250/241/346/235/277//346/250/241/346/235/277-/344/273/273/345/212/241.md" +0 -0
  207. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/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" +0 -0
  208. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/SPEC.md +0 -0
  209. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/conftest.py +0 -0
  210. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/integration/test_profile_resolution.py +0 -0
  211. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/integration/test_skill_examples.py +0 -0
  212. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/integration/test_workspace_templates.py +0 -0
  213. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/perf/test_read_counts.py +0 -0
  214. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/perf/test_resolve_subprocess_count.py +0 -0
  215. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_agent_hints.py +0 -0
  216. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_atomic_write.py +0 -0
  217. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_base_service.py +0 -0
  218. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_config.py +0 -0
  219. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_document_apply.py +0 -0
  220. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_document_index.py +0 -0
  221. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_domain_context.py +0 -0
  222. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_file_change_executor.py +0 -0
  223. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_frontmatter.py +0 -0
  224. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_generated_regions.py +0 -0
  225. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_kanban_service.py +0 -0
  226. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_migrations.py +0 -0
  227. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_operation_schema.py +0 -0
  228. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_package_version.py +0 -0
  229. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_pypi_verify.py +0 -0
  230. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_related_docs.py +0 -0
  231. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_release_check.py +0 -0
  232. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_repository_boundaries.py +0 -0
  233. {campfire_cli-0.1.22 → campfire_cli-0.1.23}/tests/unit/test_workspace_manifest.py +0 -0
@@ -40,7 +40,7 @@ Campfire 当前不负责 Agent 调度、实时消息推送或替代 Jira/Notion
40
40
  Schema + 命名 + 生命周期 + 计划/审批/执行 + 链接 + 归档 + 审计
41
41
  ```
42
42
 
43
- Domain 由声明而不是目录名称决定;`任务/`、`记录/` 可按需要成为 Domain,但 task、record 类型不强制绑定同名目录。真正的系统保留目录由 CLI 管理,不能伪装为 Domain。
43
+ Domain 由声明而不是目录名称决定;`任务/`、`记录/`、`assets/` 等普通目录可按需要成为 Domain,但文档类型不强制绑定同名目录。以下划线开头的 `_xxx/` 统一表示治理基础设施,不能声明为 Space 或 Domain;CLI 派生目录使用 `_generated/`,Base 使用 `_治理视图/`。归档是 `document_status=archived`,不对应特殊物理目录。
44
44
 
45
45
  Task Channel 借鉴 Go 的原则:**Do not communicate by sharing memory; instead, share memory by communicating.** 多个参与者不依赖各自会话中的隐式记忆,而是通过明确的任务状态与事件共享上下文。它是持久异步 Channel,不承诺实时唤醒;外部 Agent 运行时可在其上增加通知和调度。
46
46
 
@@ -42,7 +42,7 @@ 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
- `任务/`、`记录/` 不是系统保留目录,可按组织需要使用 `workspace domain create` 新建或 `workspace domain adopt` 接管;文档类型不强制对应同名 Domain。`_总览`、`generated` 等系统目录仍不能声明为 Domain,错误结果返回命中的 `reserved_directory` 和修复提示。
45
+ 目录名以 `_` 开头时表示系统治理区域,不能声明为 Space 或 Domain;错误结果返回命中的 `reserved_directory` 和修复提示。其他目录名默认没有隐藏保留语义,`任务/`、`记录/`、`assets/`、`archive/`、`generated/` 均可按需 create/adopt 为 Domain。文档类型不强制对应同名 Domain,归档只通过 `document_status=archived` 表达;CLI 关系页写入 `_generated/`,Base 写入 `_治理视图/`。
46
46
 
47
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
48
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: campfire-cli
3
- Version: 0.1.22
3
+ Version: 0.1.23
4
4
  Summary: Local-first shared context and governance CLI for humans and agents
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -99,7 +99,7 @@ campfire document list # 精确枚举和筛选受管
99
99
  campfire document apply / move / rename # 结构写入、跨 Domain 移动、原地改名
100
100
  campfire document profile list / show / resolve # Frontmatter Profile 规则
101
101
  campfire document type list # 文档类型与前缀
102
- campfire base list / show / check / sync # Obsidian Base 治理视图
102
+ campfire base list / show / check / sync # Obsidian Base `_治理视图/`
103
103
  ```
104
104
 
105
105
  通用模板集中在 Workspace 根目录 `_模板/`,方便人类查看维护;模板使用 `template` 类型和基础属性。正文顶部说明适用类型和裁剪规则,Agent 按需参考,不强制套用;更新已有文档优先保留合理结构。局部模板只在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。模板不替代 Profile,也不校验正文。
@@ -83,7 +83,7 @@ campfire document list # 精确枚举和筛选受管
83
83
  campfire document apply / move / rename # 结构写入、跨 Domain 移动、原地改名
84
84
  campfire document profile list / show / resolve # Frontmatter Profile 规则
85
85
  campfire document type list # 文档类型与前缀
86
- campfire base list / show / check / sync # Obsidian Base 治理视图
86
+ campfire base list / show / check / sync # Obsidian Base `_治理视图/`
87
87
  ```
88
88
 
89
89
  通用模板集中在 Workspace 根目录 `_模板/`,方便人类查看维护;模板使用 `template` 类型和基础属性。正文顶部说明适用类型和裁剪规则,Agent 按需参考,不强制套用;更新已有文档优先保留合理结构。局部模板只在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。模板不替代 Profile,也不校验正文。
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "campfire-cli"
3
- version = "0.1.22"
3
+ version = "0.1.23"
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.22"
3
+ __version__ = "0.1.23"
@@ -0,0 +1,3 @@
1
+ # Base App SPEC
2
+
3
+ 管理包内 SSOT Obsidian Base 与 Vault `_治理视图/` 的确定性同步。只管理配置声明的 Base,不修改 Markdown,不删除未知或孤立 Base。
@@ -127,7 +127,7 @@ class BaseService:
127
127
  return self._repository.source_root()
128
128
 
129
129
  def _target_root(self) -> Path:
130
- return self._settings.vault_root / self._settings.bases.get("target", "治理视图")
130
+ return self._settings.vault_root / self._settings.bases.get("target", "_治理视图")
131
131
 
132
132
  def _managed_names(self) -> list[str]:
133
133
  return list(config_section("bases").get("managed_bases", []))
@@ -3,7 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from collections.abc import Iterable
6
- from pathlib import Path
6
+ from pathlib import Path, PurePosixPath
7
7
  from typing import Any
8
8
 
9
9
  from campfire_cli.common.documents.document_types import safe_path
@@ -24,13 +24,25 @@ def is_system_scope_path(root: Path, path: Path, config: dict[str, Any]) -> bool
24
24
  )
25
25
 
26
26
 
27
+ def ignored_directory(name: str, config: dict[str, Any]) -> bool:
28
+ """Return whether a directory is outside managed document scopes."""
29
+ managed_system_directories = {
30
+ part
31
+ for raw_root in config.get("scope_roots", [])
32
+ for part in PurePosixPath(raw_root).parts
33
+ if part.startswith("_")
34
+ }
35
+ return name.startswith(".") or (
36
+ name.startswith("_") and name not in managed_system_directories
37
+ )
38
+
39
+
27
40
  def iter_documents(
28
41
  root: Path,
29
42
  config: dict[str, Any],
30
43
  roots: Iterable[Path] | None = None,
31
44
  ) -> list[Path]:
32
45
  root = root.resolve()
33
- ignored = set(config.get("ignored_directories", []))
34
46
  documents: set[Path] = set()
35
47
  space_marker = config.get("space_marker", "_空间.md")
36
48
  if roots is not None:
@@ -50,8 +62,10 @@ def iter_documents(
50
62
  if not scope.exists():
51
63
  continue
52
64
  for path in scope.rglob("*.md"):
53
- relative = path.relative_to(root)
54
- if exempt_document(path, config) or any(part in ignored for part in relative.parts):
65
+ scoped_parts = path.relative_to(scope).parts[:-1]
66
+ if exempt_document(path, config) or any(
67
+ ignored_directory(part, config) for part in scoped_parts
68
+ ):
55
69
  continue
56
70
  if not path.is_file() or any(
57
71
  part.is_symlink() for part in (path, *path.parents) if part != root
@@ -365,8 +365,4 @@ class DocumentMoveService:
365
365
 
366
366
  def _is_reserved_target(self, context: DomainContext, target: Path) -> bool:
367
367
  relative = target.parent.relative_to(context.root)
368
- reserved = {
369
- *self._settings.document_types.get("ignored_directories", []),
370
- *self._settings.governance.get("project_reserved_directories", []),
371
- }
372
- return any(part in reserved or part.startswith(".") for part in relative.parts)
368
+ return any(part.startswith(("_", ".")) for part in relative.parts)
@@ -259,7 +259,7 @@ class MaintenanceService:
259
259
  relation_page = None
260
260
  if notes:
261
261
  relations = {note: all_relations[note] for note in notes}
262
- relation_page = domain.path / "generated" / f"相关文档-{domain.name}.md"
262
+ relation_page = domain.path / "_generated" / f"相关文档-{domain.name}.md"
263
263
  relation_content = governance_sync.relation_markdown(domain, notes, relations)
264
264
  existing = (
265
265
  relation_page.read_text(encoding="utf-8") if relation_page.is_file() else ""
@@ -10,7 +10,7 @@
10
10
 
11
11
  `workspace space/domain create` 只创建不存在的新目录;`space adopt` 原地纳管已有 Space,`domain adopt` 可原地声明或把一个 Vault 内外已有目录接管到明确目标。Domain 所属 Space 和最近父 Domain 从目标路径唯一推导;Project 从 Manifest 绑定的根 Domain id 与祖先拓扑推导,Domain 声明不保存 Project。外部来源始终保留。命令默认只输出计划,追加 `--confirm` 才写入。
12
12
 
13
- 目录名称不决定文档类型或强制归属。`任务/`、`记录/` 可按组织需要创建或接管为 Domain,但不要求每个 Project 预建,也不强制 task、record 文档进入同名 Domain。系统保留目录不能声明为 Space/Domain;拒绝结果必须返回命中的目录名和修复提示。非保留目录直接包含文档或子 Domain 时必须有 `_领域.md`,否则报告 `undeclared-domain-directory`。
13
+ 目录名称不决定文档类型或强制归属。以下划线开头的 `_xxx/` 是系统治理目录,不能声明为 Space/Domain;拒绝结果必须返回命中的目录名和修复提示。其他名称没有隐藏保留名单,`任务/`、`记录/`、`assets/`、`archive/`、`generated/` 均可按组织需要创建或接管为 Domain。非系统目录直接包含文档或子 Domain 时必须有 `_领域.md`,否则报告 `undeclared-domain-directory`。归档只由文档状态表达,不要求物理 `archive/`。
14
14
 
15
15
  `workspace config check` 统一校验包内产品默认值和当前 Workspace 的有效治理契约,包括目录与 Space 冲突、文档类型前缀、Profile 引用和继承、归档策略以及托管资源列表。
16
16
 
@@ -20,7 +20,7 @@ Adoption、文档批量 Restructure 与 Domain Restructure 均使用共享 Chang
20
20
 
21
21
  `domain rename --name` 只改显示名称;`--folder-name` 只改原父级下目录名称,可显式同时提供。目录改名使用共享计划摘要,确认必须提供 `--expected-plan`,保护附件、声明和受管引用;Domain id、子领域身份与 Project 绑定不变。大小写不敏感文件系统的纯大小写改名明确阻止,提示先预览中间名迁移,不静默覆盖。不承诺断电原子性,回滚失败报告需要人工核对的路径。
22
22
 
23
- Space 是 Workspace 根下以 `_空间.md` 声明的顶级内容容器;Domain 位于 Space 内,以 `_领域.md` 声明并可任意嵌套。子 Domain 必须处于父 Domain 路径下、属于同一 Space 并继承 governance。`_收件箱`、`_待用户确认` 与 `治理视图` 是系统区域,不是 Space;其中 `_待用户确认/` 是受管文档范围,但没有虚构的 Domain 或 Project。Maintenance 只消费本模块发现的结构,不维护第二套领域规则。
23
+ Space 是 Workspace 根下以 `_空间.md` 声明的顶级内容容器;Domain 位于 Space 内,以 `_领域.md` 声明并可任意嵌套。子 Domain 必须处于父 Domain 路径下、属于同一 Space 并继承 governance。`_收件箱`、`_待用户确认` 与 `_治理视图` 是系统区域,不是 Space;其中 `_待用户确认/` 是受管文档范围,但没有虚构的 Domain 或 Project。Maintenance 只消费本模块发现的结构,不维护第二套领域规则。
24
24
 
25
25
  Space 与 Domain 声明 Frontmatter 只由本模块解释、格式化和修改;Document App 对其返回 `not-applicable`。`workspace space/domain format` 只规范化 Frontmatter 并逐字节保留 Markdown 正文。声明文件中 `AUTO-GENERATED` 标记区域由 CLI 独占,标记外正文允许人和 Agent 编辑。`workspace space check --space <id>` 支持对单个 Space 做局部复检。
26
26
 
@@ -8,6 +8,7 @@ from uuid import uuid4
8
8
  import yaml
9
9
 
10
10
  from campfire_cli.app.base.schema.operation_schema import maintenance_sync_follow_up
11
+ from campfire_cli.app.document.service.document_scanner import ignored_directory
11
12
  from campfire_cli.app.document.service.rules.document_rule_service import DocumentRuleService
12
13
  from campfire_cli.app.document.service.rules.profile_candidates import workspace_candidate_sets
13
14
  from campfire_cli.app.workspace.schema.restructure_schema import (
@@ -424,15 +425,14 @@ class RestructureService:
424
425
  )
425
426
 
426
427
  def _inventory_documents(self, root: Path) -> list[Path]:
427
- ignored = set(self._settings.document_types.get("ignored_directories", []))
428
- ignored.update({".git", ".obsidian", ".campfire"})
429
428
  exempt = set(self._settings.document_types.get("exempt_basenames", []))
430
429
  return sorted(
431
430
  path
432
431
  for path in root.rglob("*.md")
433
432
  if path.name not in exempt
434
433
  and not any(
435
- part in ignored for part in path.relative_to(self._settings.vault_root).parts[:-1]
434
+ ignored_directory(part, self._settings.document_types)
435
+ for part in path.relative_to(root).parts[:-1]
436
436
  )
437
437
  )
438
438
 
@@ -24,7 +24,6 @@ from campfire_cli.common.documents.domain_context import (
24
24
  from campfire_cli.common.documents.frontmatter_format import format_text
25
25
  from campfire_cli.common.exceptions import ConfigurationError
26
26
  from campfire_cli.common.filesystem import atomic_write, workspace_write_lock
27
- from campfire_cli.config.defaults import config_section
28
27
 
29
28
  SPACE_MARKER = "_空间.md"
30
29
  DOMAIN_MARKER = "_领域.md"
@@ -34,19 +33,15 @@ DECLARATION_MANAGED_COMMENT = (
34
33
  ID_RE = re.compile(r"[a-z0-9][a-z0-9-]{0,62}")
35
34
 
36
35
 
37
- def reserved_directories() -> set[str]:
38
- return set(config_section("workspace")["reserved_directories"])
39
-
40
-
41
36
  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)
37
+ reserved = next((part for part in parts if part.startswith("_")), None)
43
38
  if reserved is not None:
44
39
  raise ConfigurationError(
45
40
  f"Domain 路径命中系统保留目录:{reserved}",
46
41
  code="reserved-directory",
47
42
  path=path,
48
43
  reserved_directory=reserved,
49
- hint="该名称保留给系统区域或非 Domain 内容;请选择其他 Domain 路径。",
44
+ hint="下划线开头的目录用于系统治理;请选择不以 _ 开头的 Domain 路径。",
50
45
  )
51
46
  hidden = next((part for part in parts if part.startswith(".")), None)
52
47
  if hidden is not None:
@@ -198,7 +193,7 @@ class SpaceService:
198
193
  if (
199
194
  relative.is_absolute()
200
195
  or len(relative.parts) != 1
201
- or relative.name in reserved_directories()
196
+ or relative.name.startswith(("_", "."))
202
197
  ):
203
198
  raise ConfigurationError("Space path 必须是 Workspace 根下的单层非保留目录")
204
199
  target = self.root / relative
@@ -283,7 +278,7 @@ class DomainService:
283
278
  if not directory.is_dir() or directory == space_root:
284
279
  continue
285
280
  parts = directory.relative_to(space_root).parts
286
- if any(part in reserved_directories() or part.startswith(".") for part in parts):
281
+ if any(part.startswith(("_", ".")) for part in parts):
287
282
  continue
288
283
  direct_notes = [
289
284
  item for item in directory.glob("*.md") if item.name != DOMAIN_MARKER
@@ -302,7 +297,7 @@ class DomainService:
302
297
  )
303
298
  for marker in sorted(space_root.rglob(DOMAIN_MARKER)):
304
299
  if any(
305
- part in reserved_directories()
300
+ part.startswith(("_", "."))
306
301
  for part in marker.relative_to(space_root).parts[:-1]
307
302
  ):
308
303
  continue
@@ -0,0 +1,3 @@
1
+ # Base Resources SPEC
2
+
3
+ 本目录是标准 Obsidian Base 的唯一事实来源。Vault `_治理视图/` 中同名文件由 `campfire base sync` 生成;个性化视图应使用其他文件名。
@@ -1,12 +1,12 @@
1
- version: 1
1
+ version: 2
2
2
  workspace:
3
- version: 1
3
+ version: 2
4
4
  system_directories:
5
5
  - _收件箱/用户输入
6
6
  - _收件箱/待接管
7
7
  - _待用户确认
8
8
  - _模板
9
- - 治理视图
9
+ - _治理视图
10
10
  spaces:
11
11
  - id: knowledge
12
12
  name: 知识
@@ -28,43 +28,19 @@ workspace:
28
28
  name: 创作
29
29
  path: myblog
30
30
  type: content
31
- reserved_directories:
32
- - _收件箱
33
- - _待用户确认
34
- - _协作
35
- - 治理视图
36
- - assets
37
- - archive
38
- - generated
39
- - _总览
40
- - _模板
41
- - a_skill
42
31
  governance:
43
- version: 1
32
+ version: 2
44
33
  inbox: _收件箱
45
34
  human_request_root: _待用户确认
46
35
  collaboration_root: _协作
47
36
  space_marker: _空间.md
48
37
  domain_marker: _领域.md
49
- ignored_directories:
50
- - assets
51
- - archive
52
- - generated
53
- project_reserved_directories:
54
- - archive
55
- - _总览
56
- - _模板
57
- - a_skill
58
38
  document_types:
59
- version: 2
39
+ version: 3
60
40
  space_marker: _空间.md
61
41
  scope_roots:
62
42
  - _待用户确认
63
43
  - _模板
64
- ignored_directories:
65
- - assets
66
- - generated
67
- - a_skill
68
44
  exempt_basenames:
69
45
  - _领域.md
70
46
  - _空间.md
@@ -287,8 +263,8 @@ skills:
287
263
  unknown_skill_policy: ignore
288
264
  orphaned_skill_policy: report
289
265
  bases:
290
- version: 1
291
- target: 治理视图
266
+ version: 2
267
+ target: _治理视图
292
268
  managed_bases:
293
269
  - 文档工作台.base
294
270
  - 任务工作台-项目.base
@@ -42,7 +42,7 @@ description: "持续维护 Campfire Workspace 的结构与文档合规;适用
42
42
 
43
43
  1. 选择最窄的操作范围。诊断用对应 check;新建 Space/Domain 用 create,已有目录接管用 adopt;不要手写声明。
44
44
  2. 修改文档结构时只查询尚未知的 Profile;apply 负责结构,正文由 Edit 维护。新建后用返回的 target 在 `<!-- CAMPFIRE:BODY -->` 后补正文,不手工同步类型前缀。
45
- 3. `任务/`、`记录/` 可按组织需要声明为 Domain,但文档类型不强制决定目录。新目录使用 create,已有目录使用 adopt;系统保留目录按错误结果中的命中名称和提示处理。
45
+ 3. `_xxx/` 统一表示系统治理目录,不能声明为 Domain;其他目录名没有隐藏保留语义。新 Domain 使用 create,已有内容目录使用 adopt,文档类型不强制决定目录;归档只更新 `document_status`,不创建或移动到 `archive/`。
46
46
  4. 只改标题用 rename,跨 Domain 用 move;确认带上预览返回的 `--expected-hash` 和 `--expected-plan`。批量语义迁移使用重构流程,不逐文件绕过计划。
47
47
  5. 声明顺序异常时使用诊断返回的 format 修复入口,不把 formatter 列为日常必经步骤。声明标记外的人工正文可直接编辑。
48
48
  6. sync 自身直接写入派生物;用户要求预览时才使用 --dry-run,不传不存在的 --confirm。使用实际 follow_up 的 scope 或用户明确的治理范围,不无条件扩大全库。
@@ -14,7 +14,7 @@
14
14
  │ ├── README.md
15
15
  │ ├── 模板-任务.md
16
16
  │ └── 模板-版本发布清单.md
17
- ├── 治理视图/ # CLI 管理的 Base
17
+ ├── _治理视图/ # CLI 管理的 Base
18
18
  ├── mynote/ # 知识
19
19
  ├── mywork/ # 工作
20
20
  ├── mylog/ # 日志
@@ -34,7 +34,7 @@ campfire workspace create --id <workspace-id> --path <path>
34
34
 
35
35
  ## Base 演示
36
36
 
37
- 创建后,`治理视图/` 由 `campfire base sync` 维护以下开箱即用的 Obsidian Base:
37
+ 创建后,`_治理视图/` 由 `campfire base sync` 维护以下开箱即用的 Obsidian Base:
38
38
 
39
39
  - `文档工作台.base`:按类型查看当前文档、草稿和当前计划。
40
40
  - `任务工作台-项目.base`:按 `related_project` 查看项目任务和阻塞任务。
@@ -164,7 +164,7 @@ def test_first_time_workspace_create_and_existing_directory_setup(tmp_path: Path
164
164
  assert create_payload["resources"]["bases"]["status"] == "synced"
165
165
  assert create_payload["resources"]["skills"]["status"] == "synced"
166
166
  assert (created / ".campfire.yaml").is_file()
167
- assert (created / "治理视图" / "文档工作台.base").is_file()
167
+ assert (created / "_治理视图" / "文档工作台.base").is_file()
168
168
  assert {
169
169
  "mynote",
170
170
  "mywork",
@@ -55,6 +55,8 @@ def domain_tree(workspace: Path) -> AppContainer:
55
55
  handle.write("\n未提交的人工正文 [[mynote/金融/子领域/知识-说明.md]]\n")
56
56
  (workspace / "mynote/金融/附件.bin").write_bytes(b"\x00\xffasset")
57
57
  assert container.maintenance.sync(scope="mynote").status == "synced"
58
+ assert (workspace / "mynote/金融/子领域/_generated/相关文档-child.md").is_file()
59
+ assert not list((workspace / "mynote").rglob("generated"))
58
60
  return container
59
61
 
60
62
 
@@ -0,0 +1,33 @@
1
+ from pathlib import Path
2
+
3
+ from campfire_cli.app.document.service.document_scanner import iter_documents
4
+ from campfire_cli.config.defaults import config_section
5
+
6
+
7
+ def test_scanner_only_skips_prefixed_directories_inside_a_scope(workspace: Path) -> None:
8
+ domain = workspace / "mywork/Example"
9
+ domain.mkdir()
10
+ ordinary = [domain / name / f"记录-{name}.md" for name in ("assets", "archive", "generated")]
11
+ for path in ordinary:
12
+ path.parent.mkdir()
13
+ path.write_text("普通内容。\n", encoding="utf-8")
14
+ system_note = domain / "_generated/相关文档-Example.md"
15
+ system_note.parent.mkdir()
16
+ system_note.write_text("派生内容。\n", encoding="utf-8")
17
+
18
+ scanned = iter_documents(workspace, config_section("document_types"), roots=[domain])
19
+
20
+ assert set(scanned) == set(ordinary)
21
+
22
+
23
+ def test_scanner_allows_an_explicit_underscored_scope_root(workspace: Path) -> None:
24
+ request = workspace / "_待用户确认/请求-确认.md"
25
+ request.write_text("待确认。\n", encoding="utf-8")
26
+
27
+ scanned = iter_documents(
28
+ workspace,
29
+ config_section("document_types"),
30
+ roots=[workspace / "_待用户确认"],
31
+ )
32
+
33
+ assert scanned == [request]
@@ -45,7 +45,8 @@ def test_task_and_record_directories_can_be_domains(workspace: Path) -> None:
45
45
 
46
46
 
47
47
  @pytest.mark.parametrize(
48
- "path, reserved", [("mywork/generated/子领域", "generated"), ("mywork/_总览", "_总览")]
48
+ "path, reserved",
49
+ [("mywork/_generated/子领域", "_generated"), ("mywork/_任意系统区", "_任意系统区")],
49
50
  )
50
51
  def test_reserved_domain_path_reports_the_matching_directory(
51
52
  workspace: Path, path: str, reserved: str
@@ -66,3 +67,19 @@ def test_reserved_domain_path_reports_the_matching_directory(
66
67
  assert payload["path"] == path
67
68
  assert payload["reserved_directory"] == reserved
68
69
  assert payload["hint"]
70
+
71
+
72
+ @pytest.mark.parametrize("name", ["assets", "archive", "generated", "a_skill"])
73
+ def test_plain_directory_names_can_be_domains(workspace: Path, name: str) -> None:
74
+ created = DomainService(workspace, campfire_home()).create(
75
+ domain_id=name.replace("_", "-"),
76
+ name=name,
77
+ path=f"mywork/{name}",
78
+ domain_type="work-domain",
79
+ governance="work-docs",
80
+ project_id=None,
81
+ confirm=True,
82
+ )
83
+
84
+ assert created.status == "created"
85
+ assert (workspace / f"mywork/{name}/_领域.md").is_file()
@@ -36,7 +36,7 @@ wheels = [
36
36
 
37
37
  [[package]]
38
38
  name = "campfire-cli"
39
- version = "0.1.22"
39
+ version = "0.1.23"
40
40
  source = { editable = "." }
41
41
  dependencies = [
42
42
  { name = "alembic" },
@@ -1,3 +0,0 @@
1
- # Base App SPEC
2
-
3
- 管理包内 SSOT Obsidian Base 与 Vault `治理视图/` 的确定性同步。只管理配置声明的 Base,不修改 Markdown,不删除未知或孤立 Base。
@@ -1,3 +0,0 @@
1
- # Base Resources SPEC
2
-
3
- 本目录是标准 Obsidian Base 的唯一事实来源。Vault `治理视图/` 中同名文件由 `campfire base sync` 生成;个性化视图应使用其他文件名。
File without changes
File without changes
File without changes
File without changes
File without changes