omniconductor 0.5.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.
- package/CHANGELOG.md +68 -0
- package/README.md +59 -19
- package/VISION.md +2 -2
- package/adapters/README.md +8 -8
- package/adapters/claude/README.md +3 -6
- package/adapters/claude/SUPPORTED-FEATURES.md +4 -4
- package/adapters/claude/metadata.json +39 -0
- package/adapters/claude/transform-spec.md +1 -1
- package/adapters/claude/transform.sh +208 -38
- package/adapters/codex/README.md +23 -27
- package/adapters/codex/metadata.json +35 -0
- package/adapters/codex/transform-spec.md +5 -6
- package/adapters/codex/transform.sh +284 -37
- package/adapters/copilot/README.md +26 -29
- package/adapters/copilot/metadata.json +36 -0
- package/adapters/copilot/transform.sh +126 -35
- package/adapters/cursor/README.md +31 -30
- package/adapters/cursor/metadata.json +35 -0
- package/adapters/cursor/transform.sh +117 -28
- package/adapters/gemini/README.md +14 -15
- package/adapters/gemini/metadata.json +36 -0
- package/adapters/gemini/transform.sh +312 -36
- package/adapters/windsurf/README.md +20 -19
- package/adapters/windsurf/metadata.json +36 -0
- package/adapters/windsurf/transform.sh +139 -55
- package/bin/doctor.js +257 -0
- package/bin/omniconductor.js +15 -2
- package/core/anti-patterns/frequent-rule-file-edit.md +1 -1
- package/core/anti-patterns/single-monolithic-rule-file.md +1 -1
- package/core/hooks/README.md +1 -0
- package/core/hooks/pretool-loop-guard.sh.template +177 -0
- package/core/recipes/README.md +6 -4
- package/core/recipes/loop-engineering.md +73 -0
- package/core/universal-rules/README.md +4 -4
- package/core/universal-rules/meta-discipline.md +4 -4
- package/core/universal-rules/spec-as-you-go.md +1 -1
- package/docs/ADAPTER-LIVE-VERIFICATION.md +73 -0
- package/docs/COMPARISON.md +133 -0
- package/docs/COMPATIBILITY-MATRIX.md +126 -0
- package/docs/DESIGN-DECISIONS.md +1268 -0
- package/docs/MANUAL-INSTALL.md +15 -15
- package/docs/PUBLICATION-POLICY.md +46 -0
- package/docs/PUBLISH-GUIDE.md +141 -0
- package/package.json +7 -1
- package/tools/check-adapter-metadata.sh +211 -0
- package/tools/check-stale-tokens.sh +130 -0
- package/tools/generate-adapter-docs.js +123 -0
- package/tools/live-verify.sh +195 -0
- package/tools/manifest-safety.sh +118 -0
- package/tools/stale-tokens.txt +32 -0
- package/tools/test-install-modes.sh +277 -0
- 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
|
|
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
|
|
@@ -67,11 +74,11 @@ Options:
|
|
|
67
74
|
manifest are preserved.
|
|
68
75
|
--force Bypass uninstall safety checks (active worktrees, missing manifest)
|
|
69
76
|
|
|
70
|
-
Recipes available: web-mobile-parity, i18n, monorepo, branch-strategy, auto-mock-data, coding-conventions, tdd, debugging, database-discipline, design-system, self-improvement, git-hygiene
|
|
77
|
+
Recipes available: web-mobile-parity, i18n, monorepo, branch-strategy, auto-mock-data, coding-conventions, tdd, debugging, database-discipline, design-system, self-improvement, git-hygiene, loop-engineering
|
|
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
|
|
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
|
-
|
|
232
|
-
"
|
|
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": "
|
|
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
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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 "========================================================"
|
|
@@ -490,7 +555,7 @@ if [ "$IS_ADOPTER_CASE" = "true" ] && [ "$NO_PROMPT" = "false" ] && [ "$DRY_RUN"
|
|
|
490
555
|
|
|
491
556
|
echo ""
|
|
492
557
|
echo "Available recipes:"
|
|
493
|
-
echo " web-mobile-parity, i18n, monorepo, branch-strategy, auto-mock-data, coding-conventions, tdd, debugging, database-discipline, design-system, self-improvement, git-hygiene"
|
|
558
|
+
echo " web-mobile-parity, i18n, monorepo, branch-strategy, auto-mock-data, coding-conventions, tdd, debugging, database-discipline, design-system, self-improvement, git-hygiene, loop-engineering"
|
|
494
559
|
printf "Select recipes (comma-separated, or leave blank for none): "
|
|
495
560
|
read -r _recipe_answer
|
|
496
561
|
if [ -n "$_recipe_answer" ]; then
|
|
@@ -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 [ "$
|
|
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
|
-
|
|
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 "
|
|
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
|
|
810
|
+
echo " - Sub-agent personas: not yet emitted for Cursor (tool supports sub-agents natively — ADR-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
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
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
|
-
|
|
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
|
-
##
|
|
57
|
+
## Not emitted yet (Phase 2 — Gemini supports these natively, ADR-031/034)
|
|
59
58
|
|
|
60
|
-
| Feature |
|
|
59
|
+
| Feature | Interim workaround |
|
|
61
60
|
|---|---|
|
|
62
|
-
| Per-pattern rule scoping |
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
| Per-call model
|
|
66
|
-
|
|
|
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
|
+
}
|