campfire-cli 0.1.1__tar.gz → 0.1.3__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 (178) hide show
  1. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/PKG-INFO +13 -2
  2. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/README.md +12 -1
  3. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/pyproject.toml +1 -1
  4. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/__init__.py +1 -1
  5. campfire_cli-0.1.3/src/campfire_cli/common/agent_hints.py +53 -0
  6. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/container.py +31 -0
  7. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/main.py +51 -1
  8. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/tests/conftest.py +6 -0
  9. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/tests/integration/test_cli.py +61 -0
  10. campfire_cli-0.1.3/tests/unit/test_agent_hints.py +39 -0
  11. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/uv.lock +1 -1
  12. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/.github/workflows/ci.yml +0 -0
  13. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/.github/workflows/release.yml +0 -0
  14. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/.gitignore +0 -0
  15. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/AGENTS.md +0 -0
  16. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/ARCHITECTURE.md +0 -0
  17. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/COMMAND.md +0 -0
  18. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/DECISIONS.md +0 -0
  19. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/LICENSE +0 -0
  20. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/SPEC.md +0 -0
  21. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/alembic/SPEC.md +0 -0
  22. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/alembic/env.py +0 -0
  23. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/alembic/script.py.mako +0 -0
  24. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/alembic/versions/001_initial_schema.py +0 -0
  25. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/alembic.ini +0 -0
  26. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/scripts/SPEC.md +0 -0
  27. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/__init__.py +0 -0
  28. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/env.py +0 -0
  29. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/script.py.mako +0 -0
  30. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/versions/001_initial_schema.py +0 -0
  31. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/versions/002_workspace_project_registry.py +0 -0
  32. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/versions/003_unified_workspace_state.py +0 -0
  33. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/versions/004_restructure_workspace_domain.py +0 -0
  34. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/versions/005_decision_channel.py +0 -0
  35. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/versions/006_workspace_topology_index.py +0 -0
  36. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/versions/007_workspace_adoption.py +0 -0
  37. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/alembic/versions/__init__.py +0 -0
  38. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/SPEC.md +0 -0
  39. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/__init__.py +0 -0
  40. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/base/SPEC.md +0 -0
  41. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/base/__init__.py +0 -0
  42. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/base/cli/base_cli.py +0 -0
  43. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/base/repository/base_repository.py +0 -0
  44. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/base/schema/base_schema.py +0 -0
  45. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/base/service/base_service.py +0 -0
  46. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/decision/SPEC.md +0 -0
  47. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/decision/__init__.py +0 -0
  48. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/decision/cli/decision_cli.py +0 -0
  49. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/decision/repository/decision_repository.py +0 -0
  50. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/decision/schema/decision_schema.py +0 -0
  51. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/decision/service/decision_projection_service.py +0 -0
  52. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/decision/service/decision_service.py +0 -0
  53. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/SPEC.md +0 -0
  54. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/__init__.py +0 -0
  55. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/cli/__init__.py +0 -0
  56. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/cli/document_cli.py +0 -0
  57. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/cli/profile_cli.py +0 -0
  58. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/cli/type_cli.py +0 -0
  59. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/repository/__init__.py +0 -0
  60. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/repository/document_profile_repository.py +0 -0
  61. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/repository/document_type_repository.py +0 -0
  62. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/__init__.py +0 -0
  63. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/document_profile_service.py +0 -0
  64. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/document_rule_service.py +0 -0
  65. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/document_scanner.py +0 -0
  66. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/document_service.py +0 -0
  67. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/document_type_service.py +0 -0
  68. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/frontmatter_apply.py +0 -0
  69. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/frontmatter_formatter.py +0 -0
  70. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/frontmatter_plan.py +0 -0
  71. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/profile_registry.py +0 -0
  72. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/type_apply.py +0 -0
  73. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/document/service/type_plan.py +0 -0
  74. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/SPEC.md +0 -0
  75. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/__init__.py +0 -0
  76. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/cli/maintenance_cli.py +0 -0
  77. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/repository/maintenance_repository.py +0 -0
  78. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/schema/maintenance_schema.py +0 -0
  79. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/service/archive_service.py +0 -0
  80. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/service/link_service.py +0 -0
  81. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/service/maintenance_protocol.py +0 -0
  82. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/service/maintenance_service.py +0 -0
  83. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/service/moc_service.py +0 -0
  84. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/maintenance/service/plan_service.py +0 -0
  85. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/skill/SPEC.md +0 -0
  86. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/skill/__init__.py +0 -0
  87. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/skill/cli/skill_cli.py +0 -0
  88. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/skill/repository/skill_repository.py +0 -0
  89. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/skill/schema/skill_schema.py +0 -0
  90. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/skill/service/skill_service.py +0 -0
  91. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/SPEC.md +0 -0
  92. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/__init__.py +0 -0
  93. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/cli/__init__.py +0 -0
  94. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/cli/adoption_cli.py +0 -0
  95. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/cli/config_cli.py +0 -0
  96. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/cli/domain_cli.py +0 -0
  97. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/cli/project_cli.py +0 -0
  98. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/cli/restructure_cli.py +0 -0
  99. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/cli/space_cli.py +0 -0
  100. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/cli/workspace_cli.py +0 -0
  101. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/repository/__init__.py +0 -0
  102. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/repository/adoption_repository.py +0 -0
  103. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/repository/manifest_repository.py +0 -0
  104. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/repository/restructure_repository.py +0 -0
  105. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/repository/workspace_repository.py +0 -0
  106. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/schema/__init__.py +0 -0
  107. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/schema/adoption_schema.py +0 -0
  108. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/schema/restructure_schema.py +0 -0
  109. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/schema/workspace_schema.py +0 -0
  110. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/__init__.py +0 -0
  111. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/adoption_protocol.py +0 -0
  112. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/adoption_service.py +0 -0
  113. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/config_service.py +0 -0
  114. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/domain_restructure_service.py +0 -0
  115. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/project_service.py +0 -0
  116. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/restructure_protocol.py +0 -0
  117. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/restructure_service.py +0 -0
  118. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/restructure_verifier.py +0 -0
  119. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/structure_service.py +0 -0
  120. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/workspace_protocol.py +0 -0
  121. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/app/workspace/service/workspace_service.py +0 -0
  122. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/SPEC.md +0 -0
  123. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/__init__.py +0 -0
  124. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/database/__init__.py +0 -0
  125. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/database/migrations.py +0 -0
  126. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/database/models.py +0 -0
  127. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/database/session.py +0 -0
  128. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/documents/__init__.py +0 -0
  129. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/documents/document_types.py +0 -0
  130. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/documents/frontmatter_schema.py +0 -0
  131. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/documents/markdown.py +0 -0
  132. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/exceptions/__init__.py +0 -0
  133. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/exceptions/base.py +0 -0
  134. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/filesystem/__init__.py +0 -0
  135. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/filesystem/atomic.py +0 -0
  136. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/filesystem/locking.py +0 -0
  137. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/governance/__init__.py +0 -0
  138. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/governance/issues.py +0 -0
  139. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/governance/locking.py +0 -0
  140. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/governance/snapshots.py +0 -0
  141. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/hashing.py +0 -0
  142. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/reports/__init__.py +0 -0
  143. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/reports/json_report.py +0 -0
  144. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/common/reports/markdown_report.py +0 -0
  145. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/config/SPEC.md +0 -0
  146. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/config/defaults.py +0 -0
  147. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/config/settings.py +0 -0
  148. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/__init__.py +0 -0
  149. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/bases/Agent/346/211/247/350/241/214/345/267/245/344/275/234/345/217/260.base" +0 -0
  150. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/bases/SPEC.md +0 -0
  151. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/bases//344/273/273/345/212/241/345/267/245/344/275/234/345/217/260.base" +0 -0
  152. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/bases//345/206/263/347/255/226/345/267/245/344/275/234/345/217/260.base" +0 -0
  153. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/bases//345/276/205/345/275/222/346/241/243/346/226/207/346/241/243.base" +0 -0
  154. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/bases//351/241/271/347/233/256/346/226/207/346/241/243.base" +0 -0
  155. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/defaults/__init__.py +0 -0
  156. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/defaults/config.yml +0 -0
  157. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/SPEC.md +0 -0
  158. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-context-bootstrap/SKILL.md +0 -0
  159. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-context-bootstrap/agents/openai.yaml +0 -0
  160. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-conversation-router/SKILL.md +0 -0
  161. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-conversation-router/agents/openai.yaml +0 -0
  162. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-conversation-router/references/inbox-handoff.md +0 -0
  163. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-conversation-router/references/learning-intake.md +0 -0
  164. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-conversation-router/references/task-intake.md +0 -0
  165. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-document-capture/SKILL.md +0 -0
  166. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-inbox-triage/SKILL.md +0 -0
  167. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/SKILL.md +0 -0
  168. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/agents/openai.yaml +0 -0
  169. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-workspace-adoption/SKILL.md +0 -0
  170. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/SKILL.md +0 -0
  171. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/references//344/273/273/345/212/241/346/255/243/346/226/207/347/273/223/346/236/204.md" +0 -0
  172. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/src/campfire_cli/resources/skills/campfire-workspace-restructure/SKILL.md +0 -0
  173. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/tests/SPEC.md +0 -0
  174. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/tests/unit/test_atomic_write.py +0 -0
  175. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/tests/unit/test_common_governance.py +0 -0
  176. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/tests/unit/test_config.py +0 -0
  177. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/tests/unit/test_frontmatter.py +0 -0
  178. {campfire_cli-0.1.1 → campfire_cli-0.1.3}/tests/unit/test_repository_boundaries.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: campfire-cli
3
- Version: 0.1.1
3
+ Version: 0.1.3
4
4
  Summary: Local-first shared context and governance CLI for humans and agents
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -32,7 +32,18 @@ Vault 根目录的 `.campfire.yaml` 是可跨设备同步的 Workspace/Project
32
32
 
33
33
  ## 安装与调用
34
34
 
35
- 开发机安装:
35
+ 标准安装(已发布至 PyPI,无需源码仓库):
36
+
37
+ ```bash
38
+ uv tool install campfire-cli
39
+ campfire version
40
+ ```
41
+
42
+ 升级使用 `uv tool upgrade campfire-cli`(或 `pipx upgrade campfire-cli`),随后运行 `campfire upgrade`(别名 `campfire update`)对齐本机治理资源:SQLite Schema 迁移、全局 Skill、Base 与全局提示词路标。
43
+
44
+ `campfire setup` 初始化时会向 `~/.claude/CLAUDE.md` 与 `~/.agents/AGENTS.md` 注入 campfire 路标块(幂等、带注释标记、不触碰块外内容;可用 `CAMPFIRE_AGENT_HINT_PATH` 覆盖目标文件列表),让 Agent 冷启动时知道本机装有 campfire。
45
+
46
+ 开发机安装(跟随本地源码):
36
47
 
37
48
  ```bash
38
49
  uv tool install --editable /path/to/campfire-cli
@@ -16,7 +16,18 @@ Vault 根目录的 `.campfire.yaml` 是可跨设备同步的 Workspace/Project
16
16
 
17
17
  ## 安装与调用
18
18
 
19
- 开发机安装:
19
+ 标准安装(已发布至 PyPI,无需源码仓库):
20
+
21
+ ```bash
22
+ uv tool install campfire-cli
23
+ campfire version
24
+ ```
25
+
26
+ 升级使用 `uv tool upgrade campfire-cli`(或 `pipx upgrade campfire-cli`),随后运行 `campfire upgrade`(别名 `campfire update`)对齐本机治理资源:SQLite Schema 迁移、全局 Skill、Base 与全局提示词路标。
27
+
28
+ `campfire setup` 初始化时会向 `~/.claude/CLAUDE.md` 与 `~/.agents/AGENTS.md` 注入 campfire 路标块(幂等、带注释标记、不触碰块外内容;可用 `CAMPFIRE_AGENT_HINT_PATH` 覆盖目标文件列表),让 Agent 冷启动时知道本机装有 campfire。
29
+
30
+ 开发机安装(跟随本地源码):
20
31
 
21
32
  ```bash
22
33
  uv tool install --editable /path/to/campfire-cli
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "campfire-cli"
3
- version = "0.1.1"
3
+ version = "0.1.3"
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.1"
3
+ __version__ = "0.1.3"
@@ -0,0 +1,53 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from pathlib import Path
5
+
6
+ from campfire_cli.common.filesystem import atomic_write
7
+
8
+ HINT_START = "<!-- campfire:agent-hints:start -->"
9
+ HINT_END = "<!-- campfire:agent-hints:end -->"
10
+
11
+ HINT_BODY = """## Campfire 文档治理
12
+
13
+ 本机装有 campfire CLI(`campfire --help`),Obsidian Vault 已注册为文档工作区。
14
+ 当用户要求"沉淀/记录/写文档/归档/跟踪问题"到知识库或项目文档时,先运行
15
+ `campfire workspace resolve` 解析工作区,再按 campfire skill 流程处理;
16
+ 不要直接在代码仓库里创建笔记文件。文档分类不确定时用"记录-"前缀兜底,
17
+ 字段规则以 `campfire document inspect` 返回的有效 Profile 为准。"""
18
+
19
+
20
+ def default_hint_paths() -> list[Path]:
21
+ override = os.environ.get("CAMPFIRE_AGENT_HINT_PATH")
22
+ if override:
23
+ return [Path(item).expanduser().resolve() for item in override.split(os.pathsep) if item]
24
+ home = Path.home()
25
+ return [home / ".claude" / "CLAUDE.md", home / ".agents" / "AGENTS.md"]
26
+
27
+
28
+ def render_hint_block() -> str:
29
+ return f"{HINT_START}\n{HINT_BODY}\n{HINT_END}"
30
+
31
+
32
+ def inject_agent_hint(path: Path) -> str:
33
+ """幂等地向 path 写入 campfire 路标块,返回 created/appended/updated/kept。
34
+
35
+ 块由 HTML 注释标记包围;已存在时整体替换以升级内容,块外用户内容不动。
36
+ """
37
+ block = render_hint_block()
38
+ current = path.read_text(encoding="utf-8") if path.is_file() else ""
39
+ if HINT_START in current and HINT_END in current:
40
+ start = current.index(HINT_START)
41
+ end = current.index(HINT_END) + len(HINT_END)
42
+ updated = current[:start] + block + current[end:]
43
+ action = "updated" if updated != current else "kept"
44
+ elif current:
45
+ separator = "" if current.endswith("\n\n") else ("\n" if current.endswith("\n") else "\n\n")
46
+ updated = current + separator + block + "\n"
47
+ action = "appended"
48
+ else:
49
+ updated = block + "\n"
50
+ action = "created"
51
+ if action != "kept":
52
+ atomic_write(path, updated)
53
+ return action
@@ -28,6 +28,7 @@ from campfire_cli.app.workspace.service.domain_restructure_service import (
28
28
  )
29
29
  from campfire_cli.app.workspace.service.restructure_service import RestructureService
30
30
  from campfire_cli.app.workspace.service.workspace_service import WorkspaceService
31
+ from campfire_cli.common.agent_hints import default_hint_paths, inject_agent_hint
31
32
  from campfire_cli.common.database import create_sqlite_engine, open_session, upgrade_database
32
33
  from campfire_cli.common.exceptions import ConfigurationError
33
34
  from campfire_cli.config.defaults import effective_config
@@ -60,10 +61,40 @@ class AppContainer:
60
61
  "config": WorkspaceConfigService(settings).check().model_dump(mode="json"),
61
62
  "skills": container.skill.sync(dry_run=False).model_dump(mode="json"),
62
63
  "bases": container.base.sync(dry_run=False).model_dump(mode="json"),
64
+ "agent_hints": cls._inject_hints(),
63
65
  },
64
66
  "health": container.maintenance.check(summary=True).model_dump(mode="json"),
65
67
  }
66
68
 
69
+ @classmethod
70
+ def upgrade(cls) -> dict:
71
+ """对齐本机治理资源与当前包版本:Schema 迁移、Skill、Base 与提示词路标。"""
72
+ home = campfire_home()
73
+ upgrade_database(home / "campfire.db")
74
+ workspaces = []
75
+ for workspace_id in SqliteWorkspaceRepository(home).load_registry().workspaces:
76
+ container = cls.build(workspace_id)
77
+ workspaces.append(
78
+ {
79
+ "workspace_id": workspace_id,
80
+ "bases": container.base.sync(dry_run=False).model_dump(mode="json"),
81
+ }
82
+ )
83
+ return {
84
+ "status": "ok",
85
+ "database": {"status": "up-to-date"},
86
+ "skills": cls.build_skill().sync(dry_run=False).model_dump(mode="json"),
87
+ "agent_hints": cls._inject_hints(),
88
+ "workspaces": workspaces,
89
+ }
90
+
91
+ @staticmethod
92
+ def _inject_hints() -> list[dict[str, str]]:
93
+ return [
94
+ {"path": str(path), "action": inject_agent_hint(path)}
95
+ for path in default_hint_paths()
96
+ ]
97
+
67
98
  @classmethod
68
99
  def build_skill(cls) -> SkillService:
69
100
  """Build the global Skill service without requiring a registered Workspace."""
@@ -121,13 +121,63 @@ def tree(ctx: typer.Context) -> None:
121
121
 
122
122
  @app.command("setup")
123
123
  def setup(
124
- workspace: Path = typer.Option(..., "--workspace", help="要初始化的 Workspace 根目录"),
124
+ workspace: Path | None = typer.Option(
125
+ None, "--workspace", help="要初始化的 Workspace 根目录;缺省时输出接入引导"
126
+ ),
125
127
  make_default: bool = typer.Option(False, "--default", help="设为默认 Workspace"),
126
128
  ) -> None:
127
129
  """从 .campfire.yaml 配置本机,或为已注册 Workspace 创建首份 Manifest。"""
130
+ if workspace is None:
131
+ typer.echo(
132
+ json.dumps(
133
+ {
134
+ "status": "needs-input",
135
+ "message": "需要指定 Vault 根目录;按场景选择以下入口之一",
136
+ "paths": [
137
+ {
138
+ "scenario": "接入已有 Vault(目录已存在,含或不含 .campfire.yaml)",
139
+ "command": "campfire setup --workspace <vault路径> --default",
140
+ },
141
+ {
142
+ "scenario": "从零创建新 Workspace(初始化目录结构并注册)",
143
+ "command": (
144
+ "campfire workspace create --id <id> --path <路径> --default"
145
+ ),
146
+ },
147
+ {
148
+ "scenario": "暂不接入 Vault,仅安装全局资源(Skill 与提示词路标)",
149
+ "command": "campfire upgrade",
150
+ },
151
+ ],
152
+ },
153
+ ensure_ascii=False,
154
+ indent=2,
155
+ )
156
+ )
157
+ return
128
158
  try:
129
159
  result = AppContainer.setup(workspace, make_default)
130
160
  except AppError as exc:
131
161
  typer.echo(json.dumps({"status": "error", "message": str(exc)}, ensure_ascii=False))
132
162
  raise typer.Exit(exc.exit_code) from exc
133
163
  typer.echo(json.dumps(result, ensure_ascii=False, indent=2))
164
+
165
+
166
+ @app.command("upgrade")
167
+ def upgrade() -> None:
168
+ """升级本机治理资源:SQLite Schema 迁移、全局 Skill、Base 与提示词路标。"""
169
+ try:
170
+ result = AppContainer.upgrade()
171
+ except AppError as exc:
172
+ typer.echo(
173
+ json.dumps({"status": "error", "message": str(exc)}, ensure_ascii=False),
174
+ err=True,
175
+ )
176
+ raise typer.Exit(exc.exit_code) from exc
177
+ typer.echo(json.dumps(result, ensure_ascii=False, indent=2))
178
+
179
+
180
+ @app.command("update", hidden=True)
181
+ def update() -> None:
182
+ """campfire upgrade 的等价别名。"""
183
+ upgrade()
@@ -8,6 +8,12 @@ from campfire_cli.app.workspace.repository.workspace_repository import SqliteWor
8
8
  from campfire_cli.app.workspace.schema.workspace_schema import WorkspaceEntry, WorkspaceRegistry
9
9
 
10
10
 
11
+ @pytest.fixture(autouse=True)
12
+ def _isolate_agent_hints(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
13
+ """所有测试的提示词注入一律落在临时目录,绝不触碰用户真实全局文件。"""
14
+ monkeypatch.setenv("CAMPFIRE_AGENT_HINT_PATH", str(tmp_path / "agent-hints"))
15
+
16
+
11
17
  @pytest.fixture
12
18
  def workspace(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Path:
13
19
  campfire_home = tmp_path / "_campfire"
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
+ import os
4
5
  import subprocess
5
6
  from pathlib import Path
6
7
 
@@ -2097,3 +2098,63 @@ def test_project_resolve_does_not_match_by_shared_remote_alone(
2097
2098
  )
2098
2099
  assert within["status"] == "matched"
2099
2100
  assert within["matches"][0]["project"]["id"] == "registered-app"
2101
+
2102
+
2103
+ def test_setup_injects_agent_hints_idempotently(
2104
+ workspace: Path, monkeypatch
2105
+ ) -> None:
2106
+ claude_md = workspace / "CLAUDE.md"
2107
+ agents_md = workspace / "AGENTS.md"
2108
+ monkeypatch.setenv(
2109
+ "CAMPFIRE_AGENT_HINT_PATH", f"{claude_md}{os.pathsep}{agents_md}"
2110
+ )
2111
+ first = runner.invoke(app, ["setup", "--workspace", str(workspace)])
2112
+ assert first.exit_code == 0, first.output
2113
+ payload = json.loads(first.output)
2114
+ actions = payload["resources"]["agent_hints"]
2115
+ assert {item["action"] for item in actions} == {"created"}
2116
+ for item in [claude_md, agents_md]:
2117
+ assert "campfire:agent-hints:start" in item.read_text(encoding="utf-8")
2118
+
2119
+ second = runner.invoke(app, ["setup", "--workspace", str(workspace)])
2120
+ assert second.exit_code == 0, second.output
2121
+ assert {
2122
+ item["action"] for item in json.loads(second.output)["resources"]["agent_hints"]
2123
+ } == {"kept"}
2124
+
2125
+
2126
+ def test_upgrade_syncs_resources_and_accepts_update_alias(
2127
+ workspace: Path, monkeypatch
2128
+ ) -> None:
2129
+ claude_md = workspace / "CLAUDE.md"
2130
+ monkeypatch.setenv("CAMPFIRE_AGENT_HINT_PATH", str(claude_md))
2131
+ stale = workspace / "_global_skills" / "campfire-document-capture" / "SKILL.md"
2132
+ result = runner.invoke(app, ["upgrade"])
2133
+ assert result.exit_code == 0, result.output
2134
+ payload = json.loads(result.output)
2135
+ assert payload["status"] == "ok"
2136
+ assert payload["database"]["status"] == "up-to-date"
2137
+ assert payload["skills"]["status"] == "synced"
2138
+ assert payload["agent_hints"][0]["action"] == "created"
2139
+ assert [item["workspace_id"] for item in payload["workspaces"]] == ["test"]
2140
+ assert stale.is_file()
2141
+ stale.write_text("过时内容\n", encoding="utf-8")
2142
+
2143
+ alias = runner.invoke(app, ["update"])
2144
+ assert alias.exit_code == 0, alias.output
2145
+ aliased = json.loads(alias.output)
2146
+ assert aliased["skills"]["status"] == "synced"
2147
+ assert aliased["agent_hints"][0]["action"] == "kept"
2148
+ assert stale.read_text(encoding="utf-8") != "过时内容\n"
2149
+
2150
+
2151
+ def test_setup_without_workspace_prints_guidance(tmp_path: Path, monkeypatch) -> None:
2152
+ monkeypatch.setenv("CAMPFIRE_HOME", str(tmp_path / "home"))
2153
+ result = runner.invoke(app, ["setup"])
2154
+ assert result.exit_code == 0, result.output
2155
+ payload = json.loads(result.output)
2156
+ assert payload["status"] == "needs-input"
2157
+ commands = {item["command"] for item in payload["paths"]}
2158
+ assert "campfire setup --workspace <vault路径> --default" in commands
2159
+ assert any("workspace create" in command for command in commands)
2160
+ assert any("upgrade" in command for command in commands)
@@ -0,0 +1,39 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+
5
+ from campfire_cli.common.agent_hints import (
6
+ HINT_END,
7
+ HINT_START,
8
+ inject_agent_hint,
9
+ )
10
+
11
+
12
+ def test_inject_creates_then_keeps(tmp_path: Path) -> None:
13
+ target = tmp_path / "CLAUDE.md"
14
+ assert inject_agent_hint(target) == "created"
15
+ content = target.read_text(encoding="utf-8")
16
+ assert content.startswith(HINT_START)
17
+ assert content.endswith(HINT_END + "\n")
18
+ assert inject_agent_hint(target) == "kept"
19
+
20
+
21
+ def test_inject_appends_without_touching_existing_content(tmp_path: Path) -> None:
22
+ target = tmp_path / "CLAUDE.md"
23
+ original = "# 我的规范\n\n- 保持原样\n"
24
+ target.write_text(original, encoding="utf-8")
25
+ assert inject_agent_hint(target) == "appended"
26
+ content = target.read_text(encoding="utf-8")
27
+ assert content.startswith(original)
28
+ assert HINT_END in content
29
+
30
+
31
+ def test_inject_replaces_stale_block_only(tmp_path: Path) -> None:
32
+ target = tmp_path / "CLAUDE.md"
33
+ stale = f"# 头部\n\n{HINT_START}\n旧内容\n{HINT_END}\n# 尾部\n"
34
+ target.write_text(stale, encoding="utf-8")
35
+ assert inject_agent_hint(target) == "updated"
36
+ content = target.read_text(encoding="utf-8")
37
+ assert "旧内容" not in content
38
+ assert content.startswith("# 头部")
39
+ assert content.endswith("# 尾部\n")
@@ -36,7 +36,7 @@ wheels = [
36
36
 
37
37
  [[package]]
38
38
  name = "campfire-cli"
39
- version = "0.1.1"
39
+ version = "0.1.3"
40
40
  source = { editable = "." }
41
41
  dependencies = [
42
42
  { name = "alembic" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes