space-architect 1.3.0 → 2.0.0.rc1

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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +103 -0
  3. data/README.md +248 -155
  4. data/exe/architect +1 -1
  5. data/exe/space +2 -2
  6. data/exe/src +13 -0
  7. data/lib/space_architect/architect_mission.rb +84 -53
  8. data/lib/space_architect/cli/architect.rb +92 -132
  9. data/lib/space_architect/cli/research.rb +94 -0
  10. data/lib/space_architect/cli/space.rb +25 -31
  11. data/lib/space_architect/cli/src.rb +20 -14
  12. data/lib/space_architect/cli.rb +22 -22
  13. data/lib/space_architect/dispatcher.rb +5 -1
  14. data/lib/space_architect/harness.rb +123 -16
  15. data/lib/space_architect/research/mux.rb +127 -0
  16. data/lib/space_architect/research/registry.rb +70 -0
  17. data/lib/space_architect/research/renderer.rb +101 -0
  18. data/lib/space_architect/research/run.rb +7 -0
  19. data/lib/space_architect/research/supervisor.rb +108 -0
  20. data/lib/space_architect/research.rb +13 -0
  21. data/lib/space_architect/run_creator.rb +53 -0
  22. data/lib/space_architect/skill_installer.rb +81 -79
  23. data/lib/space_architect.rb +5 -20
  24. data/lib/{space_architect → space_core}/atomic_write.rb +1 -1
  25. data/lib/space_core/cli/base_command.rb +19 -0
  26. data/lib/space_core/cli/config.rb +49 -0
  27. data/lib/space_core/cli/current.rb +16 -0
  28. data/lib/space_core/cli/help.rb +110 -0
  29. data/lib/space_core/cli/helpers.rb +115 -0
  30. data/lib/space_core/cli/init.rb +29 -0
  31. data/lib/space_core/cli/list.rb +24 -0
  32. data/lib/space_core/cli/new.rb +38 -0
  33. data/lib/space_core/cli/path.rb +16 -0
  34. data/lib/space_core/cli/repeatable_options.rb +75 -0
  35. data/lib/space_core/cli/repo.rb +76 -0
  36. data/lib/space_core/cli/shell.rb +125 -0
  37. data/lib/space_core/cli/show.rb +21 -0
  38. data/lib/space_core/cli/status.rb +33 -0
  39. data/lib/space_core/cli/use.rb +17 -0
  40. data/lib/space_core/cli.rb +171 -0
  41. data/lib/{space_architect → space_core}/config.rb +1 -1
  42. data/lib/{space_architect → space_core}/errors.rb +1 -1
  43. data/lib/{space_architect → space_core}/git_client.rb +1 -1
  44. data/lib/{space_architect → space_core}/mise_client.rb +1 -1
  45. data/lib/{space_architect → space_core}/repo_reference.rb +1 -1
  46. data/lib/{space_architect → space_core}/repo_resolver.rb +1 -1
  47. data/lib/{space_architect → space_core}/shell_integration.rb +1 -1
  48. data/lib/{space_architect → space_core}/slugger.rb +1 -1
  49. data/lib/{space_architect → space_core}/space.rb +1 -1
  50. data/lib/{space_architect → space_core}/space_store.rb +12 -12
  51. data/lib/{space_architect → space_core}/state.rb +1 -1
  52. data/lib/{space_architect → space_core}/terminal.rb +1 -1
  53. data/lib/space_core/version.rb +7 -0
  54. data/lib/{space_architect → space_core}/warnings.rb +1 -1
  55. data/lib/{space_architect → space_core}/xdg.rb +1 -1
  56. data/lib/space_core.rb +24 -0
  57. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/clone.rb +5 -5
  58. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/config.rb +7 -7
  59. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/daemon.rb +46 -30
  60. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/options.rb +1 -1
  61. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/org.rb +9 -9
  62. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/repo.rb +9 -9
  63. data/lib/space_src/cli/shell.rb +122 -0
  64. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/status.rb +7 -7
  65. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/sync.rb +17 -17
  66. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli.rb +42 -11
  67. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cloner.rb +3 -3
  68. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/contract.rb +1 -1
  69. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/duration.rb +1 -1
  70. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/model.rb +1 -1
  71. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/store.rb +5 -5
  72. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/forge/client.rb +2 -2
  73. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/forge/github.rb +4 -4
  74. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/launchd/agent.rb +5 -5
  75. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/launchd/plist.rb +3 -3
  76. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/log_rotator.rb +1 -1
  77. data/lib/space_src/migration.rb +43 -0
  78. data/lib/space_src/nav.rb +98 -0
  79. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/paths.rb +2 -2
  80. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/scm/client.rb +1 -1
  81. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/scm/git.rb +4 -4
  82. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/scm/status.rb +1 -1
  83. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/shell.rb +1 -1
  84. data/lib/space_src/shell_integration.rb +321 -0
  85. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/state/lock.rb +1 -1
  86. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/state/store.rb +2 -2
  87. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/sync/engine.rb +12 -12
  88. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/sync/repo_plan.rb +3 -3
  89. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/interactive_reporter.rb +1 -1
  90. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/json_reporter.rb +1 -1
  91. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/mode.rb +1 -1
  92. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/plain_reporter.rb +1 -1
  93. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/reporter.rb +1 -1
  94. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/version.rb +2 -2
  95. data/lib/space_src.rb +37 -0
  96. data/skill/architect/SKILL.md +2 -2
  97. data/skill/architect/research.md +46 -37
  98. metadata +115 -67
  99. data/lib/space_architect/cli/config.rb +0 -61
  100. data/lib/space_architect/cli/current.rb +0 -22
  101. data/lib/space_architect/cli/helpers.rb +0 -117
  102. data/lib/space_architect/cli/init.rb +0 -35
  103. data/lib/space_architect/cli/list.rb +0 -30
  104. data/lib/space_architect/cli/new.rb +0 -43
  105. data/lib/space_architect/cli/options.rb +0 -12
  106. data/lib/space_architect/cli/path.rb +0 -22
  107. data/lib/space_architect/cli/repo.rb +0 -88
  108. data/lib/space_architect/cli/shell.rb +0 -137
  109. data/lib/space_architect/cli/show.rb +0 -27
  110. data/lib/space_architect/cli/status.rb +0 -39
  111. data/lib/space_architect/cli/use.rb +0 -23
  112. data/lib/space_architect/version.rb +0 -5
  113. data/vendor/repo-tender/lib/space_architect/pristine.rb +0 -44
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: 1.3.0
4
+ version: 2.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Jacobs
@@ -37,6 +37,34 @@ dependencies:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: '1.4'
40
+ - !ruby/object:Gem::Dependency
41
+ name: async-http
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.95'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.95'
54
+ - !ruby/object:Gem::Dependency
55
+ name: protocol-http
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.62'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.62'
40
68
  - !ruby/object:Gem::Dependency
41
69
  name: pastel
42
70
  requirement: !ruby/object:Gem::Requirement
@@ -193,107 +221,127 @@ dependencies:
193
221
  version: '13.0'
194
222
  description: 'A dry-cli CLI for spaces: date-prefixed directories with a YAML identity
195
223
  file, $PWD-based current-space resolution, and XDG config/state. Provisions repos
196
- at copy-on-write speed from evergreen checkouts (pairs with repo-tender), concurrently
197
- on fibers. Ships fish shell integration and completions.'
224
+ at copy-on-write speed from evergreen checkouts, concurrently on fibers. Ships fish
225
+ shell integration and completions.'
198
226
  email:
199
227
  - eric@ebj.dev
200
228
  executables:
201
229
  - architect
202
230
  - space
231
+ - src
203
232
  extensions: []
204
233
  extra_rdoc_files: []
205
234
  files:
235
+ - CHANGELOG.md
206
236
  - LICENSE.txt
207
237
  - README.md
208
238
  - exe/architect
209
239
  - exe/space
240
+ - exe/src
210
241
  - lib/space_architect.rb
211
242
  - lib/space_architect/architect_mission.rb
212
- - lib/space_architect/atomic_write.rb
213
243
  - lib/space_architect/cli.rb
214
244
  - lib/space_architect/cli/architect.rb
215
- - lib/space_architect/cli/config.rb
216
- - lib/space_architect/cli/current.rb
217
- - lib/space_architect/cli/helpers.rb
218
- - lib/space_architect/cli/init.rb
219
- - lib/space_architect/cli/list.rb
220
- - lib/space_architect/cli/new.rb
221
- - lib/space_architect/cli/options.rb
222
- - lib/space_architect/cli/path.rb
223
- - lib/space_architect/cli/repo.rb
224
- - lib/space_architect/cli/shell.rb
225
- - lib/space_architect/cli/show.rb
245
+ - lib/space_architect/cli/research.rb
226
246
  - lib/space_architect/cli/space.rb
227
247
  - lib/space_architect/cli/src.rb
228
- - lib/space_architect/cli/status.rb
229
- - lib/space_architect/cli/use.rb
230
- - lib/space_architect/config.rb
231
248
  - lib/space_architect/dispatcher.rb
232
- - lib/space_architect/errors.rb
233
- - lib/space_architect/git_client.rb
234
249
  - lib/space_architect/harness.rb
235
- - lib/space_architect/mise_client.rb
236
- - lib/space_architect/repo_reference.rb
237
- - lib/space_architect/repo_resolver.rb
238
- - lib/space_architect/shell_integration.rb
250
+ - lib/space_architect/research.rb
251
+ - lib/space_architect/research/mux.rb
252
+ - lib/space_architect/research/registry.rb
253
+ - lib/space_architect/research/renderer.rb
254
+ - lib/space_architect/research/run.rb
255
+ - lib/space_architect/research/supervisor.rb
256
+ - lib/space_architect/run_creator.rb
239
257
  - lib/space_architect/skill_installer.rb
240
- - lib/space_architect/slugger.rb
241
- - lib/space_architect/space.rb
242
- - lib/space_architect/space_store.rb
243
- - lib/space_architect/state.rb
244
258
  - lib/space_architect/templates/architect.md.erb
245
259
  - lib/space_architect/templates/brief.md.erb
246
260
  - lib/space_architect/templates/iteration.md.erb
247
- - lib/space_architect/terminal.rb
248
- - lib/space_architect/version.rb
249
- - lib/space_architect/warnings.rb
250
- - lib/space_architect/xdg.rb
261
+ - lib/space_core.rb
262
+ - lib/space_core/atomic_write.rb
263
+ - lib/space_core/cli.rb
264
+ - lib/space_core/cli/base_command.rb
265
+ - lib/space_core/cli/config.rb
266
+ - lib/space_core/cli/current.rb
267
+ - lib/space_core/cli/help.rb
268
+ - lib/space_core/cli/helpers.rb
269
+ - lib/space_core/cli/init.rb
270
+ - lib/space_core/cli/list.rb
271
+ - lib/space_core/cli/new.rb
272
+ - lib/space_core/cli/path.rb
273
+ - lib/space_core/cli/repeatable_options.rb
274
+ - lib/space_core/cli/repo.rb
275
+ - lib/space_core/cli/shell.rb
276
+ - lib/space_core/cli/show.rb
277
+ - lib/space_core/cli/status.rb
278
+ - lib/space_core/cli/use.rb
279
+ - lib/space_core/config.rb
280
+ - lib/space_core/errors.rb
281
+ - lib/space_core/git_client.rb
282
+ - lib/space_core/mise_client.rb
283
+ - lib/space_core/repo_reference.rb
284
+ - lib/space_core/repo_resolver.rb
285
+ - lib/space_core/shell_integration.rb
286
+ - lib/space_core/slugger.rb
287
+ - lib/space_core/space.rb
288
+ - lib/space_core/space_store.rb
289
+ - lib/space_core/state.rb
290
+ - lib/space_core/terminal.rb
291
+ - lib/space_core/version.rb
292
+ - lib/space_core/warnings.rb
293
+ - lib/space_core/xdg.rb
294
+ - lib/space_src.rb
295
+ - lib/space_src/cli.rb
296
+ - lib/space_src/cli/clone.rb
297
+ - lib/space_src/cli/config.rb
298
+ - lib/space_src/cli/daemon.rb
299
+ - lib/space_src/cli/options.rb
300
+ - lib/space_src/cli/org.rb
301
+ - lib/space_src/cli/repo.rb
302
+ - lib/space_src/cli/shell.rb
303
+ - lib/space_src/cli/status.rb
304
+ - lib/space_src/cli/sync.rb
305
+ - lib/space_src/cloner.rb
306
+ - lib/space_src/config/contract.rb
307
+ - lib/space_src/config/duration.rb
308
+ - lib/space_src/config/model.rb
309
+ - lib/space_src/config/store.rb
310
+ - lib/space_src/forge/client.rb
311
+ - lib/space_src/forge/github.rb
312
+ - lib/space_src/launchd/agent.rb
313
+ - lib/space_src/launchd/plist.rb
314
+ - lib/space_src/log_rotator.rb
315
+ - lib/space_src/migration.rb
316
+ - lib/space_src/nav.rb
317
+ - lib/space_src/paths.rb
318
+ - lib/space_src/scm/client.rb
319
+ - lib/space_src/scm/git.rb
320
+ - lib/space_src/scm/status.rb
321
+ - lib/space_src/shell.rb
322
+ - lib/space_src/shell_integration.rb
323
+ - lib/space_src/state/lock.rb
324
+ - lib/space_src/state/store.rb
325
+ - lib/space_src/sync/engine.rb
326
+ - lib/space_src/sync/repo_plan.rb
327
+ - lib/space_src/ui/interactive_reporter.rb
328
+ - lib/space_src/ui/json_reporter.rb
329
+ - lib/space_src/ui/mode.rb
330
+ - lib/space_src/ui/plain_reporter.rb
331
+ - lib/space_src/ui/reporter.rb
332
+ - lib/space_src/version.rb
251
333
  - skill/architect-research/SKILL.md
252
334
  - skill/architect-research/lanes.md
253
335
  - skill/architect-vocabulary/SKILL.md
254
336
  - skill/architect/SKILL.md
255
337
  - skill/architect/dispatch.md
256
338
  - skill/architect/research.md
257
- - vendor/repo-tender/lib/space_architect/pristine.rb
258
- - vendor/repo-tender/lib/space_architect/pristine/cli.rb
259
- - vendor/repo-tender/lib/space_architect/pristine/cli/clone.rb
260
- - vendor/repo-tender/lib/space_architect/pristine/cli/config.rb
261
- - vendor/repo-tender/lib/space_architect/pristine/cli/daemon.rb
262
- - vendor/repo-tender/lib/space_architect/pristine/cli/options.rb
263
- - vendor/repo-tender/lib/space_architect/pristine/cli/org.rb
264
- - vendor/repo-tender/lib/space_architect/pristine/cli/repo.rb
265
- - vendor/repo-tender/lib/space_architect/pristine/cli/status.rb
266
- - vendor/repo-tender/lib/space_architect/pristine/cli/sync.rb
267
- - vendor/repo-tender/lib/space_architect/pristine/cloner.rb
268
- - vendor/repo-tender/lib/space_architect/pristine/config/contract.rb
269
- - vendor/repo-tender/lib/space_architect/pristine/config/duration.rb
270
- - vendor/repo-tender/lib/space_architect/pristine/config/model.rb
271
- - vendor/repo-tender/lib/space_architect/pristine/config/store.rb
272
- - vendor/repo-tender/lib/space_architect/pristine/forge/client.rb
273
- - vendor/repo-tender/lib/space_architect/pristine/forge/github.rb
274
- - vendor/repo-tender/lib/space_architect/pristine/launchd/agent.rb
275
- - vendor/repo-tender/lib/space_architect/pristine/launchd/plist.rb
276
- - vendor/repo-tender/lib/space_architect/pristine/log_rotator.rb
277
- - vendor/repo-tender/lib/space_architect/pristine/paths.rb
278
- - vendor/repo-tender/lib/space_architect/pristine/scm/client.rb
279
- - vendor/repo-tender/lib/space_architect/pristine/scm/git.rb
280
- - vendor/repo-tender/lib/space_architect/pristine/scm/status.rb
281
- - vendor/repo-tender/lib/space_architect/pristine/shell.rb
282
- - vendor/repo-tender/lib/space_architect/pristine/state/lock.rb
283
- - vendor/repo-tender/lib/space_architect/pristine/state/store.rb
284
- - vendor/repo-tender/lib/space_architect/pristine/sync/engine.rb
285
- - vendor/repo-tender/lib/space_architect/pristine/sync/repo_plan.rb
286
- - vendor/repo-tender/lib/space_architect/pristine/ui/interactive_reporter.rb
287
- - vendor/repo-tender/lib/space_architect/pristine/ui/json_reporter.rb
288
- - vendor/repo-tender/lib/space_architect/pristine/ui/mode.rb
289
- - vendor/repo-tender/lib/space_architect/pristine/ui/plain_reporter.rb
290
- - vendor/repo-tender/lib/space_architect/pristine/ui/reporter.rb
291
- - vendor/repo-tender/lib/space_architect/pristine/version.rb
292
339
  homepage: https://github.com/jetpks/space-architect
293
340
  licenses:
294
341
  - MIT
295
342
  metadata:
296
343
  homepage_uri: https://github.com/jetpks/space-architect
344
+ changelog_uri: https://github.com/jetpks/space-architect/blob/main/CHANGELOG.md
297
345
  rdoc_options: []
298
346
  require_paths:
299
347
  - lib
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- module Config
6
- class Show < Dry::CLI::Command
7
- include GlobalOptions
8
- include Helpers
9
-
10
- desc "Show current config"
11
-
12
- def call(**opts)
13
- setup_terminal(**opts.slice(:color, :colors))
14
- handle_errors do
15
- rows = SpaceArchitect::Config::EDITABLE_KEYS.map do |key|
16
- value = project_config.data[key]
17
- [key, value.nil? ? "" : value.to_s]
18
- end
19
- terminal.say terminal.table(%w[Key Value], rows)
20
- CLI.record_outcome(Outcome.new(exit_code: 0))
21
- end
22
- end
23
- end
24
-
25
- class ConfigPath < Dry::CLI::Command
26
- include GlobalOptions
27
- include Helpers
28
-
29
- desc "Print the config file path"
30
-
31
- def call(**opts)
32
- setup_terminal(**opts.slice(:color, :colors))
33
- handle_errors do
34
- terminal.say terminal.path(project_config.path)
35
- CLI.record_outcome(Outcome.new(exit_code: 0))
36
- end
37
- end
38
- end
39
-
40
- class Set < Dry::CLI::Command
41
- include GlobalOptions
42
- include Helpers
43
-
44
- desc "Set a config key"
45
- argument :key, required: true, desc: "Config key"
46
- argument :value, required: true, desc: "Config value"
47
-
48
- def call(key:, value:, **opts)
49
- setup_terminal(**opts.slice(:color, :colors))
50
- handle_errors do
51
- project_config.set(key, value)
52
- stored = project_config.data[key]
53
- terminal.success "Set #{key}=#{stored.nil? ? '' : stored.to_s}"
54
- CLI.record_outcome(Outcome.new(exit_code: 0))
55
- end
56
- end
57
- end
58
- end
59
- end
60
- end
61
-
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- class Current < Dry::CLI::Command
6
- include GlobalOptions
7
- include Helpers
8
-
9
- desc "Show the current space"
10
-
11
- def call(**opts)
12
- setup_terminal(**opts.slice(:color, :colors))
13
- render(store.find) do |space|
14
- terminal.say space.id.to_s
15
- terminal.say terminal.path(space.path)
16
- CLI.record_outcome(Outcome.new(exit_code: 0))
17
- end
18
- end
19
- end
20
- end
21
- end
22
-
@@ -1,117 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "dry/monads"
4
-
5
- module SpaceArchitect
6
- module CLI
7
- module Helpers
8
- include Dry::Monads[:result]
9
- def project_config
10
- @project_config ||= SpaceArchitect::Config.load
11
- end
12
-
13
- def state
14
- @state ||= SpaceArchitect::State.load
15
- end
16
-
17
- def store
18
- @store ||= SpaceArchitect::SpaceStore.new(config: project_config, state: state)
19
- end
20
-
21
- def terminal
22
- @terminal
23
- end
24
-
25
- def setup_terminal(color: "auto", colors: nil)
26
- @terminal = Terminal.new(
27
- config: project_config,
28
- stdout: out,
29
- stderr: err,
30
- color_mode: colors || color || "auto"
31
- )
32
- end
33
-
34
- def display_date(space)
35
- id_date = space.id.match(/\A(\d{4})(\d{2})(\d{2})/)
36
- return "#{id_date[1]}-#{id_date[2]}-#{id_date[3]}" if id_date
37
-
38
- space.data["created_at"].to_s[0, 10]
39
- end
40
-
41
- def handle_errors
42
- yield
43
- rescue SpaceArchitect::Error => e
44
- if terminal
45
- terminal.error(e.message)
46
- else
47
- err.puts e.message
48
- end
49
- CLI.record_outcome(Outcome.new(exit_code: 1, message: e.message))
50
- end
51
-
52
- def render(result)
53
- case result
54
- when Dry::Monads::Result::Success
55
- yield result.value! if block_given?
56
- when Dry::Monads::Result::Failure
57
- error = result.failure
58
- message = error.respond_to?(:message) ? error.message : error.to_s
59
- terminal ? terminal.error(message) : err.puts(message)
60
- CLI.record_outcome(Outcome.new(exit_code: 1, message: message))
61
- end
62
- end
63
- end
64
-
65
- class RepoProgress
66
- def initialize(total)
67
- @total = total
68
- @statuses = {}
69
- end
70
-
71
- def start(addition)
72
- source = addition[:src_source]
73
- @statuses[addition.fetch(:reference).full_name] = source&.directory? ? :copying : :cloning
74
- end
75
-
76
- def trust(addition)
77
- @statuses[addition.fetch(:reference).full_name] = :trusting
78
- end
79
-
80
- def finish(addition)
81
- @statuses[addition.fetch(:reference).full_name] = :done
82
- end
83
-
84
- def fail(addition)
85
- @statuses[addition.fetch(:reference).full_name] = :failed
86
- end
87
-
88
- def message
89
- done = @statuses.count { |_repo, status| status == :done }
90
- failed = @statuses.count { |_repo, status| status == :failed }
91
- copying = @statuses.select { |_repo, status| status == :copying }.keys
92
- cloning = @statuses.select { |_repo, status| status == :cloning }.keys
93
- trusting = @statuses.select { |_repo, status| status == :trusting }.keys
94
-
95
- if @total == 1
96
- copying_repo = copying.first
97
- cloning_repo = cloning.first
98
- trusting_repo = trusting.first
99
- return "Copying #{copying_repo}" if copying_repo
100
- return "Cloning #{cloning_repo}" if cloning_repo
101
- return "Trusting #{trusting_repo}" if trusting_repo
102
- return "Fetch failed" if failed.positive?
103
-
104
- "Preparing repos"
105
- else
106
- active = []
107
- active << "copying #{copying.join(', ')}" unless copying.empty?
108
- active << "cloning #{cloning.join(', ')}" unless cloning.empty?
109
- active << "trusting #{trusting.join(', ')}" unless trusting.empty?
110
- suffix = active.empty? ? nil : ": #{active.join('; ')}"
111
- failed_text = failed.positive? ? ", #{failed} failed" : ""
112
- "Fetching repos #{done}/#{@total}#{failed_text}#{suffix}"
113
- end
114
- end
115
- end
116
- end
117
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- class Init < Dry::CLI::Command
6
- include GlobalOptions
7
- include Helpers
8
-
9
- desc "Create default XDG config and state files"
10
- option :force, type: :boolean, default: false, desc: "Overwrite existing config and state files"
11
-
12
- def call(force: false, **opts)
13
- setup_terminal(**opts.slice(:color, :colors))
14
- handle_errors do
15
- if force
16
- @project_config = SpaceArchitect::Config.new
17
- @state = SpaceArchitect::State.new
18
- project_config.save
19
- state.save
20
- else
21
- project_config.ensure_exists!
22
- state.ensure_exists!
23
- end
24
-
25
- FileUtils.mkdir_p(project_config.spaces_dir)
26
- terminal.success "Config: #{terminal.path(project_config.path)}"
27
- terminal.success "State: #{terminal.path(state.path)}"
28
- terminal.success "Spaces: #{terminal.path(project_config.spaces_dir)}"
29
- CLI.record_outcome(Outcome.new(exit_code: 0))
30
- end
31
- end
32
- end
33
- end
34
- end
35
-
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- class List < Dry::CLI::Command
6
- include GlobalOptions
7
- include Helpers
8
-
9
- desc "List spaces"
10
-
11
- def call(**opts)
12
- setup_terminal(**opts.slice(:color, :colors))
13
- handle_errors do
14
- spaces = store.list
15
- if spaces.empty?
16
- terminal.say "No spaces found in #{terminal.path(project_config.spaces_dir)}"
17
- next
18
- end
19
-
20
- rows = spaces.map do |space|
21
- [space.status, display_date(space), space.title, terminal.path(space.path)]
22
- end
23
- terminal.say terminal.table(%w[Status Date Title Path], rows)
24
- CLI.record_outcome(Outcome.new(exit_code: 0))
25
- end
26
- end
27
- end
28
- end
29
- end
30
-
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- class New < Dry::CLI::Command
6
- include GlobalOptions
7
- include Helpers
8
-
9
- desc "Create a new project space"
10
- argument :title, required: true, desc: "Space title"
11
- argument :repos, type: :array, required: false, desc: "Repo refs to clone"
12
- option :git, type: :boolean, default: true, desc: "Initialize the space as a Git repository (use --no-git to skip)"
13
-
14
- def call(title:, repos: [], git: true, **opts)
15
- setup_terminal(**opts.slice(:color, :colors))
16
- result = store.create(title, git: git).bind do |space|
17
- terminal.success "Created #{space.id}"
18
-
19
- repo_specs = Array(repos).compact
20
- repo_specs.each { |spec| terminal.say "Queued #{spec}" }
21
-
22
- next Success(space) if repo_specs.empty?
23
-
24
- progress = RepoProgress.new(repo_specs.length)
25
- terminal.with_spinner(-> { progress.message }) do
26
- store.add_repos_to(space, repo_specs, reporter: progress)
27
- end.fmap do |results|
28
- results.each do |r|
29
- terminal.success "Added #{r.fetch(:repo).fetch('full_name')}"
30
- terminal.say terminal.path(r.fetch(:path))
31
- end
32
- space
33
- end
34
- end
35
- render(result) do |space|
36
- terminal.say terminal.path(space.path)
37
- CLI.record_outcome(Outcome.new(exit_code: 0))
38
- end
39
- end
40
- end
41
- end
42
- end
43
-
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- module GlobalOptions
6
- def self.included(base)
7
- base.option :color, type: :string, default: "auto", desc: "Color output: auto, always, never"
8
- base.option :colors, type: :string, desc: "Alias for --color"
9
- end
10
- end
11
- end
12
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- class Path < Dry::CLI::Command
6
- include GlobalOptions
7
- include Helpers
8
-
9
- desc "Print the path for a space or the current space"
10
- argument :identifier, required: false, desc: "Space ID or title slug"
11
-
12
- def call(identifier: nil, **opts)
13
- setup_terminal(**opts.slice(:color, :colors))
14
- render(store.path_for(identifier)) do |path|
15
- terminal.say terminal.path(path)
16
- CLI.record_outcome(Outcome.new(exit_code: 0))
17
- end
18
- end
19
- end
20
- end
21
- end
22
-
@@ -1,88 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- module Repo
6
- class Add < Dry::CLI::Command
7
- include GlobalOptions
8
- include Helpers
9
-
10
- desc "Clone repos into the current space"
11
- argument :repos, type: :array, required: false, desc: "REPO [REPO...]"
12
-
13
- def call(repos: [], **opts)
14
- setup_terminal(**opts.slice(:color, :colors))
15
- handle_errors do
16
- specs = Array(repos).compact
17
- if specs.empty?
18
- terminal.error("Usage: space repo add REPO [REPO...]")
19
- CLI.record_outcome(Outcome.new(exit_code: 1))
20
- next
21
- end
22
-
23
- progress = RepoProgress.new(specs.length)
24
- add_result = terminal.with_spinner(-> { progress.message }) do
25
- store.add_repos(specs, reporter: progress)
26
- end
27
- render(add_result) do |results|
28
- results.each do |result|
29
- terminal.success "Added #{result.fetch(:repo).fetch('full_name')}"
30
- terminal.say terminal.path(result.fetch(:path))
31
- end
32
- CLI.record_outcome(Outcome.new(exit_code: 0))
33
- end
34
- end
35
- end
36
- end
37
-
38
- class RepoList < Dry::CLI::Command
39
- include GlobalOptions
40
- include Helpers
41
-
42
- desc "List repos in the current space"
43
-
44
- def call(**opts)
45
- setup_terminal(**opts.slice(:color, :colors))
46
- handle_errors do
47
- render(store.repos) do |repos|
48
- if repos.empty?
49
- id = store.find.fmap(&:id).value_or("(unknown space)")
50
- terminal.say "No repos found in #{id}"
51
- next
52
- end
53
-
54
- rows = repos.map { |repo| [repo.fetch("full_name", repo["name"]), repo.fetch("path", "")] }
55
- terminal.say terminal.table(["Repo", "Path"], rows)
56
- CLI.record_outcome(Outcome.new(exit_code: 0))
57
- end
58
- end
59
- end
60
- end
61
-
62
- class Resolve < Dry::CLI::Command
63
- include GlobalOptions
64
- include Helpers
65
-
66
- desc "Resolve repo refs without cloning"
67
- argument :repos, type: :array, required: false, desc: "REPO [REPO...]"
68
-
69
- def call(repos: [], **opts)
70
- setup_terminal(**opts.slice(:color, :colors))
71
- handle_errors do
72
- specs = Array(repos).compact
73
- if specs.empty?
74
- terminal.error("Usage: space repo resolve REPO [REPO...]")
75
- CLI.record_outcome(Outcome.new(exit_code: 1))
76
- next
77
- end
78
-
79
- references = specs.map { |spec| RepoResolver.new(project_config).resolve(spec) }
80
- terminal.say terminal.table(["Repo", "Clone URL"], references.map { |ref| [ref.full_name, ref.clone_url] })
81
- CLI.record_outcome(Outcome.new(exit_code: 0))
82
- end
83
- end
84
- end
85
- end
86
- end
87
- end
88
-