repo-nexus 0.7.28 → 0.7.29

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.
@@ -105,9 +105,6 @@ plugins:
105
105
  # Notify developer when changes are committed to intake sources or .rnex/wiki/
106
106
  notify_on_changes: true
107
107
 
108
- # Ingest member repository READMEs into atomic wiki pages
109
- ingest_member_readmes: true
110
-
111
108
  # Enable or disable
112
109
  enabled: true
113
110
  ```
@@ -116,10 +113,8 @@ plugins:
116
113
  |:---|:---|:---|:---|
117
114
  | `wiki_dir` | string | `.rnex/wiki` | Directory containing curated atomic markdown pages. |
118
115
  | `sources` | list | `[docs, "repos/**/README.md"]` | Intake directories and/or glob patterns relative to workspace root. Overridable in `.local.rnex.yaml`. |
119
- | `raw_dir` | string | *(deprecated)* | Deprecated legacy intake directory. Transparently treated as a single `sources` entry with a migration warning. |
120
116
  | `lint_trigger` | string | `manual` | Git hook event that triggers wiki change detection (`git-post-merge`, `git-post-commit`, `git-pre-commit`, `git-pre-push`, `manual`). |
121
117
  | `notify_on_changes` | boolean | `true` | Show notification banner when changes are committed to intake sources or `.rnex/wiki/`. |
122
- | `ingest_member_readmes` | boolean | `true` | Automatically ingest member repository READMEs into atomic wiki pages. |
123
118
  | `enabled` | boolean | `true` | Enable or disable the plugin. Overridable in `.local.rnex.yaml`. |
124
119
 
125
120
  ---
@@ -133,7 +128,7 @@ The `sources` setting defines where the Karpathy LLM Wiki discovers raw intake d
133
128
  - **Single-Level Globs (e.g. `repos/*/README.md` or `docs/*.md`)**: Matches files at a fixed directory level.
134
129
  - **Active Repository Filtering**: Any resolved path located within `repos/<name>/` is checked against member repository status. If a repository is disabled (`enabled: false`) in `rnex.yaml` or `.local.rnex.yaml`, its files are automatically excluded.
135
130
  - **Two-Level Configuration Precedence**: If `sources` is declared in `.local.rnex.yaml`, it completely overrides the `sources` list defined in `rnex.yaml`.
136
- - **Legacy Fallback & Migration**: Existing configurations with `raw_dir: ./path` continue to work without disruption. Repo Nexus reads `raw_dir` as a single-element sources list and emits a non-fatal deprecation notice advising you to migrate to `sources`.
131
+ - **Legacy Migration**: Existing configurations with `raw_dir: <dir>` are automatically rewritten to a `sources` list during `rnex sync`.
137
132
  - **Directory Provisioning**: When running `rnex sync`, explicit directory entries (such as `docs`) are created automatically if missing. Glob patterns (containing `*`, `?`, or `[`) and file targets are never converted into directories.
138
133
 
139
134
  ---
@@ -105,11 +105,9 @@ plugins:
105
105
  # - docs # directory: all files (hidden dirs and node_modules pruned)
106
106
  # - "repos/**/README.md" # recursive glob (quote it); disabled repos are excluded
107
107
  # # A sources list in .local.rnex.yaml replaces this list entirely.
108
- # # Legacy 'raw_dir' is still read as a single source (deprecated).
109
108
  # wiki_dir: ".rnex/wiki" # Directory for curated atomic markdown pages (default: .rnex/wiki)
110
109
  # lint_trigger: "manual" # Runs manually via 'rnex sync' or validation checklists (git-post-merge, git-post-commit, git-pre-commit, git-pre-push, manual)
111
110
  # notify_on_changes: true # Show notification when changes are committed to ./docs or .rnex/wiki
112
- # ingest_member_readmes: true # Automatically ingest member repository READMEs into atomic wiki pages (default: true)
113
111
 
114
112
 
115
113
  # ------------------------------------------------------------------------------
@@ -228,7 +228,7 @@ cmd_status() {
228
228
  printf ' %b↳ Options: %s%b\n' "$_DIM" "$_opts" "$_NC"
229
229
  fi
230
230
  if [ "$_pname" = "karpathy-llm" ] && [ -n "$(plugin_legacy_raw_dir "$_pname" 2>/dev/null)" ]; then
231
- printf ' %b↳ [!] Deprecated: raw_dir — replace it with a sources list and run rnex sync%b\n' "$_Y" "$_NC"
231
+ printf ' %b↳ [!] Deprecated: raw_dir — run "rnex sync" to rewrite to sources%b\n' "$_Y" "$_NC"
232
232
  fi
233
233
  fi
234
234
  fi
@@ -71,6 +71,10 @@ cmd_sync() {
71
71
  [ "$_sync_quiet" -eq 0 ] && log_ok "Upgraded workspace configuration and routing instructions to v$RNEX_VERSION"
72
72
  fi
73
73
 
74
+ # Reconcile legacy plugin settings (e.g. karpathy-llm raw_dir -> sources, strip ingest_member_readmes)
75
+ migrate_karpathy_llm_config "$WORKSPACE_YAML"
76
+ [ -f "$WORKSPACE_LOCAL_YAML" ] && migrate_karpathy_llm_config "$WORKSPACE_LOCAL_YAML"
77
+
74
78
  # --------------------------------------------------------------------------
75
79
  # Step 1: Sync hardcoded files & invoke commands that do not depend on config
76
80
  # --------------------------------------------------------------------------
package/lib/plugins.sh CHANGED
@@ -180,11 +180,6 @@ plugin_instantiate_template() {
180
180
 
181
181
  # Sync plugins into scoped directories: .rnex/plugins/<plugin-name>/
182
182
  sync_plugins() {
183
- # Emit the legacy raw_dir deprecation notice once per sync (stdout discarded)
184
- if yaml_plugin_enabled "karpathy-llm" 2>/dev/null; then
185
- get_plugin_config_list "karpathy-llm" "sources" >/dev/null
186
- fi
187
-
188
183
  # Clean up any bogus placeholder directories accidentally created in workspace root
189
184
  for _bogus in \
190
185
  "$NEXUS_DIR/\"{wiki_dir}" \
package/lib/workspace.sh CHANGED
@@ -208,6 +208,97 @@ _load_git_hooks() {
208
208
  GIT_HOOKS_CONFIG="$_gh"
209
209
  }
210
210
 
211
+ migrate_karpathy_llm_config() {
212
+ _mkc_f="$1"
213
+ [ -f "$_mkc_f" ] || return 0
214
+
215
+ _mkc_has_sources=0
216
+ if command -v _yaml_plugin_list_from_file >/dev/null 2>&1; then
217
+ [ -n "$(_yaml_plugin_list_from_file "$_mkc_f" "karpathy-llm" "sources")" ] && _mkc_has_sources=1
218
+ elif grep -q '^[ \t]*sources:[ \t]*' "$_mkc_f" 2>/dev/null; then
219
+ _mkc_has_sources=1
220
+ fi
221
+
222
+ _mkc_tmp="$(mktemp)"
223
+ awk -v has_sources="$_mkc_has_sources" '
224
+ /^[ \t]*plugins:[ \t]*(#.*)?$/ { in_plugins=1; in_target=0; plugin_indent=-1; print; next }
225
+ in_plugins && /^[^ \t#]/ { in_plugins=0; in_target=0 }
226
+ {
227
+ match($0, /^[ \t]*/)
228
+ indent = RLENGTH
229
+ trimmed = substr($0, indent + 1)
230
+ }
231
+ trimmed ~ /^ingest_member_readmes:[ \t]*/ {
232
+ next
233
+ }
234
+ !in_plugins || trimmed ~ /^([#]|$)/ {
235
+ print
236
+ next
237
+ }
238
+
239
+ in_target && (indent <= plugin_indent) {
240
+ in_target=0
241
+ }
242
+
243
+ !in_target {
244
+ k = trimmed
245
+ sub(/:.*/, "", k)
246
+ gsub(/^["\047]|["\047]$/, "", k)
247
+ gsub(/[[:space:]]/, "", k)
248
+ if (k == "karpathy-llm" && trimmed ~ /:[ \t]*(#.*)?$/) {
249
+ in_target=1
250
+ plugin_indent=indent
251
+ }
252
+ print
253
+ next
254
+ }
255
+
256
+ in_target && (indent > plugin_indent) {
257
+ k = trimmed
258
+ sub(/:.*/, "", k)
259
+ gsub(/^["\047]|["\047]$/, "", k)
260
+ gsub(/[[:space:]]/, "", k)
261
+ if (k == "raw_dir" && trimmed ~ /:[ \t]*/) {
262
+ if (has_sources == 1) {
263
+ next
264
+ }
265
+ val = trimmed
266
+ sub(/^[^:]*:[ \t]*/, "", val)
267
+ if (val ~ /^"[^"]*"/) {
268
+ match(val, /^"[^"]*"/)
269
+ val = substr(val, 2, RLENGTH - 2)
270
+ } else if (val ~ /^\047[^\047]*\047/) {
271
+ match(val, /^\047[^\047]*\047/)
272
+ val = substr(val, 2, RLENGTH - 2)
273
+ } else {
274
+ sub(/[ \t]*#.*$/, "", val)
275
+ sub(/[ \t]+$/, "", val)
276
+ }
277
+ while (sub(/^\.\//, "", val)) {}
278
+ if (val != "." && val != "/") {
279
+ sub(/\/+$/, "", val)
280
+ }
281
+ if (length(val) == 0) val = "docs"
282
+ ind = substr($0, 1, indent)
283
+ if (val ~ /[*?\[]|[ \t]/) {
284
+ printf "%ssources:\n%s - \"%s\"\n", ind, ind, val
285
+ } else {
286
+ printf "%ssources:\n%s - %s\n", ind, ind, val
287
+ }
288
+ has_sources=1
289
+ next
290
+ }
291
+ }
292
+ { print }
293
+ ' "$_mkc_f" > "$_mkc_tmp"
294
+
295
+ if ! cmp -s "$_mkc_f" "$_mkc_tmp"; then
296
+ mv "$_mkc_tmp" "$_mkc_f"
297
+ else
298
+ rm -f "$_mkc_tmp"
299
+ fi
300
+ }
301
+
211
302
  upgrade_workspace_config() {
212
303
  _f="$1"
213
304
  _ver="$2"
@@ -303,5 +394,8 @@ upgrade_workspace_config() {
303
394
  ' "$_f" > "$_tmp" && mv "$_tmp" "$_f"
304
395
  fi
305
396
 
397
+ # 5. Migrate legacy karpathy-llm raw_dir to sources and strip obsolete ingest_member_readmes
398
+ migrate_karpathy_llm_config "$_f"
399
+
306
400
  rm -f "$_tmp"
307
401
  }
package/lib/yaml.sh CHANGED
@@ -233,7 +233,7 @@ get_plugin_config_list() {
233
233
  karpathy-llm:sources)
234
234
  _gpl_raw="$(plugin_legacy_raw_dir "$_gpl_plugin")"
235
235
  if [ -n "$_gpl_raw" ]; then
236
- log_warn "plugins.$_gpl_plugin.raw_dir is deprecated; replace it with a 'sources' list in ${RNEX_CONFIG_FILE:-rnex.yaml} (or ${RNEX_LOCAL_CONFIG_FILE:-.local.rnex.yaml}) and run 'rnex sync'." >&2
236
+ log_warn "plugins.$_gpl_plugin.raw_dir is deprecated; run 'rnex sync' to rewrite it to 'sources' in ${RNEX_CONFIG_FILE:-rnex.yaml}." >&2
237
237
  printf '%s\n' "$_gpl_raw"
238
238
  else
239
239
  printf '%s\n' "docs" "repos/**/README.md"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "repo-nexus",
3
- "version": "0.7.28",
3
+ "version": "0.7.29",
4
4
  "description": "Lightweight, zero-dependency Virtual Meta-Repo companion for multi-repo workspaces and shared AI context (no git submodules)",
5
5
  "bin": {
6
6
  "repo-nexus": "rnex",
@@ -105,11 +105,9 @@ plugins:
105
105
  # - docs # directory: all files (hidden dirs and node_modules pruned)
106
106
  # - "repos/**/README.md" # recursive glob (quote it); disabled repos are excluded
107
107
  # # A sources list in .local.rnex.yaml replaces this list entirely.
108
- # # Legacy 'raw_dir' is still read as a single source (deprecated).
109
108
  # wiki_dir: ".rnex/wiki" # Directory for curated atomic markdown pages (default: .rnex/wiki)
110
109
  # lint_trigger: "manual" # Runs manually via 'rnex sync' or validation checklists (git-post-merge, git-post-commit, git-pre-commit, git-pre-push, manual)
111
110
  # notify_on_changes: true # Show notification when changes are committed to ./docs or .rnex/wiki
112
- # ingest_member_readmes: true # Automatically ingest member repository READMEs into atomic wiki pages (default: true)
113
111
 
114
112
 
115
113
  # ------------------------------------------------------------------------------
@@ -131,10 +131,6 @@ plugins:
131
131
 
132
132
  # Directory paths relative to workspace root (defaults shown)
133
133
  wiki_dir: .rnex/wiki # Directory for curated atomic markdown pages
134
-
135
- # Member repository README auto-ingestion (default: true)
136
- # Automatically registers member repos into wiki pages and hot.md during rnex sync
137
- ingest_member_readmes: true
138
134
  ```
139
135
 
140
136
  ### 2. Local Machine Configuration (`.local.rnex.yaml`)
@@ -158,11 +154,6 @@ plugins:
158
154
 
159
155
  ### Detailed Option Descriptions
160
156
 
161
- #### `ingest_member_readmes` (Repo Config)
162
- * **What it does:** Automatically ingests member repository READMEs into atomic wiki pages (`repo-<name>.md`) and registers them in `hot.md`.
163
- * **How it works:** During `rnex sync`, the plugin discovers configured repositories in `rnex.yaml`, extracts top-level README summaries, creates initial `repo-<name>.md` pages non-destructively, logs ingestion in `_log.md`, and updates the catalog in `hot.md`.
164
- * **Why you need it:** Provides newly onboarded AI assistants immediate context and navigation for all member repositories in the multi-repo workspace. If set to `false`, member repositories are not automatically scanned or ingested during sync.
165
-
166
157
  #### `lint_trigger` (Local Config)
167
158
  * **What it does:** Optional git hook trigger to automate wiki graph audits and maintenance workflows (`wiki-lint` and `wiki-ingest`).
168
159
  * **Default:** Unset / omitted. Automated triggers are **disabled by default**; wiki maintenance is purely manual unless you explicitly opt into a Git hook here.
@@ -183,10 +174,8 @@ plugins:
183
174
 
184
175
  | Field | Scope / File | Type | Default | Values / Behavior |
185
176
  |:---|:---|:---|:---|:---|
186
- | `ingest_member_readmes` | Repo (`rnex.yaml`) | `boolean` | `true` | Automatically ingests member repo READMEs into `repo-<name>.md` and `hot.md` during `rnex sync`. |
187
177
  | `sources` | Repo (`rnex.yaml`) | `list` | `[docs, "repos/**/README.md"]` | Directory paths and/or glob patterns for intake documents. |
188
178
  | `wiki_dir` | Repo (`rnex.yaml`) | `string` | `.rnex/wiki` | Directory containing atomic domain pages. |
189
- | `raw_dir` | Repo (`rnex.yaml`) | `string` | `./docs` | *(Deprecated)* Append-only directory for unmodified source materials. Use `sources` instead. |
190
179
  | `lint_trigger` | Local (`.local.rnex.yaml`) | `string` | *(unset)* | Optional opt-in Git hook: `git-post-commit`, `git-pre-push`, `git-post-merge`. Unset = purely manual. |
191
180
  | `notify_on_changes` | Local (`.local.rnex.yaml`) | `boolean` | `true` | Terminal alerts printed right after git commit/push when `./docs/` or `.rnex/wiki/` needs attention. |
192
181
 
@@ -72,7 +72,6 @@ get_cfg() {
72
72
  _wiki="$(get_cfg "wiki_dir" ".rnex/wiki")"
73
73
  _wiki="$(printf '%s' "$_wiki" | sed -e 's#^/##' -e 's#/$##')"
74
74
  _wiki_path="$_root/$_wiki"
75
- _ingest_readmes="$(get_cfg "ingest_member_readmes" "true")"
76
75
 
77
76
  mkdir -p "$_wiki_path"
78
77
 
@@ -420,12 +419,7 @@ LOG_EOF
420
419
  fi
421
420
  }
422
421
 
423
- # 2. Automatically ingest README.md from all registered/enabled member repositories
424
- case "$(printf '%s' "$_ingest_readmes" | tr '[:upper:]' '[:lower:]')" in
425
- false|no|0|disabled|off) _skip_all_readmes=1 ;;
426
- *) _skip_all_readmes=0 ;;
427
- esac
428
-
422
+ # 2. Automatically ingest README.md from registered/enabled member repositories when included in sources
429
423
  _rd=""
430
424
  for _cfg in "$_root/.local.rnex.yaml" "$_root/rnex.yaml"; do
431
425
  [ -f "$_cfg" ] || continue
@@ -448,6 +442,24 @@ done
448
442
  REPOS_DIR="${_rd:-./repos}"
449
443
  _clean_repos="$(printf '%s' "$REPOS_DIR" | sed -e 's#^[[:space:]]*##' -e 's#[[:space:]]*$##' -e 's#^\./##' -e 's#^/##' -e 's#/$##')"
450
444
 
445
+ _skip_all_readmes=0
446
+ if command -v get_plugin_config_list >/dev/null 2>&1; then
447
+ _src_list="$(NEXUS_DIR="$_root" WORKSPACE_YAML="$_root/rnex.yaml" WORKSPACE_LOCAL_YAML="$_root/.local.rnex.yaml" get_plugin_config_list "karpathy-llm" "sources" 2>/dev/null || true)"
448
+ if [ -n "$_src_list" ]; then
449
+ _skip_all_readmes=1
450
+ while IFS= read -r _s_item || [ -n "$_s_item" ]; do
451
+ case "$_s_item" in
452
+ *README*|*readme*|repos/*|"./repos/"*|"$_clean_repos"/*|*"**"*)
453
+ _skip_all_readmes=0
454
+ break
455
+ ;;
456
+ esac
457
+ done <<EOF_SRC
458
+ $_src_list
459
+ EOF_SRC
460
+ fi
461
+ fi
462
+
451
463
  list_configured_repos() {
452
464
  for _cfg_file in "$_root/.local.rnex.yaml" "$_root/rnex.yaml"; do
453
465
  [ -f "$_cfg_file" ] || continue
@@ -475,7 +487,6 @@ if [ "$_skip_all_readmes" -ne 1 ]; then
475
487
 
476
488
  # Check if this repository is explicitly disabled in .local.rnex.yaml or rnex.yaml (block-scoped)
477
489
  _is_disabled=""
478
- _repo_ingest=""
479
490
  for _cfg_file in "$RNEX_ROOT/.local.rnex.yaml" "$RNEX_ROOT/rnex.yaml"; do
480
491
  [ -f "$_cfg_file" ] || continue
481
492
  _en="$(awk -v repo="$repo_name" '
@@ -499,27 +510,6 @@ if [ "$_skip_all_readmes" -ne 1 ]; then
499
510
  esac
500
511
  fi
501
512
 
502
- _ingest_val="$(awk -v repo="$repo_name" '
503
- /^repos:[ ]*$/ || /^repos:[ ]*#/ { r=1; next }
504
- r && /^[^ #]/ { r=0 }
505
- r && match($0, "^ " repo ":[ ]*(\\{\\})?[ ]*(#.*)?$") { in_target=1; next }
506
- in_target && /^ [^ #]/ { in_target=0 }
507
- in_target && match($0, "^ ingest_member_readmes:[ ]*") {
508
- line = $0
509
- sub("^ ingest_member_readmes:[ ]*", "", line)
510
- sub(/[ ]*#.*$/, "", line)
511
- gsub(/^["\047]|["\047]$/, "", line)
512
- print line
513
- exit
514
- }
515
- ' "$_cfg_file")"
516
- if [ -n "$_ingest_val" ] && [ -z "$_repo_ingest" ]; then
517
- case "$(printf '%s' "$_ingest_val" | tr '[:upper:]' '[:lower:]')" in
518
- false|no|0|disabled|off) _repo_ingest=0 ;;
519
- *) _repo_ingest=1 ;;
520
- esac
521
- fi
522
-
523
513
  if [ -z "$_custom_path" ]; then
524
514
  _cp="$(awk -v repo="$repo_name" '
525
515
  /^repos:[ ]*$/ || /^repos:[ ]*#/ { r=1; next }
@@ -539,7 +529,6 @@ if [ "$_skip_all_readmes" -ne 1 ]; then
539
529
  fi
540
530
  done
541
531
  [ "$_is_disabled" = "1" ] && continue
542
- [ "$_repo_ingest" = "0" ] && continue
543
532
 
544
533
  # Resolve physical repository path and relative location
545
534
  _repo_rel=""
@@ -11,15 +11,12 @@ config_defaults:
11
11
  wiki_dir: ".rnex/wiki"
12
12
  lint_trigger: "manual" # Default changed to manual to avoid unsolicited background trigger tasks
13
13
  notify_on_changes: true
14
- ingest_member_readmes: true
15
14
 
16
15
  config_descriptions:
17
16
  sources: "<list> (intake directories and/or glob patterns; .local.rnex.yaml list replaces rnex.yaml list)"
18
17
  wiki_dir: "<dir> (directory for curated markdown pages)"
19
- raw_dir: "<dir> (deprecated: single intake directory, used only when sources is unset)"
20
18
  lint_trigger: "git-post-merge|git-post-commit|git-pre-commit|git-pre-push|manual"
21
19
  notify_on_changes: "true|false (show notification when raw/wiki changes are committed)"
22
- ingest_member_readmes: "true|false (automatically track member repository READMEs in wiki)"
23
20
 
24
21
  rules:
25
22
  - rules/behavioral.md: .rnex/plugins/karpathy-llm/rules/behavioral.md