omniconductor 0.6.0 → 1.0.1

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 (48) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +16 -12
  3. package/VISION.md +2 -2
  4. package/adapters/README.md +8 -8
  5. package/adapters/claude/README.md +2 -5
  6. package/adapters/claude/SUPPORTED-FEATURES.md +1 -1
  7. package/adapters/claude/metadata.json +39 -0
  8. package/adapters/claude/transform.sh +198 -34
  9. package/adapters/codex/README.md +23 -27
  10. package/adapters/codex/metadata.json +35 -0
  11. package/adapters/codex/transform-spec.md +5 -6
  12. package/adapters/codex/transform.sh +282 -35
  13. package/adapters/copilot/README.md +26 -29
  14. package/adapters/copilot/metadata.json +36 -0
  15. package/adapters/copilot/transform.sh +124 -33
  16. package/adapters/cursor/README.md +31 -30
  17. package/adapters/cursor/metadata.json +35 -0
  18. package/adapters/cursor/transform.sh +115 -26
  19. package/adapters/gemini/README.md +14 -15
  20. package/adapters/gemini/metadata.json +36 -0
  21. package/adapters/gemini/transform.sh +310 -34
  22. package/adapters/windsurf/README.md +20 -19
  23. package/adapters/windsurf/metadata.json +36 -0
  24. package/adapters/windsurf/transform.sh +137 -53
  25. package/bin/doctor.js +257 -0
  26. package/bin/omniconductor.js +15 -2
  27. package/core/anti-patterns/frequent-rule-file-edit.md +1 -1
  28. package/core/anti-patterns/single-monolithic-rule-file.md +1 -1
  29. package/core/recipes/README.md +2 -2
  30. package/core/universal-rules/README.md +4 -4
  31. package/core/universal-rules/meta-discipline.md +4 -4
  32. package/core/universal-rules/spec-as-you-go.md +1 -1
  33. package/docs/ADAPTER-LIVE-VERIFICATION.md +73 -0
  34. package/docs/COMPARISON.md +133 -0
  35. package/docs/COMPATIBILITY-MATRIX.md +126 -0
  36. package/docs/DESIGN-DECISIONS.md +1268 -0
  37. package/docs/MANUAL-INSTALL.md +15 -15
  38. package/docs/PUBLICATION-POLICY.md +46 -0
  39. package/docs/PUBLISH-GUIDE.md +141 -0
  40. package/package.json +7 -1
  41. package/tools/check-adapter-metadata.sh +211 -0
  42. package/tools/check-stale-tokens.sh +130 -0
  43. package/tools/generate-adapter-docs.js +123 -0
  44. package/tools/live-verify.sh +195 -0
  45. package/tools/manifest-safety.sh +118 -0
  46. package/tools/stale-tokens.txt +32 -0
  47. package/tools/test-install-modes.sh +277 -0
  48. package/tools/validate-adapter-output.sh +1 -1
@@ -24,7 +24,7 @@
24
24
  # core/docs-templates/*.md → <target>/docs/*.md (CURRENT_WORK, REMAINING_TASKS, etc.)
25
25
  # <synthesized> → <target>/.cursorrules (only if --legacy-cursorrules)
26
26
  # core/hooks/*.sh.template → SKIPPED (Reflector hook emitted via --recipes=self-improvement, ADR-032; other guards Claude-only, ADR-034)
27
- # core/roles/*.md → SKIPPED (Cursor has no sub-agent dispatch)
27
+ # core/roles/*.md → SKIPPED (role emission is Claude-only today; Cursor supports sub-agents natively — ADR-031)
28
28
  # adapters/claude/hookify-... → SKIPPED (Claude-only plugin)
29
29
 
30
30
  set -eu
@@ -33,6 +33,7 @@ set -eu
33
33
 
34
34
  TARGET=""
35
35
  RECIPES=""
36
+ MODE="full"
36
37
  DRY_RUN="false"
37
38
  NO_PROMPT="false"
38
39
  UNINSTALL="false"
@@ -45,6 +46,7 @@ WIZARD_APPLY_RULES="true"
45
46
  while [ $# -gt 0 ]; do
46
47
  case "$1" in
47
48
  --recipes=*) RECIPES="${1#--recipes=}" ;;
49
+ --mode=*) MODE="${1#--mode=}" ;;
48
50
  --dry-run) DRY_RUN="true" ;;
49
51
  --no-prompt) NO_PROMPT="true" ;;
50
52
  --uninstall|--rollback) UNINSTALL="true" ;;
@@ -56,6 +58,11 @@ Usage: bash adapters/cursor/transform.sh <target-project> [options]
56
58
 
57
59
  Options:
58
60
  --recipes=A,B,C Comma-separated list of recipes to install
61
+ --mode=<m> Install preset (ADR-044): full (default) | minimal (rules text +
62
+ docs only; no Reflector runtime) | strict (abort if .cursor/rules/
63
+ already has files) | recipes-only (ONLY the selected recipe .mdc
64
+ files; requires --recipes=) | reflector-only (self-improvement
65
+ loop standalone)
59
66
  --dry-run Preview only — no files written
60
67
  --no-prompt Skip all interactive prompts; apply sensible defaults (CI-safe)
61
68
  --legacy-cursorrules ALSO emit a flat .cursorrules bundle alongside .cursor/rules/*.mdc
@@ -71,7 +78,7 @@ Recipes available: web-mobile-parity, i18n, monorepo, branch-strategy, auto-mock
71
78
 
72
79
  What this adapter does NOT install (per ADR-004 honesty + ADR-021):
73
80
  - Hook guards (CONDUCTOR emits the Reflector hook when --recipes=self-improvement, ADR-032; other guards remain Claude-only, ADR-034)
74
- - Sub-agent personas (Cursor has no sub-agent dispatch single chat session per task)
81
+ - Sub-agent personas (not yet emitted for Cursor the tool supports sub-agents natively, ADR-031; agent emission is Phase 2)
75
82
  - Hookify rule templates (Claude-only plugin)
76
83
  EOF
77
84
  exit 0
@@ -94,11 +101,31 @@ if [ -z "$TARGET" ]; then
94
101
  exit 1
95
102
  fi
96
103
 
104
+ case "$MODE" in
105
+ full|minimal|strict|recipes-only|reflector-only) : ;;
106
+ *) echo "Error: unknown --mode '$MODE' (one of: full, minimal, strict, recipes-only, reflector-only)" >&2; exit 1 ;;
107
+ esac
108
+ if [ "$MODE" = "reflector-only" ]; then
109
+ if [ -n "$RECIPES" ] && [ "$RECIPES" != "self-improvement" ]; then
110
+ echo "NOTE: --mode=reflector-only ignores --recipes (installs self-improvement only)" >&2
111
+ fi
112
+ RECIPES="self-improvement"
113
+ fi
114
+ if [ "$MODE" = "recipes-only" ] && [ -z "$RECIPES" ] && [ "$UNINSTALL" != "true" ]; then
115
+ echo "Error: --mode=recipes-only requires --recipes=A,B,..." >&2
116
+ exit 1
117
+ fi
118
+
97
119
  # Resolve CONDUCTOR root (where this script lives: adapters/cursor/).
98
120
  CONDUCTOR_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
99
121
  CORE_ROOT="$CONDUCTOR_ROOT/core"
100
122
  [ -d "$CORE_ROOT" ] || { echo "Error: core/ not found at $CORE_ROOT" >&2; exit 1; }
101
123
 
124
+ # CONDUCTOR package version for the manifest — parsed at runtime from package.json
125
+ # so releases never drift the manifest (falls back to "unknown" on any error).
126
+ CONDUCTOR_VERSION="$(/usr/bin/sed -n -E 's/^[[:space:]]*"version"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/p' "$CONDUCTOR_ROOT/package.json" 2>/dev/null | /usr/bin/head -n 1)"
127
+ [ -n "$CONDUCTOR_VERSION" ] || CONDUCTOR_VERSION="unknown"
128
+
102
129
  if [ "$DRY_RUN" = "true" ]; then
103
130
  mkdir -p "$TARGET"
104
131
  fi
@@ -206,6 +233,9 @@ MANIFEST_STAGE_PATH=""
206
233
  MANIFEST_TS=""
207
234
  MANIFEST_LAST_BACKUP=""
208
235
 
236
+ # shellcheck source=../../tools/manifest-safety.sh
237
+ . "$CONDUCTOR_ROOT/tools/manifest-safety.sh"
238
+
209
239
  init_manifest() {
210
240
  if [ "$DRY_RUN" = "true" ]; then
211
241
  log "would init manifest staging at $MANIFEST_PATH.staging"
@@ -224,12 +254,13 @@ record_emit() {
224
254
  local relpath="$1" src="$2" backup="${3:-}"
225
255
  local had_backup="false"
226
256
  [ -n "$backup" ] && had_backup="true"
227
- local esc_path esc_src esc_backup
257
+ local esc_path esc_src esc_backup emitted_sha
228
258
  esc_path="$(printf '%s' "$relpath" | /usr/bin/sed 's/\\/\\\\/g; s/"/\\"/g')"
229
259
  esc_src="$(printf '%s' "$src" | /usr/bin/sed 's/\\/\\\\/g; s/"/\\"/g')"
230
260
  esc_backup="$(printf '%s' "$backup" | /usr/bin/sed 's/\\/\\\\/g; s/"/\\"/g')"
231
- printf ' {"path": "%s", "source": "%s", "had_backup": %s, "backup_path": "%s"},\n' \
232
- "$esc_path" "$esc_src" "$had_backup" "$esc_backup" >> "$MANIFEST_STAGE_PATH"
261
+ emitted_sha="$(conductor_sha256_file "$TARGET_ABS/$relpath")"
262
+ printf ' {"path": "%s", "source": "%s", "had_backup": %s, "backup_path": "%s", "sha256": "%s"},\n' \
263
+ "$esc_path" "$esc_src" "$had_backup" "$esc_backup" "$emitted_sha" >> "$MANIFEST_STAGE_PATH"
233
264
  }
234
265
 
235
266
  finalize_manifest() {
@@ -273,8 +304,9 @@ finalize_manifest() {
273
304
 
274
305
  /bin/cat > "$MANIFEST_PATH" <<EOF
275
306
  {
276
- "version": "v0.2.0",
307
+ "version": "v$CONDUCTOR_VERSION",
277
308
  "adapter": "cursor",
309
+ "mode": "$MODE",
278
310
  "install_timestamp": "$MANIFEST_TS",
279
311
  "conductor_root": "$CONDUCTOR_ROOT",
280
312
  "recipes_enabled": $recipes_json,
@@ -289,19 +321,19 @@ EOF
289
321
  }
290
322
 
291
323
  backup_and_remember() {
292
- MANIFEST_LAST_BACKUP=""
293
- if [ -f "$1" ]; then
294
- if [ "$DRY_RUN" = "true" ]; then
295
- log "would back up existing $1 -> $1.conductor-backup-<ts>"
296
- MANIFEST_LAST_BACKUP=""
297
- else
298
- local ts
299
- ts="$(/bin/date +%Y%m%d-%H%M%S)"
300
- local backup="$1.conductor-backup-$ts"
301
- /bin/cp "$1" "$backup"
302
- log " backed up existing $1 -> $backup"
303
- MANIFEST_LAST_BACKUP="${backup#$TARGET_ABS/}"
304
- fi
324
+ conductor_manifest_backup_and_remember "$1"
325
+ }
326
+
327
+ # ----- framework detection (ADR-044 suggest, NEVER auto-switch) ----------
328
+
329
+ detect_coexisting_frameworks() {
330
+ local found=""
331
+ [ -d "$TARGET_ABS/.specify" ] && found="$found Spec-Kit"
332
+ { [ -d "$TARGET_ABS/_bmad" ] || [ -d "$TARGET_ABS/.bmad-core" ]; } && found="$found BMAD"
333
+ if [ -n "$found" ] && [ "$MODE" = "full" ]; then
334
+ log "NOTE: detected coexisting framework(s):$found"
335
+ log " Consider --mode=recipes-only or --mode=reflector-only to coexist without"
336
+ log " overlapping workflow rules (suggestion only — nothing was changed)."
305
337
  fi
306
338
  }
307
339
 
@@ -339,6 +371,7 @@ do_uninstall() {
339
371
  local restored=0
340
372
  local deleted=0
341
373
  local missing=0
374
+ local preserved=0
342
375
 
343
376
  while IFS= read -r line; do
344
377
  case "$line" in
@@ -347,16 +380,27 @@ do_uninstall() {
347
380
  *) continue ;;
348
381
  esac
349
382
  entries_count=$((entries_count + 1))
350
- local rel_path src had_backup backup_path
383
+ local rel_path src had_backup backup_path expected_sha
351
384
  rel_path="$(printf '%s' "$line" | /usr/bin/sed -E 's/.*"path": *"([^"]*)".*/\1/')"
352
385
  src="$(printf '%s' "$line" | /usr/bin/sed -E 's/.*"source": *"([^"]*)".*/\1/')"
353
386
  had_backup="$(printf '%s' "$line" | /usr/bin/sed -E 's/.*"had_backup": *(true|false).*/\1/')"
354
387
  backup_path="$(printf '%s' "$line" | /usr/bin/sed -E 's/.*"backup_path": *"([^"]*)".*/\1/')"
388
+ expected_sha="$(conductor_manifest_field "$line" sha256 2>/dev/null || true)"
355
389
 
356
390
  local abs_dest="$TARGET_ABS/$rel_path"
357
391
  local abs_backup=""
358
392
  [ -n "$backup_path" ] && abs_backup="$TARGET_ABS/$backup_path"
359
393
 
394
+ if [ -f "$abs_dest" ] && ! conductor_manifest_file_matches "$abs_dest" "$expected_sha"; then
395
+ if [ -z "$expected_sha" ]; then
396
+ log " WARNING: preserving $rel_path (legacy manifest has no checksum)"
397
+ else
398
+ log " WARNING: preserving user-modified $rel_path"
399
+ fi
400
+ preserved=$((preserved + 1))
401
+ continue
402
+ fi
403
+
360
404
  if [ "$had_backup" = "true" ] && [ -n "$abs_backup" ]; then
361
405
  if [ -f "$abs_backup" ]; then
362
406
  if [ "$DRY_RUN" = "true" ]; then
@@ -430,6 +474,7 @@ do_uninstall() {
430
474
  echo " Backups restored: $restored"
431
475
  echo " Files deleted: $deleted"
432
476
  echo " Backup-missing deletes: $missing"
477
+ [ "$preserved" -gt 0 ] && echo " User-modified files preserved: $preserved"
433
478
  echo "========================================================"
434
479
  }
435
480
 
@@ -464,6 +509,26 @@ if [ -d "$TARGET_ABS/.cursor" ] || [ -f "$TARGET_ABS/.cursorrules" ]; then
464
509
  IS_ADOPTER_CASE="true"
465
510
  fi
466
511
 
512
+ detect_coexisting_frameworks
513
+
514
+ # --mode=strict: never write next to an existing rules surface (ADR-044).
515
+ if [ "$MODE" = "strict" ]; then
516
+ if [ -d "$TARGET_ABS/.cursor/rules" ] && [ -n "$(/bin/ls -A "$TARGET_ABS/.cursor/rules" 2>/dev/null)" ]; then
517
+ echo "Error (--mode=strict): $TARGET_ABS/.cursor/rules/ already has files — strict mode aborts instead of writing next to an existing baseline." >&2
518
+ echo " Use --mode=full (timestamped backups + manifest-based restore), or move them first." >&2
519
+ exit 3
520
+ fi
521
+ if [ -f "$TARGET_ABS/.cursorrules" ]; then
522
+ echo "Error (--mode=strict): $TARGET_ABS/.cursorrules already exists — strict mode never overwrites a rules surface (the legacy bundle step would touch it)." >&2
523
+ exit 3
524
+ fi
525
+ fi
526
+
527
+ # À-la-carte modes are non-interactive by design.
528
+ if [ "$MODE" != "full" ] && [ "$MODE" != "strict" ]; then
529
+ NO_PROMPT="true"
530
+ fi
531
+
467
532
  if [ "$IS_ADOPTER_CASE" = "true" ] && [ "$NO_PROMPT" = "false" ] && [ "$DRY_RUN" = "false" ]; then
468
533
  echo ""
469
534
  echo "========================================================"
@@ -518,7 +583,9 @@ init_manifest
518
583
 
519
584
  UNIVERSAL_RULES="workflow spec-as-you-go quality-gates operations meta-discipline"
520
585
 
521
- if [ "$WIZARD_APPLY_RULES" = "true" ]; then
586
+ if [ "$MODE" = "recipes-only" ] || [ "$MODE" = "reflector-only" ]; then
587
+ log "Step 1/4: universal-rules — skipped (--mode=$MODE is à la carte)"
588
+ elif [ "$WIZARD_APPLY_RULES" = "true" ]; then
522
589
  log "Step 1/4: universal-rules → .cursor/rules/"
523
590
  mkdir_if_real "$TARGET_ABS/.cursor/rules"
524
591
 
@@ -574,7 +641,7 @@ fi
574
641
  # that don't yet read .cursor/rules/*.mdc. Modern Cursor reads BOTH (per ADR-021) — adopters can
575
642
  # safely keep both surfaces during a transition.
576
643
 
577
- if [ "$LEGACY_CURSORRULES" = "true" ]; then
644
+ if [ "$LEGACY_CURSORRULES" = "true" ] && [ "$MODE" != "recipes-only" ] && [ "$MODE" != "reflector-only" ]; then
578
645
  log "Step 2.5/4: legacy bundle → .cursorrules"
579
646
  CURSORRULES_DEST="$TARGET_ABS/.cursorrules"
580
647
  backup_and_remember "$CURSORRULES_DEST"
@@ -615,7 +682,19 @@ if [ "$LEGACY_CURSORRULES" = "true" ]; then
615
682
  fi
616
683
 
617
684
  # ---- Step 2.6: self-improvement runtime (only with --recipes=self-improvement) ----
618
- case ",$RECIPES," in
685
+ if [ "$MODE" = "recipes-only" ] && [ -z "${INSTALLED_RECIPES// /}" ] && [ "$DRY_RUN" != "true" ]; then
686
+ echo "Error: --mode=recipes-only resolved ZERO valid recipes from '--recipes=$RECIPES' — nothing to install (check the names)." >&2
687
+ /bin/rm -f "$MANIFEST_STAGE_PATH"
688
+ exit 1
689
+ fi
690
+
691
+ if [ "$MODE" = "minimal" ]; then
692
+ RECIPES_FOR_RUNTIME=""
693
+ log "Step 2.6/4: self-improvement runtime — skipped (--mode=minimal ships text only)"
694
+ else
695
+ RECIPES_FOR_RUNTIME="$RECIPES"
696
+ fi
697
+ case ",$RECIPES_FOR_RUNTIME," in
619
698
  *",self-improvement,"*)
620
699
  log "Step 2.6/4: self-improvement (Reflector) → hooks/skills/agents"
621
700
  if [ "$DRY_RUN" != "true" ]; then
@@ -666,6 +745,9 @@ esac
666
745
 
667
746
  # ----- step 3: docs templates --------------------------------------------
668
747
 
748
+ if [ "$MODE" = "recipes-only" ] || [ "$MODE" = "reflector-only" ]; then
749
+ log "Step 3/4: docs templates — skipped (--mode=$MODE is à la carte; docs ship with full/minimal)"
750
+ else
669
751
  log "Step 3/4: docs templates → docs/"
670
752
  mkdir_if_real "$TARGET_ABS/docs"
671
753
  mkdir_if_real "$TARGET_ABS/docs/specs"
@@ -700,6 +782,8 @@ if [ -f "$CORE_ROOT/docs-templates/specs/_example.md" ]; then
700
782
  fi
701
783
 
702
784
  # Finalize manifest after all emits.
785
+ fi
786
+
703
787
  finalize_manifest
704
788
 
705
789
  # ----- step 4: completion summary ----------------------------------------
@@ -710,7 +794,12 @@ echo "========================================================"
710
794
  echo " Done."
711
795
  echo " Target: $TARGET_ABS"
712
796
  echo " Adapter: cursor"
713
- echo " Universal rules: 5 (.cursor/rules/*.mdc, alwaysApply:true)"
797
+ echo " Mode: $MODE"
798
+ if [ "$MODE" = "recipes-only" ] || [ "$MODE" = "reflector-only" ]; then
799
+ echo " Universal rules: 0 (à la carte)"
800
+ else
801
+ echo " Universal rules: 5 (.cursor/rules/*.mdc, alwaysApply:true)"
802
+ fi
714
803
  echo " Recipes installed:${INSTALLED_RECIPES:- (none)}"
715
804
  if [ "$LEGACY_CURSORRULES" = "true" ]; then
716
805
  echo " Legacy .cursorrules bundle: emitted"
@@ -718,7 +807,7 @@ fi
718
807
  echo ""
719
808
  echo " Skipped (per ADR-004 honesty):"
720
809
  echo " - Hooks: CONDUCTOR emits the Reflector hook when --recipes=self-improvement (ADR-032); other guards remain Claude-only (ADR-034)."
721
- echo " - Sub-agent personas: Cursor has no sub-agent dispatchsingle chat session per task."
810
+ echo " - Sub-agent personas: not yet emitted for Cursor (tool supports sub-agents nativelyADR-031; Phase 2)."
722
811
  echo " - Hookify rule templates: Claude-only plugin."
723
812
  echo ""
724
813
  echo " Activation: reload Cursor window (Cmd/Ctrl+Shift+P → 'Developer: Reload Window')."
@@ -726,6 +815,6 @@ echo "========================================================"
726
815
  echo ""
727
816
  echo "Next steps for the project:"
728
817
  echo " 1. Open $TARGET_ABS in Cursor."
729
- echo " 2. Edit docs/CURRENT_WORK.md with your project's current state."
818
+ [ -d "$TARGET_ABS/docs" ] && echo " 2. Edit docs/CURRENT_WORK.md with your project's current state."
730
819
  echo " 3. Verify rule loading: open the Cursor settings → Rules tab → confirm 5 universal + recipes shown."
731
820
  echo " 4. Tighten recipe globs if needed (.cursor/rules/<recipe>.mdc has a sensible default)."
@@ -6,15 +6,12 @@ Gemini CLI is a T2 target because:
6
6
  - It supports a coding-style guide convention (`.gemini/styleguide.md`).
7
7
  - It excels at large-context exploration — the always-loaded rule bundle fits its strengths.
8
8
 
9
- It is **T2** because:
9
+ **Tool capability vs CONDUCTOR emission (ADR-031):** as of 2026 Gemini CLI ships hooks, sub-agent dispatch, custom agents, per-task model routing, and commands natively. What is limited today is what CONDUCTOR **emits** for it — rule text + docs + the opt-in Reflector loop; the enforcement guard hooks, role agents, and model-routing config are Phase-2 emission (ADR-034). That is a CONDUCTOR gap, not a Gemini limitation. Real tool-side caveats: the adapter's rule bundle is a single always-loaded `GEMINI.md` (nested-file hierarchy, not glob scoping) and Gemini has no native scheduler (use OS cron / an external Action for the weekly Reflector).
10
10
 
11
- - No per-pattern rule scoping (single-file bundle).
12
- - ❌ No sub-agent dispatch.
13
- - No hooks.
14
- - ❌ No per-call model routing.
15
- - ❌ No built-in memory directory.
11
+ **Tier**: T2 (see `docs/COMPATIBILITY-MATRIX.md`).
12
+
13
+ > Enumerable facts about this adapter (output paths / tier / capabilities / live verification / headless CLI) are machine-readable in [`metadata.json`](./metadata.json) and CI-checked against `transform.sh` + the validator (ADR-040).
16
14
 
17
- **Tier**: T2 — Good for large-context use; rule scoping is "all rules always-loaded".
18
15
 
19
16
  ## Installation path
20
17
 
@@ -47,7 +44,9 @@ bash adapters/gemini/transform.sh <target-project> --uninstall
47
44
  └── specs/_example.md
48
45
  ```
49
46
 
50
- ## Native features supported
47
+ - `--recipes=self-improvement` additionally emits the Reflector loop: session-end trajectory hook config (`.gemini/settings.json`), `/reflect` command, reflector agent, prune script, and the `.conductor/reflect/` weekly runner (ADR-032/033).
48
+
49
+ ## Native features supported (emitted today)
51
50
 
52
51
  - ✅ Always-loaded baseline (`GEMINI.md`).
53
52
  - ✅ Style guide convention (`.gemini/styleguide.md`).
@@ -55,15 +54,15 @@ bash adapters/gemini/transform.sh <target-project> --uninstall
55
54
  - ✅ All doc templates.
56
55
  - ✅ Strong large-context capability — the bundled rule file is fine to load every session.
57
56
 
58
- ## Features NOT supported
57
+ ## Not emitted yet (Phase 2 — Gemini supports these natively, ADR-031/034)
59
58
 
60
- | Feature | Workaround |
59
+ | Feature | Interim workaround |
61
60
  |---|---|
62
- | Per-pattern rule scoping | All rules always-loaded; no per-file routing. Rule TEXT is the same; you just see all of it always. |
63
- | Sub-agent dispatch | Human plays orchestrator. |
64
- | Hooks | Pair with project pre-commit git hooks. |
65
- | Per-call model routing | Single model per session. |
66
- | Built-in memory directory | DIY at `.memory/`. |
61
+ | Per-pattern rule scoping | The adapter bundles all rules into one always-loaded `GEMINI.md` (Gemini scopes by nested-file hierarchy, not globs). Rule TEXT is the same; you just see all of it always. |
62
+ | Enforcement guard hooks | Self-police, or pair with project pre-commit git hooks. Only the Reflector session-end hook is emitted today (`--recipes=self-improvement`). |
63
+ | The 6 role agents (sub-agent dispatch) | Gemini has native sub-agents; CONDUCTOR doesn't emit its role definitions for Gemini yet. Human plays orchestrator. |
64
+ | Per-call model-routing config | Pick the model per task via Gemini's own model selection. |
65
+ | 4-type memory pattern | Self-managed at `.memory/` (gitignored). |
67
66
 
68
67
  ## After install — first steps
69
68
 
@@ -0,0 +1,36 @@
1
+ {
2
+ "_comment": "Single source for enumerable adapter facts (ADR-040). CI asserts transform.sh / validator / matrix agree with this file. Update HERE first; docs follow.",
3
+ "tool": "gemini",
4
+ "display_name": "Gemini CLI",
5
+ "tier": "T2",
6
+ "outputs": [
7
+ { "path": "GEMINI.md", "kind": "always_loaded", "validated": true },
8
+ { "path": ".gemini/styleguide.md", "kind": "rules", "validated": true },
9
+ { "path": "docs/CURRENT_WORK.md", "kind": "docs", "validated": false }
10
+ ],
11
+ "reflector_outputs": [
12
+ { "path": ".gemini/settings.json", "note": "SessionEnd trajectory hook config (recipe-gated)" },
13
+ { "path": ".conductor/reflect", "note": "runner + brief + scheduling (recipe-gated)" }
14
+ ],
15
+ "install": { "ala_carte": "block" },
16
+ "legacy_paths": [],
17
+ "capabilities": {
18
+ "tool_native": {
19
+ "hooks": "yes",
20
+ "sub_agents": "yes",
21
+ "model_routing": "yes",
22
+ "commands": "yes",
23
+ "glob_scoping": "no",
24
+ "scheduler": "none"
25
+ },
26
+ "conductor_emitted": {
27
+ "rules": "full",
28
+ "guard_hooks": "none",
29
+ "reflector_loop": "recipe",
30
+ "role_agents": "none",
31
+ "model_routing": "none"
32
+ }
33
+ },
34
+ "live_verification": { "status": "pending", "date": null, "cli": null, "note": "not yet run" },
35
+ "headless_cli": { "command": "gemini", "invocation": "gemini -p" }
36
+ }