space-architect 7.1.0 → 9.0.0

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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +108 -0
  3. data/README.md +58 -246
  4. data/lib/space_architect/architect_project.rb +40 -180
  5. data/lib/space_architect/bug_report.rb +2 -1
  6. data/lib/space_architect/cli/architect.rb +69 -103
  7. data/lib/space_architect/cli/research.rb +1 -1
  8. data/lib/space_architect/cli.rb +9 -14
  9. data/lib/space_architect/harness.rb +97 -344
  10. data/lib/space_architect/pi/builder-guard.ts +103 -0
  11. data/lib/space_architect/research/mux.rb +47 -32
  12. data/lib/space_architect/research/pi_events.rb +70 -0
  13. data/lib/space_architect/research/renderer.rb +39 -39
  14. data/lib/space_architect/research/supervisor.rb +35 -14
  15. data/lib/space_architect/research.rb +1 -6
  16. data/lib/space_architect/session_sync/bin_path.rb +1 -1
  17. data/lib/space_architect/session_sync/cursor.rb +1 -1
  18. data/lib/space_architect/session_sync/plist.rb +1 -1
  19. data/lib/{space_core → space_architect}/version.rb +2 -2
  20. data/lib/space_architect.rb +1 -2
  21. data/skill/architect/SKILL.md +30 -25
  22. data/skill/architect/dispatch.md +137 -115
  23. data/skill/architect/research.md +14 -8
  24. data/skill/architect-research/SKILL.md +18 -11
  25. data/skill/architect-vocabulary/SKILL.md +3 -3
  26. metadata +20 -178
  27. data/exe/space +0 -13
  28. data/exe/src +0 -13
  29. data/lib/space_architect/cli/space.rb +0 -29
  30. data/lib/space_architect/cli/src.rb +0 -38
  31. data/lib/space_architect/dispatcher.rb +0 -25
  32. data/lib/space_core/atomic_write.rb +0 -21
  33. data/lib/space_core/cli/base_command.rb +0 -19
  34. data/lib/space_core/cli/build.rb +0 -27
  35. data/lib/space_core/cli/config.rb +0 -49
  36. data/lib/space_core/cli/current.rb +0 -16
  37. data/lib/space_core/cli/help.rb +0 -195
  38. data/lib/space_core/cli/helpers.rb +0 -115
  39. data/lib/space_core/cli/init.rb +0 -29
  40. data/lib/space_core/cli/list.rb +0 -24
  41. data/lib/space_core/cli/loop_status.rb +0 -47
  42. data/lib/space_core/cli/new.rb +0 -38
  43. data/lib/space_core/cli/pack.rb +0 -29
  44. data/lib/space_core/cli/path.rb +0 -16
  45. data/lib/space_core/cli/repeatable_options.rb +0 -84
  46. data/lib/space_core/cli/repo.rb +0 -76
  47. data/lib/space_core/cli/run.rb +0 -44
  48. data/lib/space_core/cli/shell.rb +0 -125
  49. data/lib/space_core/cli/show.rb +0 -21
  50. data/lib/space_core/cli/status.rb +0 -74
  51. data/lib/space_core/cli/use.rb +0 -17
  52. data/lib/space_core/cli.rb +0 -177
  53. data/lib/space_core/commands.rb +0 -51
  54. data/lib/space_core/config.rb +0 -152
  55. data/lib/space_core/errors.rb +0 -14
  56. data/lib/space_core/git_client.rb +0 -49
  57. data/lib/space_core/mise_client.rb +0 -37
  58. data/lib/space_core/oci_builder.rb +0 -56
  59. data/lib/space_core/oci_packer.rb +0 -103
  60. data/lib/space_core/oci_runner.rb +0 -89
  61. data/lib/space_core/paths.rb +0 -58
  62. data/lib/space_core/repo_reference.rb +0 -19
  63. data/lib/space_core/repo_resolver.rb +0 -167
  64. data/lib/space_core/shell_integration.rb +0 -438
  65. data/lib/space_core/slugger.rb +0 -16
  66. data/lib/space_core/space.rb +0 -174
  67. data/lib/space_core/space_store.rb +0 -319
  68. data/lib/space_core/state.rb +0 -86
  69. data/lib/space_core/templates/oci/dockerfile.erb +0 -73
  70. data/lib/space_core/templates/oci/dockerignore.erb +0 -17
  71. data/lib/space_core/templates/oci/entrypoint.sh.erb +0 -16
  72. data/lib/space_core/terminal.rb +0 -161
  73. data/lib/space_core/warnings.rb +0 -13
  74. data/lib/space_core/xdg.rb +0 -33
  75. data/lib/space_core.rb +0 -26
  76. data/lib/space_src/cli/clone.rb +0 -54
  77. data/lib/space_src/cli/config.rb +0 -65
  78. data/lib/space_src/cli/daemon.rb +0 -362
  79. data/lib/space_src/cli/options.rb +0 -21
  80. data/lib/space_src/cli/org.rb +0 -199
  81. data/lib/space_src/cli/repo.rb +0 -169
  82. data/lib/space_src/cli/shell.rb +0 -121
  83. data/lib/space_src/cli/status.rb +0 -75
  84. data/lib/space_src/cli/sync.rb +0 -161
  85. data/lib/space_src/cli.rb +0 -159
  86. data/lib/space_src/cloner.rb +0 -77
  87. data/lib/space_src/config/contract.rb +0 -54
  88. data/lib/space_src/config/duration.rb +0 -79
  89. data/lib/space_src/config/model.rb +0 -49
  90. data/lib/space_src/config/store.rb +0 -156
  91. data/lib/space_src/forge/client.rb +0 -31
  92. data/lib/space_src/forge/github.rb +0 -98
  93. data/lib/space_src/launchd/agent.rb +0 -195
  94. data/lib/space_src/launchd/plist.rb +0 -129
  95. data/lib/space_src/log_rotator.rb +0 -46
  96. data/lib/space_src/migration.rb +0 -43
  97. data/lib/space_src/nav.rb +0 -99
  98. data/lib/space_src/paths.rb +0 -72
  99. data/lib/space_src/scm/client.rb +0 -87
  100. data/lib/space_src/scm/git.rb +0 -232
  101. data/lib/space_src/scm/status.rb +0 -24
  102. data/lib/space_src/shell.rb +0 -90
  103. data/lib/space_src/shell_integration.rb +0 -321
  104. data/lib/space_src/state/lock.rb +0 -59
  105. data/lib/space_src/state/store.rb +0 -140
  106. data/lib/space_src/sync/engine.rb +0 -503
  107. data/lib/space_src/sync/repo_plan.rb +0 -215
  108. data/lib/space_src/sync/report.rb +0 -18
  109. data/lib/space_src/ui/interactive_reporter.rb +0 -280
  110. data/lib/space_src/ui/json_reporter.rb +0 -39
  111. data/lib/space_src/ui/mode.rb +0 -68
  112. data/lib/space_src/ui/plain_reporter.rb +0 -53
  113. data/lib/space_src/ui/reporter.rb +0 -48
  114. data/lib/space_src/version.rb +0 -7
  115. data/lib/space_src.rb +0 -38
@@ -34,7 +34,7 @@ the loop.
34
34
  judgment mode): arbitrates disagreements, writes and freezes iteration files,
35
35
  calls kill/continue, merges builder output. Never writes implementation code.
36
36
  - **builder** — the implementation role: a cheaper model run headless via
37
- `architect dispatch` (reference harness: `claude -p`), one per lane in its own
37
+ `architect dispatch` (reference harness: `pi -p`), one per lane in its own
38
38
  worktree. Reports
39
39
  raw evidence; never grades its own work; never edits `architecture/`.
40
40
 
@@ -131,8 +131,8 @@ Safe **read-only** commands to orient yourself (these don't run the loop):
131
131
 
132
132
  ```sh
133
133
  architect status # project state: iterations, freeze shas, lanes, verdicts
134
- architect space show # the space you're standing in
135
- architect space list # all your spaces
134
+ space show # the space you're standing in (space-cadet binary)
135
+ space list # all your spaces
136
136
  ```
137
137
 
138
138
  ## Maintenance
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: space-architect
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.0
4
+ version: 9.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Jacobs
@@ -10,47 +10,47 @@ cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: async
13
+ name: space-cadet
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '2.39'
18
+ version: '9.1'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '2.39'
25
+ version: '9.1'
26
26
  - !ruby/object:Gem::Dependency
27
- name: async-process
27
+ name: async-http
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: '1.4'
32
+ version: '0.95'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '1.4'
39
+ version: '0.95'
40
40
  - !ruby/object:Gem::Dependency
41
- name: async-http
41
+ name: async-process
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '0.95'
46
+ version: '1.4'
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0.95'
53
+ version: '1.4'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: protocol-http
56
56
  requirement: !ruby/object:Gem::Requirement
@@ -107,48 +107,6 @@ dependencies:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
109
  version: '1.10'
110
- - !ruby/object:Gem::Dependency
111
- name: dry-schema
112
- requirement: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '1.16'
117
- type: :runtime
118
- prerelease: false
119
- version_requirements: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: '1.16'
124
- - !ruby/object:Gem::Dependency
125
- name: dry-struct
126
- requirement: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: '1.8'
131
- type: :runtime
132
- prerelease: false
133
- version_requirements: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - "~>"
136
- - !ruby/object:Gem::Version
137
- version: '1.8'
138
- - !ruby/object:Gem::Dependency
139
- name: dry-types
140
- requirement: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - "~>"
143
- - !ruby/object:Gem::Version
144
- version: '1.9'
145
- type: :runtime
146
- prerelease: false
147
- version_requirements: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: '1.9'
152
110
  - !ruby/object:Gem::Dependency
153
111
  name: dry-validation
154
112
  requirement: !ruby/object:Gem::Requirement
@@ -163,34 +121,6 @@ dependencies:
163
121
  - - "~>"
164
122
  - !ruby/object:Gem::Version
165
123
  version: '1.11'
166
- - !ruby/object:Gem::Dependency
167
- name: xdg
168
- requirement: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - "~>"
171
- - !ruby/object:Gem::Version
172
- version: '10.2'
173
- type: :runtime
174
- prerelease: false
175
- version_requirements: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - "~>"
178
- - !ruby/object:Gem::Version
179
- version: '10.2'
180
- - !ruby/object:Gem::Dependency
181
- name: tty-cursor
182
- requirement: !ruby/object:Gem::Requirement
183
- requirements:
184
- - - "~>"
185
- - !ruby/object:Gem::Version
186
- version: '0.7'
187
- type: :runtime
188
- prerelease: false
189
- version_requirements: !ruby/object:Gem::Requirement
190
- requirements:
191
- - - "~>"
192
- - !ruby/object:Gem::Version
193
- version: '0.7'
194
124
  - !ruby/object:Gem::Dependency
195
125
  name: minitest
196
126
  requirement: !ruby/object:Gem::Requirement
@@ -233,16 +163,15 @@ dependencies:
233
163
  - - "~>"
234
164
  - !ruby/object:Gem::Version
235
165
  version: '13.0'
236
- description: 'A dry-cli CLI for spaces: date-prefixed directories with a YAML identity
237
- file, $PWD-based current-space resolution, and XDG config/state. Provisions repos
238
- at copy-on-write speed from evergreen checkouts, concurrently on fibers. Ships fish
239
- shell integration and completions.'
166
+ description: 'A dry-cli CLI for the Architect Loop: iterations, briefs, freezes, verdicts,
167
+ lane worktrees, and headless pi dispatch — the judgment loop that runs inside space-cadet''s
168
+ task-scoped workspaces. Depends on the space-cadet gem for the spaces substrate
169
+ (hard) and the repo-tender gem for the session-sync launchd agent (soft, install
170
+ at will).'
240
171
  email:
241
172
  - eric@ebj.dev
242
173
  executables:
243
174
  - architect
244
- - space
245
- - src
246
175
  extensions: []
247
176
  extra_rdoc_files: []
248
177
  files:
@@ -250,24 +179,21 @@ files:
250
179
  - LICENSE.txt
251
180
  - README.md
252
181
  - exe/architect
253
- - exe/space
254
- - exe/src
255
182
  - lib/space_architect.rb
256
183
  - lib/space_architect/architect_project.rb
257
184
  - lib/space_architect/bug_report.rb
258
185
  - lib/space_architect/cli.rb
259
186
  - lib/space_architect/cli/architect.rb
260
187
  - lib/space_architect/cli/research.rb
261
- - lib/space_architect/cli/space.rb
262
- - lib/space_architect/cli/src.rb
263
188
  - lib/space_architect/conversations_client.rb
264
- - lib/space_architect/dispatcher.rb
265
189
  - lib/space_architect/gate_evaluator.rb
266
190
  - lib/space_architect/gate_lint.rb
267
191
  - lib/space_architect/harness.rb
268
192
  - lib/space_architect/jobs_client.rb
193
+ - lib/space_architect/pi/builder-guard.ts
269
194
  - lib/space_architect/research.rb
270
195
  - lib/space_architect/research/mux.rb
196
+ - lib/space_architect/research/pi_events.rb
271
197
  - lib/space_architect/research/registry.rb
272
198
  - lib/space_architect/research/renderer.rb
273
199
  - lib/space_architect/research/run.rb
@@ -283,91 +209,7 @@ files:
283
209
  - lib/space_architect/templates/architect.md.erb
284
210
  - lib/space_architect/templates/brief.md.erb
285
211
  - lib/space_architect/templates/iteration.md.erb
286
- - lib/space_core.rb
287
- - lib/space_core/atomic_write.rb
288
- - lib/space_core/cli.rb
289
- - lib/space_core/cli/base_command.rb
290
- - lib/space_core/cli/build.rb
291
- - lib/space_core/cli/config.rb
292
- - lib/space_core/cli/current.rb
293
- - lib/space_core/cli/help.rb
294
- - lib/space_core/cli/helpers.rb
295
- - lib/space_core/cli/init.rb
296
- - lib/space_core/cli/list.rb
297
- - lib/space_core/cli/loop_status.rb
298
- - lib/space_core/cli/new.rb
299
- - lib/space_core/cli/pack.rb
300
- - lib/space_core/cli/path.rb
301
- - lib/space_core/cli/repeatable_options.rb
302
- - lib/space_core/cli/repo.rb
303
- - lib/space_core/cli/run.rb
304
- - lib/space_core/cli/shell.rb
305
- - lib/space_core/cli/show.rb
306
- - lib/space_core/cli/status.rb
307
- - lib/space_core/cli/use.rb
308
- - lib/space_core/commands.rb
309
- - lib/space_core/config.rb
310
- - lib/space_core/errors.rb
311
- - lib/space_core/git_client.rb
312
- - lib/space_core/mise_client.rb
313
- - lib/space_core/oci_builder.rb
314
- - lib/space_core/oci_packer.rb
315
- - lib/space_core/oci_runner.rb
316
- - lib/space_core/paths.rb
317
- - lib/space_core/repo_reference.rb
318
- - lib/space_core/repo_resolver.rb
319
- - lib/space_core/shell_integration.rb
320
- - lib/space_core/slugger.rb
321
- - lib/space_core/space.rb
322
- - lib/space_core/space_store.rb
323
- - lib/space_core/state.rb
324
- - lib/space_core/templates/oci/dockerfile.erb
325
- - lib/space_core/templates/oci/dockerignore.erb
326
- - lib/space_core/templates/oci/entrypoint.sh.erb
327
- - lib/space_core/terminal.rb
328
- - lib/space_core/version.rb
329
- - lib/space_core/warnings.rb
330
- - lib/space_core/xdg.rb
331
- - lib/space_src.rb
332
- - lib/space_src/cli.rb
333
- - lib/space_src/cli/clone.rb
334
- - lib/space_src/cli/config.rb
335
- - lib/space_src/cli/daemon.rb
336
- - lib/space_src/cli/options.rb
337
- - lib/space_src/cli/org.rb
338
- - lib/space_src/cli/repo.rb
339
- - lib/space_src/cli/shell.rb
340
- - lib/space_src/cli/status.rb
341
- - lib/space_src/cli/sync.rb
342
- - lib/space_src/cloner.rb
343
- - lib/space_src/config/contract.rb
344
- - lib/space_src/config/duration.rb
345
- - lib/space_src/config/model.rb
346
- - lib/space_src/config/store.rb
347
- - lib/space_src/forge/client.rb
348
- - lib/space_src/forge/github.rb
349
- - lib/space_src/launchd/agent.rb
350
- - lib/space_src/launchd/plist.rb
351
- - lib/space_src/log_rotator.rb
352
- - lib/space_src/migration.rb
353
- - lib/space_src/nav.rb
354
- - lib/space_src/paths.rb
355
- - lib/space_src/scm/client.rb
356
- - lib/space_src/scm/git.rb
357
- - lib/space_src/scm/status.rb
358
- - lib/space_src/shell.rb
359
- - lib/space_src/shell_integration.rb
360
- - lib/space_src/state/lock.rb
361
- - lib/space_src/state/store.rb
362
- - lib/space_src/sync/engine.rb
363
- - lib/space_src/sync/repo_plan.rb
364
- - lib/space_src/sync/report.rb
365
- - lib/space_src/ui/interactive_reporter.rb
366
- - lib/space_src/ui/json_reporter.rb
367
- - lib/space_src/ui/mode.rb
368
- - lib/space_src/ui/plain_reporter.rb
369
- - lib/space_src/ui/reporter.rb
370
- - lib/space_src/version.rb
212
+ - lib/space_architect/version.rb
371
213
  - skill/architect-research/SKILL.md
372
214
  - skill/architect-research/lanes.md
373
215
  - skill/architect-vocabulary/SKILL.md
@@ -396,6 +238,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
396
238
  requirements: []
397
239
  rubygems_version: 4.0.10
398
240
  specification_version: 4
399
- summary: Task-scoped project workspaces (repos · notes · artifacts under one self-describing
400
- root)
241
+ summary: The Architect Loop — structured judgment-and-build cycles for humans and
242
+ headless AI builders
401
243
  test_files: []
data/exe/space DELETED
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- source_gemfile = File.expand_path("../Gemfile", __dir__)
5
- if File.exist?(source_gemfile)
6
- ENV["BUNDLE_GEMFILE"] ||= source_gemfile
7
- require "bundler/setup"
8
- $LOAD_PATH.unshift(File.expand_path("../lib", __dir__))
9
- end
10
-
11
- require "space_core"
12
-
13
- Space::Core::CLI.run(ARGV, $stdout, $stderr)
data/exe/src DELETED
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- source_gemfile = File.expand_path("../Gemfile", __dir__)
5
- if File.exist?(source_gemfile)
6
- ENV["BUNDLE_GEMFILE"] ||= source_gemfile
7
- require "bundler/setup"
8
- $LOAD_PATH.unshift(File.expand_path("../lib", __dir__))
9
- end
10
-
11
- require "space_src"
12
-
13
- Space::Src::CLI.run(ARGV, $stdout, $stderr)
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "space_core/cli"
4
-
5
- module Space::Architect
6
- module CLI
7
- # Exit-code bridge to the Space::Core CLI engine.
8
- # `architect space <args>` (and `exe/space <args>` via Space::Core::CLI directly)
9
- # hands the raw remainder to Space::Core's own dry-cli registry and translates
10
- # Space::Core's recorded Outcome into the host exit code.
11
- # Space::Core has its own Registry, Outcome, and :space_core_cli_outcome thread-local;
12
- # this is the seam between the two registries (NOT a re-registration).
13
- def self.dispatch_space(rest, out = $stdout, err = $stderr)
14
- if ::Space::Core::CLI::TOP_LEVEL_HELP.include?(rest)
15
- out.puts Dry::CLI::Usage.call(::Space::Core::CLI::Registry.get([]))
16
- return 0
17
- end
18
-
19
- if ::Space::Core::CLI::VERSION_REQUEST.include?(rest)
20
- out.puts ::Space::Core::VERSION
21
- return 0
22
- end
23
-
24
- Thread.current[:space_core_cli_outcome] = nil
25
- Dry::CLI.new(::Space::Core::CLI::Registry).call(arguments: rest, out: out, err: err)
26
- ::Space::Core::CLI.last_outcome&.exit_code || 0
27
- end
28
- end
29
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "space_src/cli"
4
-
5
- module Space::Architect
6
- module CLI
7
- # Exit-code bridge to the Space::Src CLI engine.
8
- # `architect src <args>` hands the raw remainder to Space::Src's own dry-cli
9
- # registry and translates Space::Src's recorded Outcome into the host exit code.
10
- # Space::Src has its own Registry, Outcome, and :space_src_cli_* thread-locals;
11
- # this is the seam between the two registries (NOT a re-registration). Space::Src's
12
- # top-level help/version interceptors call Kernel.exit, so we reproduce that
13
- # interception here against the injected IO instead of delegating to them.
14
- # dry-cli's internal exit on a bare group / unknown command propagates as
15
- # SystemExit — same as the host's own bare groups (e.g. `space repo`) — and is
16
- # intentionally NOT rescued (accepted behavior change).
17
- def self.dispatch_src(rest, out = $stdout, err = $stderr)
18
- if ::Space::Src::CLI::TOP_LEVEL_HELP.include?(rest)
19
- out.puts Dry::CLI::Usage.call(::Space::Src::CLI::Registry.get([]))
20
- return 0
21
- end
22
- if ::Space::Src::CLI::VERSION_REQUEST.include?(rest)
23
- out.puts ::Space::Src::VERSION
24
- return 0
25
- end
26
-
27
- if ::Space::Src::CLI.bare_query?(rest)
28
- paths = ::Space::Src::CLI.make_paths
29
- config = ::Space::Src::Config::Store.load(paths.config_file).success
30
- return ::Space::Src::Nav.dispatch(rest[0], out, err, config.base_dir)
31
- end
32
-
33
- Thread.current[:space_src_cli_outcome] = nil
34
- Dry::CLI.new(::Space::Src::CLI::Registry).call(arguments: rest, out: out, err: err)
35
- ::Space::Src::CLI.last_outcome&.exit_code || 0
36
- end
37
- end
38
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "harness"
4
-
5
- module Space::Architect
6
- # Thin backward-compat wrapper around Harness::ClaudeCodeHarness.
7
- # Existing callers that construct Dispatcher.new(...).run(...) continue to work byte-for-byte.
8
- class Dispatcher
9
- # Keep constants here so any code referencing Dispatcher::ALLOWED_TOOLS still works.
10
- ALLOWED_TOOLS = Harness::ClaudeCodeHarness::ALLOWED_TOOLS
11
- DISALLOWED_TOOLS = Harness::ClaudeCodeHarness::DISALLOWED_TOOLS
12
-
13
- def initialize(model: "claude-sonnet-4-6", max_turns: 200, claude_bin: nil)
14
- @harness = Harness::ClaudeCodeHarness.new(model: model, max_turns: max_turns, bin: claude_bin)
15
- end
16
-
17
- def run(prompt_path:, run_log_path:, chdir:)
18
- @harness.run(prompt_path: prompt_path, run_log_path: run_log_path, chdir: chdir)
19
- end
20
-
21
- def run_detached(prompt_path:, run_log_path:, chdir:)
22
- @harness.run_detached(prompt_path: prompt_path, run_log_path: run_log_path, chdir: chdir)
23
- end
24
- end
25
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "fileutils"
4
-
5
- module Space::Core
6
- module AtomicWrite
7
- module_function
8
-
9
- def write(path, content)
10
- path = path.to_s
11
- dir = File.dirname(path)
12
- FileUtils.mkdir_p(dir)
13
- tmp_path = File.join(dir, ".#{File.basename(path)}.#{Process.pid}.tmp")
14
-
15
- File.write(tmp_path, content)
16
- File.rename(tmp_path, path)
17
- ensure
18
- FileUtils.rm_f(tmp_path) if defined?(tmp_path) && tmp_path && File.exist?(tmp_path)
19
- end
20
- end
21
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "dry/cli"
4
-
5
- module Space::Core::CLI
6
- # Base for every space/architect command. dry-cli (>= 0.7.0) copies a
7
- # superclass's options to its subclasses, so the global colour options are
8
- # declared once here and inherited everywhere instead of being mixed in per
9
- # command. Helpers (terminal/store/render) ride along by inheritance too.
10
- #
11
- # The `src` binary has its own output-mode system (--plain/--json) and does
12
- # NOT inherit from this base.
13
- class BaseCommand < Dry::CLI::Command
14
- include Helpers
15
-
16
- option :color, type: :string, default: "auto", desc: "Color output: auto, always, never"
17
- option :colors, type: :string, desc: "Alias for --color"
18
- end
19
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../oci_packer"
4
- require_relative "../oci_builder"
5
-
6
- module Space::Core::CLI
7
- class Build < BaseCommand
8
- desc "Build (and tag) the OCI image for the current space"
9
-
10
- def call(**opts)
11
- setup_terminal(**opts.slice(:color, :colors))
12
- handle_errors do
13
- result = store.current.bind do |space|
14
- out_dir = space.path.join("build", "oci")
15
- Space::Core::OciPacker.new(space: space, output_dir: out_dir).generate.bind do
16
- Space::Core::OciBuilder.new(space: space, output_dir: out_dir).command
17
- end
18
- end
19
- render(result) do |argv|
20
- terminal.say "Building: #{argv.join(' ')}"
21
- out.flush
22
- Kernel.exec(*argv)
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Space::Core::CLI
4
- module Config
5
- class Show < BaseCommand
6
- desc "Show current config"
7
-
8
- def call(**opts)
9
- setup_terminal(**opts.slice(:color, :colors))
10
- handle_errors do
11
- rows = Space::Core::Config::EDITABLE_KEYS.map do |key|
12
- value = project_config.data[key]
13
- [key, value.nil? ? "" : value.to_s]
14
- end
15
- terminal.say terminal.table(%w[Key Value], rows)
16
- CLI.record_outcome(Outcome.new(exit_code: 0))
17
- end
18
- end
19
- end
20
-
21
- class ConfigPath < BaseCommand
22
- desc "Print the config file path"
23
-
24
- def call(**opts)
25
- setup_terminal(**opts.slice(:color, :colors))
26
- handle_errors do
27
- terminal.say terminal.path(project_config.path)
28
- CLI.record_outcome(Outcome.new(exit_code: 0))
29
- end
30
- end
31
- end
32
-
33
- class Set < BaseCommand
34
- desc "Set a config key"
35
- argument :key, required: true, desc: "Config key"
36
- argument :value, required: true, desc: "Config value"
37
-
38
- def call(key:, value:, **opts)
39
- setup_terminal(**opts.slice(:color, :colors))
40
- handle_errors do
41
- project_config.set(key, value)
42
- stored = project_config.data[key]
43
- terminal.success "Set #{key}=#{stored.nil? ? '' : stored.to_s}"
44
- CLI.record_outcome(Outcome.new(exit_code: 0))
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Space::Core::CLI
4
- class Current < BaseCommand
5
- desc "Show the current space"
6
-
7
- def call(**opts)
8
- setup_terminal(**opts.slice(:color, :colors))
9
- render(store.find) do |space|
10
- terminal.say space.id.to_s
11
- terminal.say terminal.path(space.path)
12
- CLI.record_outcome(Outcome.new(exit_code: 0))
13
- end
14
- end
15
- end
16
- end