campfire-cli 0.1.5__tar.gz → 0.1.6__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 (187) hide show
  1. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/PKG-INFO +1 -1
  2. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/pyproject.toml +1 -1
  3. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/__init__.py +1 -1
  4. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/cli/document_cli.py +2 -1
  5. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/cli/profile_cli.py +2 -1
  6. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/cli/type_cli.py +2 -1
  7. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/cli/config_cli.py +2 -1
  8. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/cli/domain_cli.py +2 -1
  9. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/cli/project_cli.py +2 -1
  10. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/cli/space_cli.py +2 -1
  11. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/cli/workspace_cli.py +2 -1
  12. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/project_service.py +26 -6
  13. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/workspace_service.py +2 -1
  14. campfire_cli-0.1.6/src/campfire_cli/common/filesystem/cwd.py +21 -0
  15. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/container.py +2 -1
  16. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/defaults/config.yml +1 -0
  17. campfire_cli-0.1.6/src/campfire_cli/resources/skills/campfire-task-management/SKILL.md +90 -0
  18. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/perf/test_resolve_subprocess_count.py +3 -4
  19. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/uv.lock +1 -1
  20. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/.github/workflows/ci.yml +0 -0
  21. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/.github/workflows/release.yml +0 -0
  22. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/.gitignore +0 -0
  23. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/AGENTS.md +0 -0
  24. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/ARCHITECTURE.md +0 -0
  25. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/COMMAND.md +0 -0
  26. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/DECISIONS.md +0 -0
  27. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/LICENSE +0 -0
  28. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/README.md +0 -0
  29. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/SPEC.md +0 -0
  30. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/alembic/SPEC.md +0 -0
  31. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/alembic/env.py +0 -0
  32. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/alembic/script.py.mako +0 -0
  33. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/alembic/versions/001_initial_schema.py +0 -0
  34. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/alembic.ini +0 -0
  35. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/scripts/SPEC.md +0 -0
  36. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/__init__.py +0 -0
  37. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/env.py +0 -0
  38. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/script.py.mako +0 -0
  39. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/versions/001_initial_schema.py +0 -0
  40. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/versions/002_workspace_project_registry.py +0 -0
  41. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/versions/003_unified_workspace_state.py +0 -0
  42. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/versions/004_restructure_workspace_domain.py +0 -0
  43. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/versions/005_decision_channel.py +0 -0
  44. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/versions/006_workspace_topology_index.py +0 -0
  45. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/versions/007_workspace_adoption.py +0 -0
  46. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/alembic/versions/__init__.py +0 -0
  47. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/SPEC.md +0 -0
  48. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/__init__.py +0 -0
  49. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/base/SPEC.md +0 -0
  50. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/base/__init__.py +0 -0
  51. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/base/cli/base_cli.py +0 -0
  52. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/base/repository/base_repository.py +0 -0
  53. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/base/schema/base_schema.py +0 -0
  54. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/base/service/base_service.py +0 -0
  55. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/decision/SPEC.md +0 -0
  56. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/decision/__init__.py +0 -0
  57. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/decision/cli/decision_cli.py +0 -0
  58. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/decision/repository/decision_repository.py +0 -0
  59. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/decision/schema/decision_schema.py +0 -0
  60. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/decision/service/decision_projection_service.py +0 -0
  61. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/decision/service/decision_service.py +0 -0
  62. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/SPEC.md +0 -0
  63. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/__init__.py +0 -0
  64. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/cli/__init__.py +0 -0
  65. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/repository/__init__.py +0 -0
  66. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/repository/document_profile_repository.py +0 -0
  67. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/repository/document_type_repository.py +0 -0
  68. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/__init__.py +0 -0
  69. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/document_profile_service.py +0 -0
  70. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/document_rule_service.py +0 -0
  71. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/document_scanner.py +0 -0
  72. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/document_service.py +0 -0
  73. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/document_type_service.py +0 -0
  74. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/frontmatter_apply.py +0 -0
  75. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/frontmatter_formatter.py +0 -0
  76. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/frontmatter_plan.py +0 -0
  77. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/kanban_service.py +0 -0
  78. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/profile_registry.py +0 -0
  79. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/type_apply.py +0 -0
  80. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/document/service/type_plan.py +0 -0
  81. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/SPEC.md +0 -0
  82. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/__init__.py +0 -0
  83. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/cli/maintenance_cli.py +0 -0
  84. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/repository/maintenance_repository.py +0 -0
  85. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/schema/maintenance_schema.py +0 -0
  86. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/service/archive_service.py +0 -0
  87. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/service/link_service.py +0 -0
  88. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/service/maintenance_protocol.py +0 -0
  89. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/service/maintenance_service.py +0 -0
  90. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/service/moc_service.py +0 -0
  91. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/maintenance/service/plan_service.py +0 -0
  92. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/skill/SPEC.md +0 -0
  93. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/skill/__init__.py +0 -0
  94. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/skill/cli/skill_cli.py +0 -0
  95. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/skill/repository/skill_repository.py +0 -0
  96. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/skill/schema/skill_schema.py +0 -0
  97. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/skill/service/skill_service.py +0 -0
  98. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/SPEC.md +0 -0
  99. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/__init__.py +0 -0
  100. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/cli/__init__.py +0 -0
  101. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/cli/adoption_cli.py +0 -0
  102. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/cli/restructure_cli.py +0 -0
  103. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/repository/__init__.py +0 -0
  104. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/repository/adoption_repository.py +0 -0
  105. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/repository/manifest_repository.py +0 -0
  106. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/repository/restructure_repository.py +0 -0
  107. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/repository/workspace_repository.py +0 -0
  108. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/schema/__init__.py +0 -0
  109. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/schema/adoption_schema.py +0 -0
  110. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/schema/restructure_schema.py +0 -0
  111. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/schema/workspace_schema.py +0 -0
  112. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/__init__.py +0 -0
  113. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/adoption_protocol.py +0 -0
  114. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/adoption_service.py +0 -0
  115. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/config_service.py +0 -0
  116. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/domain_restructure_service.py +0 -0
  117. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/restructure_protocol.py +0 -0
  118. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/restructure_service.py +0 -0
  119. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/restructure_verifier.py +0 -0
  120. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/structure_service.py +0 -0
  121. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/app/workspace/service/workspace_protocol.py +0 -0
  122. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/SPEC.md +0 -0
  123. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/__init__.py +0 -0
  124. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/agent_hints.py +0 -0
  125. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/database/__init__.py +0 -0
  126. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/database/migrations.py +0 -0
  127. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/database/models.py +0 -0
  128. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/database/session.py +0 -0
  129. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/documents/__init__.py +0 -0
  130. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/documents/document_types.py +0 -0
  131. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/documents/frontmatter_schema.py +0 -0
  132. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/documents/markdown.py +0 -0
  133. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/exceptions/__init__.py +0 -0
  134. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/exceptions/base.py +0 -0
  135. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/filesystem/__init__.py +0 -0
  136. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/filesystem/atomic.py +0 -0
  137. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/filesystem/locking.py +0 -0
  138. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/governance/__init__.py +0 -0
  139. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/governance/issues.py +0 -0
  140. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/governance/locking.py +0 -0
  141. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/governance/snapshots.py +0 -0
  142. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/hashing.py +0 -0
  143. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/package_version.py +0 -0
  144. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/reports/__init__.py +0 -0
  145. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/reports/json_report.py +0 -0
  146. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/common/reports/markdown_report.py +0 -0
  147. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/config/SPEC.md +0 -0
  148. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/config/defaults.py +0 -0
  149. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/config/settings.py +0 -0
  150. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/main.py +0 -0
  151. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/__init__.py +0 -0
  152. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/bases/Agent/346/211/247/350/241/214/345/267/245/344/275/234/345/217/260.base" +0 -0
  153. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/bases/SPEC.md +0 -0
  154. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/bases//344/273/273/345/212/241/345/267/245/344/275/234/345/217/260.base" +0 -0
  155. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/bases//345/206/263/347/255/226/345/267/245/344/275/234/345/217/260.base" +0 -0
  156. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/bases//345/276/205/345/275/222/346/241/243/346/226/207/346/241/243.base" +0 -0
  157. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/bases//351/241/271/347/233/256/346/226/207/346/241/243.base" +0 -0
  158. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/defaults/__init__.py +0 -0
  159. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/SPEC.md +0 -0
  160. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-context-bootstrap/SKILL.md +0 -0
  161. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-context-bootstrap/agents/openai.yaml +0 -0
  162. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-conversation-router/SKILL.md +0 -0
  163. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-conversation-router/agents/openai.yaml +0 -0
  164. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-conversation-router/references/inbox-handoff.md +0 -0
  165. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-conversation-router/references/learning-intake.md +0 -0
  166. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-conversation-router/references/task-intake.md +0 -0
  167. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-document-capture/SKILL.md +0 -0
  168. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-inbox-triage/SKILL.md +0 -0
  169. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-kanban-board/SKILL.md +0 -0
  170. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/SKILL.md +0 -0
  171. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-weekly-report-writing/agents/openai.yaml +0 -0
  172. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-workspace-adoption/SKILL.md +0 -0
  173. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-workspace-maintenance/SKILL.md +0 -0
  174. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/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
  175. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/src/campfire_cli/resources/skills/campfire-workspace-restructure/SKILL.md +0 -0
  176. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/SPEC.md +0 -0
  177. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/conftest.py +0 -0
  178. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/integration/test_cli.py +0 -0
  179. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/perf/test_read_counts.py +0 -0
  180. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/unit/test_agent_hints.py +0 -0
  181. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/unit/test_atomic_write.py +0 -0
  182. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/unit/test_common_governance.py +0 -0
  183. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/unit/test_config.py +0 -0
  184. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/unit/test_frontmatter.py +0 -0
  185. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/unit/test_kanban_service.py +0 -0
  186. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/tests/unit/test_package_version.py +0 -0
  187. {campfire_cli-0.1.5 → campfire_cli-0.1.6}/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.5
3
+ Version: 0.1.6
4
4
  Summary: Local-first shared context and governance CLI for humans and agents
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "campfire-cli"
3
- version = "0.1.5"
3
+ version = "0.1.6"
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.5"
3
+ __version__ = "0.1.6"
@@ -13,6 +13,7 @@ from campfire_cli.app.document.service.document_service import DocumentService
13
13
  from campfire_cli.app.workspace.repository.workspace_repository import SqliteWorkspaceRepository
14
14
  from campfire_cli.app.workspace.service.workspace_service import WorkspaceService
15
15
  from campfire_cli.common.exceptions import AppError
16
+ from campfire_cli.common.filesystem.cwd import safe_cwd
16
17
  from campfire_cli.config.settings import WorkspaceSettings, campfire_home
17
18
 
18
19
  document_cli = typer.Typer(
@@ -27,7 +28,7 @@ def service(ctx: typer.Context) -> DocumentService:
27
28
  selector = ctx.find_root().params.get("workspace")
28
29
  root = campfire_home()
29
30
  resolution = WorkspaceService(root, SqliteWorkspaceRepository(root)).resolve(
30
- selector, Path.cwd()
31
+ selector, safe_cwd()
31
32
  )
32
33
  settings = WorkspaceSettings.load(resolution.workspace_id, Path(resolution.workspace))
33
34
  return DocumentService(settings)
@@ -16,6 +16,7 @@ from campfire_cli.app.document.service.document_profile_service import (
16
16
  from campfire_cli.app.workspace.repository.workspace_repository import SqliteWorkspaceRepository
17
17
  from campfire_cli.app.workspace.service.workspace_service import WorkspaceService
18
18
  from campfire_cli.common.exceptions import AppError
19
+ from campfire_cli.common.filesystem.cwd import safe_cwd
19
20
  from campfire_cli.config.settings import WorkspaceSettings, campfire_home
20
21
 
21
22
  profile_cli = typer.Typer(
@@ -28,7 +29,7 @@ def service(ctx: typer.Context) -> DocumentProfileService:
28
29
  selector = ctx.find_root().params.get("workspace")
29
30
  root = campfire_home()
30
31
  resolution = WorkspaceService(root, SqliteWorkspaceRepository(root)).resolve(
31
- selector, Path.cwd()
32
+ selector, safe_cwd()
32
33
  )
33
34
  settings = WorkspaceSettings.load(resolution.workspace_id, Path(resolution.workspace))
34
35
  return DocumentProfileService(
@@ -14,6 +14,7 @@ from campfire_cli.app.document.service.document_type_service import DocumentType
14
14
  from campfire_cli.app.workspace.repository.workspace_repository import SqliteWorkspaceRepository
15
15
  from campfire_cli.app.workspace.service.workspace_service import WorkspaceService
16
16
  from campfire_cli.common.exceptions import AppError
17
+ from campfire_cli.common.filesystem.cwd import safe_cwd
17
18
  from campfire_cli.config.settings import WorkspaceSettings, campfire_home
18
19
 
19
20
  type_cli = typer.Typer(
@@ -26,7 +27,7 @@ def service(ctx: typer.Context) -> DocumentTypeService:
26
27
  selector = ctx.find_root().params.get("workspace")
27
28
  root = campfire_home()
28
29
  resolution = WorkspaceService(root, SqliteWorkspaceRepository(root)).resolve(
29
- selector, Path.cwd()
30
+ selector, safe_cwd()
30
31
  )
31
32
  settings = WorkspaceSettings.load(resolution.workspace_id, Path(resolution.workspace))
32
33
  return DocumentTypeService(
@@ -8,6 +8,7 @@ from campfire_cli.app.workspace.cli.workspace_cli import emit, invoke
8
8
  from campfire_cli.app.workspace.repository.workspace_repository import SqliteWorkspaceRepository
9
9
  from campfire_cli.app.workspace.service.config_service import WorkspaceConfigService
10
10
  from campfire_cli.app.workspace.service.workspace_service import WorkspaceService
11
+ from campfire_cli.common.filesystem.cwd import safe_cwd
11
12
  from campfire_cli.config.settings import WorkspaceSettings, campfire_home
12
13
 
13
14
  config_cli = typer.Typer(
@@ -19,7 +20,7 @@ config_cli = typer.Typer(
19
20
  def service(workspace: str | None) -> WorkspaceConfigService:
20
21
  home = campfire_home()
21
22
  resolved = WorkspaceService(home, SqliteWorkspaceRepository(home)).resolve(
22
- workspace, Path.cwd()
23
+ workspace, safe_cwd()
23
24
  )
24
25
  settings = WorkspaceSettings.load(resolved.workspace_id, Path(resolved.workspace))
25
26
  return WorkspaceConfigService(settings)
@@ -8,6 +8,7 @@ from campfire_cli.app.workspace.cli.workspace_cli import emit, invoke
8
8
  from campfire_cli.app.workspace.repository.workspace_repository import SqliteWorkspaceRepository
9
9
  from campfire_cli.app.workspace.service.structure_service import DomainService
10
10
  from campfire_cli.app.workspace.service.workspace_service import WorkspaceService
11
+ from campfire_cli.common.filesystem.cwd import safe_cwd
11
12
  from campfire_cli.config.settings import campfire_home
12
13
 
13
14
  domain_cli = typer.Typer(
@@ -18,7 +19,7 @@ domain_cli = typer.Typer(
18
19
  def service(workspace: str | None) -> DomainService:
19
20
  home = campfire_home()
20
21
  resolved = WorkspaceService(home, SqliteWorkspaceRepository(home)).resolve(
21
- workspace, Path.cwd()
22
+ workspace, safe_cwd()
22
23
  )
23
24
  return DomainService(Path(resolved.workspace), home)
24
25
 
@@ -8,6 +8,7 @@ from campfire_cli.app.workspace.cli.workspace_cli import emit, invoke
8
8
  from campfire_cli.app.workspace.repository.workspace_repository import SqliteWorkspaceRepository
9
9
  from campfire_cli.app.workspace.schema.workspace_schema import ProjectUpsertRequest
10
10
  from campfire_cli.app.workspace.service.project_service import ProjectService
11
+ from campfire_cli.common.filesystem.cwd import safe_cwd
11
12
  from campfire_cli.config.settings import campfire_home
12
13
 
13
14
  project_cli = typer.Typer(
@@ -117,7 +118,7 @@ def show(project_id: str) -> None:
117
118
  @project_cli.command("resolve")
118
119
  def resolve(path: Path | None = typer.Option(None, "--path")) -> None:
119
120
  """按本地路径和 Git remote 解析已注册 Project,不修改注册数据。"""
120
- emit(invoke(lambda: service().resolve(path or Path.cwd())))
121
+ emit(invoke(lambda: service().resolve(path or safe_cwd())))
121
122
 
122
123
 
123
124
  @project_cli.command("check")
@@ -8,6 +8,7 @@ from campfire_cli.app.workspace.cli.workspace_cli import emit, invoke
8
8
  from campfire_cli.app.workspace.repository.workspace_repository import SqliteWorkspaceRepository
9
9
  from campfire_cli.app.workspace.service.structure_service import SpaceService
10
10
  from campfire_cli.app.workspace.service.workspace_service import WorkspaceService
11
+ from campfire_cli.common.filesystem.cwd import safe_cwd
11
12
  from campfire_cli.config.settings import campfire_home
12
13
 
13
14
  space_cli = typer.Typer(
@@ -18,7 +19,7 @@ space_cli = typer.Typer(
18
19
  def service(workspace: str | None) -> SpaceService:
19
20
  home = campfire_home()
20
21
  resolved = WorkspaceService(home, SqliteWorkspaceRepository(home)).resolve(
21
- workspace, Path.cwd()
22
+ workspace, safe_cwd()
22
23
  )
23
24
  return SpaceService(Path(resolved.workspace), home)
24
25
 
@@ -11,6 +11,7 @@ from campfire_cli.app.workspace.repository.workspace_repository import SqliteWor
11
11
  from campfire_cli.app.workspace.schema.workspace_schema import WorkspaceCreateRequest
12
12
  from campfire_cli.app.workspace.service.workspace_service import WorkspaceService
13
13
  from campfire_cli.common.exceptions import AppError
14
+ from campfire_cli.common.filesystem.cwd import safe_cwd
14
15
  from campfire_cli.config.settings import campfire_home
15
16
 
16
17
  workspace_cli = typer.Typer(
@@ -97,7 +98,7 @@ def show(workspace_id: str) -> None:
97
98
  @workspace_cli.command("resolve")
98
99
  def resolve(selector: str | None = typer.Option(None, "--workspace")) -> None:
99
100
  """按显式选择、当前目录或默认值解析 Workspace。"""
100
- emit(invoke(lambda: service().resolve(selector, Path.cwd())))
101
+ emit(invoke(lambda: service().resolve(selector, safe_cwd())))
101
102
 
102
103
 
103
104
  @workspace_cli.command("set-default")
@@ -115,6 +115,31 @@ class ProjectService:
115
115
 
116
116
  def resolve(self, path: Path) -> ProjectResolutionResult:
117
117
  query = path.expanduser().resolve()
118
+ # 先做零成本的 local_path 匹配;有命中时注册信息足以应答,跳过 git 子进程
119
+ # (每次会话冷启动必经路径,两个 git 探测只为富化字段,属纯延迟开销)。
120
+ # 无 local_path 命中才跑 git 探测走 remote 兜底;此时 git_root/git_remote_url
121
+ # 输出实测值,local 命中路径输出 None 与注册 remote。
122
+ local_matches: list[ProjectMatch] = []
123
+ for project in self._repository.list_projects():
124
+ if not project.local_path:
125
+ continue
126
+ registered = Path(project.local_path).expanduser().resolve()
127
+ if query == registered or registered in query.parents:
128
+ local_matches.append(ProjectMatch(project=project, match_basis=["local-path"]))
129
+ if local_matches:
130
+ deepest = max(len(Path(item.project.local_path or "/").parts) for item in local_matches)
131
+ local_matches = [
132
+ item
133
+ for item in local_matches
134
+ if len(Path(item.project.local_path or "/").parts) == deepest
135
+ ]
136
+ return ProjectResolutionResult(
137
+ status="matched" if len(local_matches) == 1 else "ambiguous",
138
+ query_path=str(query),
139
+ git_root=None,
140
+ git_remote_url=local_matches[0].project.git_remote_url,
141
+ matches=local_matches,
142
+ )
118
143
  git_root_value = self._git_command(query, "rev-parse", "--show-toplevel")
119
144
  git_root = Path(git_root_value).resolve() if git_root_value else None
120
145
  remote = self._git_command(git_root or query, "remote", "get-url", "origin")
@@ -122,10 +147,6 @@ class ProjectService:
122
147
  matches: list[ProjectMatch] = []
123
148
  for project in self._repository.list_projects():
124
149
  basis: list[str] = []
125
- if project.local_path:
126
- registered = Path(project.local_path).expanduser().resolve()
127
- if query == registered or registered in query.parents:
128
- basis.append("local-path")
129
150
  if (
130
151
  normalized_remote
131
152
  and project.git_remote_url
@@ -134,8 +155,7 @@ class ProjectService:
134
155
  basis.append("git-remote")
135
156
  if basis:
136
157
  matches.append(ProjectMatch(project=project, match_basis=basis))
137
- local_matches = [item for item in matches if "local-path" in item.match_basis]
138
- remote_only = [item for item in matches if "local-path" not in item.match_basis]
158
+ remote_only = matches
139
159
  if local_matches:
140
160
  deepest = max(len(Path(item.project.local_path or "/").parts) for item in local_matches)
141
161
  local_matches = [
@@ -26,6 +26,7 @@ from campfire_cli.app.workspace.service.structure_service import SpaceService
26
26
  from campfire_cli.app.workspace.service.workspace_protocol import WorkspaceRepositoryProtocol
27
27
  from campfire_cli.common.exceptions import ConfigurationError
28
28
  from campfire_cli.common.filesystem import atomic_write, workspace_write_lock
29
+ from campfire_cli.common.filesystem.cwd import safe_cwd
29
30
  from campfire_cli.config.defaults import config_section
30
31
 
31
32
 
@@ -248,7 +249,7 @@ class WorkspaceService:
248
249
  raise ConfigurationError(
249
250
  f"Workspace 未注册:{selector};请先运行 campfire workspace add"
250
251
  )
251
- current = (cwd or Path.cwd()).resolve()
252
+ current = (cwd or safe_cwd()).resolve()
252
253
  matches = [
253
254
  (workspace_id, Path(entry.path).expanduser().resolve())
254
255
  for workspace_id, entry in registry.workspaces.items()
@@ -0,0 +1,21 @@
1
+ """cwd 探测的统一出口。
2
+
3
+ 进程工作目录可能已被删除(目录改名/移走后残留的 shell),os.getcwd() 此时抛
4
+ OSError。所有以 cwd 作为解析起点的入口统一走 safe_cwd:探测失败回落 HOME,
5
+ 调用方拿到的语义是"尽力而为的上下文锚点"而非进程崩溃。
6
+ """
7
+
8
+ import sys
9
+ from pathlib import Path
10
+
11
+
12
+ def safe_cwd() -> Path:
13
+ """返回当前工作目录;目录已不存在时回落用户 HOME 并告警。"""
14
+ try:
15
+ return Path.cwd()
16
+ except OSError:
17
+ print(
18
+ '{"warning": "当前工作目录已不存在,已回落 HOME 解析"}',
19
+ file=sys.stderr,
20
+ )
21
+ return Path.home()
@@ -32,6 +32,7 @@ from campfire_cli.app.workspace.service.workspace_service import WorkspaceServic
32
32
  from campfire_cli.common.agent_hints import default_hint_paths, inject_agent_hint
33
33
  from campfire_cli.common.database import create_sqlite_engine, open_session, upgrade_database
34
34
  from campfire_cli.common.exceptions import ConfigurationError
35
+ from campfire_cli.common.filesystem.cwd import safe_cwd
35
36
  from campfire_cli.common.package_version import (
36
37
  default_align_command,
37
38
  detect_install_method,
@@ -213,7 +214,7 @@ class AppContainer:
213
214
  governance_root = campfire_home()
214
215
  resolution = WorkspaceService(
215
216
  governance_root, SqliteWorkspaceRepository(governance_root)
216
- ).resolve(str(workspace) if workspace is not None else None, Path.cwd())
217
+ ).resolve(str(workspace) if workspace is not None else None, safe_cwd())
217
218
  settings = WorkspaceSettings.load(resolution.workspace_id, Path(resolution.workspace))
218
219
  database_path = governance_root / "campfire.db"
219
220
  upgrade_database(database_path)
@@ -444,6 +444,7 @@ skills:
444
444
  - campfire-inbox-triage
445
445
  - campfire-weekly-report-writing
446
446
  - campfire-kanban-board
447
+ - campfire-task-management
447
448
  unknown_skill_policy: ignore
448
449
  orphaned_skill_policy: report
449
450
  bases:
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: campfire-task-management
3
+ description: "创建、更新和完成 Campfire 任务文档;适用于用户要求为某项目或个人新建/更新/完成任务时定位归属、按 Profile 契约写入并验证,不负责执行任务、改代码或 Agent Session 调度。"
4
+ ---
5
+
6
+ # Campfire 任务管理
7
+
8
+ 统一任务文档(`任务-` 前缀)的创建、状态更新与完成闭环。任务分两类:有项目任务(关联已注册 Project)与无项目任务(个人待办、跨项目事务)。两类任务都不得虚构归属:`project` 字段只在能唯一解析到已注册 Project 时填写。
9
+
10
+ 通用写入门禁(授权、对象唯一、事实核验)遵循 `campfire-document-capture`;本 Skill 是任务类型的专项 SOP,不复制通用纪律。首次读写 Campfire 文档的 Session 先运行 `campfire-context-bootstrap` 解析 Workspace 与 Project。
11
+
12
+ ## 状态机
13
+
14
+ ```text
15
+ 用户表达任务意图
16
+ │
17
+ ▼
18
+ project list 关键词匹配
19
+ │
20
+ ┌────┴────┐
21
+ 唯一命中 多候选/无候选
22
+ │ │
23
+ ▼ ▼
24
+ 有项目任务 能澄清则问用户,
25
+ │ 不凭相似度猜测
26
+ │ │
27
+ │ 用户明确无项目?
28
+ │ │ │
29
+ │ 是 否(取消或继续澄清)
30
+ │ │
31
+ ▼ ▼
32
+ 项目文档中心 全局任务领域
33
+ └────┬────┘
34
+ ▼
35
+ document inspect 取契约 → 写入 → check → sync → 回报路径
36
+ ```
37
+
38
+ ## 工作流
39
+
40
+ ### 1. 归属定位
41
+
42
+ 1. 从用户表述提取项目关键词(项目名、简称、仓库名、路径片段)。
43
+ 2. 运行 `campfire workspace project list`,在 id、name、git_remote_url、local_path、document_domain 中做子串匹配。
44
+ 3. 唯一命中即定位该项目及其 `document_domain`;多候选或无候选时向用户列出候选并询问,不凭名称相似度猜测。
45
+ 4. 用户明确表示任务不关联项目(个人待办、跨项目事务)时归入无项目任务。
46
+
47
+ ### 2. 无项目任务归属
48
+
49
+ - 无项目任务统一落 `mywork/【工作日志】文档中心/任务/`(个人事务域;该子目录不存在时随首次任务创建,并遵循 `campfire-workspace-maintenance` 的领域检查)。
50
+ - frontmatter 的 `project` 字段留空,`domain` 填实际所在领域;不虚构项目归属,不把跨项目事务挂到某一个项目下。
51
+
52
+ ### 3. 契约获取与写入
53
+
54
+ 1. 文件名使用 `任务-<一句话标题>.md` 前缀,类型契约以 `campfire document type list` 为准。
55
+ 2. 运行 `campfire document inspect --path <同领域最近一篇任务文档>` 获取该领域 task 类型的 Profile 字段与顺序;同领域无先例时在目标路径上以 inspect 反查领域默认 Profile。不硬编码字段清单。
56
+ 3. 按 field_order 拼 frontmatter 并写入正文骨架。字段规则:
57
+
58
+ | 字段 | 规则 |
59
+ |------|------|
60
+ | task_id | 同领域既有任务递增编号;无先例时从 1 起 |
61
+ | status | 新建 `todo`,进行中 `doing`,完成 `done`,取消 `cancelled`;以 Profile 实际枚举为准 |
62
+ | lifecycle | 新建 `proposed`,进行中 `current`,完成/取消后 `completed` |
63
+ | priority | 默认 `medium`;用户明示紧急/低优时用 `high`/`low` |
64
+ | requires_human | 任务含部署、发布、对外沟通等 Agent 不可独立完成的关键步骤时为 `true` |
65
+ | project | 仅在唯一解析到已注册 Project 时填写;无项目任务留空 |
66
+
67
+ 4. 有项目任务落各自文档中心的任务子目录(已有 `任务/` 惯例的项目沿用;无先例时在文档中心根下创建并沿用同规则)。
68
+
69
+ ### 4. 状态流转
70
+
71
+ - 更新任务:只改 status、lifecycle、completed、result_summary 等状态字段与正文进展记录,不重写既有事实。
72
+ - 完成任务:status → `done`、lifecycle → `completed`、补 result_summary 与 completed 日期;正文追加结论与证据来源。
73
+ - 取消任务:status → `cancelled`,正文注明取消原因;不删除文档。
74
+ - 用户口头报进度时主动提议同步对应任务文档;一次汇报合并提议,不逐条打断。
75
+
76
+ ### 5. 验证闭环
77
+
78
+ ```bash
79
+ campfire --workspace personal document check --path "mywork/【某项目】文档中心/任务/任务-....md"
80
+ campfire --workspace personal maintenance sync --scope "mywork/【某项目】文档中心"
81
+ ```
82
+
83
+ 写入或更新后必须执行 check 与 sync,向用户回报写入路径、创建或更新结果与未决字段;check 不通过不得声称完成。
84
+
85
+ ## 边界
86
+
87
+ - 不负责执行任务本身、不修改代码、不分派或恢复 Agent Session。
88
+ - 任务的讨论与方案沉淀遵循 `campfire-document-capture`,结构治理遵循 `campfire-workspace-maintenance`。
89
+ - 看板类任务清单(`看板-` 前缀)的改造遵循 `campfire-kanban-board`,本 Skill 只处理单篇任务文档。
90
+ - 不确定归属、字段枚举与 Profile 冲突时询问用户或走 Decision,不静默落盘。
@@ -10,7 +10,7 @@ import pytest
10
10
  def test_project_resolve_git_subprocesses_do_not_scale_with_registry(
11
11
  workspace: Path, monkeypatch: pytest.MonkeyPatch, tmp_path_factory: pytest.TempPathFactory
12
12
  ) -> None:
13
- """resolve 的 git 子进程数固定为至多 2 次,不随注册项目数增长。"""
13
+ """resolve 的 git 子进程数:命中注册 local_path 时为 0,未命中走 remote 兜底时至多 2 次。"""
14
14
  from typer.testing import CliRunner
15
15
 
16
16
  from campfire_cli.main import app
@@ -60,8 +60,7 @@ def test_project_resolve_git_subprocesses_do_not_scale_with_registry(
60
60
  app, ["workspace", "project", "resolve", "--path", str(project_dir)]
61
61
  )
62
62
  assert matched.exit_code == 0, matched.output
63
- bounded = len(calls)
64
- assert bounded <= 2, calls
63
+ assert len(calls) == 0, calls
65
64
 
66
65
  unregistered = tmp_path_factory.mktemp("unregistered")
67
66
  calls.clear()
@@ -69,4 +68,4 @@ def test_project_resolve_git_subprocesses_do_not_scale_with_registry(
69
68
  app, ["workspace", "project", "resolve", "--path", str(unregistered)]
70
69
  )
71
70
  assert unmatched.exit_code == 0, unmatched.output
72
- assert len(calls) == bounded, calls
71
+ assert len(calls) <= 2, calls
@@ -36,7 +36,7 @@ wheels = [
36
36
 
37
37
  [[package]]
38
38
  name = "campfire-cli"
39
- version = "0.1.4"
39
+ version = "0.1.6"
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
File without changes