aio-connect 1.1.0

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/bin/aio.js ADDED
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ // aio — all-in-one-repo: auto-connect your AI agents to local repos, tools & skills
3
+ import { fileURLToPath } from 'node:url';
4
+ import { banner, getVersion } from '../src/banner.js';
5
+
6
+ const binPath = fileURLToPath(import.meta.url);
7
+
8
+ const HELP = `
9
+ aio — all-in-one-repo
10
+
11
+ Usage:
12
+ aio Wire up every detected agent (default: setup)
13
+ aio update Update from GitHub, then re-run setup
14
+ aio rollback Remove everything aio injected (backups are kept)
15
+
16
+ Options:
17
+ --repos <dir> Directory containing cloned git repositories
18
+ (default: D:\\Tools\\github, or $AIO_REPOS_DIR)
19
+ --home <dir> Data dir with ai-tools.db / TOOLS-INDEX.md
20
+ (default: $AIO_HOME, persisted state, or cwd walk)
21
+ -h, --help Show this help
22
+ -v, --version Show version
23
+
24
+ Environment:
25
+ AIO_REPOS_DIR, AIO_HOME Same as --repos / --home
26
+
27
+ What it does:
28
+ 1. Scans installed agents (opencode, claude, kimi, jcode, freebuff, hermes,
29
+ codex, gemini), cloned repos, local tools catalog, and global skills.
30
+ 2. Generates a context manifest (aio-context.md) listing REPOS/TOOLS/SKILLS.
31
+ 3. Injects a marker-delimited auto-use block into each agent's instruction
32
+ file — idempotent, always exactly one copy.
33
+ 4. Ensures the codebase-memory-mcp server exists where supported.
34
+ 5. Repairs stale path references after folder renames.
35
+
36
+ No slash-commands needed: the agent reads the manifest on its own and must
37
+ disclose usage as: [aio] Using <name> (<type>) — <function>
38
+ `;
39
+
40
+ function parseArgs(argv) {
41
+ const opts = { command: 'setup', repos: null, home: null };
42
+ const rest = [];
43
+ for (let i = 0; i < argv.length; i++) {
44
+ const a = argv[i];
45
+ if (a === '--repos') opts.repos = argv[++i] ?? null;
46
+ else if (a === '--home') opts.home = argv[++i] ?? null;
47
+ else rest.push(a);
48
+ }
49
+ const cmd = rest[0];
50
+ if (cmd === 'update' || cmd === 'rollback' || cmd === 'setup') opts.command = cmd;
51
+ else if (cmd === 'help' || cmd === '--help' || cmd === '-h') opts.command = 'help';
52
+ else if (cmd === '--version' || cmd === '-v' || cmd === 'version') opts.command = 'version';
53
+ else if (cmd !== undefined) {
54
+ console.error(`[aio] unknown command: ${cmd}`);
55
+ opts.command = 'help';
56
+ opts.bad = true;
57
+ }
58
+ return opts;
59
+ }
60
+
61
+ const opts = parseArgs(process.argv.slice(2));
62
+
63
+ switch (opts.command) {
64
+ case 'help':
65
+ console.log(HELP);
66
+ process.exit(opts.bad ? 1 : 0);
67
+ case 'version':
68
+ console.log(getVersion());
69
+ process.exit(0);
70
+ case 'update': {
71
+ console.log(banner());
72
+ const { runUpdate } = await import('../src/update.js');
73
+ runUpdate({ binPath });
74
+ break;
75
+ }
76
+ case 'rollback': {
77
+ console.log(banner());
78
+ const { runRollback } = await import('../src/rollback.js');
79
+ runRollback();
80
+ break;
81
+ }
82
+ default: {
83
+ console.log(banner());
84
+ const { runSetup } = await import('../src/setup.js');
85
+ try {
86
+ await runSetup(opts);
87
+ } catch (e) {
88
+ console.error(`[aio] setup failed: ${e.message}`);
89
+ if (e.stack) console.error(e.stack.split('\n').slice(1, 4).join('\n'));
90
+ process.exit(1);
91
+ }
92
+ }
93
+ }
package/docs/CONFIG.md ADDED
@@ -0,0 +1,86 @@
1
+ # aio — Configuration Reference
2
+
3
+ Everything `aio` reads or writes on your machine, in execution order.
4
+
5
+ ## Reads (scan phase)
6
+
7
+ | Source | Used for | If missing |
8
+ |---|---|---|
9
+ | `$PATH` **or** the agent's config dir | detect agents (`opencode`, `claude`, `kimi`, `jcode`, `freebuff`, `hermes`, `codex`, `gemini`) and `codebase-memory-mcp` | agent reported *not installed* |
10
+ | `--repos` / `$AIO_REPOS_DIR` / persisted `~/.aio/config.json` / `D:\Tools\github` | repo scan (`REPOS` in manifest) | warning; manifest has 0 repos |
11
+ | `--home` / `$AIO_HOME` / persisted state / walk up from cwd | locate `ai-tools.db` + `TOOLS-INDEX.md` | falls back to no tools catalog |
12
+ | `ai-tools.db` (SQLite via built-in `node:sqlite`) | `TOOLS` in manifest (23 tools) | falls back to `TOOLS-INDEX.md` parse |
13
+ | `TOOLS-INDEX.md` (markdown tables) | `TOOLS` fallback | 0 tools |
14
+ | `~/.agents/skills`, `~/.claude/skills` | `SKILLS` in manifest | 0 skills |
15
+
16
+ ## Writes (setup phase)
17
+
18
+ Every write is preceded by a file backup to `~/.aio/backups/`.
19
+
20
+ | # | Target | What happens | Reversed by `aio rollback`? |
21
+ |---|---|---|---|
22
+ | 1 | `<dataDir>/aio-context.md` (or `~/.aio/aio-context.md`) | generated context manifest | kept (generated artifact) |
23
+ | 2 | `~/.config/opencode/AGENTS.md` | marker block `<!-- aio:auto-config:v1:start --> … end -->` injected/refreshed | ✅ block removed |
24
+ | 3 | `~/.claude/CLAUDE.md` | same block | ✅ block removed |
25
+ | 4 | `~/.kimi-code/AGENTS.md` | same block | ✅ block removed |
26
+ | 5 | `~/.jcode/AGENTS.md` | same block (created if the `.jcode` dir exists) | ✅ block removed |
27
+ | 6 | `~/.codex/AGENTS.md` | same block | ✅ block removed |
28
+ | 7 | `~/.gemini/GEMINI.md` | same block | ✅ block removed |
29
+ | 8 | `~/AGENTS.md` | same block (fallback: freebuff, hermes, jcode) | ✅ block removed |
30
+ | 9 | `~/.config/opencode/opencode.jsonc` | `"codebase-memory-mcp"` entry **only if absent** (textual insert, comments preserved) | ✅ only if aio added it (ledger) |
31
+ | 10 | `~/.claude.json` | `mcpServers["codebase-memory-mcp"]` **only if absent** | ✅ only if aio added it (ledger) |
32
+ | 11 | `~/.kimi-code/mcp.json` | `mcpServers["codebase-memory-mcp"]` **only if absent** | ✅ only if aio added it (ledger) |
33
+ | 12 | `~/.jcode/mcp.json` | `servers["codebase-memory-mcp"]` (jcode's root key is `servers`) **only if absent** | ✅ only if aio added it (ledger) |
34
+ | 13 | `~/.gemini/settings.json` | `mcpServers["codebase-memory-mcp"]` — file created when `~/.gemini/` exists, **only if absent** | ✅ only if aio added it (ledger) |
35
+ | 14 | `~/.codex/config.toml` | `[mcp_servers.codebase-memory-mcp]` table appended **only if absent** | ✅ only if aio added it (ledger) |
36
+ | 15 | instruction files with a stale `AI tutorial` path | path repaired to `all-in-one-repo` | kept (repair, not injection) |
37
+ | 16 | `~/.aio/config.json`, `~/.aio/mcp-ledger.json` | state (data dir, repos dir, MCP ledger) | ledger cleared; config kept |
38
+
39
+ ### Idempotency
40
+
41
+ The block is delimited by stable markers and matched with one regex:
42
+
43
+ ```text
44
+ <!-- aio:auto-config:v1:start -->
45
+ …generated content (replaced on every run)…
46
+ <!-- aio:auto-config:v1:end -->
47
+ ```
48
+
49
+ Re-running `aio` **updates in place** — the block never duplicates (verified by
50
+ `test/selfcheck.js`).
51
+
52
+ ### The block (excerpt)
53
+
54
+ ```markdown
55
+ ### AIO AUTO-CONTEXT (generated by aio v1.1.0 — do not edit; re-run `aio` to refresh)
56
+ … manifest path, tools registry path …
57
+
58
+ Auto-use rules (plain-language prompts only — NO slash-commands required):
59
+ 1. USAGE DISCLOSURE (MANDATORY — never skip): … the FIRST line of that part of your reply must be exactly:
60
+ [aio] Using <name> (<type>) — <function>
61
+ Example: [aio] Using Stirling-PDF (repo) — HTML/CSS/JS to PDF converter
62
+ 2. When a prompt involves a local repository, tool, service, or skill, read the manifest …
63
+ ```
64
+
65
+ ## Rollback semantics
66
+
67
+ `aio rollback` is **surgical**, not a file restore:
68
+
69
+ 1. removes the marker block from the seven instruction files
70
+ (so your edits made *after* setup are preserved)
71
+ 2. removes MCP entries recorded in `~/.aio/mcp-ledger.json` — i.e. only the
72
+ entries aio itself created. Pre-existing entries (configured by you or by
73
+ the agent) are never touched.
74
+ 3. keeps `~/.aio/backups/` as a safety net.
75
+
76
+ ## Troubleshooting
77
+
78
+ | Symptom | Fix |
79
+ |---|---|
80
+ | `no local data dir found` | run from your registry folder, or `aio --home <dir>` |
81
+ | `repos dir not found` | `aio --repos <dir>` or `set AIO_REPOS_DIR=<dir>` |
82
+ | `binary not on PATH — skipped` (MCP) | install `codebase-memory-mcp`, re-run `aio` |
83
+ | manifest is stale after cloning | run `aio` again (rescans every run) |
84
+ | agent ignores the manifest | check the block exists: search `aio:auto-config` in its instruction file |
85
+ | want a clean machine | `aio rollback` (backups in `~/.aio/backups/`) |
86
+ | update to latest rules | `aio update` |
@@ -0,0 +1,142 @@
1
+ # Screenshot evidence — repository homepages
2
+
3
+ Every repository listed in the `aio` manifest has a local screenshot of its
4
+ homepage: living proof that each entry resolves to a real, reachable project —
5
+ not a placeholder row.
6
+
7
+ ## Method
8
+
9
+ | | |
10
+ |---|---|
11
+ | Engine | Microsoft Edge, headless (`--headless=new`) |
12
+ | Viewport | 1280 × 1000 CSS px |
13
+ | Settle time | `--virtual-time-budget=9000` (waits out SPA hydration) |
14
+ | Source URL | the `url = …` value from each repo's own `.git/config` |
15
+ | Output | `screenshots/repo-<name>.png`, one per repository |
16
+ | Naming | exact repo folder name — matches the manifest's `Local path` column |
17
+
18
+ Regenerate everything (same command the index was built with):
19
+
20
+ ```powershell
21
+ $shots = "<repo>\screenshots"; $edge = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
22
+ foreach ($r in Get-ChildItem "<repos-dir>" -Directory) {
23
+ $url = (Select-String -Path "$($r.FullName)\.git\config" -Pattern 'url = (\S+)').Matches[0].Groups[1].Value -replace '\.git$',''
24
+ & $edge --headless=new --screenshot="$shots\repo-$($r.Name).png" `
25
+ --window-size=1280,1000 --virtual-time-budget=9000 $url
26
+ }
27
+ ```
28
+
29
+ ## Coverage
30
+
31
+ **97 / 97 repositories captured** (2026-09-28). Files live in
32
+ `screenshots/repo-*.png` — that directory is **git-ignored** (local evidence
33
+ only; screenshots are neither committed nor shipped in the npm package).
34
+ Older ad-hoc captures (`gh-*.png`, `02a-*.png`, …) are kept alongside as
35
+ historical artifacts.
36
+
37
+ ## Index
38
+
39
+ | # | Repository | URL | Local path | Shot |
40
+ |---|---|---|---|---|
41
+ | 1 | ab-download-manager | https://github.com/amir1376/ab-download-manager | `D:\Tools\github\ab-download-manager` | 47 KB |
42
+ | 2 | actual | https://github.com/actualbudget/actual | `D:\Tools\github\actual` | 42 KB |
43
+ | 3 | agency-agents | https://github.com/msitarzewski/agency-agents | `D:\Tools\github\agency-agents` | 41 KB |
44
+ | 4 | agent-skills | https://github.com/vercel-labs/agent-skills | `D:\Tools\github\agent-skills` | 41 KB |
45
+ | 5 | ai-job-search | https://github.com/MadsLorentzen/ai-job-search | `D:\Tools\github\ai-job-search` | 45 KB |
46
+ | 6 | anything-llm | https://github.com/Mintplex-Labs/anything-llm | `D:\Tools\github\anything-llm` | 61 KB |
47
+ | 7 | AppFlowy | https://github.com/AppFlowy-IO/AppFlowy | `D:\Tools\github\AppFlowy` | 49 KB |
48
+ | 8 | bat | https://github.com/sharkdp/bat | `D:\Tools\github\bat` | 43 KB |
49
+ | 9 | book-to-skill | https://github.com/virgiliojr94/book-to-skill | `D:\Tools\github\book-to-skill` | 46 KB |
50
+ | 10 | brightbean-studio | https://github.com/brightbeanxyz/brightbean-studio | `D:\Tools\github\brightbean-studio` | 48 KB |
51
+ | 11 | browser-use | https://github.com/browser-use/browser-use | `D:\Tools\github\browser-use` | 63 KB |
52
+ | 12 | caveman | https://github.com/JuliusBrussee/caveman | `D:\Tools\github\caveman` | 45 KB |
53
+ | 13 | chunkr | https://github.com/lumina-ai-inc/chunkr | `D:\Tools\github\chunkr` | 80 KB |
54
+ | 14 | claude-watch | https://github.com/taoufik123-collab/claude-watch | `D:\Tools\github\claude-watch` | 40 KB |
55
+ | 15 | cline | https://github.com/cline/cline | `D:\Tools\github\cline` | 78 KB |
56
+ | 16 | cmdk | https://github.com/dip/cmdk | `D:\Tools\github\cmdk` | 86 KB |
57
+ | 17 | codegraph | https://github.com/colbymchenry/codegraph | `D:\Tools\github\codegraph` | 83 KB |
58
+ | 18 | coolify | https://github.com/coollabsio/coolify | `D:\Tools\github\coolify` | 48 KB |
59
+ | 19 | crawl4ai | https://github.com/unclecode/crawl4ai | `D:\Tools\github\crawl4ai` | 63 KB |
60
+ | 20 | crawlee | https://github.com/apify/crawlee | `D:\Tools\github\crawlee` | 62 KB |
61
+ | 21 | crewAI | https://github.com/crewAIInc/crewAI | `D:\Tools\github\crewAI` | 61 KB |
62
+ | 22 | crystal | https://github.com/stravu/crystal | `D:\Tools\github\crystal` | 46 KB |
63
+ | 23 | dnd-kit | https://github.com/clauderic/dnd-kit | `D:\Tools\github\dnd-kit` | 64 KB |
64
+ | 24 | eclaire | https://github.com/eclaire-labs/eclaire | `D:\Tools\github\eclaire` | 61 KB |
65
+ | 25 | firecrawl | https://github.com/firecrawl/firecrawl | `D:\Tools\github\firecrawl` | 61 KB |
66
+ | 26 | fzf | https://github.com/junegunn/fzf | `D:\Tools\github\fzf` | 43 KB |
67
+ | 27 | godui | https://github.com/LucasBassetti/godui | `D:\Tools\github\godui` | 65 KB |
68
+ | 28 | Graft | https://github.com/trailhq/Graft | `D:\Tools\github\Graft` | 46 KB |
69
+ | 29 | h4cker | https://github.com/The-Art-of-Hacking/h4cker | `D:\Tools\github\h4cker` | 59 KB |
70
+ | 30 | headroom | https://github.com/headroomlabs-ai/headroom | `D:\Tools\github\headroom` | 63 KB |
71
+ | 31 | herdr | https://github.com/herdrdev/herdr | `D:\Tools\github\herdr` | 59 KB |
72
+ | 32 | html-anything | https://github.com/nexu-io/html-anything | `D:\Tools\github\html-anything` | 65 KB |
73
+ | 33 | i-have-adhd | https://github.com/ayghri/i-have-adhd | `D:\Tools\github\i-have-adhd` | 42 KB |
74
+ | 34 | immich | https://github.com/immich-app/immich | `D:\Tools\github\immich` | 47 KB |
75
+ | 35 | input-otp | https://github.com/guilhermerodz/input-otp | `D:\Tools\github\input-otp` | 88 KB |
76
+ | 36 | jellyfin | https://github.com/jellyfin/jellyfin | `D:\Tools\github\jellyfin` | 45 KB |
77
+ | 37 | jitsi-meet | https://github.com/jitsi/jitsi-meet | `D:\Tools\github\jitsi-meet` | 43 KB |
78
+ | 38 | joplin | https://github.com/laurent22/joplin | `D:\Tools\github\joplin` | 47 KB |
79
+ | 39 | lazygit | https://github.com/jesseduffield/lazygit | `D:\Tools\github\lazygit` | 41 KB |
80
+ | 40 | lenis | https://github.com/darkroomengineering/lenis | `D:\Tools\github\lenis` | 59 KB |
81
+ | 41 | litellm | https://github.com/BerriAI/litellm | `D:\Tools\github\litellm` | 63 KB |
82
+ | 42 | liveline | https://github.com/benjitaylor/liveline | `D:\Tools\github\liveline` | 50 KB |
83
+ | 43 | localsend | https://github.com/localsend/localsend | `D:\Tools\github\localsend` | 43 KB |
84
+ | 44 | markitdown | https://github.com/microsoft/markitdown | `D:\Tools\github\markitdown` | 64 KB |
85
+ | 45 | Matt_Pocock_Skills | https://github.com/aurorasoft2/Matt_Pocock_Skills | `D:\Tools\github\Matt_Pocock_Skills` | 122 KB |
86
+ | 46 | maxun | https://github.com/getmaxun/maxun | `D:\Tools\github\maxun` | 48 KB |
87
+ | 47 | memex | https://github.com/memex-lab/memex | `D:\Tools\github\memex` | 60 KB |
88
+ | 48 | mixpost | https://github.com/inovector/mixpost | `D:\Tools\github\mixpost` | 46 KB |
89
+ | 49 | motion | https://github.com/motiondivision/motion | `D:\Tools\github\motion` | 57 KB |
90
+ | 50 | Motrix | https://github.com/agalwood/Motrix | `D:\Tools\github\Motrix` | 43 KB |
91
+ | 51 | n8n | https://github.com/n8n-io/n8n | `D:\Tools\github\n8n` | 48 KB |
92
+ | 52 | no-ai-slop | https://github.com/petergyang/no-ai-slop | `D:\Tools\github\no-ai-slop` | 40 KB |
93
+ | 53 | nocodb | https://github.com/nocodb/nocodb | `D:\Tools\github\nocodb` | 48 KB |
94
+ | 54 | number-flow | https://github.com/barvian/number-flow | `D:\Tools\github\number-flow` | 61 KB |
95
+ | 55 | obsidian-releases | https://github.com/obsidianmd/obsidian-releases | `D:\Tools\github\obsidian-releases` | 81 KB |
96
+ | 56 | oh-my-pi | https://github.com/can1357/oh-my-pi | `D:\Tools\github\oh-my-pi` | 84 KB |
97
+ | 57 | OmniRoute | https://github.com/diegosouzapw/OmniRoute | `D:\Tools\github\OmniRoute` | 51 KB |
98
+ | 58 | Open-Generative-AI | https://github.com/Anil-matcha/Open-Generative-AI | `D:\Tools\github\Open-Generative-AI` | 48 KB |
99
+ | 59 | open-notebook | https://github.com/lfnovo/open-notebook | `D:\Tools\github\open-notebook` | 43 KB |
100
+ | 60 | open-seo | https://github.com/every-app/open-seo | `D:\Tools\github\open-seo` | 43 KB |
101
+ | 61 | openanalytics | https://github.com/OpenLabs-so/openanalytics | `D:\Tools\github\openanalytics` | 60 KB |
102
+ | 62 | OpenChatCut | https://github.com/0xsline/OpenChatCut | `D:\Tools\github\OpenChatCut` | 45 KB |
103
+ | 63 | openhuman | https://github.com/tinyhumansai/openhuman | `D:\Tools\github\openhuman` | 45 KB |
104
+ | 64 | OpenMontage | https://github.com/calesthio/OpenMontage | `D:\Tools\github\OpenMontage` | 57 KB |
105
+ | 65 | openreply | https://github.com/diwenne/openreply | `D:\Tools\github\openreply` | 39 KB |
106
+ | 66 | openwhispr | https://github.com/OpenWhispr/openwhispr | `D:\Tools\github\openwhispr` | 47 KB |
107
+ | 67 | OxCode | https://github.com/daviluzsk/OxCode | `D:\Tools\github\OxCode` | 57 KB |
108
+ | 68 | penpot | https://github.com/penpot/penpot | `D:\Tools\github\penpot` | 43 KB |
109
+ | 69 | pipecat | https://github.com/pipecat-ai/pipecat | `D:\Tools\github\pipecat` | 76 KB |
110
+ | 70 | plasmic | https://github.com/plasmicapp/plasmic | `D:\Tools\github\plasmic` | 45 KB |
111
+ | 71 | postiz-app | https://github.com/gitroomhq/postiz-app | `D:\Tools\github\postiz-app` | 48 KB |
112
+ | 72 | quickLiquid | https://github.com/amarnath3003/quickLiquid | `D:\Tools\github\quickLiquid` | 114 KB |
113
+ | 73 | radix-primitives | https://github.com/radix-ui/primitives | `D:\Tools\github\radix-primitives` | 71 KB |
114
+ | 74 | react-virtuoso | https://github.com/petyosi/react-virtuoso | `D:\Tools\github\react-virtuoso` | 61 KB |
115
+ | 75 | relaticle | https://github.com/relaticle/relaticle | `D:\Tools\github\relaticle` | 61 KB |
116
+ | 76 | ripgrep | https://github.com/BurntSushi/ripgrep | `D:\Tools\github\ripgrep` | 43 KB |
117
+ | 77 | rtk | https://github.com/rtk-ai/rtk | `D:\Tools\github\rtk` | 60 KB |
118
+ | 78 | Scrapling | https://github.com/D4Vinci/Scrapling | `D:\Tools\github\Scrapling` | 60 KB |
119
+ | 79 | scrapy | https://github.com/scrapy/scrapy | `D:\Tools\github\scrapy` | 63 KB |
120
+ | 80 | shoutrrr | https://github.com/coollabsio/shoutrrr | `D:\Tools\github\shoutrrr` | 40 KB |
121
+ | 81 | skills | https://github.com/emilkowalski/skills | `D:\Tools\github\skills` | 61 KB |
122
+ | 82 | Snapzy | https://github.com/duongductrong/Snapzy | `D:\Tools\github\Snapzy` | 45 KB |
123
+ | 83 | sonner | https://github.com/emilkowalski/sonner | `D:\Tools\github\sonner` | 61 KB |
124
+ | 84 | sqlmap | https://github.com/sqlmapproject/sqlmap | `D:\Tools\github\sqlmap` | 56 KB |
125
+ | 85 | Stirling-PDF | https://github.com/Stirling-Tools/Stirling-PDF | `D:\Tools\github\Stirling-PDF` | 44 KB |
126
+ | 86 | strix | https://github.com/usestrix/strix | `D:\Tools\github\strix` | 48 KB |
127
+ | 87 | superplane | https://github.com/superplanehq/superplane | `D:\Tools\github\superplane` | 43 KB |
128
+ | 88 | syncthing | https://github.com/syncthing/syncthing | `D:\Tools\github\syncthing` | 42 KB |
129
+ | 89 | system-design-101 | https://github.com/ByteByteGoHq/system-design-101 | `D:\Tools\github\system-design-101` | 196 KB |
130
+ | 90 | ui | https://github.com/shadcn-ui/ui | `D:\Tools\github\ui` | 59 KB |
131
+ | 91 | umami | https://github.com/umami-software/umami | `D:\Tools\github\umami` | 45 KB |
132
+ | 92 | vaultwarden | https://github.com/dani-garcia/vaultwarden | `D:\Tools\github\vaultwarden` | 43 KB |
133
+ | 93 | wacrm | https://github.com/ArnasDon/wacrm | `D:\Tools\github\wacrm` | 46 KB |
134
+ | 94 | webstudio | https://github.com/webstudio-is/webstudio | `D:\Tools\github\webstudio` | 47 KB |
135
+ | 95 | yazi | https://github.com/sxyazi/yazi | `D:\Tools\github\yazi` | 46 KB |
136
+ | 96 | zennotes | https://github.com/ZenNotes/zennotes | `D:\Tools\github\zennotes` | 44 KB |
137
+ | 97 | zoxide | https://github.com/ajeetdsouza/zoxide | `D:\Tools\github\zoxide` | 45 KB |
138
+
139
+ | | |
140
+ |---|---|
141
+ | *Columns* | repository · source URL · local path · screenshot size |
142
+ | *Source of truth* | the same `.git/config` URLs the manifest uses |
package/docs/flow.md ADDED
@@ -0,0 +1,94 @@
1
+ # How the aio flow diagram works
2
+
3
+ `docs/flow.svg` is the README's animated explainer: a single static SVG that
4
+ also animates itself — no JavaScript, no runtime dependency, no external
5
+ assets. This page documents what it shows, how the motion is built, and how it
6
+ is verified.
7
+
8
+ ## What the diagram shows
9
+
10
+ Four nodes, three numbered hops:
11
+
12
+ | # | Hop | Meaning |
13
+ |---|---|---|
14
+ | 1 | **Your prompt → AI agent** | plain-language input; no `/slash-command` needed |
15
+ | 2 | **aio manifest → AI agent** | the agent pulls `REPOS · TOOLS · SKILLS` context on its own (dashed, vermilion — it is the aio-owned edge) |
16
+ | 3 | **AI agent → Your answer** | the reply carries the disclosure line `[aio] Using <name> (<type>) — <function>` |
17
+
18
+ The manifest box is drawn **dashed** on purpose: it is not a step the user
19
+ triggers — it is background context that feeds the agent continuously.
20
+
21
+ ## How the animation works
22
+
23
+ The motion is pure SVG **SMIL**: each arrow has a `<circle>` with an
24
+ `animateMotion` that travels along *the exact same path data* as the arrow it
25
+ rides — so a pulse can never drift off its track.
26
+
27
+ ```xml
28
+ <path id="p1" d="M250,198 H285 V98 H316" marker-end="url(#ah)"/>
29
+ <circle r="5" fill="#FF4A1C">
30
+ <animateMotion dur="2.4s" begin="0s" repeatCount="indefinite"
31
+ path="M250,198 H285 V98 H316"/>
32
+ </circle>
33
+ ```
34
+
35
+ Design decisions:
36
+
37
+ - **2.4 s loop, three phases (`begin` 0 s / 0.8 s / 1.6 s)** — the stagger
38
+ reads as causality: prompt leaves first, context follows, result arrives
39
+ last. One cycle tells the whole story even at low frame rates.
40
+ - **Pulses ride the arrows, arrows stay static** — direction is legible even
41
+ with animation disabled or dropped (e.g. static PNG export).
42
+ - **The manifest pulse is on the dashed vermilion edge** — reinforces which
43
+ edge aio owns; the two solid edges belong to the user↔agent exchange.
44
+ - **`repeatCount="indefinite"`, no JavaScript** — works inside `<img>` embeds,
45
+ on GitHub README rendering, and offline.
46
+
47
+ ## Accessibility & graceful degradation
48
+
49
+ - The root `<svg>` carries `role="img"` and an `aria-label` describing the
50
+ full flow — screen readers get the semantics without the motion.
51
+ - The diagram is fully meaningful as a **single frozen frame**: motion is
52
+ decorative, not informational (WCAG 2.3.1 acceptable as autoplaying,
53
+ non-essential animation).
54
+ - No external fonts or images are referenced — layout cannot break.
55
+
56
+ ## Design tokens
57
+
58
+ | Token | Value | Used for |
59
+ |---|---|---|
60
+ | Ink | `#101418` | canvas |
61
+ | Surface | `#171D23` | node boxes |
62
+ | Paper | `#F7F5F2` | titles, solid arrows, arrowheads |
63
+ | Muted | `#9AA3AD` | captions, step labels |
64
+ | Vermilion | `#FF4A1C` | manifest edge, manifest box stroke, pulses |
65
+
66
+ Same palette as the brand kit (`assets/logo-gallery.html`) — diagram and logo
67
+ system are one identity.
68
+
69
+ ## Verification (how we prove it animates)
70
+
71
+ Headless Chromium renders the SVG at two virtual-time budgets and the output
72
+ hashes are compared:
73
+
74
+ ```powershell
75
+ # frame A vs frame B — different bytes ⇒ animateMotion advanced
76
+ msedge --headless=new --screenshot=frameA.png --window-size=940,480 `
77
+ --virtual-time-budget=500 docs/flow.svg
78
+ msedge --headless=new --screenshot=frameB.png --window-size=940,480 `
79
+ --virtual-time-budget=1800 docs/flow.svg
80
+ ```
81
+
82
+ Recorded result (2026-09-28): frame A `FFDE6A1CF6E8…`, frame B
83
+ `21CB7403F90A…` — pulses visibly moved along all three edges; palette and the
84
+ 8-agent list re-skin to the v1.1.0 identity in the same pass.
85
+
86
+ ## Embedding
87
+
88
+ ```html
89
+ <img src="./docs/flow.svg" width="100%"
90
+ alt="How aio works: your prompt → AI agent (fed by the aio manifest) → answer with disclosed usage">
91
+ ```
92
+
93
+ GitHub README renders SMIL inside `<img>` (Chromium-based viewers animate;
94
+ Safari/WebGL-less contexts show the correct static frame).
package/docs/flow.svg ADDED
@@ -0,0 +1,69 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 890 430" width="890" height="430" role="img" aria-label="How aio works: prompt to agent to disclosed result, fed by the aio manifest">
2
+ <defs>
3
+ <marker id="ah" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
4
+ <path d="M0 0 L10 5 L0 10 z" fill="#F7F5F2"/>
5
+ </marker>
6
+ <marker id="ah-dim" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
7
+ <path d="M0 0 L10 5 L0 10 z" fill="#FF4A1C"/>
8
+ </marker>
9
+ </defs>
10
+
11
+ <rect x="0" y="0" width="890" height="430" rx="16" fill="#101418"/>
12
+ <rect x="1" y="1" width="888" height="428" rx="15" fill="none" stroke="#262C33" stroke-width="2"/>
13
+
14
+ <!-- boxes -->
15
+ <g font-family="'Segoe UI',system-ui,-apple-system,sans-serif">
16
+ <g>
17
+ <rect x="40" y="160" width="210" height="76" rx="12" fill="#171D23" stroke="#F7F5F2" stroke-width="2"/>
18
+ <text x="145" y="193" text-anchor="middle" font-size="17" font-weight="600" fill="#F7F5F2">Your prompt</text>
19
+ <text x="145" y="216" text-anchor="middle" font-size="12.5" fill="#9AA3AD">plain language, no /command</text>
20
+ </g>
21
+ <g>
22
+ <rect x="320" y="60" width="270" height="76" rx="12" fill="#171D23" stroke="#F7F5F2" stroke-width="2"/>
23
+ <text x="455" y="93" text-anchor="middle" font-size="17" font-weight="600" fill="#F7F5F2">AI agent</text>
24
+ <text x="455" y="116" text-anchor="middle" font-size="12.5" fill="#9AA3AD">opencode · claude · kimi · jcode · codex · gemini · freebuff · hermes</text>
25
+ </g>
26
+ <g>
27
+ <rect x="320" y="290" width="270" height="76" rx="12" fill="#1A1216" stroke="#FF4A1C" stroke-width="2" stroke-dasharray="7 5"/>
28
+ <text x="455" y="323" text-anchor="middle" font-size="17" font-weight="600" fill="#F7F5F2">aio manifest</text>
29
+ <text x="455" y="346" text-anchor="middle" font-size="12.5" fill="#9AA3AD">REPOS · TOOLS · SKILLS (auto-generated)</text>
30
+ </g>
31
+ <g>
32
+ <rect x="645" y="160" width="210" height="76" rx="12" fill="#171D23" stroke="#F7F5F2" stroke-width="2"/>
33
+ <text x="750" y="193" text-anchor="middle" font-size="17" font-weight="600" fill="#F7F5F2">Your answer</text>
34
+ <text x="750" y="216" text-anchor="middle" font-size="12.5" fill="#9AA3AD">usage disclosed, sources named</text>
35
+ </g>
36
+ </g>
37
+
38
+ <!-- arrows -->
39
+ <g fill="none" stroke="#F7F5F2" stroke-width="2.5" stroke-linecap="round">
40
+ <path id="p1" d="M250,198 H285 V98 H316" marker-end="url(#ah)"/>
41
+ <path id="p3" d="M590,98 H615 V198 H641" marker-end="url(#ah)"/>
42
+ </g>
43
+ <path id="p2" d="M455,286 V140" fill="none" stroke="#FF4A1C" stroke-width="2.5" stroke-dasharray="7 5" marker-end="url(#ah-dim)"/>
44
+
45
+ <!-- flow labels -->
46
+ <g font-family="'Segoe UI',system-ui,-apple-system,sans-serif" font-size="11.5" fill="#9AA3AD">
47
+ <text x="256" y="216">1 · prompt</text>
48
+ <text x="468" y="224">2 · auto context (no slash-command)</text>
49
+ <text x="626" y="154">3 · disclosed result</text>
50
+ </g>
51
+
52
+ <!-- traveling pulses -->
53
+ <g fill="#FF4A1C">
54
+ <circle r="5">
55
+ <animateMotion dur="2.4s" begin="0s" repeatCount="indefinite" path="M250,198 H285 V98 H316"/>
56
+ </circle>
57
+ <circle r="5" fill="#F7F5F2">
58
+ <animateMotion dur="2.4s" begin="0.8s" repeatCount="indefinite" path="M455,286 V140"/>
59
+ </circle>
60
+ <circle r="5">
61
+ <animateMotion dur="2.4s" begin="1.6s" repeatCount="indefinite" path="M590,98 H615 V198 H641"/>
62
+ </circle>
63
+ </g>
64
+
65
+ <!-- legend -->
66
+ <g font-family="'Segoe UI',system-ui,-apple-system,sans-serif" font-size="12.5" fill="#9AA3AD">
67
+ <text x="445" y="405" text-anchor="middle">Agent reads the manifest on its own and reports: [aio] Using &lt;name&gt; (&lt;type&gt;) — &lt;function&gt;</text>
68
+ </g>
69
+ </svg>
package/docs/logo.svg ADDED
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128" role="img" aria-label="aio logo">
2
+ <!-- motif: three streams converging into one node (all-in-one) -->
3
+ <rect width="128" height="128" rx="28" fill="#101418"/>
4
+ <g fill="none" stroke="#F7F5F2" stroke-width="11" stroke-linecap="round" stroke-linejoin="round">
5
+ <path d="M18 32 L46 54 Q62 64 84 64"/>
6
+ <path d="M14 64 H84"/>
7
+ <path d="M18 96 L46 74 Q62 64 84 64"/>
8
+ </g>
9
+ <circle cx="103" cy="64" r="9.5" fill="#FF4A1C"/>
10
+ </svg>
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "aio-connect",
3
+ "version": "1.1.0",
4
+ "description": "aio — auto-connect your AI coding agents to your local repos, tools & skills. No slash-commands.",
5
+ "type": "module",
6
+ "bin": {
7
+ "aio": "./bin/aio.js"
8
+ },
9
+ "scripts": {
10
+ "test": "node --test \"test/*.js\""
11
+ },
12
+ "engines": {
13
+ "node": ">=22"
14
+ },
15
+ "files": [
16
+ "bin",
17
+ "src",
18
+ "test",
19
+ "assets",
20
+ "docs",
21
+ "README.md",
22
+ "PRD.md",
23
+ "LICENSE"
24
+ ],
25
+ "keywords": [
26
+ "ai",
27
+ "aio",
28
+ "agent",
29
+ "ai-agent",
30
+ "opencode",
31
+ "claude-code",
32
+ "mcp",
33
+ "context",
34
+ "auto-connect",
35
+ "cli"
36
+ ],
37
+ "author": "MRaihan-XXL",
38
+ "license": "GPL-3.0-only",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git+https://github.com/MRaihan-XXL/all-in-one-repo.git"
42
+ },
43
+ "bugs": {
44
+ "url": "https://github.com/MRaihan-XXL/all-in-one-repo/issues"
45
+ },
46
+ "homepage": "https://github.com/MRaihan-XXL/all-in-one-repo#readme"
47
+ }
package/src/banner.js ADDED
@@ -0,0 +1,34 @@
1
+ // banner.js — aio CLI branding (logo + wordmark + version)
2
+ import fs from 'node:fs';
3
+
4
+ export function getVersion() {
5
+ try {
6
+ const pkg = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
7
+ return pkg.version || '0.0.0';
8
+ } catch {
9
+ return '0.0.0';
10
+ }
11
+ }
12
+
13
+ // Strict grid: each glyph is a fixed width, joined with single spaces — every
14
+ // row is exactly 8+1+4+1+8 = 22 columns, so letters can never come out crooked.
15
+ const GLYPHS = {
16
+ A: [' ██████ ', '██ ██', '██ ██', '████████', '██ ██', '██ ██'],
17
+ I: ['████', ' ██ ', ' ██ ', ' ██ ', ' ██ ', '████'],
18
+ O: [' ██████ ', '██ ██', '██ ██', '██ ██', '██ ██', ' ██████ '],
19
+ };
20
+ export const ART = GLYPHS.A.map((row, i) => `${row} ${GLYPHS.I[i]} ${GLYPHS.O[i]}`);
21
+
22
+ export function banner() {
23
+ const color = process.stdout.isTTY;
24
+ const accent = color ? '\x1b[38;5;203m' : '';
25
+ const dim = color ? '\x1b[2m' : '';
26
+ const reset = color ? '\x1b[0m' : '';
27
+ const version = getVersion();
28
+ const lines = [
29
+ ...ART.map((l) => accent + l + reset),
30
+ `${dim} all-in-one-repo v${version} — auto-connect AI agents to your repos, tools & skills${reset}`,
31
+ `${dim} GPL-3.0 · https://github.com/MRaihan-XXL/all-in-one-repo${reset}`,
32
+ ];
33
+ return lines.join('\n');
34
+ }
package/src/paths.js ADDED
@@ -0,0 +1,70 @@
1
+ // paths.js — location resolution: state (~/.aio), data dir, repos dir
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import os from 'node:os';
5
+
6
+ export const STATE_DIR = process.env.AIO_STATE_DIR
7
+ ? path.resolve(process.env.AIO_STATE_DIR)
8
+ : path.join(os.homedir(), '.aio');
9
+ export const CONFIG_FILE = path.join(STATE_DIR, 'config.json');
10
+ export const BACKUP_DIR = path.join(STATE_DIR, 'backups');
11
+ export const DEFAULT_REPOS_DIR = 'D:\\Tools\\github';
12
+
13
+ export function readState() {
14
+ try {
15
+ return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
16
+ } catch {
17
+ return {};
18
+ }
19
+ }
20
+
21
+ export function writeState(partial) {
22
+ fs.mkdirSync(STATE_DIR, { recursive: true });
23
+ const next = { ...readState(), ...partial };
24
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(next, null, 2));
25
+ return next;
26
+ }
27
+
28
+ function hasLocalData(dir) {
29
+ return ['ai-tools.db', 'TOOLS-INDEX.md'].some((f) => fs.existsSync(path.join(dir, f)));
30
+ }
31
+
32
+ /** Priority: --home > $AIO_HOME > persisted state > walk up from cwd (marker discovery). */
33
+ export function resolveDataDir(cliHome) {
34
+ if (cliHome) {
35
+ const abs = path.resolve(cliHome);
36
+ if (!hasLocalData(abs)) {
37
+ console.error(`[aio] warning: --home has no ai-tools.db / TOOLS-INDEX.md: ${abs}`);
38
+ }
39
+ writeState({ dataDir: abs });
40
+ return abs;
41
+ }
42
+ if (process.env.AIO_HOME) return path.resolve(process.env.AIO_HOME);
43
+ const st = readState();
44
+ if (st.dataDir && hasLocalData(st.dataDir)) return st.dataDir;
45
+ let dir = process.cwd();
46
+ for (let i = 0; i < 10; i++) {
47
+ if (hasLocalData(dir)) {
48
+ writeState({ dataDir: dir });
49
+ return dir;
50
+ }
51
+ const parent = path.dirname(dir);
52
+ if (parent === dir) break;
53
+ dir = parent;
54
+ }
55
+ return null;
56
+ }
57
+
58
+ /** Priority: --repos > $AIO_REPOS_DIR > persisted state > default (if it exists). */
59
+ export function resolveReposDir(cliRepos) {
60
+ if (cliRepos) {
61
+ const abs = path.resolve(cliRepos);
62
+ writeState({ reposDir: abs });
63
+ return abs;
64
+ }
65
+ if (process.env.AIO_REPOS_DIR) return path.resolve(process.env.AIO_REPOS_DIR);
66
+ const st = readState();
67
+ if (st.reposDir && fs.existsSync(st.reposDir)) return st.reposDir;
68
+ if (fs.existsSync(DEFAULT_REPOS_DIR)) return DEFAULT_REPOS_DIR;
69
+ return null;
70
+ }