space-architect 1.3.0 → 2.0.0.rc2

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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +103 -0
  3. data/README.md +267 -158
  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 → architect_project.rb} +475 -125
  8. data/lib/space_architect/cli/architect.rb +248 -178
  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/gate_evaluator.rb +65 -0
  15. data/lib/space_architect/gate_lint.rb +140 -0
  16. data/lib/space_architect/harness.rb +145 -17
  17. data/lib/space_architect/research/mux.rb +127 -0
  18. data/lib/space_architect/research/registry.rb +70 -0
  19. data/lib/space_architect/research/renderer.rb +101 -0
  20. data/lib/space_architect/research/run.rb +7 -0
  21. data/lib/space_architect/research/supervisor.rb +108 -0
  22. data/lib/space_architect/research.rb +13 -0
  23. data/lib/space_architect/run_creator.rb +53 -0
  24. data/lib/space_architect/skill_installer.rb +81 -79
  25. data/lib/space_architect/templates/architect.md.erb +15 -4
  26. data/lib/space_architect/templates/brief.md.erb +5 -5
  27. data/lib/space_architect/templates/iteration.md.erb +17 -6
  28. data/lib/space_architect.rb +8 -21
  29. data/lib/{space_architect → space_core}/atomic_write.rb +1 -1
  30. data/lib/space_core/cli/base_command.rb +19 -0
  31. data/lib/space_core/cli/build.rb +27 -0
  32. data/lib/space_core/cli/config.rb +49 -0
  33. data/lib/space_core/cli/current.rb +16 -0
  34. data/lib/space_core/cli/help.rb +123 -0
  35. data/lib/space_core/cli/helpers.rb +115 -0
  36. data/lib/space_core/cli/init.rb +29 -0
  37. data/lib/space_core/cli/list.rb +24 -0
  38. data/lib/space_core/cli/new.rb +38 -0
  39. data/lib/space_core/cli/pack.rb +29 -0
  40. data/lib/space_core/cli/path.rb +16 -0
  41. data/lib/space_core/cli/repeatable_options.rb +75 -0
  42. data/lib/space_core/cli/repo.rb +76 -0
  43. data/lib/space_core/cli/run.rb +29 -0
  44. data/lib/space_core/cli/shell.rb +125 -0
  45. data/lib/space_core/cli/show.rb +21 -0
  46. data/lib/space_core/cli/status.rb +33 -0
  47. data/lib/space_core/cli/use.rb +17 -0
  48. data/lib/space_core/cli.rb +177 -0
  49. data/lib/{space_architect → space_core}/config.rb +1 -1
  50. data/lib/{space_architect → space_core}/errors.rb +1 -1
  51. data/lib/{space_architect → space_core}/git_client.rb +1 -1
  52. data/lib/{space_architect → space_core}/mise_client.rb +1 -1
  53. data/lib/space_core/oci_builder.rb +56 -0
  54. data/lib/space_core/oci_packer.rb +99 -0
  55. data/lib/space_core/oci_runner.rb +73 -0
  56. data/lib/{space_architect → space_core}/repo_reference.rb +1 -1
  57. data/lib/{space_architect → space_core}/repo_resolver.rb +1 -1
  58. data/lib/{space_architect → space_core}/shell_integration.rb +1 -1
  59. data/lib/{space_architect → space_core}/slugger.rb +1 -1
  60. data/lib/{space_architect → space_core}/space.rb +11 -3
  61. data/lib/{space_architect → space_core}/space_store.rb +13 -13
  62. data/lib/{space_architect → space_core}/state.rb +1 -1
  63. data/lib/space_core/templates/oci/dockerfile.erb +63 -0
  64. data/lib/space_core/templates/oci/dockerignore.erb +17 -0
  65. data/lib/space_core/templates/oci/entrypoint.sh.erb +10 -0
  66. data/lib/{space_architect → space_core}/terminal.rb +1 -1
  67. data/lib/space_core/version.rb +7 -0
  68. data/lib/{space_architect → space_core}/warnings.rb +1 -1
  69. data/lib/{space_architect → space_core}/xdg.rb +1 -1
  70. data/lib/space_core.rb +24 -0
  71. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/clone.rb +5 -5
  72. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/config.rb +7 -7
  73. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/daemon.rb +46 -30
  74. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/options.rb +1 -1
  75. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/org.rb +9 -9
  76. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/repo.rb +9 -9
  77. data/lib/space_src/cli/shell.rb +122 -0
  78. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/status.rb +7 -7
  79. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli/sync.rb +17 -17
  80. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cli.rb +42 -11
  81. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/cloner.rb +3 -3
  82. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/contract.rb +1 -1
  83. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/duration.rb +1 -1
  84. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/model.rb +1 -1
  85. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/config/store.rb +5 -5
  86. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/forge/client.rb +2 -2
  87. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/forge/github.rb +4 -4
  88. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/launchd/agent.rb +5 -5
  89. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/launchd/plist.rb +3 -3
  90. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/log_rotator.rb +1 -1
  91. data/lib/space_src/migration.rb +43 -0
  92. data/lib/space_src/nav.rb +98 -0
  93. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/paths.rb +2 -2
  94. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/scm/client.rb +1 -1
  95. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/scm/git.rb +4 -4
  96. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/scm/status.rb +1 -1
  97. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/shell.rb +1 -1
  98. data/lib/space_src/shell_integration.rb +321 -0
  99. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/state/lock.rb +1 -1
  100. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/state/store.rb +2 -2
  101. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/sync/engine.rb +12 -12
  102. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/sync/repo_plan.rb +3 -3
  103. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/interactive_reporter.rb +1 -1
  104. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/json_reporter.rb +1 -1
  105. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/mode.rb +1 -1
  106. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/plain_reporter.rb +1 -1
  107. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/ui/reporter.rb +1 -1
  108. data/{vendor/repo-tender/lib/space_architect/pristine → lib/space_src}/version.rb +2 -2
  109. data/lib/space_src.rb +37 -0
  110. data/skill/architect/SKILL.md +110 -54
  111. data/skill/architect/dispatch.md +147 -39
  112. data/skill/architect/research.md +46 -37
  113. data/skill/architect-research/SKILL.md +2 -2
  114. data/skill/architect-vocabulary/SKILL.md +24 -21
  115. metadata +127 -68
  116. data/lib/space_architect/cli/config.rb +0 -61
  117. data/lib/space_architect/cli/current.rb +0 -22
  118. data/lib/space_architect/cli/helpers.rb +0 -117
  119. data/lib/space_architect/cli/init.rb +0 -35
  120. data/lib/space_architect/cli/list.rb +0 -30
  121. data/lib/space_architect/cli/new.rb +0 -43
  122. data/lib/space_architect/cli/options.rb +0 -12
  123. data/lib/space_architect/cli/path.rb +0 -22
  124. data/lib/space_architect/cli/repo.rb +0 -88
  125. data/lib/space_architect/cli/shell.rb +0 -137
  126. data/lib/space_architect/cli/show.rb +0 -27
  127. data/lib/space_architect/cli/status.rb +0 -39
  128. data/lib/space_architect/cli/use.rb +0 -23
  129. data/lib/space_architect/version.rb +0 -5
  130. data/vendor/repo-tender/lib/space_architect/pristine.rb +0 -44
@@ -1,10 +1,13 @@
1
1
  # Research fan-out reference
2
2
 
3
- Read this only when a research trigger fires (see SKILL.md step 3). The
4
- fan-out uses `claude -p` (Sonnet 4.6) as parallel web-research subagents
5
- read-only (no `Edit`/`Write`/`Bash`), built-in `WebSearch`/`WebFetch` — and
6
- the architect keeps all judgment: it verifies the load-bearing claims and writes
7
- the iteration's **Grounds** section itself.
3
+ Read this only when a research trigger fires (see SKILL.md step 3). The fan-out
4
+ uses `architect research dispatch` to launch parallel read-only `claude -p`
5
+ researchers (a cheaper model, read-only no Edit/Write/Bash) and `architect research wait` to
6
+ collect their results. The architect keeps all judgment: it verifies
7
+ load-bearing claims and writes the iteration's **Grounds** section itself.
8
+
9
+ **Note:** the `~/.claude/skills/architect-research/` copy of this skill is
10
+ synced separately and is NOT updated by this repo.
8
11
 
9
12
  ## Fan out
10
13
 
@@ -13,41 +16,42 @@ Cover different angles, not the same angle five times — typical split:
13
16
  official docs/reference, changelog/breaking changes, community failure reports,
14
17
  alternatives/comparisons, security/operational constraints.
15
18
 
16
- One fresh `claude -p` per question, each launched as its own **background Bash
17
- tool call** (`run_in_background`) — one call per researcher, not a shell `&`
18
- loop (a `&` launcher orphans the researchers and the harness reaps them all at
19
- once; same trap as builder dispatch). The researcher toolset is read-only
20
- (`Read,Grep,Glob`) plus the web tools (`WebSearch,WebFetch`) — no
21
- `Edit`/`Write`/`Bash`, so it cannot touch the repo. Capture the final report
22
- by redirecting stdout (the report *is* the text result in the default `text`
23
- output format):
19
+ Write each research prompt to its own file, then dispatch and wait:
24
20
 
25
21
  ```bash
26
- claude -p --model claude-sonnet-4-6 \
27
- --allowedTools 'Read,Grep,Glob,WebSearch,WebFetch' \
28
- --max-turns 40 \
29
- < build/research/<NN>-<topic>.prompt.md \
30
- > build/research/<NN>-<topic>.md
22
+ # 1. Write one prompt file per research question (use Write tool — do NOT shell-redirect)
23
+ # Filenames: <NN>-<topic>.prompt.md e.g. 01-official-api.prompt.md
24
+
25
+ # 2. Dispatch all lanes at once (non-blocking — returns PIDs immediately)
26
+ architect research dispatch \
27
+ 01-official-api.prompt.md \
28
+ 02-changelog.prompt.md
29
+
30
+ # 3. Wait for all lanes to complete (tails run.jsonl streams; exits non-zero if any lane fails)
31
+ architect research wait
32
+
33
+ # 4. Read each report
34
+ cat build/research/01-official-api/report.md
35
+ cat build/research/02-changelog/report.md
31
36
  ```
32
37
 
33
- Write each research-prompt to a `.prompt.md` file and feed it on stdin, never
34
- as a shell argument — a quote-mangling shell will corrupt a big prompt; the
35
- stdin redirect injects it verbatim.
36
-
37
- - Read-only by toolset: with only `Read,Grep,Glob,WebSearch,WebFetch` on the
38
- allow list and nothing else granted, any write/bash call is denied — the
39
- researcher can't touch the repo. Its report is the redirected stdout.
40
- - Web comes from the built-in `WebSearch` and `WebFetch` tools — no extension
41
- or key. Launch ONE canary researcher and confirm it actually fetches live URLs
42
- before fanning out. Restrict domains with `WebFetch(domain:…)` allow rules in
43
- prompt-injection-sensitive repos.
44
- - Thinking budget: keep research at a modest level (a plain block, or "think
45
- hard") — research is coverage work; deep thinking buys nothing here. Synthesis
46
- happens on the architect's side.
47
- - Scope each researcher to ≤5 subjects and put hard context rules in the
48
- research-prompt (snippet over page; quote ≤2 sentences; stop the moment you
49
- can answer) a researcher that fills its context window dies without emitting
50
- its report. Bisect and re-dispatch dead lanes; don't re-run as-is.
38
+ The id for each lane is derived from the prompt filename:
39
+ `01-official-api.prompt.md` id `01-official-api`
40
+ directory `build/research/01-official-api/`.
41
+
42
+ Verbosity flags for `wait`:
43
+ - default (L1): per-lane lifecycle + terminal outcome line
44
+ - `--level 2`: + assistant text
45
+ - `--level 3`: + tool call names
46
+ - `--level 4`: + tool call inputs and results
47
+ - `--quiet`: suppress all output; exit status alone signals outcome
48
+ - `--thinking`: reveal assistant thinking blocks
49
+ - `--jsonl`: emit raw lane-tagged JSONL instead of human text
50
+
51
+ The researchers are READ-ONLY by toolset (`Read,Grep,Glob,WebSearch,WebFetch`
52
+ with no Edit/Write/Bash) so they cannot touch the repo. Their final report
53
+ is extracted from the terminal `result` event in the stream-json log and
54
+ written to `build/research/<id>/report.md` automatically by `wait`.
51
55
 
52
56
  ## Research-prompt template
53
57
 
@@ -70,9 +74,14 @@ OUTPUT FORMAT — a markdown report:
70
74
  - End with: the 2-3 findings most likely to change an implementation decision.
71
75
  ```
72
76
 
77
+ Keep each researcher scoped to ≤5 subjects and put hard context rules in the
78
+ prompt (snippet over page; quote ≤2 sentences; stop the moment you can answer)
79
+ — a researcher that fills its context window dies without emitting its report.
80
+ Bisect and re-dispatch dead lanes; don't re-run as-is.
81
+
73
82
  ## Gather (architect — this is your work, not another agent's)
74
83
 
75
- 1. Read every findings file in `build/research/`.
84
+ 1. Read every `build/research/<id>/report.md`.
76
85
  2. Identify the **load-bearing claims** — facts the spec will depend on
77
86
  (an API shape, a version constraint, a limit, a deprecation). Adversarially
78
87
  verify each: cross-check against a second independent source or the live
@@ -74,7 +74,7 @@ toolset (`Read,Grep,Glob`) plus the web tools (`WebSearch,WebFetch`); the
74
74
  report is the redirected stdout:
75
75
 
76
76
  ```bash
77
- claude -p --model claude-sonnet-4-6 \
77
+ claude -p --model <researcher-model> \
78
78
  --allowedTools 'Read,Grep,Glob,WebSearch,WebFetch' \
79
79
  --max-turns 40 \
80
80
  < build/research/<NN>-<lane>.prompt.md \
@@ -161,5 +161,5 @@ Commit the report. Raw findings stay in `build/research/` (gitignored).
161
161
 
162
162
  If this feeds the build loop: distill the report into the iteration's **Grounds**
163
163
  section (`architecture/I<NN>-<name>.md`) per `/architect`, or into
164
- `architecture/BRIEF.md` §sections when it is mission-scope, and continue there.
164
+ `architecture/BRIEF.md` §sections when it is project-scope, and continue there.
165
165
  The builder's PHASE 0 will challenge Grounds' claims — that's a feature.
@@ -2,7 +2,7 @@
2
2
  name: architect-vocabulary
3
3
  description: >
4
4
  Load the Architect system's vocabulary and a short "where you are"
5
- orientation — space, mission, iteration, lane, brief, builder, architect,
5
+ orientation — space, project, iteration, lane, brief, builder, architect,
6
6
  gate, freeze, verdict, research, variant set — for when you're standing in a
7
7
  space-architect workspace (or working on the skill itself) and need the terms
8
8
  understood in conversation but do NOT want to run the loop. Reference only:
@@ -30,11 +30,12 @@ the loop.
30
30
 
31
31
  **Roles**
32
32
 
33
- - **architect** — the judgment role (a human, or Claude Opus 4.8 in judgment
34
- mode): arbitrates disagreements, writes and freezes iteration files, calls
35
- kill/continue, merges builder output. Never writes implementation code.
36
- - **builder** — the implementation role: Claude Sonnet 4.6 run headless via
37
- `architect dispatch` (`claude -p`), one per lane in its own worktree. Reports
33
+ - **architect** — the judgment role (a strong reasoning model, or a human, in
34
+ judgment mode): arbitrates disagreements, writes and freezes iteration files,
35
+ calls kill/continue, merges builder output. Never writes implementation code.
36
+ - **builder** — the implementation role: a cheaper model run headless via
37
+ `architect dispatch` (reference harness: `claude -p`), one per lane in its own
38
+ worktree. Reports
38
39
  raw evidence; never grades its own work; never edits `architecture/`.
39
40
 
40
41
  **The workspace**
@@ -43,9 +44,9 @@ the loop.
43
44
  artifacts under one root. `architect` finds it by walking up from `$PWD` to the
44
45
  nearest `space.yaml`.
45
46
  - **space.yaml** — the space's identity file: id, title, status, repos, notes,
46
- tags, plus the `architect:` block (mission state — iterations, freeze shas,
47
+ tags, plus the `project:` block (project state — iterations, freeze shas,
47
48
  lanes).
48
- - **mission** — an Architect Loop instance living inside a space; spans the
49
+ - **project** — an Architect Loop instance living inside a space; spans the
49
50
  repos under `repos/`.
50
51
 
51
52
  **The unit of work**
@@ -54,8 +55,9 @@ the loop.
54
55
  file `architecture/I<NN>-<name>.md`, grown section by section. Its sections:
55
56
  - **Grounds** — *why*: research/brief distilled (optional).
56
57
  - **Specification** — *what/how*: the full delegation contract.
57
- - **Acceptance Criteria** — *proof*: exact gate commands + thresholds; this is
58
- what gets frozen.
58
+ - **Acceptance Criteria** — *proof*: prose conditions (AC1, AC2, …) the
59
+ architect judges against, plus a fenced ` ```gates ` block of runnable checks;
60
+ this is what gets frozen.
59
61
  - **Builder Prompt** — the exact lane-prompt(s) dispatched.
60
62
  - **Builder Report** — raw evidence, transcribed verbatim from build scratch.
61
63
  - **Verdict** — rulings + per-AC PASS/FAIL/INVALID + KILL/CONTINUE.
@@ -70,17 +72,18 @@ the loop.
70
72
 
71
73
  **Contracts and checkpoints**
72
74
 
73
- - **brief** (`architecture/BRIEF.md`) — the durable, §-numbered mission contract
74
- that spans iterations; frozen at the mission level and cited as **BRIEF §N**.
75
+ - **brief** (`architecture/BRIEF.md`) — the durable, §-numbered project contract
76
+ that spans iterations; frozen at the project level and cited as **BRIEF §N**.
75
77
  - **ARCHITECT.md** (`architecture/ARCHITECT.md`) — the cross-iteration index /
76
- table of contents and mission-wide state.
78
+ table of contents and project-wide state.
77
79
  - **freeze** ❄️ — committing the frozen region (Grounds / Specification /
78
80
  Acceptance Criteria) *before* dispatch (`architect freeze`). Records the
79
81
  **freeze_sha** in `space.yaml`; any later change to those sections is an
80
82
  automatic iteration FAIL.
81
- - **gate** — a frozen verification command + threshold (test/lint/typecheck/
82
- build). `architect gate` runs them and streams raw output it is a runner,
83
- never a judge.
83
+ - **gate** — a structured entry in the ` ```gates ` block: `id`, `ac`, `cmd`,
84
+ optional `cwd`, and an `expect` hash (exit_code / stdout_match / threshold).
85
+ `architect gate` runs each gate's `cmd` and streams raw output — it is a runner,
86
+ never a judge. `architect freeze` lints the gates block before committing.
84
87
 
85
88
  **Outcomes**
86
89
 
@@ -106,18 +109,18 @@ the loop.
106
109
  **Repos**
107
110
 
108
111
  - **evergreen** / copy-on-write / **`src` engine** — repo provisioning: when an
109
- up-to-date local copy exists under `evergreen_dir`, `architect` copies it into
112
+ up-to-date local copy exists under `src_dir`, `architect` copies it into
110
113
  the space (copy-on-write on APFS) instead of cloning over the network. The
111
- vendored `src` engine keeps those evergreen checkouts tended.
114
+ `src` engine (`space-src`) keeps those evergreen checkouts tended.
112
115
 
113
116
  ## Where you are
114
117
 
115
118
  A space's directory layout:
116
119
 
117
120
  ```text
118
- space.yaml # identity + mission state (the architect: block)
121
+ space.yaml # identity + project state (the project: block)
119
122
  README.md
120
- repos/ # the repos the mission spans
123
+ repos/ # the repos the project spans
121
124
  notes/ # scratch, prompts, logs
122
125
  architecture/ # ARCHITECT.md index + I<NN>-<name>.md iteration files (+ BRIEF.md)
123
126
  build/ # lane worktrees + scratch: build/<id>-<lane>/
@@ -127,7 +130,7 @@ tmp/ # workspace-local temp — use instead of /tmp
127
130
  Safe **read-only** commands to orient yourself (these don't run the loop):
128
131
 
129
132
  ```sh
130
- architect status # mission state: iterations, freeze shas, lanes, verdicts
133
+ architect status # project state: iterations, freeze shas, lanes, verdicts
131
134
  architect space show # the space you're standing in
132
135
  architect space list # all your spaces
133
136
  ```
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.rc2
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,138 @@ 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
- - lib/space_architect/architect_mission.rb
212
- - lib/space_architect/atomic_write.rb
242
+ - lib/space_architect/architect_project.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
249
+ - lib/space_architect/gate_evaluator.rb
250
+ - lib/space_architect/gate_lint.rb
234
251
  - 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
252
+ - lib/space_architect/research.rb
253
+ - lib/space_architect/research/mux.rb
254
+ - lib/space_architect/research/registry.rb
255
+ - lib/space_architect/research/renderer.rb
256
+ - lib/space_architect/research/run.rb
257
+ - lib/space_architect/research/supervisor.rb
258
+ - lib/space_architect/run_creator.rb
239
259
  - 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
260
  - lib/space_architect/templates/architect.md.erb
245
261
  - lib/space_architect/templates/brief.md.erb
246
262
  - 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
263
+ - lib/space_core.rb
264
+ - lib/space_core/atomic_write.rb
265
+ - lib/space_core/cli.rb
266
+ - lib/space_core/cli/base_command.rb
267
+ - lib/space_core/cli/build.rb
268
+ - lib/space_core/cli/config.rb
269
+ - lib/space_core/cli/current.rb
270
+ - lib/space_core/cli/help.rb
271
+ - lib/space_core/cli/helpers.rb
272
+ - lib/space_core/cli/init.rb
273
+ - lib/space_core/cli/list.rb
274
+ - lib/space_core/cli/new.rb
275
+ - lib/space_core/cli/pack.rb
276
+ - lib/space_core/cli/path.rb
277
+ - lib/space_core/cli/repeatable_options.rb
278
+ - lib/space_core/cli/repo.rb
279
+ - lib/space_core/cli/run.rb
280
+ - lib/space_core/cli/shell.rb
281
+ - lib/space_core/cli/show.rb
282
+ - lib/space_core/cli/status.rb
283
+ - lib/space_core/cli/use.rb
284
+ - lib/space_core/config.rb
285
+ - lib/space_core/errors.rb
286
+ - lib/space_core/git_client.rb
287
+ - lib/space_core/mise_client.rb
288
+ - lib/space_core/oci_builder.rb
289
+ - lib/space_core/oci_packer.rb
290
+ - lib/space_core/oci_runner.rb
291
+ - lib/space_core/repo_reference.rb
292
+ - lib/space_core/repo_resolver.rb
293
+ - lib/space_core/shell_integration.rb
294
+ - lib/space_core/slugger.rb
295
+ - lib/space_core/space.rb
296
+ - lib/space_core/space_store.rb
297
+ - lib/space_core/state.rb
298
+ - lib/space_core/templates/oci/dockerfile.erb
299
+ - lib/space_core/templates/oci/dockerignore.erb
300
+ - lib/space_core/templates/oci/entrypoint.sh.erb
301
+ - lib/space_core/terminal.rb
302
+ - lib/space_core/version.rb
303
+ - lib/space_core/warnings.rb
304
+ - lib/space_core/xdg.rb
305
+ - lib/space_src.rb
306
+ - lib/space_src/cli.rb
307
+ - lib/space_src/cli/clone.rb
308
+ - lib/space_src/cli/config.rb
309
+ - lib/space_src/cli/daemon.rb
310
+ - lib/space_src/cli/options.rb
311
+ - lib/space_src/cli/org.rb
312
+ - lib/space_src/cli/repo.rb
313
+ - lib/space_src/cli/shell.rb
314
+ - lib/space_src/cli/status.rb
315
+ - lib/space_src/cli/sync.rb
316
+ - lib/space_src/cloner.rb
317
+ - lib/space_src/config/contract.rb
318
+ - lib/space_src/config/duration.rb
319
+ - lib/space_src/config/model.rb
320
+ - lib/space_src/config/store.rb
321
+ - lib/space_src/forge/client.rb
322
+ - lib/space_src/forge/github.rb
323
+ - lib/space_src/launchd/agent.rb
324
+ - lib/space_src/launchd/plist.rb
325
+ - lib/space_src/log_rotator.rb
326
+ - lib/space_src/migration.rb
327
+ - lib/space_src/nav.rb
328
+ - lib/space_src/paths.rb
329
+ - lib/space_src/scm/client.rb
330
+ - lib/space_src/scm/git.rb
331
+ - lib/space_src/scm/status.rb
332
+ - lib/space_src/shell.rb
333
+ - lib/space_src/shell_integration.rb
334
+ - lib/space_src/state/lock.rb
335
+ - lib/space_src/state/store.rb
336
+ - lib/space_src/sync/engine.rb
337
+ - lib/space_src/sync/repo_plan.rb
338
+ - lib/space_src/ui/interactive_reporter.rb
339
+ - lib/space_src/ui/json_reporter.rb
340
+ - lib/space_src/ui/mode.rb
341
+ - lib/space_src/ui/plain_reporter.rb
342
+ - lib/space_src/ui/reporter.rb
343
+ - lib/space_src/version.rb
251
344
  - skill/architect-research/SKILL.md
252
345
  - skill/architect-research/lanes.md
253
346
  - skill/architect-vocabulary/SKILL.md
254
347
  - skill/architect/SKILL.md
255
348
  - skill/architect/dispatch.md
256
349
  - 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
350
  homepage: https://github.com/jetpks/space-architect
293
351
  licenses:
294
352
  - MIT
295
353
  metadata:
296
354
  homepage_uri: https://github.com/jetpks/space-architect
355
+ changelog_uri: https://github.com/jetpks/space-architect/blob/main/CHANGELOG.md
297
356
  rdoc_options: []
298
357
  require_paths:
299
358
  - 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
-