repo-nexus 0.7.7 → 0.7.10
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 +13 -0
- package/docs/CLI.md +2 -2
- package/docs/ai-instructions.sample.md +3 -0
- package/docs/plugins/claude.md +5 -5
- package/docs/plugins/copilot.md +1 -1
- package/docs/plugins/cursor.md +2 -2
- package/docs/plugins/gemini.md +5 -5
- package/docs/plugins/index.md +1 -1
- package/docs/plugins/karpathy-llm.md +1 -1
- package/docs/plugins/windsurf.md +3 -3
- package/docs/rnex.example.yaml +2 -0
- package/lib/ai.sh +157 -16
- package/lib/commands/init.sh +1 -1
- package/lib/commands/plugin.sh +2 -0
- package/lib/commands/status.sh +5 -2
- package/lib/hooks.sh +132 -10
- package/lib/yaml.sh +2 -2
- package/package.json +1 -1
- package/templates/ai-instructions.sample.md +3 -0
- package/templates/rnex.example.yaml +2 -0
- package/toolkit/plugins/karpathy-llm/README.md +8 -8
- package/toolkit/plugins/karpathy-llm/hooks/after_sync.sh +53 -28
- package/toolkit/plugins/karpathy-llm/hooks/before_plugin_disable.sh +8 -0
- package/toolkit/plugins/karpathy-llm/instructions/rnex-wiki-architecture.md +4 -3
- package/toolkit/plugins/karpathy-llm/instructions.md +3 -2
- package/toolkit/plugins/karpathy-llm/plugin.yaml +2 -0
- package/toolkit/plugins/karpathy-llm/rules/behavioral.md +4 -0
- package/toolkit/plugins/karpathy-llm/skills/wiki-ingest.md +10 -6
- package/toolkit/plugins/karpathy-llm/skills/wiki-lint.md +5 -1
- package/toolkit/plugins/karpathy-llm/templates/hot.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,19 @@ All notable changes to Repo Nexus (`rnex`) will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.7.7] - 2026-10-15
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **Native `SKILL.md` Bundle Support for User Skills**:
|
|
12
|
+
- Upgraded User Skill generator (`rnex_register_user_skill`) to emit dual formats tailored to each AI provider's discovery engine:
|
|
13
|
+
- **Skill-Based Providers (`.github/skills/`, `.claude/skills/`, `.gemini/skills/`)**: Generates native `rnex-<name>/SKILL.md` directory bundles containing YAML frontmatter (`name: rnex-<name>`, `description: "..."`) for automatic discoverability in VS Code, Copilot Chat, Antigravity, and Claude Code skill-pickers.
|
|
14
|
+
- **Rule-Based Providers (`.cursor/rules/`, `.windsurf/rules/`)**: Generates flat `rnex-<name>.md` pointer files aligning with Cursor and Windsurf rule conventions.
|
|
15
|
+
- Automatically extracts skill descriptions from target markdown headers to populate YAML frontmatter cleanly.
|
|
16
|
+
- **GitHub Copilot Integration Plugin (`copilot`)**:
|
|
17
|
+
- Restored `copilot` as a first-class AI provider plugin in `toolkit/plugins/copilot/`.
|
|
18
|
+
- Supports `instructions: true` (managing `.github/copilot-instructions.md` within non-destructive delimiters) and `skills: true` (generating native User Skill bundles in `.github/skills/`).
|
|
19
|
+
- Added CLI flags `--copilot` and `--no-copilot` to `rnex init`.
|
|
20
|
+
|
|
8
21
|
## [0.7.5] - 2026-10-15
|
|
9
22
|
|
|
10
23
|
### Added
|
package/docs/CLI.md
CHANGED
|
@@ -87,8 +87,8 @@ Every lifecycle hook receives the following environment variables:
|
|
|
87
87
|
| `RNEX_QUIET` | Set to `1` when `--quiet` was passed, `0` otherwise. |
|
|
88
88
|
|
|
89
89
|
Hooks have access to POSIX helper functions for managing User Skill pointers:
|
|
90
|
-
- `rnex_register_user_skill <skill_name> <target_path_in_rnex>`: Generates a zero-logic user skill pointer (`rnex-<
|
|
91
|
-
- `rnex_unregister_user_skill <skill_name>`: Removes the `rnex-<skill_name
|
|
90
|
+
- `rnex_register_user_skill <skill_name> <target_path_in_rnex>`: Generates a zero-logic user skill pointer (either a native `rnex-<name>/SKILL.md` bundle with YAML frontmatter for skill-based providers, or a flat `rnex-<name>.md` file for rule-based providers) linking to the target skill protocol.
|
|
91
|
+
- `rnex_unregister_user_skill <skill_name>`: Removes the `rnex-<skill_name>` user skill pointer (bundle or flat file) from all active provider directories.
|
|
92
92
|
|
|
93
93
|
### Karpathy LLM Wiki Plugin
|
|
94
94
|
The `karpathy-llm` plugin uses lifecycle hooks to manage its domain directories:
|
|
@@ -23,3 +23,6 @@ When workspace configuration, routing blocks, plugin assets, or member repositor
|
|
|
23
23
|
|
|
24
24
|
## Git Operations
|
|
25
25
|
Commit and push changes directly within the respective member repository root (`repos/<name>/`).
|
|
26
|
+
|
|
27
|
+
## Wiki Operations
|
|
28
|
+
`raw_dir` (`./docs`) and `./repos/` are strictly read-only inputs during wiki operations. Never create, copy, or modify files inside `./docs`; write generated output exclusively inside `wiki_dir` (`.rnex/wiki/`).
|
package/docs/plugins/claude.md
CHANGED
|
@@ -7,7 +7,7 @@ description: Integrate Anthropic Claude Code with Repo Nexus, generating zero-lo
|
|
|
7
7
|
|
|
8
8
|
The **`claude`** plugin integrates Anthropic Claude Code CLI (`claude`) and Claude Desktop into a Repo Nexus Virtual Meta-Repo.
|
|
9
9
|
|
|
10
|
-
All AI assistants in Repo Nexus share [`AGENTS.md`](file:///Users/admin/Projects/ai/repo-nexus/AGENTS.md) at the workspace root as the single universal source of truth for routing. When enabled, the `claude` plugin generates zero-logic User Skill pointers into `.claude/skills/` (e.g. `rnex-clone-sync.md`, `rnex-batch-exec.md`, `rnex-wiki-ingest
|
|
10
|
+
All AI assistants in Repo Nexus share [`AGENTS.md`](file:///Users/admin/Projects/ai/repo-nexus/AGENTS.md) at the workspace root as the single universal source of truth for routing. When enabled, the `claude` plugin generates zero-logic User Skill pointers into `.claude/skills/` (e.g. `rnex-clone-sync.md`, `rnex-batch-exec.md`, `rnex-karpathy-llm-wiki-ingest`).
|
|
11
11
|
|
|
12
12
|
Operational skills, rules, and subagents remain cleanly encapsulated within `.rnex/skills/` and active plugin directories (`.rnex/plugins/<plugin-name>/`).
|
|
13
13
|
|
|
@@ -15,8 +15,8 @@ Operational skills, rules, and subagents remain cleanly encapsulated within `.rn
|
|
|
15
15
|
|
|
16
16
|
## Capabilities
|
|
17
17
|
|
|
18
|
-
1. **Zero-Logic User Skills (`.claude/skills/rnex
|
|
19
|
-
- Generates
|
|
18
|
+
1. **Zero-Logic User Skills (`.claude/skills/rnex-*/SKILL.md`)**:
|
|
19
|
+
- Generates native `SKILL.md` bundles prefixed with `rnex-` in `.claude/skills/` with YAML frontmatter for Claude Code skill discovery.
|
|
20
20
|
- Contains zero inline heuristics—redirects Claude directly to the underlying agentic skill protocols inside `.rnex/`.
|
|
21
21
|
|
|
22
22
|
2. **Native Instruction Support via `CLAUDE.md` & `AGENTS.md`**:
|
|
@@ -84,8 +84,8 @@ my-workspace/
|
|
|
84
84
|
│ ├── rnex-clone-sync.md
|
|
85
85
|
│ ├── rnex-batch-exec.md
|
|
86
86
|
│ ├── rnex-workspace-status.md
|
|
87
|
-
│ ├── rnex-wiki-ingest
|
|
88
|
-
│ └── rnex-wiki-lint
|
|
87
|
+
│ ├── rnex-karpathy-llm-wiki-ingest/
|
|
88
|
+
│ └── rnex-karpathy-llm-wiki-lint/
|
|
89
89
|
├── .rnex/
|
|
90
90
|
│ ├── skills/ # Core workspace agentic skills
|
|
91
91
|
│ └── plugins/
|
package/docs/plugins/copilot.md
CHANGED
|
@@ -12,7 +12,7 @@ The `copilot` plugin integrates GitHub Copilot with Repo Nexus by projecting wor
|
|
|
12
12
|
GitHub Copilot operates natively within VS Code, Visual Studio, JetBrains, and GitHub.com:
|
|
13
13
|
- **Universal Routing (`AGENTS.md`)**: GitHub Copilot natively reads `AGENTS.md` at the workspace root.
|
|
14
14
|
- **Custom Instructions (`.github/copilot-instructions.md`)**: When `instructions: true`, Repo Nexus injects its non-destructive routing block inside `<!-- REPO-NEXUS:START -->` and `<!-- REPO-NEXUS:END -->`. Custom developer rules outside these markers are strictly preserved.
|
|
15
|
-
- **User Skills (`.github/skills/`)**: When `skills: true`,
|
|
15
|
+
- **User Skills (`.github/skills/`)**: When `skills: true`, Repo Nexus generates native `SKILL.md` directory bundles (`.github/skills/rnex-<name>/SKILL.md`) with YAML frontmatter, making them automatically discoverable in VS Code and Copilot Chat skill-pickers while redirecting to the underlying agentic skills under `.rnex/skills/` and active plugins.
|
|
16
16
|
|
|
17
17
|
## Configuration
|
|
18
18
|
|
package/docs/plugins/cursor.md
CHANGED
|
@@ -83,8 +83,8 @@ my-workspace/
|
|
|
83
83
|
│ ├── rnex-clone-sync.md
|
|
84
84
|
│ ├── rnex-batch-exec.md
|
|
85
85
|
│ ├── rnex-workspace-status.md
|
|
86
|
-
│ ├── rnex-wiki-ingest.md
|
|
87
|
-
│ └── rnex-wiki-lint.md
|
|
86
|
+
│ ├── rnex-karpathy-llm-wiki-ingest.md
|
|
87
|
+
│ └── rnex-karpathy-llm-wiki-lint.md
|
|
88
88
|
├── .rnex/
|
|
89
89
|
│ ├── skills/ # Core workspace agentic skills
|
|
90
90
|
│ └── plugins/
|
package/docs/plugins/gemini.md
CHANGED
|
@@ -7,7 +7,7 @@ description: Integrate Google Gemini and Antigravity IDE with Repo Nexus, genera
|
|
|
7
7
|
|
|
8
8
|
The **`gemini`** plugin integrates Google Gemini CLI and Google Antigravity IDE into a Repo Nexus Virtual Meta-Repo.
|
|
9
9
|
|
|
10
|
-
All AI assistants in Repo Nexus share [`AGENTS.md`](file:///Users/admin/Projects/ai/repo-nexus/AGENTS.md) at the workspace root as the single universal source of truth for routing. When enabled, the `gemini` plugin generates zero-logic User Skill pointers into `.gemini/skills/` (e.g. `rnex-clone-sync.md`, `rnex-batch-exec.md`, `rnex-wiki-ingest
|
|
10
|
+
All AI assistants in Repo Nexus share [`AGENTS.md`](file:///Users/admin/Projects/ai/repo-nexus/AGENTS.md) at the workspace root as the single universal source of truth for routing. When enabled, the `gemini` plugin generates zero-logic User Skill pointers into `.gemini/skills/` (e.g. `rnex-clone-sync.md`, `rnex-batch-exec.md`, `rnex-karpathy-llm-wiki-ingest`).
|
|
11
11
|
|
|
12
12
|
Operational skills, rules, and subagents remain cleanly encapsulated within `.rnex/skills/` and active plugin directories (`.rnex/plugins/<plugin-name>/`).
|
|
13
13
|
|
|
@@ -15,8 +15,8 @@ Operational skills, rules, and subagents remain cleanly encapsulated within `.rn
|
|
|
15
15
|
|
|
16
16
|
## Capabilities
|
|
17
17
|
|
|
18
|
-
1. **Zero-Logic User Skills (`.gemini/skills/rnex
|
|
19
|
-
- Generates
|
|
18
|
+
1. **Zero-Logic User Skills (`.gemini/skills/rnex-*/SKILL.md`)**:
|
|
19
|
+
- Generates native `SKILL.md` bundles prefixed with `rnex-` in `.gemini/skills/` with YAML frontmatter for Gemini and Antigravity skill discovery.
|
|
20
20
|
- Contains zero inline heuristics—redirects Gemini/Antigravity directly to the underlying agentic skill protocols inside `.rnex/`.
|
|
21
21
|
|
|
22
22
|
2. **Native Instructions Support via `GEMINI.md`**:
|
|
@@ -83,8 +83,8 @@ my-workspace/
|
|
|
83
83
|
│ ├── rnex-clone-sync.md
|
|
84
84
|
│ ├── rnex-batch-exec.md
|
|
85
85
|
│ ├── rnex-workspace-status.md
|
|
86
|
-
│ ├── rnex-wiki-ingest
|
|
87
|
-
│ └── rnex-wiki-lint
|
|
86
|
+
│ ├── rnex-karpathy-llm-wiki-ingest/
|
|
87
|
+
│ └── rnex-karpathy-llm-wiki-lint/
|
|
88
88
|
├── .rnex/
|
|
89
89
|
│ ├── skills/ # Core workspace agentic skills
|
|
90
90
|
│ └── plugins/
|
package/docs/plugins/index.md
CHANGED
|
@@ -23,7 +23,7 @@ Active plugins are mirrored into each active member repository under `repos/<nam
|
|
|
23
23
|
Repo Nexus decouples functional plugins from AI provider plugins:
|
|
24
24
|
- **Core Skills (`toolkit/skills/` $\rightarrow$ `.rnex/skills/`)**: Workspace-level capabilities owned by Repo Nexus core.
|
|
25
25
|
- **Plugin Skills (`toolkit/plugins/<plugin>/skills/` $\rightarrow$ `.rnex/plugins/<plugin>/skills/`)**: Scoped domain skills owned exclusively by individual plugins.
|
|
26
|
-
- **User Skills
|
|
26
|
+
- **User Skills**: Provider plugins (`copilot`, `claude`, `gemini`, `cursor`, and `windsurf`) project zero-logic user skill pointers into active provider directories using native `SKILL.md` bundles with YAML frontmatter in skill directories (`.github/skills/`, `.claude/skills/`, `.gemini/skills/`) and flat files in rule directories (`.cursor/rules/`, `.windsurf/rules/`), redirecting AI assistants directly to the underlying agentic skills in `.rnex/`.
|
|
27
27
|
|
|
28
28
|
### 4. Non-Destructive Delimited Merging
|
|
29
29
|
When plugins update root instruction files (`AGENTS.md`, `CLAUDE.md`, `GEMINI.md`, `.cursorrules`, `.windsurfrules`), Repo Nexus isolates auto-managed routing between explicit delimiters:
|
|
@@ -169,7 +169,7 @@ The `karpathy-llm` plugin encapsulates its agentic skills in `.rnex/plugins/karp
|
|
|
169
169
|
- `wiki-ingest.md`
|
|
170
170
|
- `wiki-lint.md`
|
|
171
171
|
|
|
172
|
-
During `rnex sync`, its `after_sync.sh` lifecycle hook automatically registers zero-logic User Skill pointers (`rnex-wiki-ingest
|
|
172
|
+
During `rnex sync`, its `after_sync.sh` lifecycle hook automatically registers zero-logic User Skill pointers (`rnex-karpathy-llm-wiki-ingest` and `rnex-karpathy-llm-wiki-lint`) across all enabled AI provider directories (`.cursor/rules/`, `.claude/skills/`, `.gemini/skills/`, `.windsurf/rules/`).
|
|
173
173
|
|
|
174
174
|
When running `rnex plugin disable karpathy-llm`, its `before_plugin_disable.sh` lifecycle hook automatically unregisters the User Skills from all provider directories, while keeping core workspace skills intact.
|
|
175
175
|
|
package/docs/plugins/windsurf.md
CHANGED
|
@@ -7,7 +7,7 @@ description: Integrate Windsurf IDE and Cascade with Repo Nexus, generating zero
|
|
|
7
7
|
|
|
8
8
|
The **`windsurf`** plugin integrates Codeium's Windsurf IDE and Cascade into a Repo Nexus Virtual Meta-Repo.
|
|
9
9
|
|
|
10
|
-
All AI assistants in Repo Nexus share [`AGENTS.md`](file:///Users/admin/Projects/ai/repo-nexus/AGENTS.md) at the workspace root as the single universal source of truth for routing. When enabled, the `windsurf` plugin generates zero-logic User Skill pointers into `.windsurf/rules/` (e.g. `rnex-clone-sync.md`, `rnex-batch-exec.md`, `rnex-wiki-ingest.md`).
|
|
10
|
+
All AI assistants in Repo Nexus share [`AGENTS.md`](file:///Users/admin/Projects/ai/repo-nexus/AGENTS.md) at the workspace root as the single universal source of truth for routing. When enabled, the `windsurf` plugin generates zero-logic User Skill pointers into `.windsurf/rules/` (e.g. `rnex-clone-sync.md`, `rnex-batch-exec.md`, `rnex-karpathy-llm-wiki-ingest.md`).
|
|
11
11
|
|
|
12
12
|
Operational skills, rules, and subagents remain cleanly encapsulated within `.rnex/skills/` and active plugin directories (`.rnex/plugins/<plugin-name>/`).
|
|
13
13
|
|
|
@@ -83,8 +83,8 @@ my-workspace/
|
|
|
83
83
|
│ ├── rnex-clone-sync.md
|
|
84
84
|
│ ├── rnex-batch-exec.md
|
|
85
85
|
│ ├── rnex-workspace-status.md
|
|
86
|
-
│ ├── rnex-wiki-ingest.md
|
|
87
|
-
│ └── rnex-wiki-lint.md
|
|
86
|
+
│ ├── rnex-karpathy-llm-wiki-ingest.md
|
|
87
|
+
│ └── rnex-karpathy-llm-wiki-lint.md
|
|
88
88
|
├── .rnex/
|
|
89
89
|
│ ├── skills/ # Core workspace agentic skills
|
|
90
90
|
│ └── plugins/
|
package/docs/rnex.example.yaml
CHANGED
|
@@ -107,6 +107,8 @@ plugins:
|
|
|
107
107
|
# wiki_dir: ".rnex/wiki" # Directory for curated atomic markdown pages (default: .rnex/wiki)
|
|
108
108
|
# lint_trigger: "manual" # Runs manually via 'rnex sync' or validation checklists (git-post-merge, git-post-commit, git-pre-commit, git-pre-push, manual)
|
|
109
109
|
# notify_on_changes: true # Show notification when changes are committed to ./docs or .rnex/wiki
|
|
110
|
+
# ingest_member_readmes: true # Automatically ingest member repository READMEs into atomic wiki pages (default: true)
|
|
111
|
+
|
|
110
112
|
|
|
111
113
|
# ------------------------------------------------------------------------------
|
|
112
114
|
# repos — Member repositories managed by Repo Nexus
|
package/lib/ai.sh
CHANGED
|
@@ -124,6 +124,9 @@ When workspace configuration, routing blocks, plugin assets, or member repositor
|
|
|
124
124
|
|
|
125
125
|
## Git Operations
|
|
126
126
|
Commit and push changes directly within the respective member repository root (`repos/<name>/`).
|
|
127
|
+
|
|
128
|
+
## Wiki Operations
|
|
129
|
+
`raw_dir` (`./docs`) and `./repos/` are strictly read-only inputs during wiki operations. Never create, copy, or modify files inside `./docs`; write generated output exclusively inside `wiki_dir` (`.rnex/wiki/`).
|
|
127
130
|
BASE_AI_EOF
|
|
128
131
|
fi
|
|
129
132
|
|
|
@@ -367,24 +370,90 @@ if [ -z "$RNEX_PROVIDER_SKILL_DIRS" ]; then
|
|
|
367
370
|
export RNEX_PROVIDER_SKILL_DIRS="$_dirs"
|
|
368
371
|
fi
|
|
369
372
|
|
|
370
|
-
|
|
373
|
+
rnex_generate_user_skill() {
|
|
371
374
|
skill_name="$1"
|
|
372
375
|
target_path="$2"
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
376
|
+
plugin_name="${3:-}"
|
|
377
|
+
|
|
378
|
+
if [ -n "$plugin_name" ]; then
|
|
379
|
+
full_name="rnex-${plugin_name}-${skill_name}"
|
|
380
|
+
else
|
|
381
|
+
full_name="rnex-${skill_name}"
|
|
382
|
+
fi
|
|
383
|
+
_dirs="${RNEX_PROVIDER_SKILL_DIRS:-}"
|
|
384
|
+
_r="${RNEX_ROOT:-.}"
|
|
385
|
+
|
|
386
|
+
_target_file=""
|
|
387
|
+
if [ -f "$_r/$target_path" ]; then
|
|
388
|
+
_target_file="$_r/$target_path"
|
|
389
|
+
elif [ -f "$target_path" ]; then
|
|
390
|
+
_target_file="$target_path"
|
|
391
|
+
fi
|
|
392
|
+
|
|
393
|
+
_skill_desc=""
|
|
394
|
+
if [ -n "$_target_file" ]; then
|
|
395
|
+
_skill_desc="$(awk 'NF && !/^#/ { print; exit }' "$_target_file" 2>/dev/null)"
|
|
396
|
+
fi
|
|
397
|
+
if [ -z "$_skill_desc" ]; then
|
|
398
|
+
_skill_desc="Repo Nexus agentic skill protocol for ${full_name}."
|
|
399
|
+
fi
|
|
400
|
+
_skill_desc="$(printf '%s' "$_skill_desc" | tr '\n\r' ' ' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//;s/"/\\"/g')"
|
|
401
|
+
|
|
402
|
+
for provider_dir in $_dirs; do
|
|
403
|
+
case "$provider_dir" in
|
|
404
|
+
*rules*)
|
|
405
|
+
mkdir -p "$_r/$provider_dir"
|
|
406
|
+
rm -rf "${_r:?}/${provider_dir:?}/${full_name:?}" 2>/dev/null || true
|
|
407
|
+
cat << EOF > "$_r/$provider_dir/${full_name}.md"
|
|
408
|
+
# User Skill: ${full_name}
|
|
377
409
|
|
|
378
410
|
CRITICAL: Do not execute inline heuristics. Read and strictly follow the agentic skill protocol at:
|
|
379
411
|
\`${target_path}\`
|
|
380
412
|
EOF
|
|
413
|
+
;;
|
|
414
|
+
*)
|
|
415
|
+
mkdir -p "$_r/$provider_dir/${full_name}"
|
|
416
|
+
rm -f "$_r/$provider_dir/${full_name}.md" 2>/dev/null || true
|
|
417
|
+
cat << EOF > "$_r/$provider_dir/${full_name}/SKILL.md"
|
|
418
|
+
---
|
|
419
|
+
name: ${full_name}
|
|
420
|
+
description: "${_skill_desc}"
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
# User Skill: ${full_name}
|
|
424
|
+
|
|
425
|
+
CRITICAL: Do not execute inline heuristics. Read and strictly follow the agentic skill protocol at:
|
|
426
|
+
\`${target_path}\`
|
|
427
|
+
EOF
|
|
428
|
+
;;
|
|
429
|
+
esac
|
|
381
430
|
done
|
|
382
431
|
}
|
|
383
432
|
|
|
433
|
+
rnex_register_user_skill() {
|
|
434
|
+
rnex_generate_user_skill "$@"
|
|
435
|
+
}
|
|
436
|
+
|
|
384
437
|
rnex_unregister_user_skill() {
|
|
385
438
|
skill_name="$1"
|
|
386
|
-
|
|
387
|
-
|
|
439
|
+
plugin_name="${2:-}"
|
|
440
|
+
if [ -n "$plugin_name" ]; then
|
|
441
|
+
full_name="rnex-${plugin_name}-${skill_name}"
|
|
442
|
+
else
|
|
443
|
+
case "$skill_name" in
|
|
444
|
+
rnex-*) full_name="$skill_name" ;;
|
|
445
|
+
*) full_name="rnex-${skill_name}" ;;
|
|
446
|
+
esac
|
|
447
|
+
fi
|
|
448
|
+
_dirs="${RNEX_PROVIDER_SKILL_DIRS:-}"
|
|
449
|
+
_r="${RNEX_ROOT:-.}"
|
|
450
|
+
for provider_dir in $_dirs; do
|
|
451
|
+
rm -f "$_r/$provider_dir/${full_name}.md"
|
|
452
|
+
rm -rf "${_r:?}/${provider_dir:?}/${full_name:?}"
|
|
453
|
+
if [ -n "$plugin_name" ]; then
|
|
454
|
+
rm -f "$_r/$provider_dir/rnex-${skill_name}.md"
|
|
455
|
+
rm -rf "${_r:?}/${provider_dir:?}/rnex-${skill_name:?}"
|
|
456
|
+
fi
|
|
388
457
|
done
|
|
389
458
|
}
|
|
390
459
|
ENV_EOF
|
|
@@ -411,30 +480,95 @@ get_active_provider_skill_dirs() {
|
|
|
411
480
|
printf '%s' "$_dirs"
|
|
412
481
|
}
|
|
413
482
|
|
|
414
|
-
# Usage:
|
|
415
|
-
|
|
483
|
+
# Usage: rnex_generate_user_skill <skill_name> <target_path_in_rnex> [plugin_name]
|
|
484
|
+
rnex_generate_user_skill() {
|
|
416
485
|
skill_name="$1"
|
|
417
486
|
target_path="$2"
|
|
487
|
+
plugin_name="${3:-}"
|
|
488
|
+
|
|
489
|
+
if [ -n "$plugin_name" ]; then
|
|
490
|
+
full_name="rnex-${plugin_name}-${skill_name}"
|
|
491
|
+
else
|
|
492
|
+
full_name="rnex-${skill_name}"
|
|
493
|
+
fi
|
|
494
|
+
|
|
418
495
|
_dirs="${RNEX_PROVIDER_SKILL_DIRS:-$(get_active_provider_skill_dirs)}"
|
|
419
496
|
_r="${NEXUS_DIR:-${RNEX_ROOT:-.}}"
|
|
497
|
+
|
|
498
|
+
_target_file=""
|
|
499
|
+
if [ -f "$_r/$target_path" ]; then
|
|
500
|
+
_target_file="$_r/$target_path"
|
|
501
|
+
elif [ -f "$target_path" ]; then
|
|
502
|
+
_target_file="$target_path"
|
|
503
|
+
fi
|
|
504
|
+
|
|
505
|
+
_skill_desc=""
|
|
506
|
+
if [ -n "$_target_file" ]; then
|
|
507
|
+
_skill_desc="$(awk 'NF && !/^#/ { print; exit }' "$_target_file" 2>/dev/null)"
|
|
508
|
+
fi
|
|
509
|
+
if [ -z "$_skill_desc" ]; then
|
|
510
|
+
_skill_desc="Repo Nexus agentic skill protocol for ${full_name}."
|
|
511
|
+
fi
|
|
512
|
+
_skill_desc="$(printf '%s' "$_skill_desc" | tr '\n\r' ' ' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//;s/"/\\"/g')"
|
|
513
|
+
|
|
420
514
|
for provider_dir in $_dirs; do
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
515
|
+
case "$provider_dir" in
|
|
516
|
+
*rules*)
|
|
517
|
+
mkdir -p "$_r/$provider_dir"
|
|
518
|
+
rm -rf "${_r:?}/${provider_dir:?}/${full_name:?}" 2>/dev/null || true
|
|
519
|
+
cat << EOF > "$_r/$provider_dir/${full_name}.md"
|
|
520
|
+
# User Skill: ${full_name}
|
|
424
521
|
|
|
425
522
|
CRITICAL: Do not execute inline heuristics. Read and strictly follow the agentic skill protocol at:
|
|
426
523
|
\`${target_path}\`
|
|
427
524
|
EOF
|
|
525
|
+
;;
|
|
526
|
+
*)
|
|
527
|
+
mkdir -p "$_r/$provider_dir/${full_name}"
|
|
528
|
+
rm -f "$_r/$provider_dir/${full_name}.md" 2>/dev/null || true
|
|
529
|
+
cat << EOF > "$_r/$provider_dir/${full_name}/SKILL.md"
|
|
530
|
+
---
|
|
531
|
+
name: ${full_name}
|
|
532
|
+
description: "${_skill_desc}"
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
# User Skill: ${full_name}
|
|
536
|
+
|
|
537
|
+
CRITICAL: Do not execute inline heuristics. Read and strictly follow the agentic skill protocol at:
|
|
538
|
+
\`${target_path}\`
|
|
539
|
+
EOF
|
|
540
|
+
;;
|
|
541
|
+
esac
|
|
428
542
|
done
|
|
429
543
|
}
|
|
430
544
|
|
|
431
|
-
# Usage:
|
|
545
|
+
# Usage: rnex_register_user_skill <skill_name> <target_path_in_rnex> [plugin_name]
|
|
546
|
+
rnex_register_user_skill() {
|
|
547
|
+
rnex_generate_user_skill "$@"
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
# Usage: rnex_unregister_user_skill <skill_name> [plugin_name]
|
|
432
551
|
rnex_unregister_user_skill() {
|
|
433
552
|
skill_name="$1"
|
|
553
|
+
plugin_name="${2:-}"
|
|
554
|
+
if [ -n "$plugin_name" ]; then
|
|
555
|
+
full_name="rnex-${plugin_name}-${skill_name}"
|
|
556
|
+
else
|
|
557
|
+
case "$skill_name" in
|
|
558
|
+
rnex-*) full_name="$skill_name" ;;
|
|
559
|
+
*) full_name="rnex-${skill_name}" ;;
|
|
560
|
+
esac
|
|
561
|
+
fi
|
|
562
|
+
|
|
434
563
|
_dirs="${RNEX_PROVIDER_SKILL_DIRS:-$(get_active_provider_skill_dirs)}"
|
|
435
564
|
_r="${NEXUS_DIR:-${RNEX_ROOT:-.}}"
|
|
436
565
|
for provider_dir in $_dirs; do
|
|
437
|
-
rm -f "$_r/$provider_dir
|
|
566
|
+
rm -f "$_r/$provider_dir/${full_name}.md"
|
|
567
|
+
rm -rf "${_r:?}/${provider_dir:?}/${full_name:?}"
|
|
568
|
+
if [ -n "$plugin_name" ]; then
|
|
569
|
+
rm -f "$_r/$provider_dir/rnex-${skill_name}.md"
|
|
570
|
+
rm -rf "${_r:?}/${provider_dir:?}/rnex-${skill_name:?}"
|
|
571
|
+
fi
|
|
438
572
|
done
|
|
439
573
|
}
|
|
440
574
|
|
|
@@ -444,8 +578,7 @@ clean_provider_user_skills() {
|
|
|
444
578
|
rm -f "$_sk_dir"/rnex-*.md 2>/dev/null || true
|
|
445
579
|
for _d in "$_sk_dir"/rnex-*; do
|
|
446
580
|
[ -d "$_d" ] || continue
|
|
447
|
-
rm -
|
|
448
|
-
rmdir "$_d" 2>/dev/null || true
|
|
581
|
+
rm -rf "$_d" 2>/dev/null || true
|
|
449
582
|
done
|
|
450
583
|
rmdir "$_sk_dir" 2>/dev/null || true
|
|
451
584
|
}
|
|
@@ -457,10 +590,12 @@ clean_provider_skills() {
|
|
|
457
590
|
clean_plugin_user_skills() {
|
|
458
591
|
_pdir="$1"
|
|
459
592
|
[ -d "$_pdir" ] || return 0
|
|
593
|
+
_pname="$(basename "$_pdir")"
|
|
460
594
|
if [ -d "$_pdir/skills" ]; then
|
|
461
595
|
for _sk_file in "$_pdir/skills"/*.md; do
|
|
462
596
|
[ -f "$_sk_file" ] || continue
|
|
463
597
|
_sk_name="$(basename "$_sk_file" .md)"
|
|
598
|
+
rnex_unregister_user_skill "$_sk_name" "$_pname"
|
|
464
599
|
rnex_unregister_user_skill "$_sk_name"
|
|
465
600
|
done
|
|
466
601
|
fi
|
|
@@ -555,6 +690,12 @@ sync_rnex_base_assets() {
|
|
|
555
690
|
rm -f "$NEXUS_DIR/.rnex/skills/wiki-ingest.md" "$NEXUS_DIR/.rnex/skills/wiki-lint.md" \
|
|
556
691
|
"$NEXUS_DIR/.rnex/skills/rnex-wiki-ingest.md" "$NEXUS_DIR/.rnex/skills/rnex-wiki-lint.md" 2>/dev/null || true
|
|
557
692
|
|
|
693
|
+
# Purge stale unprefixed wiki user skills across provider directories
|
|
694
|
+
for _p_dir in $(get_active_provider_skill_dirs 2>/dev/null || true); do
|
|
695
|
+
rm -f "$NEXUS_DIR/$_p_dir/rnex-wiki-ingest.md" "$NEXUS_DIR/$_p_dir/rnex-wiki-lint.md" 2>/dev/null || true
|
|
696
|
+
rm -rf "$NEXUS_DIR/$_p_dir/rnex-wiki-ingest" "$NEXUS_DIR/$_p_dir/rnex-wiki-lint" 2>/dev/null || true
|
|
697
|
+
done
|
|
698
|
+
|
|
558
699
|
# Register core User Skills across active provider directories
|
|
559
700
|
for _sk_file in "$NEXUS_DIR/.rnex/skills"/*.md; do
|
|
560
701
|
[ -f "$_sk_file" ] || continue
|
package/lib/commands/init.sh
CHANGED
|
@@ -119,7 +119,7 @@ cmd_init() {
|
|
|
119
119
|
_init_plugins="${_init_plugins} windsurf:\n instructions: true\n skills: true\n"
|
|
120
120
|
fi
|
|
121
121
|
if [ "$_cli_karpathy" = "true" ]; then
|
|
122
|
-
_init_plugins="${_init_plugins} karpathy-llm:\n raw_dir: \"./docs\"\n wiki_dir: \".rnex/wiki\"\n lint_trigger: \"manual\"\n"
|
|
122
|
+
_init_plugins="${_init_plugins} karpathy-llm:\n raw_dir: \"./docs\"\n wiki_dir: \".rnex/wiki\"\n lint_trigger: \"manual\"\n ingest_member_readmes: true\n"
|
|
123
123
|
fi
|
|
124
124
|
|
|
125
125
|
cat > "$_target_yaml" <<YAML_EOF
|
package/lib/commands/plugin.sh
CHANGED
|
@@ -83,11 +83,13 @@ cmd_plugin_info() {
|
|
|
83
83
|
if [ "$_name" = "karpathy-llm" ]; then
|
|
84
84
|
_cur_lt="$(yaml_plugin_get "karpathy-llm" "lint_trigger" 2>/dev/null || true)"
|
|
85
85
|
_cur_nc="$(yaml_plugin_get "karpathy-llm" "notify_on_changes" 2>/dev/null || true)"
|
|
86
|
+
_cur_imr="$(yaml_plugin_get "karpathy-llm" "ingest_member_readmes" 2>/dev/null || true)"
|
|
86
87
|
printf '\n%bConfigurable Options (in rnex.yaml or .local.rnex.yaml):%b\n' "$_BOLD" "$_NC"
|
|
87
88
|
printf ' - wiki_dir: <dir> (directory for curated markdown pages; current: %s)\n' "$(karpathy_wiki_dir)"
|
|
88
89
|
printf ' - raw_dir: <dir> (directory for unmodified intake documents; current: %s)\n' "$(karpathy_raw_dir)"
|
|
89
90
|
printf ' - lint_trigger: git-post-merge|git-post-commit|git-pre-commit|git-pre-push|manual (current: %s)\n' "${_cur_lt:-manual}"
|
|
90
91
|
printf ' - notify_on_changes: true|false (show notification when raw/wiki changes are committed; current: %s)\n' "${_cur_nc:-true}"
|
|
92
|
+
printf ' - ingest_member_readmes: true|false (automatically track member repository READMEs in wiki; current: %s)\n' "${_cur_imr:-true}"
|
|
91
93
|
fi
|
|
92
94
|
|
|
93
95
|
printf '\n%bScoped Directory:%b .rnex/plugins/%s\n' "$_BOLD" "$_NC" "$_name"
|
package/lib/commands/status.sh
CHANGED
|
@@ -165,15 +165,18 @@ cmd_status() {
|
|
|
165
165
|
if [ -d "$NEXUS_DIR/.cursor/rules" ] && ls "$NEXUS_DIR/.cursor/rules"/rnex-*.md >/dev/null 2>&1; then
|
|
166
166
|
printf ' %b✓%b %s %b(Cursor user skills)%b\n' "$_G" "$_NC" ".cursor/rules/" "$_DIM" "$_NC"
|
|
167
167
|
fi
|
|
168
|
-
if [ -d "$NEXUS_DIR/.claude/skills" ] && ls "$NEXUS_DIR/.claude/skills"/rnex-*.md >/dev/null 2>&1; then
|
|
168
|
+
if [ -d "$NEXUS_DIR/.claude/skills" ] && { ls "$NEXUS_DIR/.claude/skills"/rnex-*.md >/dev/null 2>&1 || ls -d "$NEXUS_DIR/.claude/skills"/rnex-* >/dev/null 2>&1; }; then
|
|
169
169
|
printf ' %b✓%b %s %b(Claude user skills)%b\n' "$_G" "$_NC" ".claude/skills/" "$_DIM" "$_NC"
|
|
170
170
|
fi
|
|
171
171
|
if [ -d "$NEXUS_DIR/.windsurf/rules" ] && ls "$NEXUS_DIR/.windsurf/rules"/rnex-*.md >/dev/null 2>&1; then
|
|
172
172
|
printf ' %b✓%b %s %b(Windsurf user skills)%b\n' "$_G" "$_NC" ".windsurf/rules/" "$_DIM" "$_NC"
|
|
173
173
|
fi
|
|
174
|
-
if [ -d "$NEXUS_DIR/.gemini/skills" ] && ls "$NEXUS_DIR/.gemini/skills"/rnex-*.md >/dev/null 2>&1; then
|
|
174
|
+
if [ -d "$NEXUS_DIR/.gemini/skills" ] && { ls "$NEXUS_DIR/.gemini/skills"/rnex-*.md >/dev/null 2>&1 || ls -d "$NEXUS_DIR/.gemini/skills"/rnex-* >/dev/null 2>&1; }; then
|
|
175
175
|
printf ' %b✓%b %s %b(Gemini user skills)%b\n' "$_G" "$_NC" ".gemini/skills/" "$_DIM" "$_NC"
|
|
176
176
|
fi
|
|
177
|
+
if [ -d "$NEXUS_DIR/.github/skills" ] && { ls "$NEXUS_DIR/.github/skills"/rnex-*.md >/dev/null 2>&1 || ls -d "$NEXUS_DIR/.github/skills"/rnex-* >/dev/null 2>&1; }; then
|
|
178
|
+
printf ' %b✓%b %s %b(Copilot user skills)%b\n' "$_G" "$_NC" ".github/skills/" "$_DIM" "$_NC"
|
|
179
|
+
fi
|
|
177
180
|
printf '\n'
|
|
178
181
|
|
|
179
182
|
printf '%bActive Plugins:%b\n' "$_BOLD" "$_NC"
|
package/lib/hooks.sh
CHANGED
|
@@ -59,25 +59,86 @@ run_hook() {
|
|
|
59
59
|
RNEX_PROVIDER_SKILL_DIRS="$_skill_dirs"
|
|
60
60
|
export RNEX_ROOT RNEX_CONFIG_MERGED RNEX_PLUGIN_DIR RNEX_CMD RNEX_ARGS RNEX_QUIET RNEX_PROVIDER_SKILL_DIRS
|
|
61
61
|
# shellcheck disable=SC2329
|
|
62
|
-
|
|
62
|
+
rnex_generate_user_skill() {
|
|
63
63
|
skill_name="$1"
|
|
64
64
|
target_path="$2"
|
|
65
|
+
plugin_name="${3:-}"
|
|
66
|
+
|
|
67
|
+
if [ -n "$plugin_name" ]; then
|
|
68
|
+
full_name="rnex-${plugin_name}-${skill_name}"
|
|
69
|
+
else
|
|
70
|
+
full_name="rnex-${skill_name}"
|
|
71
|
+
fi
|
|
72
|
+
_target_file=""
|
|
73
|
+
if [ -f "$RNEX_ROOT/$target_path" ]; then
|
|
74
|
+
_target_file="$RNEX_ROOT/$target_path"
|
|
75
|
+
elif [ -f "$target_path" ]; then
|
|
76
|
+
_target_file="$target_path"
|
|
77
|
+
fi
|
|
78
|
+
_skill_desc=""
|
|
79
|
+
if [ -n "$_target_file" ]; then
|
|
80
|
+
_skill_desc="$(awk 'NF && !/^#/ { print; exit }' "$_target_file" 2>/dev/null)"
|
|
81
|
+
fi
|
|
82
|
+
if [ -z "$_skill_desc" ]; then
|
|
83
|
+
_skill_desc="Repo Nexus agentic skill protocol for ${full_name}."
|
|
84
|
+
fi
|
|
85
|
+
_skill_desc="$(printf '%s' "$_skill_desc" | tr '\n\r' ' ' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//;s/"/\\"/g')"
|
|
86
|
+
|
|
65
87
|
for provider_dir in $RNEX_PROVIDER_SKILL_DIRS; do
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
88
|
+
case "$provider_dir" in
|
|
89
|
+
*rules*)
|
|
90
|
+
mkdir -p "$RNEX_ROOT/$provider_dir"
|
|
91
|
+
rm -rf "${RNEX_ROOT:?}/${provider_dir:?}/${full_name:?}" 2>/dev/null || true
|
|
92
|
+
cat << EOF > "$RNEX_ROOT/$provider_dir/${full_name}.md"
|
|
93
|
+
# User Skill: ${full_name}
|
|
94
|
+
|
|
95
|
+
CRITICAL: Do not execute inline heuristics. Read and strictly follow the agentic skill protocol at:
|
|
96
|
+
\`${target_path}\`
|
|
97
|
+
EOF
|
|
98
|
+
;;
|
|
99
|
+
*)
|
|
100
|
+
mkdir -p "$RNEX_ROOT/$provider_dir/${full_name}"
|
|
101
|
+
rm -f "$RNEX_ROOT/$provider_dir/${full_name}.md" 2>/dev/null || true
|
|
102
|
+
cat << EOF > "$RNEX_ROOT/$provider_dir/${full_name}/SKILL.md"
|
|
103
|
+
---
|
|
104
|
+
name: ${full_name}
|
|
105
|
+
description: "${_skill_desc}"
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
# User Skill: ${full_name}
|
|
69
109
|
|
|
70
110
|
CRITICAL: Do not execute inline heuristics. Read and strictly follow the agentic skill protocol at:
|
|
71
111
|
\`${target_path}\`
|
|
72
112
|
EOF
|
|
113
|
+
;;
|
|
114
|
+
esac
|
|
73
115
|
done
|
|
74
116
|
}
|
|
75
117
|
|
|
118
|
+
# shellcheck disable=SC2329
|
|
119
|
+
rnex_register_user_skill() {
|
|
120
|
+
rnex_generate_user_skill "$@"
|
|
121
|
+
}
|
|
122
|
+
|
|
76
123
|
# shellcheck disable=SC2329
|
|
77
124
|
rnex_unregister_user_skill() {
|
|
78
125
|
skill_name="$1"
|
|
126
|
+
plugin_name="${2:-}"
|
|
127
|
+
if [ -n "$plugin_name" ]; then
|
|
128
|
+
full_name="rnex-${plugin_name}-${skill_name}"
|
|
129
|
+
else
|
|
130
|
+
case "$skill_name" in
|
|
131
|
+
rnex-*) full_name="$skill_name" ;;
|
|
132
|
+
*) full_name="rnex-${skill_name}" ;;
|
|
133
|
+
esac
|
|
134
|
+
fi
|
|
79
135
|
for provider_dir in $RNEX_PROVIDER_SKILL_DIRS; do
|
|
80
|
-
rm -f "$RNEX_ROOT/$provider_dir
|
|
136
|
+
rm -f "$RNEX_ROOT/$provider_dir/${full_name}.md"
|
|
137
|
+
rm -rf "${RNEX_ROOT:?}/${provider_dir:?}/${full_name:?}"
|
|
138
|
+
if [ -n "$plugin_name" ]; then
|
|
139
|
+
rm -f "$RNEX_ROOT/$provider_dir/rnex-${skill_name}.md"
|
|
140
|
+
rm -rf "${RNEX_ROOT:?}/${provider_dir:?}/rnex-${skill_name:?}"
|
|
141
|
+
fi
|
|
81
142
|
done
|
|
82
143
|
}
|
|
83
144
|
set -- "$@"
|
|
@@ -138,25 +199,86 @@ run_plugin_hook() {
|
|
|
138
199
|
RNEX_PROVIDER_SKILL_DIRS="$_skill_dirs"
|
|
139
200
|
export RNEX_ROOT RNEX_CONFIG_MERGED RNEX_PLUGIN_DIR RNEX_CMD RNEX_ARGS RNEX_QUIET RNEX_PROVIDER_SKILL_DIRS
|
|
140
201
|
# shellcheck disable=SC2329
|
|
141
|
-
|
|
202
|
+
rnex_generate_user_skill() {
|
|
142
203
|
skill_name="$1"
|
|
143
204
|
target_path="$2"
|
|
205
|
+
plugin_name="${3:-}"
|
|
206
|
+
|
|
207
|
+
if [ -n "$plugin_name" ]; then
|
|
208
|
+
full_name="rnex-${plugin_name}-${skill_name}"
|
|
209
|
+
else
|
|
210
|
+
full_name="rnex-${skill_name}"
|
|
211
|
+
fi
|
|
212
|
+
_target_file=""
|
|
213
|
+
if [ -f "$RNEX_ROOT/$target_path" ]; then
|
|
214
|
+
_target_file="$RNEX_ROOT/$target_path"
|
|
215
|
+
elif [ -f "$target_path" ]; then
|
|
216
|
+
_target_file="$target_path"
|
|
217
|
+
fi
|
|
218
|
+
_skill_desc=""
|
|
219
|
+
if [ -n "$_target_file" ]; then
|
|
220
|
+
_skill_desc="$(awk 'NF && !/^#/ { print; exit }' "$_target_file" 2>/dev/null)"
|
|
221
|
+
fi
|
|
222
|
+
if [ -z "$_skill_desc" ]; then
|
|
223
|
+
_skill_desc="Repo Nexus agentic skill protocol for ${full_name}."
|
|
224
|
+
fi
|
|
225
|
+
_skill_desc="$(printf '%s' "$_skill_desc" | tr '\n\r' ' ' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//;s/"/\\"/g')"
|
|
226
|
+
|
|
144
227
|
for provider_dir in $RNEX_PROVIDER_SKILL_DIRS; do
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
228
|
+
case "$provider_dir" in
|
|
229
|
+
*rules*)
|
|
230
|
+
mkdir -p "$RNEX_ROOT/$provider_dir"
|
|
231
|
+
rm -rf "${RNEX_ROOT:?}/${provider_dir:?}/${full_name:?}" 2>/dev/null || true
|
|
232
|
+
cat << EOF > "$RNEX_ROOT/$provider_dir/${full_name}.md"
|
|
233
|
+
# User Skill: ${full_name}
|
|
148
234
|
|
|
149
235
|
CRITICAL: Do not execute inline heuristics. Read and strictly follow the agentic skill protocol at:
|
|
150
236
|
\`${target_path}\`
|
|
151
237
|
EOF
|
|
238
|
+
;;
|
|
239
|
+
*)
|
|
240
|
+
mkdir -p "$RNEX_ROOT/$provider_dir/${full_name}"
|
|
241
|
+
rm -f "$RNEX_ROOT/$provider_dir/${full_name}.md" 2>/dev/null || true
|
|
242
|
+
cat << EOF > "$RNEX_ROOT/$provider_dir/${full_name}/SKILL.md"
|
|
243
|
+
---
|
|
244
|
+
name: ${full_name}
|
|
245
|
+
description: "${_skill_desc}"
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
# User Skill: ${full_name}
|
|
249
|
+
|
|
250
|
+
CRITICAL: Do not execute inline heuristics. Read and strictly follow the agentic skill protocol at:
|
|
251
|
+
\`${target_path}\`
|
|
252
|
+
EOF
|
|
253
|
+
;;
|
|
254
|
+
esac
|
|
152
255
|
done
|
|
153
256
|
}
|
|
154
257
|
|
|
258
|
+
# shellcheck disable=SC2329
|
|
259
|
+
rnex_register_user_skill() {
|
|
260
|
+
rnex_generate_user_skill "$@"
|
|
261
|
+
}
|
|
262
|
+
|
|
155
263
|
# shellcheck disable=SC2329
|
|
156
264
|
rnex_unregister_user_skill() {
|
|
157
265
|
skill_name="$1"
|
|
266
|
+
plugin_name="${2:-}"
|
|
267
|
+
if [ -n "$plugin_name" ]; then
|
|
268
|
+
full_name="rnex-${plugin_name}-${skill_name}"
|
|
269
|
+
else
|
|
270
|
+
case "$skill_name" in
|
|
271
|
+
rnex-*) full_name="$skill_name" ;;
|
|
272
|
+
*) full_name="rnex-${skill_name}" ;;
|
|
273
|
+
esac
|
|
274
|
+
fi
|
|
158
275
|
for provider_dir in $RNEX_PROVIDER_SKILL_DIRS; do
|
|
159
|
-
rm -f "$RNEX_ROOT/$provider_dir
|
|
276
|
+
rm -f "$RNEX_ROOT/$provider_dir/${full_name}.md"
|
|
277
|
+
rm -rf "${RNEX_ROOT:?}/${provider_dir:?}/${full_name:?}"
|
|
278
|
+
if [ -n "$plugin_name" ]; then
|
|
279
|
+
rm -f "$RNEX_ROOT/$provider_dir/rnex-${skill_name}.md"
|
|
280
|
+
rm -rf "${RNEX_ROOT:?}/${provider_dir:?}/rnex-${skill_name:?}"
|
|
281
|
+
fi
|
|
160
282
|
done
|
|
161
283
|
}
|
|
162
284
|
set -- "$@"
|
package/lib/yaml.sh
CHANGED
|
@@ -281,14 +281,14 @@ yaml_enable_plugin() {
|
|
|
281
281
|
awk -v name="$_name" '
|
|
282
282
|
/^plugins:[ ]*$/ || /^plugins:[ ]*#/ {
|
|
283
283
|
print
|
|
284
|
-
printf " %s:\n raw_dir: \"./docs\"\n wiki_dir: \".rnex/wiki\"\n lint_trigger: \"manual\"\n", name
|
|
284
|
+
printf " %s:\n raw_dir: \"./docs\"\n wiki_dir: \".rnex/wiki\"\n lint_trigger: \"manual\"\n ingest_member_readmes: true\n", name
|
|
285
285
|
added=1
|
|
286
286
|
next
|
|
287
287
|
}
|
|
288
288
|
{ print }
|
|
289
289
|
END {
|
|
290
290
|
if (!added) {
|
|
291
|
-
printf "plugins:\n %s:\n raw_dir: \"./docs\"\n wiki_dir: \".rnex/wiki\"\n lint_trigger: \"manual\"\n", name
|
|
291
|
+
printf "plugins:\n %s:\n raw_dir: \"./docs\"\n wiki_dir: \".rnex/wiki\"\n lint_trigger: \"manual\"\n ingest_member_readmes: true\n", name
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
' "$_target_file" > "$_tmp" && mv "$_tmp" "$_target_file"
|
package/package.json
CHANGED
|
@@ -23,3 +23,6 @@ When workspace configuration, routing blocks, plugin assets, or member repositor
|
|
|
23
23
|
|
|
24
24
|
## Git Operations
|
|
25
25
|
Commit and push changes directly within the respective member repository root (`repos/<name>/`).
|
|
26
|
+
|
|
27
|
+
## Wiki Operations
|
|
28
|
+
`raw_dir` (`./docs`) and `./repos/` are strictly read-only inputs during wiki operations. Never create, copy, or modify files inside `./docs`; write generated output exclusively inside `wiki_dir` (`.rnex/wiki/`).
|
|
@@ -107,6 +107,8 @@ plugins:
|
|
|
107
107
|
# wiki_dir: ".rnex/wiki" # Directory for curated atomic markdown pages (default: .rnex/wiki)
|
|
108
108
|
# lint_trigger: "manual" # Runs manually via 'rnex sync' or validation checklists (git-post-merge, git-post-commit, git-pre-commit, git-pre-push, manual)
|
|
109
109
|
# notify_on_changes: true # Show notification when changes are committed to ./docs or .rnex/wiki
|
|
110
|
+
# ingest_member_readmes: true # Automatically ingest member repository READMEs into atomic wiki pages (default: true)
|
|
111
|
+
|
|
110
112
|
|
|
111
113
|
# ------------------------------------------------------------------------------
|
|
112
114
|
# repos — Member repositories managed by Repo Nexus
|
|
@@ -26,9 +26,9 @@ Reference specification: [setup-karpathy-wiki.md](https://github.com/unoxen/ai-t
|
|
|
26
26
|
* **Rolling Context Cache (`<wiki_dir>/hot.md`, default: `.rnex/wiki/hot.md`):** High-density ~500-word orientation summary for rapid agent onboarding without full wiki scans (especially for codebase knowledge and second-brain wikis).
|
|
27
27
|
* **Audit Trail (`<wiki_dir>/_log.md`, default: `.rnex/wiki/_log.md`):** Append-only log recording every ingest and lint operation with timestamped details.
|
|
28
28
|
|
|
29
|
-
### 4. Standardized Agent
|
|
30
|
-
* **`
|
|
31
|
-
* **`
|
|
29
|
+
### 4. Standardized Agent Skills (`skills/`)
|
|
30
|
+
* **`wiki-ingest.md` (User Skill: `rnex-karpathy-llm-wiki-ingest`):** Decomposes raw source documents into 5–25 atomic wiki pages with frontmatter relations.
|
|
31
|
+
* **`wiki-lint.md` (User Skill: `rnex-karpathy-llm-wiki-lint`):** Integrity audit protocol to validate paths, recompute `mentioned_in`, eliminate orphans, merge duplicates, audit inconsistencies, identify gaps, suggest source candidates, and rebuild indexes.
|
|
32
32
|
|
|
33
33
|
---
|
|
34
34
|
|
|
@@ -45,9 +45,9 @@ Enabling the plugin (`rnex plugin enable karpathy-llm`) performs an exact, zero-
|
|
|
45
45
|
|
|
46
46
|
### Phase 2: Evolutionary Growth & Domain Specialization (Usage Phase)
|
|
47
47
|
Once initialized, the workspace structure organically evolves according to actual domain needs and source materials:
|
|
48
|
-
* **Source Ingestion (`rnex-wiki-ingest`)**: As raw source documents are deposited into `./docs` and ingested, atomic pages are generated. Users or agents can organize pages into categorical subfolders (e.g. `architecture/`, `decisions/`, `concepts/`, `projects/`) or keep them flat.
|
|
48
|
+
* **Source Ingestion (`rnex-karpathy-llm-wiki-ingest`)**: As raw source documents are deposited into `./docs` and ingested, atomic pages are generated. Users or agents can organize pages into categorical subfolders (e.g. `architecture/`, `decisions/`, `concepts/`, `projects/`) or keep them flat.
|
|
49
49
|
* **Customizable Guidelines**: Teams can tailor `rules/rnex-behavioral.md` and `instructions/rnex-wiki-architecture.md` for their specific team conventions.
|
|
50
|
-
* **Graph Maintenance (`rnex-wiki-lint`)**: The periodic lint workflow validates relation paths, updates `mentioned_in`, and rebuilds `index.md` and `hot.md` to match the evolved knowledge graph.
|
|
50
|
+
* **Graph Maintenance (`rnex-karpathy-llm-wiki-lint`)**: The periodic lint workflow validates relation paths, updates `mentioned_in`, and rebuilds `index.md` and `hot.md` to match the evolved knowledge graph.
|
|
51
51
|
|
|
52
52
|
---
|
|
53
53
|
|
|
@@ -71,9 +71,9 @@ my-workspace/
|
|
|
71
71
|
│ │ └── rnex-wiki-architecture.md# LLM Wiki architecture & relation schema
|
|
72
72
|
│ ├── rules/
|
|
73
73
|
│ │ └── rnex-behavioral.md # Cardinal principles & context engineering
|
|
74
|
-
│ ├──
|
|
75
|
-
│ │ ├──
|
|
76
|
-
│ │ └──
|
|
74
|
+
│ ├── skills/
|
|
75
|
+
│ │ ├── wiki-ingest.md # 8-step decomposition & ingestion workflow
|
|
76
|
+
│ │ └── wiki-lint.md # 10-step graph validation & maintenance workflow
|
|
77
77
|
│ └── templates/
|
|
78
78
|
│ ├── rnex-wiki-page.template.md# Atomic page template with typed relations
|
|
79
79
|
│ └── rnex-llm-wiki.sample.md# Sample wiki walkthrough
|
|
@@ -7,9 +7,6 @@ set -e
|
|
|
7
7
|
# Resolve root workspace
|
|
8
8
|
_root="$RNEX_ROOT"
|
|
9
9
|
|
|
10
|
-
# Target directory inside .rnex/ (the internal wiki's Raw intake state)
|
|
11
|
-
WIKI_RAW_DIR="$RNEX_ROOT/.rnex/wiki/raw"
|
|
12
|
-
mkdir -p "$WIKI_RAW_DIR"
|
|
13
10
|
|
|
14
11
|
# Helper to read plugin config
|
|
15
12
|
get_cfg() {
|
|
@@ -48,6 +45,7 @@ get_cfg() {
|
|
|
48
45
|
|
|
49
46
|
_wiki="$(get_cfg "wiki_dir" ".rnex/wiki")"
|
|
50
47
|
_raw="$(get_cfg "raw_dir" "./docs")"
|
|
48
|
+
_ingest_readmes="$(get_cfg "ingest_member_readmes" "true")"
|
|
51
49
|
|
|
52
50
|
# Clean relative paths
|
|
53
51
|
_wiki="$(printf '%s' "$_wiki" | sed -e 's#^/##' -e 's#/$##')"
|
|
@@ -59,6 +57,9 @@ _raw_path="$_root/$_raw"
|
|
|
59
57
|
mkdir -p "$_wiki_path" "$_raw_path"
|
|
60
58
|
[ -f "$_raw_path/.gitkeep" ] || touch "$_raw_path/.gitkeep"
|
|
61
59
|
|
|
60
|
+
# Ensure .rnex/wiki/ contains only agent-maintained wiki artifacts (no raw staging directory)
|
|
61
|
+
rm -rf "$_wiki_path/raw" 2>/dev/null || true
|
|
62
|
+
|
|
62
63
|
_pdir="${RNEX_PLUGIN_DIR:-$_root/.rnex/plugins/karpathy-llm}"
|
|
63
64
|
if [ ! -d "$_pdir/templates" ] && [ -d "$_root/toolkit/plugins/karpathy-llm/templates" ]; then
|
|
64
65
|
_tmpl_dir="$_root/toolkit/plugins/karpathy-llm/templates"
|
|
@@ -97,18 +98,31 @@ if [ -n "$_src_k_skills" ] && [ "$_src_k_skills" != "$RNEX_ROOT/.rnex/plugins/ka
|
|
|
97
98
|
cp -R "$_src_k_skills"/. "$RNEX_ROOT/.rnex/plugins/karpathy-llm/skills"/ 2>/dev/null || true
|
|
98
99
|
fi
|
|
99
100
|
|
|
100
|
-
# 2. Register plugin User Skills via contract helper
|
|
101
|
-
if ! command -v rnex_register_user_skill >/dev/null 2>&1; then
|
|
101
|
+
# 2. Register plugin User Skills via contract helper (with plugin name prefix)
|
|
102
|
+
if ! command -v rnex_register_user_skill >/dev/null 2>&1 && ! command -v rnex_generate_user_skill >/dev/null 2>&1; then
|
|
102
103
|
if [ -f "$RNEX_ROOT/.rnex/bin/rnex-env.sh" ]; then
|
|
103
104
|
. "$RNEX_ROOT/.rnex/bin/rnex-env.sh"
|
|
104
105
|
fi
|
|
105
106
|
fi
|
|
106
107
|
|
|
107
|
-
|
|
108
|
+
# Clean up stale unprefixed skills
|
|
109
|
+
if command -v rnex_unregister_user_skill >/dev/null 2>&1; then
|
|
110
|
+
rnex_unregister_user_skill "wiki-ingest"
|
|
111
|
+
rnex_unregister_user_skill "wiki-lint"
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
_reg_fn=""
|
|
115
|
+
if command -v rnex_generate_user_skill >/dev/null 2>&1; then
|
|
116
|
+
_reg_fn="rnex_generate_user_skill"
|
|
117
|
+
elif command -v rnex_register_user_skill >/dev/null 2>&1; then
|
|
118
|
+
_reg_fn="rnex_register_user_skill"
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
if [ -n "$_reg_fn" ]; then
|
|
108
122
|
for skill_file in "$RNEX_ROOT/.rnex/plugins/karpathy-llm/skills"/*.md; do
|
|
109
123
|
[ -f "$skill_file" ] || continue
|
|
110
124
|
skill_name=$(basename "$skill_file" .md)
|
|
111
|
-
|
|
125
|
+
"$_reg_fn" "$skill_name" ".rnex/plugins/karpathy-llm/skills/${skill_name}.md" "karpathy-llm"
|
|
112
126
|
done
|
|
113
127
|
fi
|
|
114
128
|
|
|
@@ -134,20 +148,6 @@ RAW_DIR_VAL=$(grep -h -E '^\s*raw_dir:' "$RNEX_ROOT/rnex.yaml" "$RNEX_ROOT/.loca
|
|
|
134
148
|
[ -z "$RAW_DIR_VAL" ] && RAW_DIR_VAL="$(get_cfg "raw_dir" "./docs")"
|
|
135
149
|
RAW_DIR="${RAW_DIR_VAL:-./docs}"
|
|
136
150
|
|
|
137
|
-
# Clear and sync custom local raw folder files to raw intake (skip if RAW_DIR is a documentation site)
|
|
138
|
-
if [ -d "$RNEX_ROOT/$RAW_DIR" ] && [ ! -d "$RNEX_ROOT/$RAW_DIR/.vitepress" ]; then
|
|
139
|
-
_raw_abs="$(cd "$RNEX_ROOT/$RAW_DIR" 2>/dev/null && pwd -P || true)"
|
|
140
|
-
_wiki_raw_abs="$(cd "$WIKI_RAW_DIR" 2>/dev/null && pwd -P || true)"
|
|
141
|
-
if [ -n "$_raw_abs" ] && [ "$_raw_abs" != "$_wiki_raw_abs" ]; then
|
|
142
|
-
find "$RNEX_ROOT/$RAW_DIR" -type f \( -name "*.md" -o -name "*.txt" -o -name "*.json" \) 2>/dev/null | while read -r filepath; do
|
|
143
|
-
filename=$(basename "$filepath")
|
|
144
|
-
# Prevent overwriting standard operational files
|
|
145
|
-
if [ "$filename" != "index.md" ] && [ "$filename" != "hot.md" ] && [ "$filename" != "_log.md" ]; then
|
|
146
|
-
cp "$filepath" "$WIKI_RAW_DIR/$filename"
|
|
147
|
-
fi
|
|
148
|
-
done
|
|
149
|
-
fi
|
|
150
|
-
fi
|
|
151
151
|
|
|
152
152
|
# Ingest member repository README into atomic wiki page, index, and hot cache
|
|
153
153
|
ingest_member_readme() {
|
|
@@ -316,18 +316,24 @@ LOG_EOF
|
|
|
316
316
|
fi
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
-
# 2. Automatically
|
|
319
|
+
# 2. Automatically ingest README.md from all enabled/cloned member repositories in-place
|
|
320
320
|
# Get list of enabled repositories using a secure cross-repo read or `rnex list`
|
|
321
|
+
case "$(printf '%s' "$_ingest_readmes" | tr '[:upper:]' '[:lower:]')" in
|
|
322
|
+
false|no|0|disabled|off) _skip_all_readmes=1 ;;
|
|
323
|
+
*) _skip_all_readmes=0 ;;
|
|
324
|
+
esac
|
|
325
|
+
|
|
321
326
|
REPOS_DIR_VAL=$(grep -h -E '^\s*repos_dir:' "$RNEX_ROOT/rnex.yaml" "$RNEX_ROOT/.local.rnex.yaml" 2>/dev/null | tail -n1 | awk -F: '{print $NF}' | awk '{print $1}' | tr -d '"'\''')
|
|
322
327
|
REPOS_DIR="${REPOS_DIR_VAL:-./repos}"
|
|
323
328
|
|
|
324
|
-
if [ -d "$RNEX_ROOT/$REPOS_DIR" ]; then
|
|
329
|
+
if [ "$_skip_all_readmes" -ne 1 ] && [ -d "$RNEX_ROOT/$REPOS_DIR" ]; then
|
|
325
330
|
for repo_path in "$RNEX_ROOT/$REPOS_DIR"/*; do
|
|
326
331
|
[ ! -d "$repo_path" ] && continue
|
|
327
332
|
repo_name=$(basename "$repo_path")
|
|
328
333
|
|
|
329
334
|
# Check if this repository is explicitly disabled in .local.rnex.yaml or rnex.yaml (block-scoped)
|
|
330
335
|
_is_disabled=""
|
|
336
|
+
_repo_ingest=""
|
|
331
337
|
for _cfg_file in "$RNEX_ROOT/.local.rnex.yaml" "$RNEX_ROOT/rnex.yaml"; do
|
|
332
338
|
[ -f "$_cfg_file" ] || continue
|
|
333
339
|
_en="$(awk -v repo="$repo_name" '
|
|
@@ -344,21 +350,40 @@ if [ -d "$RNEX_ROOT/$REPOS_DIR" ]; then
|
|
|
344
350
|
exit
|
|
345
351
|
}
|
|
346
352
|
' "$_cfg_file")"
|
|
347
|
-
if [ -n "$_en" ]; then
|
|
353
|
+
if [ -n "$_en" ] && [ -z "$_is_disabled" ]; then
|
|
348
354
|
case "$(printf '%s' "$_en" | tr '[:upper:]' '[:lower:]')" in
|
|
349
355
|
false|no|0|disabled|off) _is_disabled=1 ;;
|
|
350
356
|
*) _is_disabled=0 ;;
|
|
351
357
|
esac
|
|
352
|
-
|
|
358
|
+
fi
|
|
359
|
+
|
|
360
|
+
_ingest_val="$(awk -v repo="$repo_name" '
|
|
361
|
+
/^repos:[ ]*$/ || /^repos:[ ]*#/ { r=1; next }
|
|
362
|
+
r && /^[^ #]/ { r=0 }
|
|
363
|
+
r && match($0, "^ " repo ":[ ]*(#.*)?$") { in_target=1; next }
|
|
364
|
+
in_target && /^ [^ #]/ { in_target=0 }
|
|
365
|
+
in_target && match($0, "^ ingest_member_readmes:[ ]*") {
|
|
366
|
+
line = $0
|
|
367
|
+
sub("^ ingest_member_readmes:[ ]*", "", line)
|
|
368
|
+
sub(/[ ]*#.*$/, "", line)
|
|
369
|
+
gsub(/^["\x27]|["\x27]$/, "", line)
|
|
370
|
+
print line
|
|
371
|
+
exit
|
|
372
|
+
}
|
|
373
|
+
' "$_cfg_file")"
|
|
374
|
+
if [ -n "$_ingest_val" ] && [ -z "$_repo_ingest" ]; then
|
|
375
|
+
case "$(printf '%s' "$_ingest_val" | tr '[:upper:]' '[:lower:]')" in
|
|
376
|
+
false|no|0|disabled|off) _repo_ingest=0 ;;
|
|
377
|
+
*) _repo_ingest=1 ;;
|
|
378
|
+
esac
|
|
353
379
|
fi
|
|
354
380
|
done
|
|
355
381
|
[ "$_is_disabled" = "1" ] && continue
|
|
382
|
+
[ "$_repo_ingest" = "0" ] && continue
|
|
356
383
|
|
|
357
|
-
# Read and
|
|
384
|
+
# Read and ingest any README file directly in-place (no staging copy)
|
|
358
385
|
for readme_name in README.md readme.md README.markdown README; do
|
|
359
386
|
if [ -f "$repo_path/$readme_name" ]; then
|
|
360
|
-
# Namespace the copied file with its repo name to prevent conflicts
|
|
361
|
-
cp "$repo_path/$readme_name" "$WIKI_RAW_DIR/README_${repo_name}.md"
|
|
362
387
|
# Ingest member repository README into atomic wiki page, index, and hot cache
|
|
363
388
|
ingest_member_readme "$repo_name" "$repo_path" "$readme_name"
|
|
364
389
|
break
|
|
@@ -11,11 +11,19 @@ if ! command -v rnex_unregister_user_skill >/dev/null 2>&1; then
|
|
|
11
11
|
fi
|
|
12
12
|
|
|
13
13
|
if command -v rnex_unregister_user_skill >/dev/null 2>&1; then
|
|
14
|
+
rnex_unregister_user_skill "wiki-ingest" "karpathy-llm"
|
|
15
|
+
rnex_unregister_user_skill "wiki-lint" "karpathy-llm"
|
|
14
16
|
rnex_unregister_user_skill "wiki-ingest"
|
|
15
17
|
rnex_unregister_user_skill "wiki-lint"
|
|
16
18
|
else
|
|
17
19
|
for _pdir in $RNEX_PROVIDER_SKILL_DIRS; do
|
|
20
|
+
rm -f "$RNEX_ROOT/$_pdir/rnex-karpathy-llm-wiki-ingest.md"
|
|
21
|
+
rm -f "$RNEX_ROOT/$_pdir/rnex-karpathy-llm-wiki-lint.md"
|
|
22
|
+
rm -rf "$RNEX_ROOT/$_pdir/rnex-karpathy-llm-wiki-ingest"
|
|
23
|
+
rm -rf "$RNEX_ROOT/$_pdir/rnex-karpathy-llm-wiki-lint"
|
|
18
24
|
rm -f "$RNEX_ROOT/$_pdir/rnex-wiki-ingest.md"
|
|
19
25
|
rm -f "$RNEX_ROOT/$_pdir/rnex-wiki-lint.md"
|
|
26
|
+
rm -rf "$RNEX_ROOT/$_pdir/rnex-wiki-ingest"
|
|
27
|
+
rm -rf "$RNEX_ROOT/$_pdir/rnex-wiki-lint"
|
|
20
28
|
done
|
|
21
29
|
fi
|
|
@@ -13,12 +13,13 @@ The curated wiki directory (`wiki_dir`, default: `.rnex/wiki`) and raw intake di
|
|
|
13
13
|
When working in a workspace with an active Karpathy LLM Wiki:
|
|
14
14
|
|
|
15
15
|
- **Configuration Resolution**: Read `rnex.yaml` / `.local.rnex.yaml` to identify the active `raw_dir` (default: `./docs`) and `wiki_dir` (default: `.rnex/wiki`).
|
|
16
|
-
- **
|
|
16
|
+
- **Read-Only Input Directives**: `raw_dir` (`./docs`) and `./repos/` are strictly read-only inputs during wiki operations. Never create, copy, or modify files inside `./docs`; write generated output exclusively inside `wiki_dir` (`.rnex/wiki/`).
|
|
17
|
+
- **Intake**: All source material (articles, transcripts, docs, notes) goes to `<raw_dir>/` (default: `./docs`) unmodified, and member repository READMEs exist under `./repos/<name>/README.md`. Sources are read directly in-place without staging copies. Never write directly to `<wiki_dir>/` without ingesting.
|
|
17
18
|
- **Orientation (Hot-Cache First)**: Read `<wiki_dir>/hot.md` (default: `.rnex/wiki/hot.md`) for quick ~500-word orientation. Consult `<wiki_dir>/index.md` (default: `.rnex/wiki/index.md`) on demand only if the specific topic or contract is not covered in `hot.md`.
|
|
18
19
|
- **Bounded Hot Cache**: `<wiki_dir>/hot.md` enforces a strict ~500-word ceiling with 3 structured sections: 1. Architecture & Repo Map, 2. Current Focus & Recent Ingests, 3. Key Contracts. Ingest and lint workflows must condense older context to prevent bloat.
|
|
19
20
|
- **Annotated Indexing**: `<wiki_dir>/index.md` entries must maintain a single 1-line summary next to each atomic page link (e.g. `- [Auth Flow](auth.md): JWT validation and token rotation`) so agents pinpoint target pages in a single read without trial-and-error scanning.
|
|
20
|
-
- **Ingestion**: When files appear in `<raw_dir
|
|
21
|
-
- **Maintenance**:
|
|
21
|
+
- **Ingestion**: When files appear in `<raw_dir>/` or member repositories are added, execute the `wiki-ingest` agentic skill (`.rnex/plugins/karpathy-llm/skills/wiki-ingest.md`). One source document produces 5–25 atomic pages — never collapse a source into a single file.
|
|
22
|
+
- **Maintenance**: Execute the `wiki-lint` agentic skill (`.rnex/plugins/karpathy-llm/skills/wiki-lint.md`) to validate paths, update `mentioned_in`, and preserve graph integrity.
|
|
22
23
|
|
|
23
24
|
---
|
|
24
25
|
|
|
@@ -13,11 +13,12 @@ The curated wiki directory (`wiki_dir`, default: `.rnex/wiki`) and raw intake di
|
|
|
13
13
|
When working in a workspace with an active Karpathy LLM Wiki:
|
|
14
14
|
|
|
15
15
|
- **Configuration Resolution**: Read `rnex.yaml` / `.local.rnex.yaml` to identify the active `raw_dir` (default: `./docs`) and `wiki_dir` (default: `.rnex/wiki`).
|
|
16
|
-
- **
|
|
16
|
+
- **Read-Only Input Directives**: `raw_dir` (`./docs`) and `./repos/` are strictly read-only inputs during wiki operations. Never create, copy, or modify files inside `./docs`; write generated output exclusively inside `wiki_dir` (`.rnex/wiki/`).
|
|
17
|
+
- **Intake**: All source material (articles, transcripts, docs, notes) goes to `<raw_dir>/` (default: `./docs`) unmodified, and member repository READMEs exist under `./repos/<name>/README.md`. Sources are read directly in-place without staging copies. Never write directly to `<wiki_dir>/` without ingesting.
|
|
17
18
|
- **Orientation (Hot-Cache First)**: Read `<wiki_dir>/hot.md` (default: `.rnex/wiki/hot.md`) for quick ~500-word orientation. Consult `<wiki_dir>/index.md` (default: `.rnex/wiki/index.md`) on demand only if the specific topic or contract is not covered in `hot.md`.
|
|
18
19
|
- **Bounded Hot Cache**: `<wiki_dir>/hot.md` enforces a strict ~500-word ceiling with 3 structured sections: 1. Architecture & Repo Map, 2. Current Focus & Recent Ingests, 3. Key Contracts. Ingest and lint workflows must condense older context to prevent bloat.
|
|
19
20
|
- **Behavioral Principles**: Strictly adhere to the coding agent principles defined at `.rnex/plugins/karpathy-llm/rules/behavioral.md`.
|
|
20
|
-
- **Ingestion**: When files appear in `<raw_dir
|
|
21
|
+
- **Ingestion**: When files appear in `<raw_dir>/` or when member repos are added, execute the `wiki-ingest` agentic skill protocol (`.rnex/plugins/karpathy-llm/skills/wiki-ingest.md`). One source document produces 5–25 atomic pages — never collapse a source into a single file.
|
|
21
22
|
- **Maintenance**: Execute the `wiki-lint` agentic skill protocol (`.rnex/plugins/karpathy-llm/skills/wiki-lint.md`) to validate paths, update `mentioned_in`, and preserve graph integrity.
|
|
22
23
|
|
|
23
24
|
---
|
|
@@ -9,12 +9,14 @@ config_defaults:
|
|
|
9
9
|
wiki_dir: ".rnex/wiki"
|
|
10
10
|
lint_trigger: "manual" # Default changed to manual to avoid unsolicited background trigger tasks
|
|
11
11
|
notify_on_changes: true
|
|
12
|
+
ingest_member_readmes: true
|
|
12
13
|
|
|
13
14
|
config:
|
|
14
15
|
raw_dir: "./docs"
|
|
15
16
|
wiki_dir: ".rnex/wiki"
|
|
16
17
|
lint_trigger: "manual"
|
|
17
18
|
notify_on_changes: true
|
|
19
|
+
ingest_member_readmes: true
|
|
18
20
|
|
|
19
21
|
rules:
|
|
20
22
|
- rules/behavioral.md: .rnex/plugins/karpathy-llm/rules/behavioral.md
|
|
@@ -45,3 +45,7 @@ In a Repo Nexus workspace, independent repositories are organized into `./repos/
|
|
|
45
45
|
3. **Context Economy:**
|
|
46
46
|
- Do not redundantly read entire files or directory trees when targeted symbol lookups or line ranges suffice.
|
|
47
47
|
- Rely on active workspace context, indexing, and compiled documentation rather than re-scanning raw files repeatedly.
|
|
48
|
+
|
|
49
|
+
4. **Read-Only Intake & Source Directories:**
|
|
50
|
+
- `raw_dir` (`./docs`) and `./repos/` are strictly read-only inputs during wiki operations. Never create, copy, or modify files inside `./docs`; write generated output exclusively inside `wiki_dir` (`.rnex/wiki/`).
|
|
51
|
+
|
|
@@ -10,13 +10,17 @@ Use this skill when ingesting new reference materials, architecture documentatio
|
|
|
10
10
|
|
|
11
11
|
## Ingestion Protocol
|
|
12
12
|
|
|
13
|
-
1. **Resolve Configuration &
|
|
13
|
+
1. **Resolve Configuration & Direct Source Paths:**
|
|
14
14
|
- Read `rnex.yaml` (and `.local.rnex.yaml` if present) to resolve the active `raw_dir` (default: `./docs`) and `wiki_dir` (default: `.rnex/wiki`) under `plugins.karpathy-llm`.
|
|
15
|
-
-
|
|
16
|
-
|
|
15
|
+
- Direct input scope explicitly reads:
|
|
16
|
+
1. All files in `raw_dir` (`./docs`) (read-only).
|
|
17
|
+
2. `./repos/<name>/README.md` for every enabled member repository in `rnex.yaml` / `.local.rnex.yaml` (read-only).
|
|
18
|
+
- `raw_dir` (`./docs`) and `./repos/` are strictly read-only inputs during wiki operations. Never create, copy, or modify files inside `./docs`; write generated output exclusively inside `wiki_dir` (`.rnex/wiki/`).
|
|
19
|
+
- Scan direct source paths for source materials not yet recorded in `<wiki_dir>/_log.md`.
|
|
20
|
+
- All source material is read directly in-place without staging copies. Never write directly to `<wiki_dir>/` without ingesting.
|
|
17
21
|
|
|
18
22
|
2. **Read & Clarify:**
|
|
19
|
-
- Read each source document thoroughly.
|
|
23
|
+
- Read each source document thoroughly in-place.
|
|
20
24
|
- If scope, domain boundaries, or terminology are ambiguous, ask one round of clarifying questions before decomposing.
|
|
21
25
|
|
|
22
26
|
3. **Atomic Decomposition:**
|
|
@@ -31,7 +35,7 @@ Use this skill when ingesting new reference materials, architecture documentatio
|
|
|
31
35
|
title: ""
|
|
32
36
|
tags: []
|
|
33
37
|
last_updated: YYYY-MM-DD
|
|
34
|
-
sources: [] # <raw_dir>/
|
|
38
|
+
sources: [] # direct source files (<raw_dir>/... or repos/<name>/README.md) this page was derived from
|
|
35
39
|
related: [] # thematically related wiki pages
|
|
36
40
|
extends: [] # pages this one builds upon or specialises
|
|
37
41
|
contradicts: [] # pages with conflicting information
|
|
@@ -56,4 +60,4 @@ Use this skill when ingesting new reference materials, architecture documentatio
|
|
|
56
60
|
- Maintain the strict ~500-word ceiling. Condense or prune older focus items.
|
|
57
61
|
|
|
58
62
|
8. **Append Operation Log:**
|
|
59
|
-
- Append a timestamped entry to `<wiki_dir>/_log.md` detailing date,
|
|
63
|
+
- Append a timestamped entry to `<wiki_dir>/_log.md` detailing date, direct source path processed, generated atomic pages, and follow-ups.
|
|
@@ -12,7 +12,11 @@ Use this skill to perform health checks and maintenance on the curated wiki know
|
|
|
12
12
|
|
|
13
13
|
1. **Resolve Configuration & Verify Paths:**
|
|
14
14
|
- Read `rnex.yaml` (and `.local.rnex.yaml` if present) to resolve `wiki_dir` (default: `.rnex/wiki`) and `raw_dir` (default: `./docs`) under `plugins.karpathy-llm`.
|
|
15
|
-
-
|
|
15
|
+
- Direct input scope explicitly reads:
|
|
16
|
+
1. All files in `raw_dir` (`./docs`) (read-only).
|
|
17
|
+
2. `./repos/<name>/README.md` for every enabled member repository in `rnex.yaml` / `.local.rnex.yaml` (read-only).
|
|
18
|
+
- `raw_dir` (`./docs`) and `./repos/` are strictly read-only inputs during wiki operations. Never create, copy, or modify files inside `./docs`; write generated output exclusively inside `wiki_dir` (`.rnex/wiki/`).
|
|
19
|
+
- For every page under `<wiki_dir>/`, verify that all paths in frontmatter relation fields (`related`, `extends`, `contradicts`, `sources`) resolve to existing files under `<wiki_dir>/`, `<raw_dir>/`, or `./repos/<name>/README.md`.
|
|
16
20
|
- Fix or flag broken paths.
|
|
17
21
|
|
|
18
22
|
2. **Recompute `mentioned_in` Relations:**
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
## 2. Current Focus & Recent Ingests
|
|
10
10
|
* **Active Tasks:** Wiki initialization complete.
|
|
11
|
-
* **Recent Ingests:** None yet. Deposit source documents into `/{raw_dir}/` and run `rnex-wiki-ingest`.
|
|
11
|
+
* **Recent Ingests:** None yet. Deposit source documents into `/{raw_dir}/` and run `rnex-karpathy-llm-wiki-ingest`.
|
|
12
12
|
|
|
13
13
|
## 3. Key Contracts & Boundaries
|
|
14
14
|
* **Atomic Pages:** Concepts live in discrete files with frontmatter relations (`sources`, `related`, `extends`, `mentioned_in`).
|