auto-context-cli 1.0.2__tar.gz → 1.0.3__tar.gz
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.
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/PKG-INFO +116 -41
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/README.md +115 -40
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/pyproject.toml +1 -1
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/__init__.py +1 -1
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/commands/init_cmd.py +7 -0
- auto_context_cli-1.0.3/src/auto_context/commands/scan_cmd.py +133 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/main.py +8 -2
- auto_context_cli-1.0.3/src/auto_context/scanner.py +297 -0
- auto_context_cli-1.0.3/src/auto_context/templates/context.template.md +53 -0
- auto_context_cli-1.0.3/src/auto_context/templates/rules/hub-satellite-architecture.md +33 -0
- auto_context_cli-1.0.3/src/auto_context/templates/rules/readme-docs-sync.md +23 -0
- auto_context_cli-1.0.2/src/auto_context/templates/context.template.md +0 -94
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/.gitignore +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/LICENSE +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/commands/__init__.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/commands/import_cmd.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/commands/mcp.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/commands/memory.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/commands/share.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/commands/update_cmd.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/config.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/security.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/AGENTS.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/GEMINI.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/context.local.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/maintain_context.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/mcp_config.template.json +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/profile.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/rule.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/rules/code-standards.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/rules/security-boundaries.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/skill.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/skills/browser-testing/SKILL.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/skills/docker-ops/SKILL.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/skills/git-workflow/SKILL.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/skills/server-diagnostics/SKILL.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: auto-context-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.3
|
|
4
4
|
Summary: Autonomous context & instruction manager for AI coding assistants
|
|
5
5
|
Author: Arghya Biswas
|
|
6
6
|
License: MIT
|
|
@@ -20,7 +20,7 @@ Description-Content-Type: text/markdown
|
|
|
20
20
|
|
|
21
21
|
[](https://pypi.org/project/auto-context-cli/)
|
|
22
22
|
[](https://pypi.org/project/auto-context-cli/)
|
|
23
|
-
[](https://github.com/Cyber-arghya/auto-context/releases/tag/v1.0.
|
|
23
|
+
[](https://github.com/Cyber-arghya/auto-context/releases/tag/v1.0.3)
|
|
24
24
|
[](https://opensource.org/licenses/MIT)
|
|
25
25
|
[](#-quick-one-line-install)
|
|
26
26
|
[](#-supported-ai-assistants)
|
|
@@ -75,45 +75,33 @@ cd /path/to/any-project
|
|
|
75
75
|
init-context
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
###
|
|
79
|
-
|
|
80
|
-
init-context
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
--secret, --private Publish shared Gist as unlisted/secret
|
|
106
|
-
|
|
107
|
-
OPTIONS (MCP TOOLING):
|
|
108
|
-
--add-mcp <NAME> Add or update an MCP server configuration
|
|
109
|
-
--remove-mcp <NAME> Remove an MCP server from configuration
|
|
110
|
-
--list-mcp List all active MCP server tools
|
|
111
|
-
--preset <PRESET> Preset template (sqlite, postgres, github, filesystem, brave, fetch)
|
|
112
|
-
--command <CMD> Executable command for stdio server (e.g. npx, uvx, python3)
|
|
113
|
-
--args <ARGS> Arguments to pass to command
|
|
114
|
-
--url <URL> Streamable HTTP endpoint URL for remote MCP server
|
|
115
|
-
--env <KEY=VAL,...> Environment variables (e.g. 'GITHUB_TOKEN=xyz')
|
|
116
|
-
```
|
|
78
|
+
### Command Reference & Syntax:
|
|
79
|
+
|
|
80
|
+
Auto-Context supports both modern subcommands (`init-context <command>`) and standard legacy flags:
|
|
81
|
+
|
|
82
|
+
| Command | Shorthand / Flag | Description |
|
|
83
|
+
| :--- | :--- | :--- |
|
|
84
|
+
| `init-context init [DIR]` | `init-context [DIR]` | Scaffolds 5-tier context in active or specified directory. |
|
|
85
|
+
| `init-context scan [DIR]` | `init-context --scan` | Stack-adaptive codebase scanner: generates satellites (.agents/context/). |
|
|
86
|
+
| `init-context rule <name>` | `init-context -r <name>` | Scaffolds a new agent rule with YAML frontmatter. |
|
|
87
|
+
| `init-context skill <name>` | `init-context -s <name>` | Scaffolds a new agent skill directory with triggers & runbook. |
|
|
88
|
+
| `init-context promote <name>` | — | Promotes local workspace rule/skill to Global Plugin & Central Memory. |
|
|
89
|
+
| `init-context update` | — | Modular, non-breaking update for CLI, global plugin & system rules. |
|
|
90
|
+
| `init-context share <name>` | — | Audits secrets and shares a rule or skill via GitHub Gist. |
|
|
91
|
+
| `init-context import <url>` | — | Imports a rule or skill with 3-way Collision Guard protection. |
|
|
92
|
+
| `init-context memory init` | — | Initializes private GitHub brain repository (`~/.auto-context/memory`). |
|
|
93
|
+
| `init-context memory push` | — | Auto-harvests workspace rules, audits secrets & pushes to private GitHub. |
|
|
94
|
+
| `init-context memory pull` | — | Pulls and restores central brain on a new machine. |
|
|
95
|
+
| `init-context memory status` | — | Displays central brain location, remote URL, and rules/skills count. |
|
|
96
|
+
| `init-context mcp add <name>`| `init-context --add-mcp` | Adds or updates an MCP tool (Node `npx` or Python `uvx`). |
|
|
97
|
+
| `init-context mcp list` | `init-context --list-mcp` | Lists all active MCP server configurations. |
|
|
98
|
+
| `init-context mcp remove <name>`| `init-context --remove-mcp` | Safely removes an MCP server configuration. |
|
|
99
|
+
|
|
100
|
+
### Global Flags:
|
|
101
|
+
* `-g, --global`: Targets machine-wide scope (`~/.gemini/config/plugins/auto-context/` & `~/.auto-context/memory/`).
|
|
102
|
+
* `-f, --force`: Overwrites existing files (bypasses collision guards with confirmation).
|
|
103
|
+
* `-d, --dry-run`: Previews actions without writing files or modifying directories.
|
|
104
|
+
* `-v, --version`: Displays installed package version.
|
|
117
105
|
|
|
118
106
|
---
|
|
119
107
|
|
|
@@ -309,6 +297,68 @@ triggers: ["docker", "container", "compose", "dockerfile"]
|
|
|
309
297
|
|
|
310
298
|
---
|
|
311
299
|
|
|
300
|
+
## 🚀 Rule Promotion & Auto-Harvesting (`init-context promote`)
|
|
301
|
+
|
|
302
|
+
Sometimes a rule or workflow starts as a quick experiment in one project, but proves so valuable that you want every project across your machine and team to inherit it.
|
|
303
|
+
|
|
304
|
+
### 1️⃣ 1-Command Rule Promotion
|
|
305
|
+
```bash
|
|
306
|
+
init-context promote docker-multi-stage
|
|
307
|
+
```
|
|
308
|
+
* **Elevates Local to Global:** Copies `.agents/rules/docker-multi-stage.md` directly into `~/.gemini/config/plugins/auto-context/rules/` and `~/.auto-context/memory/rules/`.
|
|
309
|
+
* **Zero Rewriting:** Preserves all existing YAML frontmatter, guidelines, and constraints.
|
|
310
|
+
* **Instant Sync:** Immediately run `init-context memory push` to backup the newly promoted rule to your private Git brain.
|
|
311
|
+
|
|
312
|
+
### 2️⃣ Auto-Harvesting in Central Memory
|
|
313
|
+
When you run:
|
|
314
|
+
```bash
|
|
315
|
+
init-context memory push
|
|
316
|
+
```
|
|
317
|
+
The CLI automatically:
|
|
318
|
+
1. **Discovers Local Knowledge:** Scans the active workspace's `.agents/rules/` and `.agents/skills/`.
|
|
319
|
+
2. **Harvests to Central Memory:** Copies any new rules and skills into `~/.auto-context/memory/` without overwriting existing files.
|
|
320
|
+
3. **Audits Secrets:** Runs the Zero-Bypass security audit.
|
|
321
|
+
4. **Pushes to Private Remote:** Backs up everything to your private GitHub repo.
|
|
322
|
+
Even if an agent originally codified a rule locally, running `memory push` guarantees zero knowledge loss!
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## 🛰️ Hub & Satellite Modular Architecture (< 400 Token Budget)
|
|
327
|
+
|
|
328
|
+
Dumping routes, models, problem logs, credentials, and runbooks into a single monolithic `context.md` causes context file bloat (1,000–5,000 lines). Every turn burns thousands of unnecessary tokens simply reading the context file!
|
|
329
|
+
|
|
330
|
+
Auto-Context solves this with the **Hub & Satellite Architecture**:
|
|
331
|
+
|
|
332
|
+
```
|
|
333
|
+
project-root/
|
|
334
|
+
├── context.md <─── The Executive Hub (Capped at < 80 lines / ~400 tokens!)
|
|
335
|
+
└── .agents/
|
|
336
|
+
└── context/ <─── Stack-Adaptive Satellites (Loaded on-demand)
|
|
337
|
+
├── routes.md (API Endpoints & UI Page Map — loaded only for route tasks)
|
|
338
|
+
├── schema.md (Database Schemas & ORM Models — loaded only for DB tasks)
|
|
339
|
+
└── gotchas.md (Critical Architecture Traps & Invariants)
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### 1️⃣ Codebase Scanner (`init-context scan`)
|
|
343
|
+
In any in-flight or 40% completed repository, run:
|
|
344
|
+
```bash
|
|
345
|
+
init-context scan
|
|
346
|
+
```
|
|
347
|
+
- **Zero Token Cost:** Scans project directories and manifests locally via fast filesystem heuristics (0 LLM tokens).
|
|
348
|
+
- **Stack-Adaptive:**
|
|
349
|
+
- If Next.js / Express / FastAPI: Generates `.agents/context/routes.md`.
|
|
350
|
+
- If Prisma / Drizzle / Django / SQLAlchemy: Generates `.agents/context/schema.md`.
|
|
351
|
+
- Always provisions `.agents/context/gotchas.md`.
|
|
352
|
+
- **Strict Idempotency Proof ($f(f(x)) = f(x)$):**
|
|
353
|
+
- Uses SHA-256 content hashes and anchored delimiters (`<!-- AUTO-CONTEXT:DISCOVERY:START -->`).
|
|
354
|
+
- Running `scan` 1 time or 100 times produces the exact same deterministic state without duplicating content.
|
|
355
|
+
|
|
356
|
+
### 2️⃣ The Brutal Truth Filter & `gotchas.md`
|
|
357
|
+
- **Zero Dead Logs:** A chronological diary of 50 minor solved bug typos is a waste of disk and token budget. Git already tracks commit history!
|
|
358
|
+
- **Gotchas Over History:** Auto-Context replaces useless bug logs with **`gotchas.md`**: non-obvious architecture traps, port collisions, and invariants that cannot be guessed from reading code.
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
312
362
|
## ⚡ Two-Tier Progressive Disclosure (Token-Optimized Architecture)
|
|
313
363
|
|
|
314
364
|
To avoid context window bloat and burning 20k–30k tokens at session startup, Auto-Context enforces a **Two-Tier Progressive Disclosure Protocol**:
|
|
@@ -542,9 +592,34 @@ To prevent **Prompt Injection Leaks** and keep production secrets safe:
|
|
|
542
592
|
init-context -s my-skill-name -g # সকল প্রজেক্টের জন্য গ্লোবালি
|
|
543
593
|
```
|
|
544
594
|
|
|
595
|
+
### 🛰️ হাব অ্যান্ড স্যাটেলাইট আর্কিটেকচার (< ৪০০ টোকেন সিলিং):
|
|
596
|
+
সব রুট, ডাটাবেজ মডেল এবং হিস্ট্রি এক ফাইলে রাখলে `context.md` ১,০০০–৫,০০০ লাইন হয়ে টোকেন অপচয় করে। Auto-Context একে সমাধান করেছে **Hub & Satellite** মডেল দিয়ে:
|
|
597
|
+
* **The Executive Hub (`context.md`):** প্রজেক্টের রুট ফাইল সবসময় সর্বোচ্চ **< ৮০ লাইন (< ৪০০ টোকেন)**-এ সীমাবদ্ধ থাকবে।
|
|
598
|
+
* **স্ট্যাক-অ্যাডাপটিভ স্যাটেলাইট (`.agents/context/`):**
|
|
599
|
+
* `routes.md`: প্রজেক্টের এপিআই ও পেজ রুট ম্যাপ (শুধু রাউটিং কাজের সময় এআই পড়বে)।
|
|
600
|
+
* `schema.md`: ডাটাবেজ মডেল ও ওআরএম স্কিমা (শুধু ডাটাবেজ কাজের সময় পড়বে)।
|
|
601
|
+
* `gotchas.md`: বাস্তব টেকনিক্যাল ফাঁদ, পোর্ট কনফ্লিক্ট ও আর্কিটেকচারাল সীমাবদ্ধতা।
|
|
602
|
+
|
|
603
|
+
### 🔍 কোডবেস স্ক্যানার (`init-context scan`):
|
|
604
|
+
যেকোনো চলমান বা ৪০% শেষ হওয়া প্রজেক্টে টার্মিনালে রান করুন:
|
|
605
|
+
```bash
|
|
606
|
+
init-context scan
|
|
607
|
+
```
|
|
608
|
+
* **জিরো টোকেন খরচ:** সম্পূর্ণ অফলাইনে লোকাল প্রসেসর দিয়ে মাত্র ১০০ মিলিসেকেন্ডে প্রজেক্ট স্ক্যান করে স্যাটেলাইট ফাইল তৈরি করে।
|
|
609
|
+
* **আইডেমপোটেন্সি প্রুফ ($f(f(x)) = f(x)$):** দিনে ১০০ বার কমান্ড চালালেও কোনো ডুপ্লিকেট কনটেন্ট হবে না বা ইউজারের নিজস্ব নোট ওভাররাইট হবে না।
|
|
610
|
+
|
|
545
611
|
### ⚡ টু-টায়ার প্রোগ্রেসিভ ডিসক্লোজার (টোকেন সাশ্রয়ী আর্কিটেকচার):
|
|
546
612
|
শুরুতেই সব স্কিলের বড় ফাইল লোড করে চ্যাট ভারী করা হয় না। এআই শুরুতে মাত্র ১৫০–২০০ টোকেনের একটি ইনডেক্স (`context.md` Section 5) পড়ে। যখন নির্দিষ্ট টাস্কের কিওয়ার্ড মিলবে (যেমন: "docker", "rebase", "diagnostics", "ui test"), কেবল তখনই সংশ্লিষ্ট পূর্ণাঙ্গ স্কিলটি অন-ডিমান্ড মেমরিতে লোড হয়। ফলে টোকেন খরচ প্রায় ৮০% হ্রাস পায়!
|
|
547
613
|
|
|
614
|
+
### 🚀 রুল প্রমোশন ও অটো-হার্ভেস্টিং (Promote & Auto-Harvest):
|
|
615
|
+
* **লোকাল রুলকে গ্লোবালে উন্নীত করা (`promote`):**
|
|
616
|
+
যদি কোনো নির্দিষ্ট প্রজেক্টে তৈরি করা রুল বা স্কিল আপনার কম্পিউটারের সকল প্রজেক্টের জন্য প্রয়োজন হয়, তবে এক কমান্ডে গ্লোবাল প্লাগইন ও সেন্ট্রাল মেমরিতে প্রমোট করতে পারবেন:
|
|
617
|
+
```bash
|
|
618
|
+
init-context promote docker-multi-stage
|
|
619
|
+
```
|
|
620
|
+
* **অটো-হার্ভেস্টিং (Auto-Harvesting in Memory Push):**
|
|
621
|
+
যখন আপনি `init-context memory push` চালাবেন, তখন বর্তমান প্রজেক্টের লোকাল রুল ও স্কিলগুলো স্বয়ংক্রিয়ভাবে সেন্ট্রাল মেমরিতে হার্ভেস্ট (সংগ্রহ) হবে এবং সিক্রেট অডিট পাস করে প্রাইভেট গিটহাবে ব্যাকআপ হয়ে যাবে।
|
|
622
|
+
|
|
548
623
|
### 🧠 সেন্ট্রাল মেমরি ব্রেইন ও ডটফাইলস (Disaster Recovery & Dotfiles):
|
|
549
624
|
যেমনভাবে লিনাক্সে `.dotfiles` দিয়ে চোখের পলকে সব কনফিগারেশন সেটআপ করা যায়, তেমনি Auto-Context দিয়ে আপনার এআই এজেন্টের মেমরি ও স্কিল ক্লাউডে নিরাপদে সেভ থাকে:
|
|
550
625
|
1. **প্রাইভেট মেমরি তৈরি (`memory init`):**
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
[](https://pypi.org/project/auto-context-cli/)
|
|
8
8
|
[](https://pypi.org/project/auto-context-cli/)
|
|
9
|
-
[](https://github.com/Cyber-arghya/auto-context/releases/tag/v1.0.
|
|
9
|
+
[](https://github.com/Cyber-arghya/auto-context/releases/tag/v1.0.3)
|
|
10
10
|
[](https://opensource.org/licenses/MIT)
|
|
11
11
|
[](#-quick-one-line-install)
|
|
12
12
|
[](#-supported-ai-assistants)
|
|
@@ -61,45 +61,33 @@ cd /path/to/any-project
|
|
|
61
61
|
init-context
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
###
|
|
65
|
-
|
|
66
|
-
init-context
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
--secret, --private Publish shared Gist as unlisted/secret
|
|
92
|
-
|
|
93
|
-
OPTIONS (MCP TOOLING):
|
|
94
|
-
--add-mcp <NAME> Add or update an MCP server configuration
|
|
95
|
-
--remove-mcp <NAME> Remove an MCP server from configuration
|
|
96
|
-
--list-mcp List all active MCP server tools
|
|
97
|
-
--preset <PRESET> Preset template (sqlite, postgres, github, filesystem, brave, fetch)
|
|
98
|
-
--command <CMD> Executable command for stdio server (e.g. npx, uvx, python3)
|
|
99
|
-
--args <ARGS> Arguments to pass to command
|
|
100
|
-
--url <URL> Streamable HTTP endpoint URL for remote MCP server
|
|
101
|
-
--env <KEY=VAL,...> Environment variables (e.g. 'GITHUB_TOKEN=xyz')
|
|
102
|
-
```
|
|
64
|
+
### Command Reference & Syntax:
|
|
65
|
+
|
|
66
|
+
Auto-Context supports both modern subcommands (`init-context <command>`) and standard legacy flags:
|
|
67
|
+
|
|
68
|
+
| Command | Shorthand / Flag | Description |
|
|
69
|
+
| :--- | :--- | :--- |
|
|
70
|
+
| `init-context init [DIR]` | `init-context [DIR]` | Scaffolds 5-tier context in active or specified directory. |
|
|
71
|
+
| `init-context scan [DIR]` | `init-context --scan` | Stack-adaptive codebase scanner: generates satellites (.agents/context/). |
|
|
72
|
+
| `init-context rule <name>` | `init-context -r <name>` | Scaffolds a new agent rule with YAML frontmatter. |
|
|
73
|
+
| `init-context skill <name>` | `init-context -s <name>` | Scaffolds a new agent skill directory with triggers & runbook. |
|
|
74
|
+
| `init-context promote <name>` | — | Promotes local workspace rule/skill to Global Plugin & Central Memory. |
|
|
75
|
+
| `init-context update` | — | Modular, non-breaking update for CLI, global plugin & system rules. |
|
|
76
|
+
| `init-context share <name>` | — | Audits secrets and shares a rule or skill via GitHub Gist. |
|
|
77
|
+
| `init-context import <url>` | — | Imports a rule or skill with 3-way Collision Guard protection. |
|
|
78
|
+
| `init-context memory init` | — | Initializes private GitHub brain repository (`~/.auto-context/memory`). |
|
|
79
|
+
| `init-context memory push` | — | Auto-harvests workspace rules, audits secrets & pushes to private GitHub. |
|
|
80
|
+
| `init-context memory pull` | — | Pulls and restores central brain on a new machine. |
|
|
81
|
+
| `init-context memory status` | — | Displays central brain location, remote URL, and rules/skills count. |
|
|
82
|
+
| `init-context mcp add <name>`| `init-context --add-mcp` | Adds or updates an MCP tool (Node `npx` or Python `uvx`). |
|
|
83
|
+
| `init-context mcp list` | `init-context --list-mcp` | Lists all active MCP server configurations. |
|
|
84
|
+
| `init-context mcp remove <name>`| `init-context --remove-mcp` | Safely removes an MCP server configuration. |
|
|
85
|
+
|
|
86
|
+
### Global Flags:
|
|
87
|
+
* `-g, --global`: Targets machine-wide scope (`~/.gemini/config/plugins/auto-context/` & `~/.auto-context/memory/`).
|
|
88
|
+
* `-f, --force`: Overwrites existing files (bypasses collision guards with confirmation).
|
|
89
|
+
* `-d, --dry-run`: Previews actions without writing files or modifying directories.
|
|
90
|
+
* `-v, --version`: Displays installed package version.
|
|
103
91
|
|
|
104
92
|
---
|
|
105
93
|
|
|
@@ -295,6 +283,68 @@ triggers: ["docker", "container", "compose", "dockerfile"]
|
|
|
295
283
|
|
|
296
284
|
---
|
|
297
285
|
|
|
286
|
+
## 🚀 Rule Promotion & Auto-Harvesting (`init-context promote`)
|
|
287
|
+
|
|
288
|
+
Sometimes a rule or workflow starts as a quick experiment in one project, but proves so valuable that you want every project across your machine and team to inherit it.
|
|
289
|
+
|
|
290
|
+
### 1️⃣ 1-Command Rule Promotion
|
|
291
|
+
```bash
|
|
292
|
+
init-context promote docker-multi-stage
|
|
293
|
+
```
|
|
294
|
+
* **Elevates Local to Global:** Copies `.agents/rules/docker-multi-stage.md` directly into `~/.gemini/config/plugins/auto-context/rules/` and `~/.auto-context/memory/rules/`.
|
|
295
|
+
* **Zero Rewriting:** Preserves all existing YAML frontmatter, guidelines, and constraints.
|
|
296
|
+
* **Instant Sync:** Immediately run `init-context memory push` to backup the newly promoted rule to your private Git brain.
|
|
297
|
+
|
|
298
|
+
### 2️⃣ Auto-Harvesting in Central Memory
|
|
299
|
+
When you run:
|
|
300
|
+
```bash
|
|
301
|
+
init-context memory push
|
|
302
|
+
```
|
|
303
|
+
The CLI automatically:
|
|
304
|
+
1. **Discovers Local Knowledge:** Scans the active workspace's `.agents/rules/` and `.agents/skills/`.
|
|
305
|
+
2. **Harvests to Central Memory:** Copies any new rules and skills into `~/.auto-context/memory/` without overwriting existing files.
|
|
306
|
+
3. **Audits Secrets:** Runs the Zero-Bypass security audit.
|
|
307
|
+
4. **Pushes to Private Remote:** Backs up everything to your private GitHub repo.
|
|
308
|
+
Even if an agent originally codified a rule locally, running `memory push` guarantees zero knowledge loss!
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## 🛰️ Hub & Satellite Modular Architecture (< 400 Token Budget)
|
|
313
|
+
|
|
314
|
+
Dumping routes, models, problem logs, credentials, and runbooks into a single monolithic `context.md` causes context file bloat (1,000–5,000 lines). Every turn burns thousands of unnecessary tokens simply reading the context file!
|
|
315
|
+
|
|
316
|
+
Auto-Context solves this with the **Hub & Satellite Architecture**:
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
project-root/
|
|
320
|
+
├── context.md <─── The Executive Hub (Capped at < 80 lines / ~400 tokens!)
|
|
321
|
+
└── .agents/
|
|
322
|
+
└── context/ <─── Stack-Adaptive Satellites (Loaded on-demand)
|
|
323
|
+
├── routes.md (API Endpoints & UI Page Map — loaded only for route tasks)
|
|
324
|
+
├── schema.md (Database Schemas & ORM Models — loaded only for DB tasks)
|
|
325
|
+
└── gotchas.md (Critical Architecture Traps & Invariants)
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### 1️⃣ Codebase Scanner (`init-context scan`)
|
|
329
|
+
In any in-flight or 40% completed repository, run:
|
|
330
|
+
```bash
|
|
331
|
+
init-context scan
|
|
332
|
+
```
|
|
333
|
+
- **Zero Token Cost:** Scans project directories and manifests locally via fast filesystem heuristics (0 LLM tokens).
|
|
334
|
+
- **Stack-Adaptive:**
|
|
335
|
+
- If Next.js / Express / FastAPI: Generates `.agents/context/routes.md`.
|
|
336
|
+
- If Prisma / Drizzle / Django / SQLAlchemy: Generates `.agents/context/schema.md`.
|
|
337
|
+
- Always provisions `.agents/context/gotchas.md`.
|
|
338
|
+
- **Strict Idempotency Proof ($f(f(x)) = f(x)$):**
|
|
339
|
+
- Uses SHA-256 content hashes and anchored delimiters (`<!-- AUTO-CONTEXT:DISCOVERY:START -->`).
|
|
340
|
+
- Running `scan` 1 time or 100 times produces the exact same deterministic state without duplicating content.
|
|
341
|
+
|
|
342
|
+
### 2️⃣ The Brutal Truth Filter & `gotchas.md`
|
|
343
|
+
- **Zero Dead Logs:** A chronological diary of 50 minor solved bug typos is a waste of disk and token budget. Git already tracks commit history!
|
|
344
|
+
- **Gotchas Over History:** Auto-Context replaces useless bug logs with **`gotchas.md`**: non-obvious architecture traps, port collisions, and invariants that cannot be guessed from reading code.
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
298
348
|
## ⚡ Two-Tier Progressive Disclosure (Token-Optimized Architecture)
|
|
299
349
|
|
|
300
350
|
To avoid context window bloat and burning 20k–30k tokens at session startup, Auto-Context enforces a **Two-Tier Progressive Disclosure Protocol**:
|
|
@@ -528,9 +578,34 @@ To prevent **Prompt Injection Leaks** and keep production secrets safe:
|
|
|
528
578
|
init-context -s my-skill-name -g # সকল প্রজেক্টের জন্য গ্লোবালি
|
|
529
579
|
```
|
|
530
580
|
|
|
581
|
+
### 🛰️ হাব অ্যান্ড স্যাটেলাইট আর্কিটেকচার (< ৪০০ টোকেন সিলিং):
|
|
582
|
+
সব রুট, ডাটাবেজ মডেল এবং হিস্ট্রি এক ফাইলে রাখলে `context.md` ১,০০০–৫,০০০ লাইন হয়ে টোকেন অপচয় করে। Auto-Context একে সমাধান করেছে **Hub & Satellite** মডেল দিয়ে:
|
|
583
|
+
* **The Executive Hub (`context.md`):** প্রজেক্টের রুট ফাইল সবসময় সর্বোচ্চ **< ৮০ লাইন (< ৪০০ টোকেন)**-এ সীমাবদ্ধ থাকবে।
|
|
584
|
+
* **স্ট্যাক-অ্যাডাপটিভ স্যাটেলাইট (`.agents/context/`):**
|
|
585
|
+
* `routes.md`: প্রজেক্টের এপিআই ও পেজ রুট ম্যাপ (শুধু রাউটিং কাজের সময় এআই পড়বে)।
|
|
586
|
+
* `schema.md`: ডাটাবেজ মডেল ও ওআরএম স্কিমা (শুধু ডাটাবেজ কাজের সময় পড়বে)।
|
|
587
|
+
* `gotchas.md`: বাস্তব টেকনিক্যাল ফাঁদ, পোর্ট কনফ্লিক্ট ও আর্কিটেকচারাল সীমাবদ্ধতা।
|
|
588
|
+
|
|
589
|
+
### 🔍 কোডবেস স্ক্যানার (`init-context scan`):
|
|
590
|
+
যেকোনো চলমান বা ৪০% শেষ হওয়া প্রজেক্টে টার্মিনালে রান করুন:
|
|
591
|
+
```bash
|
|
592
|
+
init-context scan
|
|
593
|
+
```
|
|
594
|
+
* **জিরো টোকেন খরচ:** সম্পূর্ণ অফলাইনে লোকাল প্রসেসর দিয়ে মাত্র ১০০ মিলিসেকেন্ডে প্রজেক্ট স্ক্যান করে স্যাটেলাইট ফাইল তৈরি করে।
|
|
595
|
+
* **আইডেমপোটেন্সি প্রুফ ($f(f(x)) = f(x)$):** দিনে ১০০ বার কমান্ড চালালেও কোনো ডুপ্লিকেট কনটেন্ট হবে না বা ইউজারের নিজস্ব নোট ওভাররাইট হবে না।
|
|
596
|
+
|
|
531
597
|
### ⚡ টু-টায়ার প্রোগ্রেসিভ ডিসক্লোজার (টোকেন সাশ্রয়ী আর্কিটেকচার):
|
|
532
598
|
শুরুতেই সব স্কিলের বড় ফাইল লোড করে চ্যাট ভারী করা হয় না। এআই শুরুতে মাত্র ১৫০–২০০ টোকেনের একটি ইনডেক্স (`context.md` Section 5) পড়ে। যখন নির্দিষ্ট টাস্কের কিওয়ার্ড মিলবে (যেমন: "docker", "rebase", "diagnostics", "ui test"), কেবল তখনই সংশ্লিষ্ট পূর্ণাঙ্গ স্কিলটি অন-ডিমান্ড মেমরিতে লোড হয়। ফলে টোকেন খরচ প্রায় ৮০% হ্রাস পায়!
|
|
533
599
|
|
|
600
|
+
### 🚀 রুল প্রমোশন ও অটো-হার্ভেস্টিং (Promote & Auto-Harvest):
|
|
601
|
+
* **লোকাল রুলকে গ্লোবালে উন্নীত করা (`promote`):**
|
|
602
|
+
যদি কোনো নির্দিষ্ট প্রজেক্টে তৈরি করা রুল বা স্কিল আপনার কম্পিউটারের সকল প্রজেক্টের জন্য প্রয়োজন হয়, তবে এক কমান্ডে গ্লোবাল প্লাগইন ও সেন্ট্রাল মেমরিতে প্রমোট করতে পারবেন:
|
|
603
|
+
```bash
|
|
604
|
+
init-context promote docker-multi-stage
|
|
605
|
+
```
|
|
606
|
+
* **অটো-হার্ভেস্টিং (Auto-Harvesting in Memory Push):**
|
|
607
|
+
যখন আপনি `init-context memory push` চালাবেন, তখন বর্তমান প্রজেক্টের লোকাল রুল ও স্কিলগুলো স্বয়ংক্রিয়ভাবে সেন্ট্রাল মেমরিতে হার্ভেস্ট (সংগ্রহ) হবে এবং সিক্রেট অডিট পাস করে প্রাইভেট গিটহাবে ব্যাকআপ হয়ে যাবে।
|
|
608
|
+
|
|
534
609
|
### 🧠 সেন্ট্রাল মেমরি ব্রেইন ও ডটফাইলস (Disaster Recovery & Dotfiles):
|
|
535
610
|
যেমনভাবে লিনাক্সে `.dotfiles` দিয়ে চোখের পলকে সব কনফিগারেশন সেটআপ করা যায়, তেমনি Auto-Context দিয়ে আপনার এআই এজেন্টের মেমরি ও স্কিল ক্লাউডে নিরাপদে সেভ থাকে:
|
|
536
611
|
1. **প্রাইভেট মেমরি তৈরি (`memory init`):**
|
|
@@ -207,6 +207,13 @@ def init(
|
|
|
207
207
|
".env.*.local",
|
|
208
208
|
])
|
|
209
209
|
|
|
210
|
+
# ── Stack-Adaptive Satellites (.agents/context/) ───────────────────────
|
|
211
|
+
try:
|
|
212
|
+
from auto_context import scanner
|
|
213
|
+
scanner.generate_satellites(project_dir, force=force)
|
|
214
|
+
except Exception:
|
|
215
|
+
pass
|
|
216
|
+
|
|
210
217
|
console.print(Panel(
|
|
211
218
|
"[bold green]✨ Project scaffold complete![/]\n"
|
|
212
219
|
"Edit [cyan]context.md[/] and [cyan]GEMINI.md[/] to customise your AI workspace.",
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"""
|
|
2
|
+
scan_cmd.py — On-demand codebase inspection and satellite synchronization command.
|
|
3
|
+
|
|
4
|
+
Discovers routes, data models, network ports, and runbooks without burning LLM tokens.
|
|
5
|
+
Generates or updates stack-adaptive satellites (.agents/context/) and synchronizes
|
|
6
|
+
the Executive Hub (context.md) with strict idempotency and hash verification.
|
|
7
|
+
"""
|
|
8
|
+
from datetime import date
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Annotated, Optional
|
|
11
|
+
|
|
12
|
+
from rich.console import Console
|
|
13
|
+
from rich.panel import Panel
|
|
14
|
+
import typer
|
|
15
|
+
|
|
16
|
+
from auto_context import scanner
|
|
17
|
+
from auto_context.commands import init_cmd
|
|
18
|
+
|
|
19
|
+
console = Console()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def scan(
|
|
23
|
+
target: Annotated[Optional[Path], typer.Argument(help="Target project directory.")] = None,
|
|
24
|
+
force: Annotated[bool, typer.Option("--force", "-f", help="Force overwrite satellite files.")] = False,
|
|
25
|
+
) -> None:
|
|
26
|
+
"""
|
|
27
|
+
Inspect project codebase, generate stack-adaptive satellites, and sync context.md.
|
|
28
|
+
|
|
29
|
+
Zero Token Cost:
|
|
30
|
+
- Runs 100% locally via fast filesystem heuristics.
|
|
31
|
+
- Generates .agents/context/routes.md, schema.md, gotchas.md as needed.
|
|
32
|
+
- Keeps primary context.md compact (< 400 tokens) using the Hub & Satellite pattern.
|
|
33
|
+
"""
|
|
34
|
+
project_dir = (target or Path.cwd()).resolve()
|
|
35
|
+
project_name = project_dir.name
|
|
36
|
+
stack, framework = init_cmd.detect_stack(project_dir)
|
|
37
|
+
|
|
38
|
+
console.print(Panel(
|
|
39
|
+
f"[bold cyan]🔍 Auto-Context: Stack-Adaptive Codebase Scanner[/]\n"
|
|
40
|
+
f"[yellow] Target:[/] {project_name} ({project_dir})\n"
|
|
41
|
+
f"[cyan] Stack: [/] {stack} ([dim]{framework}[/])",
|
|
42
|
+
border_style="cyan",
|
|
43
|
+
))
|
|
44
|
+
|
|
45
|
+
# 1. Discover ports & services
|
|
46
|
+
ports = scanner.discover_ports_and_services(project_dir)
|
|
47
|
+
# 2. Discover runbook commands
|
|
48
|
+
commands = scanner.discover_runbook_commands(project_dir)
|
|
49
|
+
# 3. Generate adaptive satellites in .agents/context/
|
|
50
|
+
satellites = scanner.generate_satellites(project_dir, force=force)
|
|
51
|
+
|
|
52
|
+
# 4. Render/Sync the compact Executive Hub (context.md)
|
|
53
|
+
hub_file = project_dir / "context.md"
|
|
54
|
+
date_now = date.today().isoformat()
|
|
55
|
+
|
|
56
|
+
# Build discovered ports table
|
|
57
|
+
ports_table = "| Service / Key | Port | Source |\n| :--- | :--- | :--- |\n"
|
|
58
|
+
if ports:
|
|
59
|
+
for svc, port, src in ports:
|
|
60
|
+
ports_table += f"| **{svc}** | `{port}` | {src} |\n"
|
|
61
|
+
else:
|
|
62
|
+
ports_table += "| **App Port** | `3000` (Default) | Inferred |\n"
|
|
63
|
+
|
|
64
|
+
# Build runbook table
|
|
65
|
+
runbook_table = "| Task | Executable Command |\n| :--- | :--- |\n"
|
|
66
|
+
if commands:
|
|
67
|
+
for action, cmd in commands:
|
|
68
|
+
runbook_table += f"| {action} | `{cmd}` |\n"
|
|
69
|
+
else:
|
|
70
|
+
runbook_table += "| Start Development | `npm run dev` / `python main.py` |\n"
|
|
71
|
+
|
|
72
|
+
# Build satellites index section
|
|
73
|
+
satellites_index = ""
|
|
74
|
+
if "routes" in satellites:
|
|
75
|
+
satellites_index += f"- **Route Map:** [`routes.md`](file://{satellites['routes'].as_posix()})\n"
|
|
76
|
+
if "schema" in satellites:
|
|
77
|
+
satellites_index += f"- **Database Schemas:** [`schema.md`](file://{satellites['schema'].as_posix()})\n"
|
|
78
|
+
if "gotchas" in satellites:
|
|
79
|
+
satellites_index += f"- **Critical Gotchas:** [`gotchas.md`](file://{satellites['gotchas'].as_posix()})\n"
|
|
80
|
+
|
|
81
|
+
# Anchored block for idempotent synchronization
|
|
82
|
+
anchored_block = (
|
|
83
|
+
"<!-- AUTO-CONTEXT:DISCOVERY:START -->\n"
|
|
84
|
+
"## 1. Discovered Ports & Network Vault\n\n"
|
|
85
|
+
f"{ports_table}\n"
|
|
86
|
+
"## 2. Stack & Adaptive Satellites\n\n"
|
|
87
|
+
f"* **Stack:** {stack} ({framework})\n"
|
|
88
|
+
f"{satellites_index if satellites_index else '- Satellites: Core stack (no external routes/models detected)\n'}\n"
|
|
89
|
+
"## 3. Operations Runbook\n\n"
|
|
90
|
+
f"{runbook_table}\n"
|
|
91
|
+
"<!-- AUTO-CONTEXT:DISCOVERY:END -->"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
if hub_file.exists():
|
|
95
|
+
existing_text = hub_file.read_text(encoding="utf-8")
|
|
96
|
+
if "<!-- AUTO-CONTEXT:DISCOVERY:START -->" in existing_text:
|
|
97
|
+
# Idempotent replacement of discovery block
|
|
98
|
+
pattern = r"<!-- AUTO-CONTEXT:DISCOVERY:START -->.*?<!-- AUTO-CONTEXT:DISCOVERY:END -->"
|
|
99
|
+
import re
|
|
100
|
+
new_hub_text = re.sub(pattern, anchored_block, existing_text, flags=re.DOTALL)
|
|
101
|
+
else:
|
|
102
|
+
# Upgrade existing legacy context.md by prepending hub block
|
|
103
|
+
new_hub_text = (
|
|
104
|
+
f"# {project_name} — Executive Context Hub\n\n"
|
|
105
|
+
f"> **Last Updated:** {date_now} | **Stack:** {stack} ({framework})\n\n"
|
|
106
|
+
f"{anchored_block}\n\n"
|
|
107
|
+
"## 4. Active Invariants & Gotchas\n\n"
|
|
108
|
+
"See [`.agents/context/gotchas.md`](file://"
|
|
109
|
+
f"{(project_dir / '.agents' / 'context' / 'gotchas.md').as_posix()}) "
|
|
110
|
+
"for institutional knowledge.\n"
|
|
111
|
+
)
|
|
112
|
+
else:
|
|
113
|
+
# Create brand new Executive Hub (< 60 lines!)
|
|
114
|
+
new_hub_text = (
|
|
115
|
+
f"# {project_name} — Executive Context Hub\n\n"
|
|
116
|
+
f"> **Last Updated:** {date_now} | **Stack:** {stack} ({framework})\n\n"
|
|
117
|
+
f"{anchored_block}\n\n"
|
|
118
|
+
"## 4. Active Invariants & Gotchas\n\n"
|
|
119
|
+
"Inspect [`.agents/context/gotchas.md`](file://"
|
|
120
|
+
f"{(project_dir / '.agents' / 'context' / 'gotchas.md').as_posix()}) "
|
|
121
|
+
"before modifying architecture.\n"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
scanner.write_idempotent(hub_file, new_hub_text, "Executive Hub (context.md)")
|
|
125
|
+
|
|
126
|
+
console.print(Panel(
|
|
127
|
+
f"[bold green]✨ Codebase scan completed with zero token waste![/]\n"
|
|
128
|
+
f"[white]• Ports discovered: [green]{len(ports)}[/]\n"
|
|
129
|
+
f"• Runbook commands: [green]{len(commands)}[/]\n"
|
|
130
|
+
f"• Satellites generated: [green]{len(satellites)}[/] (routes, schema, gotchas)\n"
|
|
131
|
+
f"• Hub size (context.md): [bold green]< 60 lines (Token Optimized)[/]",
|
|
132
|
+
border_style="green",
|
|
133
|
+
))
|
|
@@ -11,7 +11,7 @@ from typing import Annotated, Optional
|
|
|
11
11
|
import typer
|
|
12
12
|
from rich.console import Console
|
|
13
13
|
|
|
14
|
-
from auto_context.commands import init_cmd, memory, mcp, share, import_cmd, update_cmd
|
|
14
|
+
from auto_context.commands import init_cmd, memory, mcp, share, import_cmd, update_cmd, scan_cmd
|
|
15
15
|
|
|
16
16
|
app = typer.Typer(
|
|
17
17
|
name="init-context",
|
|
@@ -33,6 +33,7 @@ app.command("promote")(init_cmd.promote)
|
|
|
33
33
|
app.command("share")(share.share)
|
|
34
34
|
app.command("import")(import_cmd.import_item)
|
|
35
35
|
app.command("update")(update_cmd.update)
|
|
36
|
+
app.command("scan")(scan_cmd.scan)
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
@app.callback(invoke_without_command=True)
|
|
@@ -54,6 +55,7 @@ def root(
|
|
|
54
55
|
global_: Annotated[bool, typer.Option("--global", "-g", help="Target global plugin scope.")] = False,
|
|
55
56
|
force: Annotated[bool, typer.Option("--force", "-f", help="Overwrite existing files.")] = False,
|
|
56
57
|
dry_run: Annotated[bool, typer.Option("--dry-run", "-d", help="Preview without writing.")] = False,
|
|
58
|
+
scan: Annotated[bool, typer.Option("--scan", help="Run stack-adaptive scanner on target directory.")] = False,
|
|
57
59
|
version: bool = typer.Option(False, "--version", "-v", help="Show version and exit."),
|
|
58
60
|
) -> None:
|
|
59
61
|
"""
|
|
@@ -67,7 +69,7 @@ def root(
|
|
|
67
69
|
try:
|
|
68
70
|
v = pkg_version("auto-context")
|
|
69
71
|
except Exception:
|
|
70
|
-
v = "1.0.
|
|
72
|
+
v = "1.0.3"
|
|
71
73
|
console.print(f"init-context v{v}")
|
|
72
74
|
raise typer.Exit()
|
|
73
75
|
|
|
@@ -106,6 +108,10 @@ def root(
|
|
|
106
108
|
)
|
|
107
109
|
return
|
|
108
110
|
|
|
111
|
+
if scan:
|
|
112
|
+
scan_cmd.scan(target=target, force=force)
|
|
113
|
+
return
|
|
114
|
+
|
|
109
115
|
# Default action: scaffold workspace
|
|
110
116
|
init_cmd.init(target=target, force=force, dry_run=dry_run)
|
|
111
117
|
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"""
|
|
2
|
+
scanner.py — Stack-Adaptive Codebase Introspection & Brownfield Discovery Engine.
|
|
3
|
+
|
|
4
|
+
Discovers ports, routes, database schemas, services, and runbooks using lightweight
|
|
5
|
+
filesystem convention heuristics (0 LLM tokens, 100% crash-proof, idempotency-guaranteed).
|
|
6
|
+
"""
|
|
7
|
+
import hashlib
|
|
8
|
+
import json
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
import re
|
|
11
|
+
from typing import Optional
|
|
12
|
+
|
|
13
|
+
from rich.console import Console
|
|
14
|
+
|
|
15
|
+
console = Console()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ── Idempotency & Hash Helpers ────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
def get_content_hash(text: str) -> str:
|
|
21
|
+
"""Compute SHA-256 hash of text content."""
|
|
22
|
+
return hashlib.sha256(text.encode("utf-8")).hexdigest()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def write_idempotent(path: Path, content: str, label: str = "File") -> bool:
|
|
26
|
+
"""
|
|
27
|
+
Write content to path only if content has changed (Content-Hash Guard).
|
|
28
|
+
Returns True if a write occurred, False if content was already identical.
|
|
29
|
+
"""
|
|
30
|
+
if path.exists():
|
|
31
|
+
try:
|
|
32
|
+
existing = path.read_text(encoding="utf-8")
|
|
33
|
+
if get_content_hash(existing) == get_content_hash(content):
|
|
34
|
+
console.print(f" [dim]— Up to date:[/] {path.name}")
|
|
35
|
+
return False
|
|
36
|
+
except Exception:
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
40
|
+
path.write_text(content, encoding="utf-8")
|
|
41
|
+
console.print(f" [green][✓] Synchronized:[/] {path.name}")
|
|
42
|
+
return True
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# ── Port & Service Extractor ──────────────────────────────────────────────────
|
|
46
|
+
|
|
47
|
+
def discover_ports_and_services(project_dir: Path) -> list[tuple[str, str, str]]:
|
|
48
|
+
"""
|
|
49
|
+
Extract network ports and service bindings from configs without leaking secrets.
|
|
50
|
+
Returns list of (Service, Port, SourceFile).
|
|
51
|
+
"""
|
|
52
|
+
results: list[tuple[str, str, str]] = []
|
|
53
|
+
seen_ports: set[str] = set()
|
|
54
|
+
|
|
55
|
+
# 1. Check docker-compose.yml / compose.yaml
|
|
56
|
+
for compose_name in ("docker-compose.yml", "docker-compose.yaml", "compose.yml", "compose.yaml"):
|
|
57
|
+
compose_file = project_dir / compose_name
|
|
58
|
+
if compose_file.exists():
|
|
59
|
+
try:
|
|
60
|
+
text = compose_file.read_text(encoding="utf-8", errors="ignore")
|
|
61
|
+
matches = re.findall(r'["\']?(\d{2,5}):(\d{2,5})["\']?', text)
|
|
62
|
+
for host_port, container_port in matches:
|
|
63
|
+
if host_port not in seen_ports and int(host_port) > 80:
|
|
64
|
+
seen_ports.add(host_port)
|
|
65
|
+
results.append(("Container Port", host_port, compose_name))
|
|
66
|
+
except Exception:
|
|
67
|
+
pass
|
|
68
|
+
|
|
69
|
+
# 2. Check .env.example / .env
|
|
70
|
+
for env_name in (".env.example", ".env", ".env.local"):
|
|
71
|
+
env_file = project_dir / env_name
|
|
72
|
+
if env_file.exists():
|
|
73
|
+
try:
|
|
74
|
+
for line in env_file.read_text(encoding="utf-8", errors="ignore").splitlines():
|
|
75
|
+
line = line.strip()
|
|
76
|
+
if line.startswith("#") or "=" not in line:
|
|
77
|
+
continue
|
|
78
|
+
key, val = line.split("=", 1)
|
|
79
|
+
key = key.strip()
|
|
80
|
+
val = val.strip().strip('"').strip("'")
|
|
81
|
+
if "PORT" in key.upper() and val.isdigit() and val not in seen_ports:
|
|
82
|
+
seen_ports.add(val)
|
|
83
|
+
results.append((key, val, env_name))
|
|
84
|
+
except Exception:
|
|
85
|
+
pass
|
|
86
|
+
|
|
87
|
+
# 3. Check Dockerfile
|
|
88
|
+
dockerfile = project_dir / "Dockerfile"
|
|
89
|
+
if dockerfile.exists():
|
|
90
|
+
try:
|
|
91
|
+
for line in dockerfile.read_text(encoding="utf-8", errors="ignore").splitlines():
|
|
92
|
+
if line.strip().upper().startswith("EXPOSE "):
|
|
93
|
+
port = line.strip().split()[1]
|
|
94
|
+
if port.isdigit() and port not in seen_ports:
|
|
95
|
+
seen_ports.add(port)
|
|
96
|
+
results.append(("Exposed Port", port, "Dockerfile"))
|
|
97
|
+
except Exception:
|
|
98
|
+
pass
|
|
99
|
+
|
|
100
|
+
return results
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
# ── Runbook Command Extractor ─────────────────────────────────────────────────
|
|
104
|
+
|
|
105
|
+
def discover_runbook_commands(project_dir: Path) -> list[tuple[str, str]]:
|
|
106
|
+
"""
|
|
107
|
+
Extract executable development, build, and test commands from project manifests.
|
|
108
|
+
Returns list of (Action, Command).
|
|
109
|
+
"""
|
|
110
|
+
commands: list[tuple[str, str]] = []
|
|
111
|
+
|
|
112
|
+
# 1. package.json scripts
|
|
113
|
+
pkg_file = project_dir / "package.json"
|
|
114
|
+
if pkg_file.exists():
|
|
115
|
+
try:
|
|
116
|
+
data = json.loads(pkg_file.read_text(encoding="utf-8", errors="ignore"))
|
|
117
|
+
scripts = data.get("scripts", {})
|
|
118
|
+
for key in ("dev", "start", "build", "test", "lint"):
|
|
119
|
+
if key in scripts:
|
|
120
|
+
commands.append((f"Run {key}", f"npm run {key}"))
|
|
121
|
+
except Exception:
|
|
122
|
+
pass
|
|
123
|
+
|
|
124
|
+
# 2. Makefile
|
|
125
|
+
makefile = project_dir / "Makefile"
|
|
126
|
+
if makefile.exists():
|
|
127
|
+
try:
|
|
128
|
+
targets = re.findall(r"^([a-zA-Z0-9_-]+):", makefile.read_text(encoding="utf-8", errors="ignore"), re.M)
|
|
129
|
+
for t in targets[:4]:
|
|
130
|
+
if not t.startswith("."):
|
|
131
|
+
commands.append((f"Make {t}", f"make {t}"))
|
|
132
|
+
except Exception:
|
|
133
|
+
pass
|
|
134
|
+
|
|
135
|
+
# 3. Python indicators
|
|
136
|
+
if (project_dir / "manage.py").exists():
|
|
137
|
+
commands.append(("Django Runserver", "python manage.py runserver"))
|
|
138
|
+
commands.append(("Django Migrate", "python manage.py migrate"))
|
|
139
|
+
elif (project_dir / "pyproject.toml").exists() or (project_dir / "requirements.txt").exists():
|
|
140
|
+
for main_candidate in ("main.py", "app.py", "server.py", "wsgi.py"):
|
|
141
|
+
if (project_dir / main_candidate).exists():
|
|
142
|
+
commands.append(("Start Python Server", f"python {main_candidate}"))
|
|
143
|
+
break
|
|
144
|
+
|
|
145
|
+
# 4. Docker Compose
|
|
146
|
+
if (project_dir / "docker-compose.yml").exists() or (project_dir / "compose.yaml").exists():
|
|
147
|
+
commands.append(("Start Docker Services", "docker compose up -d"))
|
|
148
|
+
|
|
149
|
+
return commands
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# ── Routes & Endpoints Extractor ──────────────────────────────────────────────
|
|
153
|
+
|
|
154
|
+
def discover_routes(project_dir: Path) -> list[str]:
|
|
155
|
+
"""
|
|
156
|
+
Extract API and UI routes using Next.js, Express, FastAPI, and Django conventions.
|
|
157
|
+
Returns clean list of detected route paths.
|
|
158
|
+
"""
|
|
159
|
+
routes: list[str] = []
|
|
160
|
+
|
|
161
|
+
try:
|
|
162
|
+
# 1. Next.js App Router (app/ or src/app/)
|
|
163
|
+
app_dirs = [d for d in (project_dir / "app", project_dir / "src" / "app") if d.is_dir()]
|
|
164
|
+
for app_dir in app_dirs:
|
|
165
|
+
for file_path in app_dir.rglob("*"):
|
|
166
|
+
if file_path.is_file() and file_path.name in ("route.ts", "route.js", "page.tsx", "page.jsx"):
|
|
167
|
+
rel = file_path.parent.relative_to(app_dir).as_posix()
|
|
168
|
+
route_path = "/" if rel == "." else f"/{rel}"
|
|
169
|
+
kind = "API" if file_path.name.startswith("route") else "Page"
|
|
170
|
+
routes.append(f"[{kind}] {route_path} -> {file_path.relative_to(project_dir).as_posix()}")
|
|
171
|
+
|
|
172
|
+
# 2. Next.js Pages Router (pages/ or src/pages/)
|
|
173
|
+
page_dirs = [d for d in (project_dir / "pages", project_dir / "src" / "pages") if d.is_dir()]
|
|
174
|
+
for page_dir in page_dirs:
|
|
175
|
+
for file_path in page_dir.rglob("*.tsx"):
|
|
176
|
+
if not file_path.name.startswith("_"):
|
|
177
|
+
rel = file_path.relative_to(page_dir).with_suffix("").as_posix()
|
|
178
|
+
route_path = "/" if rel == "index" else f"/{rel.replace('/index', '')}"
|
|
179
|
+
kind = "API" if "api" in rel else "Page"
|
|
180
|
+
routes.append(f"[{kind}] {route_path} -> {file_path.relative_to(project_dir).as_posix()}")
|
|
181
|
+
|
|
182
|
+
# 3. Express / FastAPI / Django Route folders
|
|
183
|
+
for folder_name in ("routes", "controllers", "routers", "endpoints"):
|
|
184
|
+
for candidate in (project_dir / folder_name, project_dir / "src" / folder_name):
|
|
185
|
+
if candidate.is_dir():
|
|
186
|
+
for f in candidate.glob("*.py") if candidate.glob("*.py") else candidate.glob("*.ts"):
|
|
187
|
+
routes.append(f"[Module] {f.stem} -> {f.relative_to(project_dir).as_posix()}")
|
|
188
|
+
|
|
189
|
+
except Exception:
|
|
190
|
+
pass
|
|
191
|
+
|
|
192
|
+
return routes[:35] # Cap to prevent unbounded lists
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
# ── Database Models Extractor ─────────────────────────────────────────────────
|
|
196
|
+
|
|
197
|
+
def discover_database_models(project_dir: Path) -> list[str]:
|
|
198
|
+
"""
|
|
199
|
+
Extract data models from Prisma, Django, SQLAlchemy, Drizzle schemas.
|
|
200
|
+
Returns list of discovered model names and schema files.
|
|
201
|
+
"""
|
|
202
|
+
models: list[str] = []
|
|
203
|
+
|
|
204
|
+
try:
|
|
205
|
+
# 1. Prisma schema
|
|
206
|
+
for prisma_path in (project_dir / "prisma" / "schema.prisma", project_dir / "schema.prisma"):
|
|
207
|
+
if prisma_path.exists():
|
|
208
|
+
text = prisma_path.read_text(encoding="utf-8", errors="ignore")
|
|
209
|
+
found = re.findall(r"\bmodel\s+([A-Za-z0-9_]+)\s*\{", text)
|
|
210
|
+
for m in found:
|
|
211
|
+
models.append(f"[Prisma] {m} ({prisma_path.relative_to(project_dir).as_posix()})")
|
|
212
|
+
|
|
213
|
+
# 2. Django / SQLAlchemy models.py
|
|
214
|
+
for models_file in project_dir.rglob("models.py"):
|
|
215
|
+
if "venv" not in models_file.parts and ".git" not in models_file.parts:
|
|
216
|
+
text = models_file.read_text(encoding="utf-8", errors="ignore")
|
|
217
|
+
found = re.findall(r"\bclass\s+([A-Za-z0-9_]+)\s*\(", text)
|
|
218
|
+
for m in found:
|
|
219
|
+
if m not in ("Meta",):
|
|
220
|
+
models.append(f"[Model] {m} ({models_file.relative_to(project_dir).as_posix()})")
|
|
221
|
+
|
|
222
|
+
# 3. Drizzle schema
|
|
223
|
+
for drizzle_file in project_dir.rglob("schema.ts"):
|
|
224
|
+
if "node_modules" not in drizzle_file.parts:
|
|
225
|
+
text = drizzle_file.read_text(encoding="utf-8", errors="ignore")
|
|
226
|
+
found = re.findall(r"export\s+const\s+([A-Za-z0-9_]+)\s+=\s+(?:pgTable|mysqlTable|sqliteTable)", text)
|
|
227
|
+
for m in found:
|
|
228
|
+
models.append(f"[Drizzle] {m} ({drizzle_file.relative_to(project_dir).as_posix()})")
|
|
229
|
+
|
|
230
|
+
except Exception:
|
|
231
|
+
pass
|
|
232
|
+
|
|
233
|
+
return models[:30]
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
# ── Satellites Generator (.agents/context/) ───────────────────────────────────
|
|
237
|
+
|
|
238
|
+
def generate_satellites(project_dir: Path, force: bool = False) -> dict[str, Path]:
|
|
239
|
+
"""
|
|
240
|
+
Generate stack-adaptive satellite files in .agents/context/ on-demand.
|
|
241
|
+
Enforces strict idempotency and zero token bloat in the main hub.
|
|
242
|
+
"""
|
|
243
|
+
satellites_dir = project_dir / ".agents" / "context"
|
|
244
|
+
satellites_dir.mkdir(parents=True, exist_ok=True)
|
|
245
|
+
generated: dict[str, Path] = {}
|
|
246
|
+
|
|
247
|
+
routes = discover_routes(project_dir)
|
|
248
|
+
models = discover_database_models(project_dir)
|
|
249
|
+
|
|
250
|
+
# 1. routes.md (if web routes detected)
|
|
251
|
+
if routes:
|
|
252
|
+
routes_path = satellites_dir / "routes.md"
|
|
253
|
+
routes_content = (
|
|
254
|
+
"# System Route & Endpoint Map\n\n"
|
|
255
|
+
"> Discovered automatically via convention scanner. Used by AI agents for precision navigation.\n\n"
|
|
256
|
+
"| Kind | Route Path | Implementation File |\n"
|
|
257
|
+
"| :--- | :--- | :--- |\n"
|
|
258
|
+
)
|
|
259
|
+
for r in routes:
|
|
260
|
+
parts = r.split(" -> ")
|
|
261
|
+
kind_path = parts[0]
|
|
262
|
+
impl = parts[1] if len(parts) > 1 else ""
|
|
263
|
+
routes_content += f"| {kind_path} | `{impl}` |\n"
|
|
264
|
+
|
|
265
|
+
write_idempotent(routes_path, routes_content, "Routes Satellite")
|
|
266
|
+
generated["routes"] = routes_path
|
|
267
|
+
|
|
268
|
+
# 2. schema.md (if database models detected)
|
|
269
|
+
if models:
|
|
270
|
+
schema_path = satellites_dir / "schema.md"
|
|
271
|
+
schema_content = (
|
|
272
|
+
"# Database Schema & Entity Models\n\n"
|
|
273
|
+
"> Discovered data models and ORM schema definitions. Used by AI agents for database context.\n\n"
|
|
274
|
+
"| Model / Entity | Definition File |\n"
|
|
275
|
+
"| :--- | :--- |\n"
|
|
276
|
+
)
|
|
277
|
+
for m in models:
|
|
278
|
+
schema_content += f"| {m} |\n"
|
|
279
|
+
|
|
280
|
+
write_idempotent(schema_path, schema_content, "Schema Satellite")
|
|
281
|
+
generated["schema"] = schema_path
|
|
282
|
+
|
|
283
|
+
# 3. gotchas.md (Critical Traps & Anti-Patterns — Replaces useless bug diaries)
|
|
284
|
+
gotchas_path = satellites_dir / "gotchas.md"
|
|
285
|
+
if not gotchas_path.exists() or force:
|
|
286
|
+
gotchas_content = (
|
|
287
|
+
"# Critical Gotchas, Anti-Patterns & Architecture Invariants\n\n"
|
|
288
|
+
"> Institutional knowledge and non-obvious traps that cannot be guessed from reading code.\n\n"
|
|
289
|
+
"## ⚠️ Active Constraints & Traps\n\n"
|
|
290
|
+
"1. **Port Invariants:** Inspect discovered ports before binding local services.\n"
|
|
291
|
+
"2. **Secret Isolation:** Production secrets belong in `.env`; dummy dev accounts belong in `context.local.md`.\n"
|
|
292
|
+
"3. **State Boundaries:** Verify migrations before initiating build or release cycles.\n"
|
|
293
|
+
)
|
|
294
|
+
write_idempotent(gotchas_path, gotchas_content, "Gotchas Satellite")
|
|
295
|
+
generated["gotchas"] = gotchas_path
|
|
296
|
+
|
|
297
|
+
return generated
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Executive Context Hub
|
|
2
|
+
|
|
3
|
+
> **Last Updated:** {{DATE_NOW}} | **Stack:** {{STACK}} ({{FRAMEWORK}})
|
|
4
|
+
> **Directory:** `{{PROJECT_DIR}}` | **Model:** Hub & Satellite (< 400 Tokens)
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- AUTO-CONTEXT:DISCOVERY:START -->
|
|
9
|
+
## 1. Network & Configuration Vault
|
|
10
|
+
|
|
11
|
+
> 🔒 **Sandbox Isolation:** Mock dev accounts and local ports live in [`context.local.md`](file://{{PROJECT_DIR}}/context.local.md). Production secrets belong exclusively in `.env`.
|
|
12
|
+
|
|
13
|
+
| Service / Key | Port / Setting | Source / Mode |
|
|
14
|
+
| :--- | :--- | :--- |
|
|
15
|
+
| **App Server** | `3000` (Default) | Development |
|
|
16
|
+
| **Test Fixtures** | `context.local.md` | Mock accounts (chmod 600) |
|
|
17
|
+
| **Runtime Secrets** | `.env` | Protected by .gitignore |
|
|
18
|
+
|
|
19
|
+
## 2. Stack & Adaptive Satellites
|
|
20
|
+
|
|
21
|
+
* **Primary Stack:** {{STACK}} ({{FRAMEWORK}})
|
|
22
|
+
* **Satellites Directory:** [`.agents/context/`](file://{{PROJECT_DIR}}/.agents/context/)
|
|
23
|
+
- **Critical Gotchas:** [`gotchas.md`](file://{{PROJECT_DIR}}/.agents/context/gotchas.md) — Architecture invariants & traps
|
|
24
|
+
- **Routes & Endpoints:** [`routes.md`](file://{{PROJECT_DIR}}/.agents/context/routes.md) — Discovered API & page map
|
|
25
|
+
- **Database Schemas:** [`schema.md`](file://{{PROJECT_DIR}}/.agents/context/schema.md) — Discovered models & ORM entities
|
|
26
|
+
|
|
27
|
+
## 3. Operations Runbook
|
|
28
|
+
|
|
29
|
+
| Action | Command |
|
|
30
|
+
| :--- | :--- |
|
|
31
|
+
| **Start Development** | `npm run dev` / `python main.py` |
|
|
32
|
+
| **Codebase Rescan** | `init-context scan` |
|
|
33
|
+
<!-- AUTO-CONTEXT:DISCOVERY:END -->
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 4. Active Invariants & Critical Gotchas
|
|
38
|
+
|
|
39
|
+
> ⚠️ Consult [`.agents/context/gotchas.md`](file://{{PROJECT_DIR}}/.agents/context/gotchas.md) before modifying database models, port bindings, or build pipelines.
|
|
40
|
+
|
|
41
|
+
1. **Token Conservation:** Do NOT read full component bodies; use Grep / Symbol targeting.
|
|
42
|
+
2. **Secret Safety:** Never commit plaintext credentials or test keys.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 5. Skills & Progressive Disclosure Routing
|
|
47
|
+
|
|
48
|
+
| Skill | Triggers | Location |
|
|
49
|
+
| :--- | :--- | :--- |
|
|
50
|
+
| **`docker-ops`** | `docker`, `compose` | [SKILL.md](file://{{PROJECT_DIR}}/.agents/skills/docker-ops/SKILL.md) |
|
|
51
|
+
| **`git-workflow`** | `git`, `commit`, `rebase` | [SKILL.md](file://{{PROJECT_DIR}}/.agents/skills/git-workflow/SKILL.md) |
|
|
52
|
+
| **`server-diagnostics`** | `health`, `ram`, `port` | [SKILL.md](file://{{PROJECT_DIR}}/.agents/skills/server-diagnostics/SKILL.md) |
|
|
53
|
+
| **`browser-testing`** | `browser`, `playwright` | [SKILL.md](file://{{PROJECT_DIR}}/.agents/skills/browser-testing/SKILL.md) |
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hub-satellite-architecture
|
|
3
|
+
description: Enforces the Hub & Satellite modular context pattern, strict idempotency, token budget ceilings, and the Brutal Truth Filter across all projects.
|
|
4
|
+
trigger: always_on
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Rule: Hub & Satellite Modular Architecture & Idempotency Proof
|
|
8
|
+
|
|
9
|
+
## Objective
|
|
10
|
+
Prevent monolithic context file bloat, eliminate token waste, ensure 100% idempotent execution, and enforce high-value institutional knowledge retention across all coding tasks.
|
|
11
|
+
|
|
12
|
+
## Guidelines & Constraints
|
|
13
|
+
|
|
14
|
+
1. **Hub & Satellite Pattern (Strict Token Budget):**
|
|
15
|
+
- Primary `context.md` serves solely as an **Executive Hub** and MUST NOT exceed **80 lines / ~400 tokens**.
|
|
16
|
+
- Detailed domain specifics must be separated into stack-adaptive satellite files inside `.agents/context/` (e.g. `routes.md`, `schema.md`, `gotchas.md`).
|
|
17
|
+
- Satellites are dynamically loaded on-demand via progressive disclosure, preserving conversation context window budgets.
|
|
18
|
+
|
|
19
|
+
2. **Strict Idempotency Proof ($f(f(x)) = f(x)$):**
|
|
20
|
+
- Running context generation or sync commands 1 time or 100 times must produce the exact same deterministic result without duplicating blocks.
|
|
21
|
+
- Use anchored block delimiters (`<!-- AUTO-CONTEXT:<TAG>:START --> ... <!-- AUTO-CONTEXT:<TAG>:END -->`).
|
|
22
|
+
- Re-running replaces block contents rather than appending.
|
|
23
|
+
- User-written notes, secrets, and manual entries outside anchored zones must remain 100% untouched.
|
|
24
|
+
- Check content hashes before disk writes to avoid unnecessary I/O.
|
|
25
|
+
|
|
26
|
+
3. **The Brutal Truth Filter (Zero Dead Logs):**
|
|
27
|
+
- If an idea, log entry, or feature fails first-principles scrutiny, drop it immediately and inform the user.
|
|
28
|
+
- Prohibit chronological bug cemeteries (`history.md` dumps of trivial solved bugs).
|
|
29
|
+
- In their place, maintain **`gotchas.md`**: high-impact institutional knowledge, non-obvious architecture traps, port collisions, and edge-case invariants.
|
|
30
|
+
|
|
31
|
+
4. **KISS & DRY Heuristics:**
|
|
32
|
+
- Prefer language-agnostic filesystem convention heuristics (directories, manifests) over heavy language AST parsers that crash on in-flight syntax errors.
|
|
33
|
+
- All scanners must degrade gracefully with zero unhandled exceptions.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: readme-docs-sync
|
|
3
|
+
description: Mandates immediate documentation synchronization in README.md whenever features, commands, or workflows are added or updated in auto-context or any Git repository.
|
|
4
|
+
trigger: always_on
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Rule: Mandatory README & Documentation Synchronization
|
|
8
|
+
|
|
9
|
+
## Objective
|
|
10
|
+
Ensure that all features, subcommands, options, and architectural workflows in `auto-context` or any active Git repository are comprehensively, accurately, and immediately documented in `README.md` with proper executable commands and instructions.
|
|
11
|
+
|
|
12
|
+
## Guidelines & Constraints
|
|
13
|
+
1. **Zero Undocumented Features:**
|
|
14
|
+
- Whenever a new feature, CLI command, option, flag, or architectural capability is added or modified, `README.md` MUST be updated before committing or releasing.
|
|
15
|
+
- Both the English reference documentation and the Bengali guide (বাংলা নির্দেশিকা) must be updated.
|
|
16
|
+
2. **Clear & Executable Instructions:**
|
|
17
|
+
- Every command documented must be 100% executable and tested.
|
|
18
|
+
- Include clear syntax examples (`init-context update`, `init-context promote`, `init-context memory`, etc.), options tables, and expected output.
|
|
19
|
+
3. **Safety & Non-Breaking Boundaries:**
|
|
20
|
+
- Explicitly document data protection guarantees (e.g. `context.md`, `.env`, and user custom rules are never overwritten or broken).
|
|
21
|
+
4. **Release Version Alignment:**
|
|
22
|
+
- When bumping package versions (`pyproject.toml`, tags), update release badges and installation commands in `README.md`.
|
|
23
|
+
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# {{PROJECT_NAME}} — Master Architectural Context, Problem Log & Operations Manual
|
|
2
|
-
|
|
3
|
-
> **Last Updated:** {{DATE_NOW}}
|
|
4
|
-
> **Project Directory:** `{{PROJECT_DIR}}`
|
|
5
|
-
> **Repository Name:** `{{PROJECT_NAME}}`
|
|
6
|
-
> **Primary Stack:** {{STACK}} ({{FRAMEWORK}})
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## 1. Master Credentials & Configuration Vault
|
|
11
|
-
|
|
12
|
-
> 🔒 **Local Sandbox Isolation:** Mock test logins, seed users, and local dev ports are stored in [`context.local.md`](file://{{PROJECT_DIR}}/context.local.md) (strictly protected by `.gitignore` and `chmod 600`). Real secrets reside exclusively in `.env`.
|
|
13
|
-
|
|
14
|
-
| Property | Value / Setting | Description |
|
|
15
|
-
| :--- | :--- | :--- |
|
|
16
|
-
| **Project Name** | `{{PROJECT_NAME}}` | Active project identifier |
|
|
17
|
-
| **Environment** | Development / Production | Current runtime environment |
|
|
18
|
-
| **Base Port** | TBD | Application listening port |
|
|
19
|
-
| **API Endpoints** | TBD | Service URL / Domains |
|
|
20
|
-
| **Secrets / Keys** | Secured in Vault | Credentials, API tokens, passwords |
|
|
21
|
-
| **Test Fixtures** | `context.local.md` | Local dummy test credentials (git-ignored) |
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## 2. Chronological Problem Log & Technical Solutions
|
|
26
|
-
|
|
27
|
-
```mermaid
|
|
28
|
-
flowchart TD
|
|
29
|
-
Init["1. Project Initialized"] --> Ready["Ready for development"]
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
| # | Symptom / Error Message | Root Cause | Exact CLI Solution & Code Patch |
|
|
33
|
-
| :-: | :--- | :--- | :--- |
|
|
34
|
-
| 1 | Initial setup | Clean repository initialization | Generated autonomous context framework |
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## 3. System Architecture & Tech Stack
|
|
39
|
-
|
|
40
|
-
* **Primary Stack:** {{STACK}}
|
|
41
|
-
* **Framework:** {{FRAMEWORK}}
|
|
42
|
-
* **Database / Cache:** TBD
|
|
43
|
-
* **Deployment Target:** TBD
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
{{PROJECT_NAME}}/
|
|
47
|
-
├── .agents/
|
|
48
|
-
│ ├── rules/
|
|
49
|
-
│ │ ├── code-standards.md
|
|
50
|
-
│ │ ├── maintain_context.md
|
|
51
|
-
│ │ └── security-boundaries.md
|
|
52
|
-
│ └── skills/
|
|
53
|
-
│ ├── browser-testing/
|
|
54
|
-
│ ├── docker-ops/
|
|
55
|
-
│ ├── git-workflow/
|
|
56
|
-
│ └── server-diagnostics/
|
|
57
|
-
├── AGENTS.md
|
|
58
|
-
├── GEMINI.md
|
|
59
|
-
├── context.local.md
|
|
60
|
-
└── context.md
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## 4. Setup, Reproduction & Operations Runbook
|
|
66
|
-
|
|
67
|
-
### Prerequisites
|
|
68
|
-
* Operating System: Linux / WSL2 / Windows / macOS
|
|
69
|
-
* Runtime / Package Manager: TBD
|
|
70
|
-
|
|
71
|
-
### Quick Start
|
|
72
|
-
```bash
|
|
73
|
-
# Setup instructions will be populated automatically by AI assistant
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
## 5. Skills & Progressive Disclosure Catalog
|
|
79
|
-
|
|
80
|
-
> 💡 **Progressive Disclosure Protocol:** Agents must NOT read full `SKILL.md` files upfront. When user prompts match any triggers, dynamically inspect the skill file using `read_file`.
|
|
81
|
-
|
|
82
|
-
| Skill | Version | Purpose & Scope | Triggers | Location |
|
|
83
|
-
| :--- | :---: | :--- | :--- | :--- |
|
|
84
|
-
| **`docker-ops`** | 1.0.0 | Production Dockerfile & Compose orchestration | `docker`, `container`, `compose` | [SKILL.md](file://{{PROJECT_DIR}}/.agents/skills/docker-ops/SKILL.md) |
|
|
85
|
-
| **`git-workflow`** | 1.0.0 | Conventional commits & merge conflict resolution | `git`, `commit`, `branch`, `rebase` | [SKILL.md](file://{{PROJECT_DIR}}/.agents/skills/git-workflow/SKILL.md) |
|
|
86
|
-
| **`server-diagnostics`** | 1.0.0 | System health, RAM/swap, CPU, ports & sockets | `health`, `ram`, `cpu`, `swap`, `port` | [SKILL.md](file://{{PROJECT_DIR}}/.agents/skills/server-diagnostics/SKILL.md) |
|
|
87
|
-
| **`browser-testing`** | 1.0.0 | UI testing & mock logins using `context.local.md` | `browser`, `playwright`, `puppeteer`, `ui-test` | [SKILL.md](file://{{PROJECT_DIR}}/.agents/skills/browser-testing/SKILL.md) |
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## 6. Autonomous Documentation Policy
|
|
92
|
-
* Maintained automatically by AI assistants (Antigravity, Cursor, Claude Code, Copilot, Cline, Windsurf) on every code or configuration change.
|
|
93
|
-
* Governed by [`GEMINI.md`](file://{{PROJECT_DIR}}/GEMINI.md) and [`.agents/rules/maintain_context.md`](file://{{PROJECT_DIR}}/.agents/rules/maintain_context.md).
|
|
94
|
-
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/AGENTS.template.md
RENAMED
|
File without changes
|
{auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/GEMINI.template.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/profile.template.md
RENAMED
|
File without changes
|
{auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/rule.template.md
RENAMED
|
File without changes
|
{auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/rules/code-standards.md
RENAMED
|
File without changes
|
|
File without changes
|
{auto_context_cli-1.0.2 → auto_context_cli-1.0.3}/src/auto_context/templates/skill.template.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|