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
@@ -1,137 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- module Shell
6
- class ShellInit < Dry::CLI::Command
7
- include GlobalOptions
8
- include Helpers
9
-
10
- desc "Print shell integration script"
11
- argument :shell_name, required: true, desc: "Shell name (e.g. fish)"
12
-
13
- def call(shell_name:, **opts)
14
- setup_terminal(**opts.slice(:color, :colors))
15
- handle_errors do
16
- terminal.say ShellIntegration.for(shell_name)
17
- CLI.record_outcome(Outcome.new(exit_code: 0))
18
- end
19
- end
20
- end
21
-
22
- class Fish < Dry::CLI::Command
23
- include GlobalOptions
24
- include Helpers
25
-
26
- desc "Manage fish shell integration: install, uninstall, path"
27
- argument :subcommand, required: false, desc: "install, uninstall, or path (default: install)"
28
- option :force, type: :boolean, default: false, desc: "Overwrite or remove existing shell files"
29
-
30
- def call(subcommand: "install", force: false, **opts)
31
- setup_terminal(**opts.slice(:color, :colors))
32
- handle_errors do
33
- case subcommand
34
- when "install"
35
- result = ShellIntegration.install("fish", env: project_config.env, force: force)
36
- terminal.success fish_install_message(result.fetch(:action), result.fetch(:path))
37
- terminal.success fish_completions_install_message(result.fetch(:completions_action), result.fetch(:completions_path))
38
- terminal.say "Restart fish to load the integration in this terminal: exec fish"
39
- when "uninstall"
40
- result = ShellIntegration.uninstall("fish", env: project_config.env, force: force)
41
- terminal.success fish_uninstall_message(result.fetch(:action), result.fetch(:path))
42
- terminal.success fish_completions_uninstall_message(result.fetch(:completions_action), result.fetch(:completions_path))
43
- when "path"
44
- terminal.say "Function: #{terminal.path(ShellIntegration.path_for('fish', env: project_config.env))}"
45
- terminal.say "Completions: #{terminal.path(ShellIntegration.completions_path_for('fish', env: project_config.env))}"
46
- else
47
- err.puts "Usage: space shell fish [install|uninstall|path]"
48
- CLI.record_outcome(Outcome.new(exit_code: 1))
49
- next
50
- end
51
- CLI.record_outcome(Outcome.new(exit_code: 0))
52
- end
53
- end
54
-
55
- private
56
-
57
- def fish_install_message(action, path)
58
- case action
59
- when :unchanged then "Fish integration already installed: #{terminal.path(path)}"
60
- when :updated then "Updated fish integration: #{terminal.path(path)}"
61
- else "Installed fish integration: #{terminal.path(path)}"
62
- end
63
- end
64
-
65
- def fish_uninstall_message(action, path)
66
- case action
67
- when :missing then "Fish integration was not installed: #{terminal.path(path)}"
68
- else "Removed fish integration: #{terminal.path(path)}"
69
- end
70
- end
71
-
72
- def fish_completions_install_message(action, path)
73
- case action
74
- when :unchanged then "Fish completions already installed: #{terminal.path(path)}"
75
- when :updated then "Updated fish completions: #{terminal.path(path)}"
76
- else "Installed fish completions: #{terminal.path(path)}"
77
- end
78
- end
79
-
80
- def fish_completions_uninstall_message(action, path)
81
- case action
82
- when :missing then "Fish completions were not installed: #{terminal.path(path)}"
83
- else "Removed fish completions: #{terminal.path(path)}"
84
- end
85
- end
86
- end
87
-
88
- class Complete < Dry::CLI::Command
89
- include GlobalOptions
90
- include Helpers
91
-
92
- desc "Print completion candidates"
93
- argument :kind, required: true, desc: "Completion kind"
94
- argument :extra, type: :array, required: false, desc: "Extra args for completion"
95
-
96
- def call(kind:, extra: [], **opts)
97
- setup_terminal(**opts.slice(:color, :colors))
98
- handle_errors do
99
- completion_candidates(kind, Array(extra)).each { |c| terminal.say c }
100
- CLI.record_outcome(Outcome.new(exit_code: 0))
101
- end
102
- end
103
-
104
- private
105
-
106
- def completion_candidates(kind, args)
107
- case kind
108
- when "spaces" then store.list.map { |space| "#{space.id}\t#{space.title}" }
109
- when "statuses" then Space::VALID_STATUSES
110
- when "config-keys" then SpaceArchitect::Config::EDITABLE_KEYS
111
- when "config-values" then completion_values_for_config_key(args.first)
112
- when "shells" then ["fish"]
113
- when "color-modes" then %w[auto always never]
114
- when "repo-subcommands" then %w[add list ls resolve]
115
- when "config-subcommands" then %w[show path set]
116
- when "fish-subcommands" then %w[install uninstall path]
117
- else
118
- raise SpaceArchitect::Error, "Usage: space shell complete #{completion_kinds.join('|')}"
119
- end
120
- end
121
-
122
- def completion_values_for_config_key(key)
123
- case key
124
- when "git_clone_protocol" then SpaceArchitect::Config::VALID_GIT_CLONE_PROTOCOLS
125
- when "default_provider" then %w[github.com gitlab.com]
126
- else []
127
- end
128
- end
129
-
130
- def completion_kinds
131
- %w[spaces statuses config-keys config-values shells color-modes repo-subcommands config-subcommands fish-subcommands]
132
- end
133
- end
134
- end
135
- end
136
- end
137
-
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- class Show < Dry::CLI::Command
6
- include GlobalOptions
7
- include Helpers
8
-
9
- desc "Show metadata 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.find(identifier)) do |space|
15
- terminal.say "ID: #{space.id}"
16
- terminal.say "Title: #{space.title}"
17
- terminal.say "Status: #{space.status}"
18
- terminal.say "Path: #{terminal.path(space.path)}"
19
- terminal.say "Created: #{space.data['created_at']}"
20
- terminal.say "Updated: #{space.data['updated_at']}"
21
- CLI.record_outcome(Outcome.new(exit_code: 0))
22
- end
23
- end
24
- end
25
- end
26
- end
27
-
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- class Status < Dry::CLI::Command
6
- include GlobalOptions
7
- include Helpers
8
-
9
- desc "Set a space status: active, paused, done, archived"
10
- argument :rest, type: :array, required: false, desc: "[SPACE] STATUS"
11
-
12
- def call(rest: [], **opts)
13
- setup_terminal(**opts.slice(:color, :colors))
14
- handle_errors do
15
- identifier, status_value = parse_status_args(Array(rest))
16
- render(store.find(identifier)) do |space|
17
- space.update_status(status_value)
18
- terminal.success "#{space.id} is #{space.status}"
19
- CLI.record_outcome(Outcome.new(exit_code: 0))
20
- end
21
- end
22
- end
23
-
24
- private
25
-
26
- def parse_status_args(args)
27
- case args.length
28
- when 1
29
- [nil, args.first]
30
- when 2
31
- args
32
- else
33
- raise SpaceArchitect::Error, "Usage: space status [SPACE] STATUS"
34
- end
35
- end
36
- end
37
- end
38
- end
39
-
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- module CLI
5
- class Use < Dry::CLI::Command
6
- include GlobalOptions
7
- include Helpers
8
-
9
- desc "Remember a space in recent state and print its path"
10
- argument :identifier, required: true, desc: "Space ID or title slug"
11
-
12
- def call(identifier:, **opts)
13
- setup_terminal(**opts.slice(:color, :colors))
14
- render(store.use(identifier)) do |space|
15
- terminal.success "Recent space: #{space.id}"
16
- terminal.say terminal.path(space.path)
17
- CLI.record_outcome(Outcome.new(exit_code: 0))
18
- end
19
- end
20
- end
21
- end
22
- end
23
-
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SpaceArchitect
4
- VERSION = "1.3.0"
5
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "space_architect/pristine/version"
4
-
5
- # repo-tender — keep local git clones evergreen.
6
- # (clean · on the remote's default branch · fetched within refresh_interval)
7
- #
8
- # Slice 1 surface: Paths, Shell, Config::{Model,Contract,Store},
9
- # State::Store, SCM::{Client,Git,Status}, Forge::{Client,GitHub}.
10
- # Later slices build sync orchestration, CLI, and launchd on top.
11
-
12
- module SpaceArchitect::Pristine
13
- end
14
-
15
- require "space_architect/pristine/paths"
16
- require "space_architect/pristine/shell"
17
- require "space_architect/pristine/config/model"
18
- require "space_architect/pristine/config/contract"
19
- require "space_architect/pristine/config/store"
20
- require "space_architect/pristine/state/store"
21
- require "space_architect/pristine/state/lock"
22
- require "space_architect/pristine/scm/client"
23
- require "space_architect/pristine/scm/status"
24
- require "space_architect/pristine/scm/git"
25
- require "space_architect/pristine/forge/client"
26
- require "space_architect/pristine/forge/github"
27
- require "space_architect/pristine/sync/repo_plan"
28
- require "space_architect/pristine/sync/engine"
29
- require "space_architect/pristine/config/duration"
30
- require "space_architect/pristine/log_rotator"
31
- require "space_architect/pristine/launchd/plist"
32
- require "space_architect/pristine/launchd/agent"
33
- require "space_architect/pristine/ui/reporter"
34
- require "space_architect/pristine/ui/mode"
35
- require "space_architect/pristine/ui/plain_reporter"
36
- require "space_architect/pristine/ui/json_reporter"
37
- require "space_architect/pristine/cli"
38
- require "space_architect/pristine/cli/repo"
39
- require "space_architect/pristine/cli/org"
40
- require "space_architect/pristine/cli/sync"
41
- require "space_architect/pristine/cli/status"
42
- require "space_architect/pristine/cli/config"
43
- require "space_architect/pristine/cli/daemon"
44
- require "space_architect/pristine/cli/clone"