auto-context-cli 1.0.2__tar.gz → 1.0.4__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.4}/PKG-INFO +116 -41
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/README.md +115 -40
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/pyproject.toml +1 -1
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/__init__.py +1 -1
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/commands/init_cmd.py +7 -0
- auto_context_cli-1.0.4/src/auto_context/commands/scan_cmd.py +134 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/main.py +8 -2
- auto_context_cli-1.0.4/src/auto_context/scanner.py +297 -0
- auto_context_cli-1.0.4/src/auto_context/templates/AGENTS.template.md +47 -0
- auto_context_cli-1.0.4/src/auto_context/templates/GEMINI.template.md +47 -0
- auto_context_cli-1.0.4/src/auto_context/templates/context.template.md +53 -0
- auto_context_cli-1.0.4/src/auto_context/templates/maintain_context.template.md +48 -0
- auto_context_cli-1.0.4/src/auto_context/templates/rules/hub-satellite-architecture.md +34 -0
- auto_context_cli-1.0.4/src/auto_context/templates/rules/readme-docs-sync.md +23 -0
- auto_context_cli-1.0.2/src/auto_context/templates/AGENTS.template.md +0 -53
- auto_context_cli-1.0.2/src/auto_context/templates/GEMINI.template.md +0 -53
- auto_context_cli-1.0.2/src/auto_context/templates/context.template.md +0 -94
- auto_context_cli-1.0.2/src/auto_context/templates/maintain_context.template.md +0 -37
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/.gitignore +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/LICENSE +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/commands/__init__.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/commands/import_cmd.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/commands/mcp.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/commands/memory.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/commands/share.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/commands/update_cmd.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/config.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/security.py +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/templates/context.local.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/templates/mcp_config.template.json +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/templates/profile.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/templates/rule.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/templates/rules/code-standards.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/templates/rules/security-boundaries.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/templates/skill.template.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/templates/skills/browser-testing/SKILL.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/templates/skills/docker-ops/SKILL.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/src/auto_context/templates/skills/git-workflow/SKILL.md +0 -0
- {auto_context_cli-1.0.2 → auto_context_cli-1.0.4}/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.4
|
|
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.4)
|
|
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.4)
|
|
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,134 @@
|
|
|
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
|
+
))
|
|
134
|
+
|
|
@@ -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.4"
|
|
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
|
|