campfire-cli 0.1.22__tar.gz → 0.1.24__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 (234) hide show
  1. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/ARCHITECTURE.md +6 -6
  2. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/COMMAND.md +1 -1
  3. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/PKG-INFO +8 -2
  4. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/README.md +7 -1
  5. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/SPEC.md +1 -1
  6. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/pyproject.toml +1 -1
  7. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/__init__.py +1 -1
  8. campfire_cli-0.1.24/src/campfire_cli/app/base/SPEC.md +3 -0
  9. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/service/base_service.py +1 -1
  10. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/document_scanner.py +18 -4
  11. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/index/document_index_service.py +0 -29
  12. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/mutation/document_move_service.py +1 -5
  13. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/SPEC.md +2 -2
  14. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/service/maintenance_protocol.py +1 -4
  15. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/service/maintenance_service.py +1 -28
  16. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/service/moc_service.py +2 -51
  17. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/SPEC.md +2 -2
  18. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/restructure_service.py +3 -3
  19. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/structure_service.py +5 -10
  20. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/agent_hints.py +1 -1
  21. campfire_cli-0.1.24/src/campfire_cli/resources/bases/SPEC.md +3 -0
  22. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/defaults/config.yml +7 -31
  23. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/SPEC.md +1 -1
  24. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-kanban-board/SKILL.md +1 -1
  25. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/SKILL.md +3 -3
  26. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  27. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/integration/test_cli.py +1 -1
  28. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/integration/test_domain_rename_sync.py +90 -4
  29. campfire_cli-0.1.24/tests/integration/test_relation_pages_cli.py +97 -0
  30. campfire_cli-0.1.24/tests/unit/test_document_scanner.py +33 -0
  31. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_domain_paths.py +18 -1
  32. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/uv.lock +1 -1
  33. campfire_cli-0.1.22/src/campfire_cli/app/base/SPEC.md +0 -3
  34. campfire_cli-0.1.22/src/campfire_cli/resources/bases/SPEC.md +0 -3
  35. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/.github/workflows/ci.yml +0 -0
  36. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/.github/workflows/release.yml +0 -0
  37. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/.gitignore +0 -0
  38. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/.python-version +0 -0
  39. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/AGENTS.md +0 -0
  40. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/DECISIONS.md +0 -0
  41. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/LICENSE +0 -0
  42. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/alembic/SPEC.md +0 -0
  43. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/alembic/env.py +0 -0
  44. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/alembic/script.py.mako +0 -0
  45. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/alembic/versions/001_initial_schema.py +0 -0
  46. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/alembic.ini +0 -0
  47. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/scripts/SPEC.md +0 -0
  48. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/scripts/pypi_verify.py +0 -0
  49. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/scripts/quality_check.py +0 -0
  50. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/scripts/release_check.py +0 -0
  51. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/__init__.py +0 -0
  52. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/env.py +0 -0
  53. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/script.py.mako +0 -0
  54. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/001_initial_schema.py +0 -0
  55. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/002_workspace_project_registry.py +0 -0
  56. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/003_unified_workspace_state.py +0 -0
  57. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/004_restructure_workspace_domain.py +0 -0
  58. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/005_decision_channel.py +0 -0
  59. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/006_workspace_topology_index.py +0 -0
  60. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/007_workspace_adoption.py +0 -0
  61. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/008_remove_adoption_batches.py +0 -0
  62. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/009_document_query_index.py +0 -0
  63. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/010_project_domain_identity.py +0 -0
  64. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/011_document_state_model.py +0 -0
  65. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/012_remove_decision_channel.py +0 -0
  66. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/alembic/versions/__init__.py +0 -0
  67. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/SPEC.md +0 -0
  68. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/__init__.py +0 -0
  69. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/__init__.py +0 -0
  70. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/cli/base_cli.py +0 -0
  71. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/repository/base_repository.py +0 -0
  72. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/schema/base_schema.py +0 -0
  73. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/base/schema/operation_schema.py +0 -0
  74. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/SPEC.md +0 -0
  75. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/__init__.py +0 -0
  76. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/cli/__init__.py +0 -0
  77. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/cli/document_cli.py +0 -0
  78. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/cli/profile_cli.py +0 -0
  79. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/cli/type_cli.py +0 -0
  80. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/repository/__init__.py +0 -0
  81. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/repository/document_index_repository.py +0 -0
  82. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/repository/document_profile_repository.py +0 -0
  83. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/repository/document_type_repository.py +0 -0
  84. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/schema/__init__.py +0 -0
  85. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/schema/document_schema.py +0 -0
  86. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/__init__.py +0 -0
  87. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/document_service.py +0 -0
  88. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/index/__init__.py +0 -0
  89. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/index/document_index_builder.py +0 -0
  90. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/index/document_index_protocol.py +0 -0
  91. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/mutation/__init__.py +0 -0
  92. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/mutation/document_apply_service.py +0 -0
  93. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/mutation/document_relocation.py +0 -0
  94. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/mutation/frontmatter_apply.py +0 -0
  95. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/__init__.py +0 -0
  96. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/document_patch_values.py +0 -0
  97. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/document_profile_service.py +0 -0
  98. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/document_rule_service.py +0 -0
  99. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/document_type_service.py +0 -0
  100. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/frontmatter_formatter.py +0 -0
  101. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/frontmatter_plan.py +0 -0
  102. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/kanban_service.py +0 -0
  103. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/profile_candidates.py +0 -0
  104. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/profile_registry.py +0 -0
  105. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/document/service/rules/type_plan.py +0 -0
  106. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/__init__.py +0 -0
  107. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/cli/maintenance_cli.py +0 -0
  108. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/repository/maintenance_repository.py +0 -0
  109. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/maintenance/schema/maintenance_schema.py +0 -0
  110. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/SPEC.md +0 -0
  111. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/__init__.py +0 -0
  112. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/cli/skill_cli.py +0 -0
  113. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/repository/skill_repository.py +0 -0
  114. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/schema/skill_schema.py +0 -0
  115. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/skill/service/skill_service.py +0 -0
  116. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/__init__.py +0 -0
  117. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/__init__.py +0 -0
  118. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/config_cli.py +0 -0
  119. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/domain_cli.py +0 -0
  120. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/project_cli.py +0 -0
  121. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/restructure_cli.py +0 -0
  122. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/space_cli.py +0 -0
  123. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/cli/workspace_cli.py +0 -0
  124. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/repository/__init__.py +0 -0
  125. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/repository/manifest_repository.py +0 -0
  126. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/repository/restructure_repository.py +0 -0
  127. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/repository/workspace_repository.py +0 -0
  128. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/schema/__init__.py +0 -0
  129. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/schema/adoption_schema.py +0 -0
  130. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/schema/restructure_schema.py +0 -0
  131. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/schema/workspace_schema.py +0 -0
  132. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/__init__.py +0 -0
  133. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/adoption_service.py +0 -0
  134. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/config_service.py +0 -0
  135. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/domain_restructure_service.py +0 -0
  136. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/project_service.py +0 -0
  137. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/restructure_protocol.py +0 -0
  138. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/restructure_verifier.py +0 -0
  139. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/workspace_protocol.py +0 -0
  140. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/app/workspace/service/workspace_service.py +0 -0
  141. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/SPEC.md +0 -0
  142. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/__init__.py +0 -0
  143. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/cli_output.py +0 -0
  144. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/database/__init__.py +0 -0
  145. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/database/migrations.py +0 -0
  146. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/database/models.py +0 -0
  147. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/database/session.py +0 -0
  148. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/__init__.py +0 -0
  149. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/document_types.py +0 -0
  150. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/domain_context.py +0 -0
  151. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/frontmatter_format.py +0 -0
  152. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/frontmatter_schema.py +0 -0
  153. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/markdown.py +0 -0
  154. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/documents/related_docs.py +0 -0
  155. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/exceptions/__init__.py +0 -0
  156. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/exceptions/base.py +0 -0
  157. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/__init__.py +0 -0
  158. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/atomic.py +0 -0
  159. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/change_set.py +0 -0
  160. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/cwd.py +0 -0
  161. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/locking.py +0 -0
  162. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/filesystem/plan.py +0 -0
  163. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/governance/__init__.py +0 -0
  164. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/governance/issues.py +0 -0
  165. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/governance/locking.py +0 -0
  166. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/governance/snapshots.py +0 -0
  167. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/hashing.py +0 -0
  168. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/package_version.py +0 -0
  169. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/reports/__init__.py +0 -0
  170. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/reports/json_report.py +0 -0
  171. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/common/reports/markdown_report.py +0 -0
  172. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/config/SPEC.md +0 -0
  173. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/config/defaults.py +0 -0
  174. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/config/settings.py +0 -0
  175. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/container.py +0 -0
  176. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/main.py +0 -0
  177. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/__init__.py +0 -0
  178. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  179. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  180. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  181. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  182. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/bases//346/226/207/346/241/243/345/267/245/344/275/234/345/217/260.base" +0 -0
  183. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/defaults/__init__.py +0 -0
  184. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/TEMPLATE.md +0 -0
  185. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-context-bootstrap/SKILL.md +0 -0
  186. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-context-bootstrap/agents/openai.yaml +0 -0
  187. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-conversation-router/SKILL.md +0 -0
  188. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-conversation-router/agents/openai.yaml +0 -0
  189. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-conversation-router/references/inbox-handoff.md +0 -0
  190. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-conversation-router/references/learning-intake.md +0 -0
  191. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-conversation-router/references/task-intake.md +0 -0
  192. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-document-capture/SKILL.md +0 -0
  193. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  194. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  195. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  196. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  197. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  198. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-inbox-triage/SKILL.md +0 -0
  199. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-task-management/SKILL.md +0 -0
  200. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/SKILL.md +0 -0
  201. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/agents/openai.yaml +0 -0
  202. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-workspace-adoption/SKILL.md +0 -0
  203. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-workspace-onboarding/SKILL.md +0 -0
  204. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-workspace-restructure/SKILL.md +0 -0
  205. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/skills/campfire-workspace-restructure/references/restructure-spec.md +0 -0
  206. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/src/campfire_cli/resources/workspace/_/346/250/241/346/235/277/README.md" +0 -0
  207. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  208. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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
  209. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/SPEC.md +0 -0
  210. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/conftest.py +0 -0
  211. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/integration/test_profile_resolution.py +0 -0
  212. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/integration/test_skill_examples.py +0 -0
  213. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/integration/test_workspace_templates.py +0 -0
  214. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/perf/test_read_counts.py +0 -0
  215. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/perf/test_resolve_subprocess_count.py +0 -0
  216. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_agent_hints.py +0 -0
  217. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_atomic_write.py +0 -0
  218. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_base_service.py +0 -0
  219. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_config.py +0 -0
  220. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_document_apply.py +0 -0
  221. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_document_index.py +0 -0
  222. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_domain_context.py +0 -0
  223. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_file_change_executor.py +0 -0
  224. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_frontmatter.py +0 -0
  225. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_generated_regions.py +0 -0
  226. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_kanban_service.py +0 -0
  227. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_migrations.py +0 -0
  228. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_operation_schema.py +0 -0
  229. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_package_version.py +0 -0
  230. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_pypi_verify.py +0 -0
  231. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_related_docs.py +0 -0
  232. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_release_check.py +0 -0
  233. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/tests/unit/test_repository_boundaries.py +0 -0
  234. {campfire_cli-0.1.22 → campfire_cli-0.1.24}/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;MOC 保留领域导航,Base 使用 `_治理视图/`;不再生成 `_generated/` 关系页。归档是 `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
 
@@ -108,7 +108,7 @@ Campfire 不是“Markdown 版 kubectl”,而是面向人机协作场景组合
108
108
  命令副作用按下列边界分类:
109
109
 
110
110
  - **必须纳入当前事务**:不执行就会让当前意图产生破损状态的变更,例如结构迁移时的 Domain 声明、Project 归属和可移植 Manifest 对齐。
111
- - **必须显式返回**:可从原始事实重建的派生结果,例如 MOC、关系页、索引和治理报告;这些作为 `follow_up` 由 Skill 显式执行。
111
+ - **必须显式返回**:可从原始事实重建的派生结果,例如 MOC 和治理报告;这些作为 `follow_up` 由 Skill 显式执行。
112
112
  - **禁止捎带**:与当前意图无关的全 Workspace 格式化、归档、结构重构或其他写操作。
113
113
 
114
114
  “一次改多个文件”不等于不原子;“一次只改一个字段”也不自动等于边界正确。评审新命令时必须逐项回答:
@@ -124,7 +124,7 @@ Campfire 不是“Markdown 版 kubectl”,而是面向人机协作场景组合
124
124
  命令设计遵循以下约束:
125
125
 
126
126
  1. **对象域优先**:公共入口采用 `campfire <object-domain> <verb>`,例如 `document apply`、`maintenance check`;动词在所属业务对象内保持单义,不为同一行为保留多个别名。
127
- 2. **意图原子、派生显式**:`document apply` 创建或更新文档,并在显式类型变化时将类型、文件名前缀和确定性引用作为同一变更提交;`document move` 原子完成单文档跨 Domain 移动、目标 Profile 对齐和确定性引用修复。命令只在 MOC、关系页或索引可能变化时返回零或一个可直接执行的最小 scope `maintenance sync`。
127
+ 2. **意图原子、派生显式**:`document apply` 创建或更新文档,并在显式类型变化时将类型、文件名前缀和确定性引用作为同一变更提交;`document move` 原子完成单文档跨 Domain 移动、目标 Profile 对齐和确定性引用修复。命令只在 MOC 等可见派生内容可能变化时返回零或一个可直接执行的最小 scope `maintenance sync`。
128
128
  3. **契约声明式,变更显式**:Profile 是字段、类型、枚举、顺序和条件必填的 SSOT。Agent 提交业务值,CLI 解析有效 Profile 并拒绝猜测;已有文档只修改明确给出的字段或正文操作。
129
129
  4. **写入先证明安全**:写命令默认预览,显式确认后才提交;提交时在锁内复核快照或期望哈希,多文件变更作为一个 ChangeSet 执行,失败回滚,避免静默覆盖和部分写入。
130
130
  5. **人类与 Agent 共用一个契约**:命令和结果只有一套语义。JSON 状态、issues、missing fields 与 follow-up 供 Agent 稳定消费,`tree` 和分层 `-h` 供人类与 Agent 渐进发现,不维护第二套参数目录。
@@ -165,13 +165,13 @@ SQLite 中的 Workspace 与 Project 注册数据是结构化事实,文档索
165
165
 
166
166
  ### 文档查询投影
167
167
 
168
- 文档索引保存列表查询需要的结构化字段、内容哈希、源文件 stat,以及显式 Frontmatter 关联、WikiLink、Markdown Link、Embed 形成的确定关系。它不复制正文,不保存相似度建议,也不把文件 mtime 解释为任务时间。
168
+ 文档索引保存列表查询需要的结构化字段、内容哈希、源文件 stat,以及Frontmatter `related_docs` 形成的确定关系,不解析正文 WikiLink、Markdown Link 或 Embed。它不复制正文,不保存相似度建议,也不把文件 mtime 解释为任务时间。
169
169
 
170
170
  每次 `document list` 或 `document inspect` 先对账文件清单、size、mtime、有效配置哈希和 Space/Domain 拓扑哈希。stat 只用于筛选变化候选,内容哈希才表示内容版本;新增、修改和删除会在查询前自动 reconcile。候选快照在内存中完成后,通过单个 SQLite 事务替换文档、关系和 generation,中断不能暴露半套新索引。
171
171
 
172
172
  `document list` 只做结构化精确枚举与 AND 筛选;未来正文关键词、模糊匹配、相关性排序或混合检索使用独立 `document search`。`document inspect.relations` 只返回可证明的 declared、outgoing、incoming 和 unresolved;相似文档属于未来独立 suggestions,不能混入确定关系。
173
173
 
174
- 索引新鲜度是 CLI 内部读取保障,不生成让 Agent 手工执行的 index follow-up。MOC、关系页等 Workspace 内可见生成物仍由成功写命令按需返回 scoped `maintenance sync`。
174
+ 索引新鲜度是 CLI 内部读取保障,不生成让 Agent 手工执行的 index follow-up。MOC 等 Workspace 内可见生成物仍由成功写命令按需返回 scoped `maintenance sync`。
175
175
 
176
176
  ### 设备本地与跨设备边界
177
177
 
@@ -237,7 +237,7 @@ Human / Browser ──> HTTP Adapter ──┘ │
237
237
  1. 人类和 Agent 使用同一套 CLI 契约,不维护两套规则。
238
238
  2. 写操作默认先计划、再确认、再执行;执行前复核并发变更。
239
239
  3. 规则集中在配置契约和规则引擎,Skill、模板、CLI 不复制枚举定义。
240
- 4. MOC、Base、关系和报告能生成就不手工维护。
240
+ 4. MOC、Base 和报告能生成就不手工维护;文档关系通过 CLI 查询,不再复制为关系页。
241
241
  5. 有歧义的分类和结构重构进入待确认,不由 Agent 擅自决定。
242
242
  6. Markdown 内容可脱离 Campfire 阅读和迁移;文档查询投影在 SQLite 丢失后可以重建,Decision 与未完成批次等工作流状态不作此承诺。
243
243
  7. 只有一个用户级 SQLite;所有 Workspace 业务表必须携带 `workspace_id`,Repository 查询不得越界。
@@ -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.24
4
4
  Summary: Local-first shared context and governance CLI for humans and agents
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -27,6 +27,12 @@ Description-Content-Type: text/markdown
27
27
 
28
28
  ## 安装
29
29
 
30
+ ### v0.1.24 变更说明
31
+
32
+ `maintenance sync` 不再生成 `_generated/相关文档-*.md`,并移除 MOC 自动区域中的关系页入口;MOC 的文档导航、分组和模板入口保持不变。`related_docs` 仍为可选字段,Agent 通过 `document list` 定位文档、通过 `document inspect` 查询出向、入向及失效关联,查询不要求先同步 MOC。
33
+
34
+ 同步不会删除或改写历史关系页,也不会修改人工正文链接。历史清理须先核实来源和人工内容,再确认具体范围;不能按 `_generated` 或 `generated` 目录名递归删除。Base 同步策略和领域模型不在本次变更范围内。
35
+
30
36
  标准安装(已发布至 PyPI,无需源码仓库):
31
37
 
32
38
  ```bash
@@ -99,7 +105,7 @@ campfire document list # 精确枚举和筛选受管
99
105
  campfire document apply / move / rename # 结构写入、跨 Domain 移动、原地改名
100
106
  campfire document profile list / show / resolve # Frontmatter Profile 规则
101
107
  campfire document type list # 文档类型与前缀
102
- campfire base list / show / check / sync # Obsidian Base 治理视图
108
+ campfire base list / show / check / sync # Obsidian Base `_治理视图/`
103
109
  ```
104
110
 
105
111
  通用模板集中在 Workspace 根目录 `_模板/`,方便人类查看维护;模板使用 `template` 类型和基础属性。正文顶部说明适用类型和裁剪规则,Agent 按需参考,不强制套用;更新已有文档优先保留合理结构。局部模板只在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。模板不替代 Profile,也不校验正文。
@@ -11,6 +11,12 @@
11
11
 
12
12
  ## 安装
13
13
 
14
+ ### v0.1.24 变更说明
15
+
16
+ `maintenance sync` 不再生成 `_generated/相关文档-*.md`,并移除 MOC 自动区域中的关系页入口;MOC 的文档导航、分组和模板入口保持不变。`related_docs` 仍为可选字段,Agent 通过 `document list` 定位文档、通过 `document inspect` 查询出向、入向及失效关联,查询不要求先同步 MOC。
17
+
18
+ 同步不会删除或改写历史关系页,也不会修改人工正文链接。历史清理须先核实来源和人工内容,再确认具体范围;不能按 `_generated` 或 `generated` 目录名递归删除。Base 同步策略和领域模型不在本次变更范围内。
19
+
14
20
  标准安装(已发布至 PyPI,无需源码仓库):
15
21
 
16
22
  ```bash
@@ -83,7 +89,7 @@ campfire document list # 精确枚举和筛选受管
83
89
  campfire document apply / move / rename # 结构写入、跨 Domain 移动、原地改名
84
90
  campfire document profile list / show / resolve # Frontmatter Profile 规则
85
91
  campfire document type list # 文档类型与前缀
86
- campfire base list / show / check / sync # Obsidian Base 治理视图
92
+ campfire base list / show / check / sync # Obsidian Base `_治理视图/`
87
93
  ```
88
94
 
89
95
  通用模板集中在 Workspace 根目录 `_模板/`,方便人类查看维护;模板使用 `template` 类型和基础属性。正文顶部说明适用类型和裁剪规则,Agent 按需参考,不强制套用;更新已有文档优先保留合理结构。局部模板只在用户或领域规则明确指定时使用,不逐层查找或自动覆盖。模板不替代 Profile,也不校验正文。
@@ -116,7 +116,7 @@ Campfire 使用语义化版本:
116
116
 
117
117
  ## Workspace 索引
118
118
 
119
- - Markdown Frontmatter 的 `related_docs` 是文档关系唯一 SSOT,采用 `[[Workspace相对路径.md]]`。不解析、索引或自动改写正文链接;历史正文保留,SQLite 和可见关系页均可从该字段重建。
119
+ - Markdown Frontmatter 的 `related_docs` 是文档关系唯一 SSOT,采用 `[[Workspace相对路径.md]]`。不解析、索引或自动改写正文链接;历史正文保留,SQLite 关系投影可从该字段重建;不再生成 Markdown 关系页,Agent 通过 document inspect 查询关系。
120
120
  - 改名、移动与类型联动改名只定向更新 `related_docs` 引用方;预览输出 `expected_plan`,确认复核整个变更集摘要和文件哈希。文件提交后的索引失败必须报告已写入事实,并使索引可在下次查询恢复。
121
121
 
122
122
  - SQLite `spaces`、`domains`、`documents` 只允许作为可重建本机投影,不得反向覆盖 Markdown SSOT。
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "campfire-cli"
3
- version = "0.1.22"
3
+ version = "0.1.24"
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.24"
@@ -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
@@ -123,35 +123,6 @@ class DocumentIndexService:
123
123
  "in_degree": len(incoming),
124
124
  }
125
125
 
126
- def relation_views(self, sources: list[Path]) -> dict[Path, list[dict[str, Any]]]:
127
- self.reconcile()
128
- records = {r.path: r for r in self._repository.load_documents() if r.queryable}
129
- results = {path: [] for path in sources}
130
- by_name = {p.relative_to(self._settings.vault_root).as_posix(): p for p in sources}
131
- for edge in self._repository.load_edges():
132
- if edge.resolution != "resolved":
133
- continue
134
- for source, target, kind in (
135
- (edge.source_path, edge.target_path, "direct-link"),
136
- (edge.target_path, edge.source_path, "backlink"),
137
- ):
138
- if source not in by_name or target not in records:
139
- continue
140
- record = records[target]
141
- results[by_name[source]].append(
142
- {
143
- "target": target.removesuffix(".md"),
144
- "target_name": record.name or Path(target).stem,
145
- "target_domain": record.domain_id or "",
146
- "type": kind,
147
- "score": 1.0,
148
- "reasons": ["related_docs 显式关联"],
149
- }
150
- )
151
- for items in results.values():
152
- items.sort(key=lambda item: (item["type"], item["target"]))
153
- return results
154
-
155
126
  def referencing(self, relative_path: str) -> list[str]:
156
127
  self.reconcile()
157
128
  return sorted(
@@ -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)
@@ -8,7 +8,7 @@ Domain MOC 只列出该 Domain `_模板/` 中实际存在的模板;根目录 `
8
8
 
9
9
  受管范围由当前 Workspace 中实际存在的 `_空间.md` 动态发现,不使用固定 Space 白名单;`scope_roots` 只补充 `_待用户确认/` 等非 Space 系统范围。声明文件由 Workspace App 校验,不计入普通文档问题。
10
10
 
11
- `check --scope` 的 status 表示当前筛选结果,`workspace_status` 表示全 Workspace 状态。`sync --scope` 只发现并扫描 scope 内的 Domain 和文档,一次刷新 MOC、关系页并触发文档索引 reconcile;只受当前范围的结构问题阻塞。`document list/inspect` 不以 Maintenance 为前置步骤。单篇内容创建、补全和修改属于 Document App,批量迁移属于 Workspace Restructure。
11
+ `check --scope` 的 status 表示当前筛选结果,`workspace_status` 表示全 Workspace 状态。`sync --scope` 只发现并扫描 scope 内的 Domain 和文档,刷新 MOC 并触发文档索引 reconcile;只受当前范围的结构问题阻塞。`document list/inspect` 不以 Maintenance 为前置步骤。单篇内容创建、补全和修改属于 Document App,批量迁移属于 Workspace Restructure。
12
12
 
13
13
  ```text
14
14
  maintenance/
@@ -20,4 +20,4 @@ maintenance/
20
20
  归档仅是 Document Profile 中的 `document_status` 值,通过 `document apply` 修改;Maintenance 不提供归档命令。
21
21
 
22
22
  scoped sync 在全局拓扑中检查目标身份是否重复,再按稳定 Domain id 和当前 scope 更新结构投影;合法外部改名不依赖先 check。文档索引先独立提交完整 generation,再在文件变更事务内提交领域索引;领域索引提交失败回滚其事务并补偿生成文件,不在领域提交之后追加可能失败的文档索引提交。两个投影可分别重建,不宣称文件系统与 SQLite 共享事务。可捕获失败返回阶段与实际写入状态,补偿失败须停止并核对文件,不盲目重放。
23
- 关系页只消费 Document Index 的 `related_docs` 正向和反向投影;不另行解析正文链接、不计算标签或文本相似度。正文不再作为关系 SSOT,旧正文不自动迁移。
23
+ Maintenance 不再生成关系页,也不读取关系展示投影;MOC 保留导航、文档分组与模板入口,移除自动关系入口。related_docs 与正反向查询仍由 Document App 管理。sync 不删除或改写历史关系页及自定义文件;历史清理须独立盘点和确认,不按目录名递归删除,不改写人工正文链接。
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from pathlib import Path
4
- from typing import Any, Protocol
3
+ from typing import Protocol
5
4
 
6
5
  from campfire_cli.app.document.schema import DocumentIndexResult
7
6
  from campfire_cli.app.maintenance.schema.maintenance_schema import (
@@ -15,8 +14,6 @@ from campfire_cli.app.maintenance.schema.maintenance_schema import (
15
14
  class DocumentIndexMaintainerProtocol(Protocol):
16
15
  """Expose only the index maintenance operations needed by Maintenance."""
17
16
 
18
- def relation_views(self, sources: list[Path]) -> dict[Path, list[dict[str, Any]]]: ...
19
-
20
17
  def rebuild(self) -> DocumentIndexResult: ...
21
18
 
22
19
  def reconcile(self) -> DocumentIndexResult: ...
@@ -226,22 +226,8 @@ class MaintenanceService:
226
226
  templates_by_domain = {
227
227
  domain.id: governance_sync.direct_templates(domain) for domain in domains
228
228
  }
229
- project_domain_ids = {
230
- domain.id for domain in domains if domain.governance == "project-docs"
231
- }
232
- domain_by_note = {
233
- note: domain_id
234
- for domain_id, notes in notes_by_domain.items()
235
- for note in notes
236
- if domain_id not in project_domain_ids
237
- }
238
- all_notes = sorted(
239
- domain_by_note,
240
- key=lambda path: str(path.relative_to(self._settings.vault_root)).casefold(),
241
- )
242
229
  try:
243
230
  indexed_document_count = self._document_index.reconcile().document_count
244
- all_relations = self._document_index.relation_views(all_notes)
245
231
  except AppError as exc:
246
232
  return self._sync_failure(exc, "document-index", scope)
247
233
  for domain in sorted(domains, key=lambda item: item.id):
@@ -256,21 +242,8 @@ class MaintenanceService:
256
242
  marker_name,
257
243
  )
258
244
  else:
259
- relation_page = None
260
- if notes:
261
- relations = {note: all_relations[note] for note in notes}
262
- relation_page = domain.path / "generated" / f"相关文档-{domain.name}.md"
263
- relation_content = governance_sync.relation_markdown(domain, notes, relations)
264
- existing = (
265
- relation_page.read_text(encoding="utf-8") if relation_page.is_file() else ""
266
- )
267
- generated_snapshot[
268
- relation_page.relative_to(self._settings.vault_root).as_posix()
269
- ] = file_sha256(relation_page) if relation_page.is_file() else None
270
- if existing != relation_content:
271
- changes.append((relation_page, relation_content))
272
245
  generated = governance_sync.generate_domain_content(
273
- domain, domains, notes, templates_by_domain[domain.id], relation_page
246
+ domain, domains, notes, templates_by_domain[domain.id]
274
247
  )
275
248
  moc = domain.path / f"{domain.moc}.md"
276
249
  if not moc.is_file():
@@ -1,12 +1,12 @@
1
1
  """
2
2
  SPEC:
3
3
  name: moc_service
4
- purpose: 幂等生成领域 MOC 自动区域、相关文档页面、索引缓存和治理报告
4
+ purpose: 幂等生成领域 MOC 自动区域
5
5
  default_env_file: none
6
6
  env_override: none
7
7
  idempotent: true
8
8
  behavior:
9
- - 从领域声明、文档属性及受管关系索引生成派生内容
9
+ - 从领域声明和文档属性生成目录内容
10
10
  - 内容未变化时不重写文件
11
11
  - 支持 dry-run 和 JSON 输出
12
12
  safety:
@@ -19,7 +19,6 @@ SPEC:
19
19
  from __future__ import annotations
20
20
 
21
21
  import os
22
- import re
23
22
  from pathlib import Path
24
23
  from typing import Any
25
24
 
@@ -31,15 +30,6 @@ START_MARKER = "<!-- AUTO-GENERATED:DOMAIN-INDEX:START -->"
31
30
  END_MARKER = "<!-- AUTO-GENERATED:DOMAIN-INDEX:END -->"
32
31
 
33
32
 
34
- def note_title(path: Path) -> str:
35
- return title_from_text(path.read_text(encoding="utf-8"), path.stem)
36
-
37
-
38
- def title_from_text(text: str, fallback: str) -> str:
39
- match = re.search(r"^#\s+(.+)$", text, re.MULTILINE)
40
- return match.group(1).strip() if match else fallback
41
-
42
-
43
33
  def direct_notes(domain: Domain, marker_name: str) -> list[Path]:
44
34
  excluded = {marker_name, f"{domain.moc}.md"}
45
35
  return sorted(
@@ -78,24 +68,11 @@ def replace_generated_region(original: str, generated: str) -> str:
78
68
  return original[:start] + "\n\n" + generated.rstrip() + "\n\n" + original[end:]
79
69
 
80
70
 
81
- def write_if_changed(
82
- path: Path, content: str, dry_run: bool, changes: list[str], vault_root: Path
83
- ) -> None:
84
- previous = path.read_text(encoding="utf-8") if path.exists() else None
85
- if previous == content:
86
- return
87
- changes.append(str(path.relative_to(vault_root)))
88
- if not dry_run:
89
- path.parent.mkdir(parents=True, exist_ok=True)
90
- path.write_text(content, encoding="utf-8")
91
-
92
-
93
71
  def generate_domain_content(
94
72
  domain: Domain,
95
73
  domains: list[Domain],
96
74
  notes: list[Path],
97
75
  templates: list[Path],
98
- relation_page: Path | None,
99
76
  ) -> str:
100
77
  children = sorted(
101
78
  [item for item in domains if item.parent_domain == domain.id],
@@ -109,8 +86,6 @@ def generate_domain_content(
109
86
  lines.extend(["", "## 本领域文档", ""])
110
87
  lines.extend([f"- [[{note.stem}]]" for note in notes] or ["- 暂无"])
111
88
  append_template_section(lines, domain, templates)
112
- lines.extend(["", "## 自动关系", ""])
113
- lines.append(f"- [[{relation_page.stem}|相关文档计算结果]]" if relation_page else "- 暂无")
114
89
  return "\n".join(lines)
115
90
 
116
91
 
@@ -168,27 +143,3 @@ def generate_project_domain_content(
168
143
  append_template_section(lines, domain, templates)
169
144
  lines.append("")
170
145
  return "\n".join(lines).rstrip()
171
-
172
-
173
- def relation_markdown(
174
- domain: Domain, notes: list[Path], relations: dict[Path, list[dict[str, Any]]]
175
- ) -> str:
176
- lines = [
177
- f"# {domain.name}相关文档",
178
- "",
179
- "> 本页由 `campfire maintenance sync` 自动生成,请勿手工编辑。",
180
- "",
181
- ]
182
- for note in notes:
183
- lines.extend([f"## [[{note.stem}]]", ""])
184
- items = relations.get(note, [])
185
- if not items:
186
- lines.extend(["- 暂无 related_docs 关联", ""])
187
- continue
188
- for item in items:
189
- reason = "、".join(item["reasons"]) or "related_docs 显式关联"
190
- lines.append(
191
- f"- [[{item['target']}|{item['target_name']}]]:`{item['type']}`;依据:{reason}"
192
- )
193
- lines.append("")
194
- return "\n".join(lines).rstrip() + "\n"
@@ -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
@@ -50,7 +50,7 @@ HINT_BODY = """## Campfire 文档治理
50
50
  11. 设置 `document_status=archived` 前必须获得用户针对该文档的明确同意;
51
51
  `--confirm` 只确认 CLI 写入,不代表归档授权。
52
52
 
53
- `.campfire.yaml`、声明 Frontmatter、自动生成区域、Base、关系页和 SQLite
53
+ `.campfire.yaml`、声明 Frontmatter、自动生成区域、Base 和 SQLite
54
54
  是 CLI 管理资源。Agent 可以读取,但只能通过 Campfire 语义命令写入;缺少
55
55
  对应命令时停止并报告能力缺口,不直接编辑。声明文件标记外正文不受此限制。
56
56
  `_空间.md` 与 `_领域.md` 的人工正文维护局部业务规则;通用结构事实和索引
@@ -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