space-architect 1.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +103 -0
- data/README.md +248 -146
- data/exe/architect +1 -1
- data/exe/space +2 -2
- data/exe/src +13 -0
- data/lib/space_architect/architect_mission.rb +84 -53
- data/lib/space_architect/cli/architect.rb +107 -121
- data/lib/space_architect/cli/research.rb +94 -0
- data/lib/space_architect/cli/space.rb +25 -31
- data/lib/space_architect/cli/src.rb +20 -14
- data/lib/space_architect/cli.rb +22 -22
- data/lib/space_architect/dispatcher.rb +5 -1
- data/lib/space_architect/harness.rb +123 -16
- data/lib/space_architect/research/mux.rb +127 -0
- data/lib/space_architect/research/registry.rb +70 -0
- data/lib/space_architect/research/renderer.rb +101 -0
- data/lib/space_architect/research/run.rb +7 -0
- data/lib/space_architect/research/supervisor.rb +108 -0
- data/lib/space_architect/research.rb +13 -0
- data/lib/space_architect/run_creator.rb +53 -0
- data/lib/space_architect/skill_installer.rb +109 -0
- data/lib/space_architect.rb +5 -19
- data/lib/{space_architect → space_core}/atomic_write.rb +1 -1
- data/lib/space_core/cli/base_command.rb +19 -0
- data/lib/space_core/cli/config.rb +49 -0
- data/lib/space_core/cli/current.rb +16 -0
- data/lib/space_core/cli/help.rb +110 -0
- data/lib/space_core/cli/helpers.rb +115 -0
- data/lib/space_core/cli/init.rb +29 -0
- data/lib/space_core/cli/list.rb +24 -0
- data/lib/space_core/cli/new.rb +38 -0
- data/lib/space_core/cli/path.rb +16 -0
- data/lib/space_core/cli/repeatable_options.rb +75 -0
- data/lib/space_core/cli/repo.rb +76 -0
- data/lib/space_core/cli/shell.rb +125 -0
- data/lib/space_core/cli/show.rb +21 -0
- data/lib/space_core/cli/status.rb +33 -0
- data/lib/space_core/cli/use.rb +17 -0
- data/lib/space_core/cli.rb +171 -0
- data/lib/{space_architect → space_core}/config.rb +1 -1
- data/lib/{space_architect → space_core}/errors.rb +1 -1
- data/lib/{space_architect → space_core}/git_client.rb +1 -1
- data/lib/{space_architect → space_core}/mise_client.rb +1 -1
- data/lib/{space_architect → space_core}/repo_reference.rb +1 -1
- data/lib/{space_architect → space_core}/repo_resolver.rb +1 -1
- data/lib/{space_architect → space_core}/shell_integration.rb +1 -1
- data/lib/{space_architect → space_core}/slugger.rb +1 -1
- data/lib/{space_architect → space_core}/space.rb +1 -1
- data/lib/{space_architect → space_core}/space_store.rb +12 -12
- data/lib/{space_architect → space_core}/state.rb +1 -1
- data/lib/{space_architect → space_core}/terminal.rb +16 -1
- data/lib/space_core/version.rb +7 -0
- data/lib/{space_architect → space_core}/warnings.rb +1 -1
- data/lib/{space_architect → space_core}/xdg.rb +1 -1
- data/lib/space_core.rb +24 -0
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/clone.rb +5 -5
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/config.rb +7 -7
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/daemon.rb +46 -30
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/options.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/org.rb +9 -9
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/repo.rb +9 -9
- data/lib/space_src/cli/shell.rb +122 -0
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/status.rb +7 -7
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/sync.rb +17 -17
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli.rb +40 -18
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cloner.rb +3 -3
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/contract.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/duration.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/model.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/store.rb +5 -5
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/forge/client.rb +2 -2
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/forge/github.rb +4 -4
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/launchd/agent.rb +5 -5
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/launchd/plist.rb +3 -3
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/log_rotator.rb +1 -1
- data/lib/space_src/migration.rb +43 -0
- data/lib/space_src/nav.rb +98 -0
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/paths.rb +2 -2
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/scm/client.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/scm/git.rb +4 -4
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/scm/status.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/shell.rb +1 -1
- data/lib/space_src/shell_integration.rb +321 -0
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/state/lock.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/state/store.rb +2 -2
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/sync/engine.rb +12 -12
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/sync/repo_plan.rb +3 -3
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/interactive_reporter.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/json_reporter.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/mode.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/plain_reporter.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/reporter.rb +1 -1
- data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/version.rb +2 -2
- data/lib/space_src.rb +37 -0
- data/skill/architect/SKILL.md +329 -0
- data/skill/architect/dispatch.md +308 -0
- data/skill/architect/research.md +98 -0
- data/skill/architect-research/SKILL.md +165 -0
- data/skill/architect-research/lanes.md +191 -0
- data/skill/architect-vocabulary/SKILL.md +141 -0
- metadata +122 -67
- data/lib/space_architect/cli/config.rb +0 -61
- data/lib/space_architect/cli/current.rb +0 -22
- data/lib/space_architect/cli/helpers.rb +0 -117
- data/lib/space_architect/cli/init.rb +0 -35
- data/lib/space_architect/cli/list.rb +0 -30
- data/lib/space_architect/cli/new.rb +0 -43
- data/lib/space_architect/cli/options.rb +0 -12
- data/lib/space_architect/cli/path.rb +0 -22
- data/lib/space_architect/cli/repo.rb +0 -88
- data/lib/space_architect/cli/shell.rb +0 -137
- data/lib/space_architect/cli/show.rb +0 -27
- data/lib/space_architect/cli/status.rb +0 -39
- data/lib/space_architect/cli/use.rb +0 -23
- data/lib/space_architect/version.rb +0 -5
- data/vendor/repo-tender/lib/space_architect/pristine.rb +0 -37
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:
|
|
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,100 +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
|
|
197
|
-
|
|
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/
|
|
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/
|
|
236
|
-
- lib/space_architect/
|
|
237
|
-
- lib/space_architect/
|
|
238
|
-
- lib/space_architect/
|
|
239
|
-
- lib/space_architect/
|
|
240
|
-
- lib/space_architect/
|
|
241
|
-
- lib/space_architect/
|
|
242
|
-
- lib/space_architect/
|
|
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
|
|
257
|
+
- lib/space_architect/skill_installer.rb
|
|
243
258
|
- lib/space_architect/templates/architect.md.erb
|
|
244
259
|
- lib/space_architect/templates/brief.md.erb
|
|
245
260
|
- lib/space_architect/templates/iteration.md.erb
|
|
246
|
-
- lib/
|
|
247
|
-
- lib/
|
|
248
|
-
- lib/
|
|
249
|
-
- lib/
|
|
250
|
-
-
|
|
251
|
-
-
|
|
252
|
-
-
|
|
253
|
-
-
|
|
254
|
-
-
|
|
255
|
-
-
|
|
256
|
-
-
|
|
257
|
-
-
|
|
258
|
-
-
|
|
259
|
-
-
|
|
260
|
-
-
|
|
261
|
-
-
|
|
262
|
-
-
|
|
263
|
-
-
|
|
264
|
-
-
|
|
265
|
-
-
|
|
266
|
-
-
|
|
267
|
-
-
|
|
268
|
-
-
|
|
269
|
-
-
|
|
270
|
-
-
|
|
271
|
-
-
|
|
272
|
-
-
|
|
273
|
-
-
|
|
274
|
-
-
|
|
275
|
-
-
|
|
276
|
-
-
|
|
277
|
-
-
|
|
278
|
-
-
|
|
279
|
-
-
|
|
280
|
-
-
|
|
281
|
-
-
|
|
282
|
-
-
|
|
283
|
-
-
|
|
284
|
-
-
|
|
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
|
|
333
|
+
- skill/architect-research/SKILL.md
|
|
334
|
+
- skill/architect-research/lanes.md
|
|
335
|
+
- skill/architect-vocabulary/SKILL.md
|
|
336
|
+
- skill/architect/SKILL.md
|
|
337
|
+
- skill/architect/dispatch.md
|
|
338
|
+
- skill/architect/research.md
|
|
285
339
|
homepage: https://github.com/jetpks/space-architect
|
|
286
340
|
licenses:
|
|
287
341
|
- MIT
|
|
288
342
|
metadata:
|
|
289
343
|
homepage_uri: https://github.com/jetpks/space-architect
|
|
344
|
+
changelog_uri: https://github.com/jetpks/space-architect/blob/main/CHANGELOG.md
|
|
290
345
|
rdoc_options: []
|
|
291
346
|
require_paths:
|
|
292
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
|
-
|