ctxdotdev 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,74 +2,145 @@
2
2
 
3
3
  **One command. Perfect context. Every AI tool.**
4
4
 
5
- `ctx` is a CLI tool that gives every AI coding tool perfect project context with one command. Works with Cursor, Claude Code, GitHub Copilot, Continue.dev, Codex, and any LLM.
5
+ `ctx` scans your project, detects the framework (Next.js, React, Vue, Django, Express, Go, Rust 30+), reads config files, analyzes dependencies, and copies a concise context summary to your clipboard. Paste into any AI coding tool.
6
6
 
7
7
  ## Quick Start
8
8
 
9
9
  ```bash
10
- # Install via npm
11
10
  npm install -g ctxdotdev
12
-
13
- # Then generate context in any project
14
- cd my-project
11
+ cd your-project
15
12
  ctx
16
-
17
- # Context is copied to your clipboard. Paste into any AI tool.
18
13
  ```
19
14
 
20
- ## Why ctx?
15
+ That's it. Context is copied to your clipboard. Paste it into Cursor, Claude Code, Copilot, or any LLM.
21
16
 
22
- **The problem:** Every time you use an AI coding tool, you have to re-explain your codebase. What framework is this? What's the project structure? What are the dependencies? You waste 15+ minutes per session setting up context.
17
+ ## Why?
23
18
 
24
- **The solution:** `ctx` scans your project, analyzes its structure, dependencies, and configuration, and produces a compact context summary. One command. One second. Perfect context.
19
+ Every time you use an AI coding tool, you have to re-explain your codebase. *"This is a Next.js app with TypeScript, Prisma, and Tailwind..."* 15 minutes gone.
25
20
 
26
- ## Commands
21
+ `ctx` gives the AI the same context in one second. No more repeating yourself.
27
22
 
28
- | Command | Description |
29
- |---------|-------------|
30
- | `ctx` | Generate context and copy to clipboard |
31
- | `ctx init` | Initialize ctx in this project |
32
- | `ctx watch` | Watch files and auto-update context (Pro) |
33
- | `ctx config` | View or edit project configuration |
34
- | `ctx template` | Manage context templates (Pro) |
35
- | `ctx doctor` | Check installation and setup |
23
+ ## Examples
24
+
25
+ ### Next.js + TypeScript
26
+ ```
27
+ $ ctx
28
+
29
+ Project: my-app ── Node / Next.js
30
+
31
+ Dependencies: 312 (289 production)
32
+ Git branch: main
33
+
34
+ Structure:
35
+ ├── src/
36
+ ├── public/
37
+ ├── prisma/
38
+ ├── package.json
39
+ ├── tsconfig.json
40
+ ├── next.config.ts
41
+ └── tailwind.config.ts
36
42
 
37
- ## Features
43
+ Config files:
44
+ → my-app/tsconfig.json (TypeScript config)
45
+ → my-app/next.config.ts (Next.js config)
46
+ → my-app/tailwind.config.ts (Tailwind config)
47
+ → my-app/vitest.config.ts (Vitest config)
38
48
 
39
- - **Cross-platform** — Works with Cursor, Claude Code, Copilot, Codex, and any LLM
40
- - **One command**`ctx` generates context in under a second
41
- - **Privacy-first** — All processing local. Nothing leaves your machine.
42
- - **Smart prioritization**Auto-detects what's most relevant
43
- - **Project-aware** — Detects framework, dependencies, structure automatically
49
+ Key files:
50
+ package.json (2.3KB)1h ago
51
+ tsconfig.json (642B) 1d ago
52
+ README.md (1.1KB)3d ago
44
53
 
45
- ## Output Example
54
+ Context copied to clipboard. Ready for AI.
55
+ ```
46
56
 
57
+ ### Django (Python)
47
58
  ```
48
- Project: my-app ── Node / Next.js
59
+ $ ctx
60
+
61
+ Project: blog ── Python / Django
49
62
 
50
- Dependencies: 1,234 (312 production)
63
+ Dependencies: 0
51
64
  Git branch: main
52
65
 
53
66
  Structure:
54
- ├── src/
55
- ├── public/
56
- ├── package.json
57
- ├── tsconfig.json
58
- └── next.config.js
67
+ ├── blog/
68
+ ├── manage.py
69
+ ├── requirements.txt
70
+ ├── pyproject.toml
71
+ ├── Dockerfile
72
+ └── docker-compose.yml
59
73
 
60
74
  Config files:
61
- tsconfig.json (TypeScript config)
75
+ blog/manage.py (Django manage)
76
+ → blog/requirements.txt (Python deps)
77
+ → blog/pyproject.toml (Python project)
78
+ → blog/Dockerfile (Dockerfile)
79
+ → blog/docker-compose.yml (Docker Compose)
62
80
 
63
- Key files:
64
- → package.json — 2h ago
65
- → src/app/layout.tsx — 3h ago
81
+ Context copied to clipboard. Ready for AI.
82
+ ```
83
+
84
+ ### Go API
85
+ ```
86
+ $ ctx
87
+
88
+ Project: api ── Go / Gin
89
+
90
+ Dependencies: 0
91
+ Git branch: main
92
+
93
+ Structure:
94
+ ├── cmd/
95
+ ├── internal/
96
+ ├── go.mod
97
+ ├── go.sum
98
+ ├── Dockerfile
99
+ └── Makefile
100
+
101
+ Config files:
102
+ → api/go.mod (Go module)
103
+ → api/Makefile (Makefile)
66
104
 
67
105
  ✓ Context copied to clipboard. Ready for AI.
68
106
  ```
69
107
 
108
+ ## All Commands
109
+
110
+ | Command | Description |
111
+ |---------|-------------|
112
+ | `ctx` | Generate context and copy to clipboard |
113
+ | `ctx init` | Initialize ctx in this project |
114
+ | `ctx watch` | Watch files, auto-update context on changes |
115
+ | `ctx template` | List, create, and use context templates |
116
+ | `ctx config` | View project configuration |
117
+ | `ctx doctor` | Check installation and project setup |
118
+
119
+ ## Watch Mode
120
+
121
+ Regenerate context automatically whenever a file changes:
122
+
123
+ ```bash
124
+ ctx watch
125
+ ```
126
+
127
+ The output updates in real-time. Great for long AI coding sessions where your project keeps changing.
128
+
129
+ ## Templates
130
+
131
+ Use different context profiles for different tasks:
132
+
133
+ ```bash
134
+ ctx template list
135
+ ctx template use review # Focus on changed files
136
+ ctx template use debug # Include dependency details
137
+ ctx template use onboard # Full project overview
138
+ ctx template create my-custom
139
+ ```
140
+
70
141
  ## Configuration
71
142
 
72
- Create a `.ctx/config.json` in your project root:
143
+ Create `.ctx/config.json` in your project root:
73
144
 
74
145
  ```json
75
146
  {
@@ -83,8 +154,20 @@ Create a `.ctx/config.json` in your project root:
83
154
  }
84
155
  ```
85
156
 
86
- Or use `.ctxignore` for additional file exclusions (same syntax as `.gitignore`).
157
+ ## Supported Frameworks
158
+
159
+ **Node.js**: Next.js, React, Vue, Svelte, SvelteKit, Nuxt, Angular, NestJS, Express, Fastify, Hono, Gatsby, Remix, Astro, Solid, tRPC, Electron, Expo, React Native, Preact, Lit, Docusaurus, VitePress, Eleventy
160
+
161
+ **Python**: Django, Flask, FastAPI, Tornado, aiohttp, Starlette
162
+
163
+ **Go**: Gin, Echo, Fiber, Chi
164
+
165
+ **Rust**: Axum, Actix, Rocket, Tide, Warp, Leptos, Yew
166
+
167
+ ## Privacy
168
+
169
+ All processing is local. Your code never leaves your machine. No telemetry. No tracking. No cloud.
87
170
 
88
171
  ## License
89
172
 
90
- MIT — do whatever you want with it.
173
+ MIT
@@ -9,8 +9,7 @@ export interface ProjectInfo {
9
9
  gitInfo: GitInfo | null;
10
10
  keyFiles: ScannedFile[];
11
11
  }
12
- export type ProjectType = 'node' | 'python' | 'go' | 'rust' | 'unknown';
13
- export type Framework = 'next.js' | 'react' | 'express' | 'fastify' | 'django' | 'flask' | 'unknown';
12
+ export type ProjectType = 'node' | 'deno' | 'bun' | 'python' | 'go' | 'rust' | 'unknown';
14
13
  export interface DepInfo {
15
14
  total: number;
16
15
  production: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,SAAS,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AACxE,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,OAAO,GACP,SAAS,GACT,SAAS,GACT,QAAQ,GACR,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,CAmB7E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,SAAS,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAEzF,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAiFD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,CAmB7E"}
@@ -1,5 +1,83 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { resolve, basename } from 'node:path';
3
+ const FRAMEWORK_SIGNATURES = {
4
+ node: [
5
+ { dep: 'next', label: 'Next.js' },
6
+ { dep: 'nuxt', label: 'Nuxt' },
7
+ { dep: 'sveltekit', label: 'SvelteKit' },
8
+ { dep: 'svelte', label: 'Svelte' },
9
+ { dep: 'vue', label: 'Vue' },
10
+ { dep: 'react', label: 'React' },
11
+ { dep: 'gatsby', label: 'Gatsby' },
12
+ { dep: 'remix', label: 'Remix' },
13
+ { dep: 'astro', label: 'Astro' },
14
+ { dep: 'angular', label: 'Angular' },
15
+ { dep: 'nest', label: 'NestJS' },
16
+ { dep: 'express', label: 'Express' },
17
+ { dep: 'fastify', label: 'Fastify' },
18
+ { dep: 'hono', label: 'Hono' },
19
+ { dep: 'trpc', label: 'tRPC' },
20
+ { dep: 'solid-js', label: 'Solid' },
21
+ { dep: 'solid-start', label: 'SolidStart' },
22
+ { dep: '@11ty/eleventy', label: 'Eleventy' },
23
+ { dep: 'docusaurus', label: 'Docusaurus' },
24
+ { dep: 'vitepress', label: 'VitePress' },
25
+ { dep: '@remix-run/react', label: 'Remix' },
26
+ { dep: '@sveltejs/kit', label: 'SvelteKit' },
27
+ { dep: '@nuxt/kit', label: 'Nuxt' },
28
+ { dep: '@angular/core', label: 'Angular' },
29
+ { dep: '@nestjs/core', label: 'NestJS' },
30
+ { dep: 'electron', label: 'Electron' },
31
+ { dep: 'expo', label: 'Expo' },
32
+ { dep: 'react-native', label: 'React Native' },
33
+ { dep: 'preact', label: 'Preact' },
34
+ { dep: 'lit', label: 'Lit' },
35
+ { config: 'astro.config.mjs', label: 'Astro' },
36
+ { config: 'astro.config.ts', label: 'Astro' },
37
+ { config: 'svelte.config.js', label: 'SvelteKit' },
38
+ { config: 'vue.config.js', label: 'Vue' },
39
+ { config: 'nuxt.config.ts', label: 'Nuxt' },
40
+ { config: 'nuxt.config.js', label: 'Nuxt' },
41
+ { config: 'remix.config.js', label: 'Remix' },
42
+ { config: 'gatsby-config.js', label: 'Gatsby' },
43
+ { config: 'next.config.js', label: 'Next.js' },
44
+ { config: 'next.config.mjs', label: 'Next.js' },
45
+ { config: 'next.config.ts', label: 'Next.js' },
46
+ ],
47
+ python: [
48
+ { dep: 'django', label: 'Django' },
49
+ { dep: 'flask', label: 'Flask' },
50
+ { dep: 'fastapi', label: 'FastAPI' },
51
+ { dep: 'tornado', label: 'Tornado' },
52
+ { dep: 'aiohttp', label: 'aiohttp' },
53
+ { dep: 'starlette', label: 'Starlette' },
54
+ { dep: 'bottle', label: 'Bottle' },
55
+ { dep: 'pyramid', label: 'Pyramid' },
56
+ { dep: 'sanic', label: 'Sanic' },
57
+ { config: 'manage.py', label: 'Django' },
58
+ { config: 'app.py', label: 'Flask' },
59
+ ],
60
+ go: [
61
+ { dep: 'gin', label: 'Gin' },
62
+ { dep: 'echo', label: 'Echo' },
63
+ { dep: 'fiber', label: 'Fiber' },
64
+ { dep: 'chi', label: 'Chi' },
65
+ { dep: 'mux', label: 'Mux' },
66
+ { dep: 'negroni', label: 'Negroni' },
67
+ ],
68
+ rust: [
69
+ { dep: 'axum', label: 'Axum' },
70
+ { dep: 'actix-web', label: 'Actix' },
71
+ { dep: 'rocket', label: 'Rocket' },
72
+ { dep: 'tide', label: 'Tide' },
73
+ { dep: 'warp', label: 'Warp' },
74
+ { dep: 'salvo', label: 'Salvo' },
75
+ { dep: 'poem', label: 'Poem' },
76
+ { dep: 'leptos', label: 'Leptos' },
77
+ { dep: 'yew', label: 'Yew' },
78
+ { dep: 'dioxus', label: 'Dioxus' },
79
+ ],
80
+ };
3
81
  export function analyzeProject(cwd, files) {
4
82
  const name = basename(cwd);
5
83
  const type = detectProjectType(cwd);
@@ -22,7 +100,11 @@ export function analyzeProject(cwd, files) {
22
100
  function detectProjectType(cwd) {
23
101
  if (existsSync(resolve(cwd, 'package.json')))
24
102
  return 'node';
25
- if (existsSync(resolve(cwd, 'pyproject.toml')) || existsSync(resolve(cwd, 'requirements.txt')))
103
+ if (existsSync(resolve(cwd, 'deno.json')) || existsSync(resolve(cwd, 'deno.jsonc')))
104
+ return 'deno';
105
+ if (existsSync(resolve(cwd, 'bun.lock')) || existsSync(resolve(cwd, 'bun.lockb')))
106
+ return 'bun';
107
+ if (existsSync(resolve(cwd, 'pyproject.toml')) || existsSync(resolve(cwd, 'requirements.txt')) || existsSync(resolve(cwd, 'Pipfile')))
26
108
  return 'python';
27
109
  if (existsSync(resolve(cwd, 'go.mod')))
28
110
  return 'go';
@@ -31,25 +113,80 @@ function detectProjectType(cwd) {
31
113
  return 'unknown';
32
114
  }
33
115
  function detectFramework(cwd, type) {
34
- if (type === 'node') {
116
+ const signatures = FRAMEWORK_SIGNATURES[type];
117
+ if (!signatures)
118
+ return 'Unknown';
119
+ let deps = {};
120
+ if (type === 'node' || type === 'bun' || type === 'deno') {
35
121
  try {
36
122
  const pkg = JSON.parse(readFileSync(resolve(cwd, 'package.json'), 'utf-8'));
37
- const deps = { ...pkg.dependencies, ...pkg.devDependencies };
38
- if (deps.next)
39
- return 'next.js';
40
- if (deps.react)
41
- return 'react';
42
- if (deps.express)
43
- return 'express';
44
- if (deps.fastify)
45
- return 'fastify';
123
+ deps = { ...pkg.dependencies, ...pkg.devDependencies };
46
124
  }
47
125
  catch { /* ignore */ }
48
126
  }
49
- return 'unknown';
127
+ if (type === 'python') {
128
+ try {
129
+ const req = readFileSync(resolve(cwd, 'requirements.txt'), 'utf-8');
130
+ for (const sig of signatures) {
131
+ if (sig.dep && req.toLowerCase().includes(sig.dep))
132
+ return sig.label;
133
+ }
134
+ }
135
+ catch { /* ignore */ }
136
+ try {
137
+ const toml = readFileSync(resolve(cwd, 'pyproject.toml'), 'utf-8');
138
+ for (const sig of signatures) {
139
+ if (sig.dep && toml.toLowerCase().includes(sig.dep))
140
+ return sig.label;
141
+ }
142
+ }
143
+ catch { /* ignore */ }
144
+ }
145
+ if (type === 'go') {
146
+ try {
147
+ const mod = readFileSync(resolve(cwd, 'go.mod'), 'utf-8');
148
+ for (const sig of signatures) {
149
+ if (sig.dep && mod.includes(sig.dep))
150
+ return sig.label;
151
+ }
152
+ }
153
+ catch { /* ignore */ }
154
+ }
155
+ if (type === 'rust') {
156
+ try {
157
+ const toml = readFileSync(resolve(cwd, 'Cargo.toml'), 'utf-8');
158
+ for (const sig of signatures) {
159
+ if (sig.dep && toml.includes(sig.dep))
160
+ return sig.label;
161
+ }
162
+ }
163
+ catch { /* ignore */ }
164
+ }
165
+ for (const sig of signatures) {
166
+ if (sig.config && existsSync(resolve(cwd, sig.config)))
167
+ return sig.label;
168
+ if (sig.dep && deps[sig.dep])
169
+ return sig.label;
170
+ }
171
+ if (type === 'node')
172
+ return 'Node.js';
173
+ if (type === 'deno')
174
+ return 'Deno';
175
+ if (type === 'bun')
176
+ return 'Bun';
177
+ return 'Unknown';
178
+ }
179
+ function parseDependencies(cwd) {
180
+ try {
181
+ const pkg = JSON.parse(readFileSync(resolve(cwd, 'package.json'), 'utf-8'));
182
+ return { ...pkg.dependencies, ...pkg.devDependencies };
183
+ }
184
+ catch {
185
+ return {};
186
+ }
50
187
  }
51
188
  function analyzeDependencies(cwd, type) {
52
- if (type === 'node') {
189
+ if (type === 'node' || type === 'deno' || type === 'bun') {
53
190
  try {
54
191
  const pkg = JSON.parse(readFileSync(resolve(cwd, 'package.json'), 'utf-8'));
55
192
  const prod = Object.keys(pkg.dependencies ?? {}).length;
@@ -62,16 +199,65 @@ function analyzeDependencies(cwd, type) {
62
199
  }
63
200
  function findConfigFiles(cwd, type) {
64
201
  const configs = [];
65
- if (type === 'node') {
66
- checkConfig(configs, cwd, 'tsconfig.json', 'TypeScript config');
67
- checkConfig(configs, cwd, 'next.config.js', 'Next.js config');
68
- checkConfig(configs, cwd, 'next.config.mjs', 'Next.js config');
69
- checkConfig(configs, cwd, 'next.config.ts', 'Next.js config');
70
- checkConfig(configs, cwd, 'tailwind.config.js', 'Tailwind config');
71
- checkConfig(configs, cwd, 'eslint.config.js', 'ESLint config');
72
- checkConfig(configs, cwd, '.eslintrc.json', 'ESLint config');
73
- checkConfig(configs, cwd, 'vitest.config.ts', 'Vitest config');
74
- checkConfig(configs, cwd, 'jest.config.ts', 'Jest config');
202
+ const configChecks = [
203
+ ['tsconfig.json', 'TypeScript config'],
204
+ ['jsconfig.json', 'JavaScript config'],
205
+ ['next.config.js', 'Next.js config'],
206
+ ['next.config.mjs', 'Next.js config'],
207
+ ['next.config.ts', 'Next.js config'],
208
+ ['tailwind.config.js', 'Tailwind config'],
209
+ ['tailwind.config.ts', 'Tailwind config'],
210
+ ['eslint.config.js', 'ESLint config'],
211
+ ['eslint.config.mjs', 'ESLint config'],
212
+ ['.eslintrc.json', 'ESLint config'],
213
+ ['vitest.config.ts', 'Vitest config'],
214
+ ['vitest.config.js', 'Vitest config'],
215
+ ['jest.config.ts', 'Jest config'],
216
+ ['jest.config.js', 'Jest config'],
217
+ ['vite.config.ts', 'Vite config'],
218
+ ['vite.config.js', 'Vite config'],
219
+ ['astro.config.mjs', 'Astro config'],
220
+ ['astro.config.ts', 'Astro config'],
221
+ ['svelte.config.js', 'Svelte config'],
222
+ ['nuxt.config.ts', 'Nuxt config'],
223
+ ['nuxt.config.js', 'Nuxt config'],
224
+ ['vue.config.js', 'Vue config'],
225
+ ['remix.config.js', 'Remix config'],
226
+ ['gatsby-config.js', 'Gatsby config'],
227
+ ['gatsby-config.ts', 'Gatsby config'],
228
+ ['playwright.config.ts', 'Playwright config'],
229
+ ['playwright.config.js', 'Playwright config'],
230
+ ['.prettierrc', 'Prettier config'],
231
+ ['prettier.config.js', 'Prettier config'],
232
+ ['.prettierrc.json', 'Prettier config'],
233
+ ['biome.json', 'Biome config'],
234
+ ['biome.jsonc', 'Biome config'],
235
+ ['docker-compose.yml', 'Docker Compose'],
236
+ ['docker-compose.yaml', 'Docker Compose'],
237
+ ['.github/workflows', 'GitHub Actions'],
238
+ ['.vscode', 'VS Code'],
239
+ ['Makefile', 'Makefile'],
240
+ ['.editorconfig', 'EditorConfig'],
241
+ ];
242
+ for (const [path, typeName] of configChecks) {
243
+ checkConfig(configs, cwd, path, typeName);
244
+ }
245
+ if (type === 'python') {
246
+ checkConfig(configs, cwd, 'pyproject.toml', 'Python project');
247
+ checkConfig(configs, cwd, 'requirements.txt', 'Python deps');
248
+ checkConfig(configs, cwd, 'manage.py', 'Django manage');
249
+ checkConfig(configs, cwd, 'Dockerfile', 'Dockerfile');
250
+ }
251
+ if (type === 'go') {
252
+ checkConfig(configs, cwd, 'go.mod', 'Go module');
253
+ checkConfig(configs, cwd, 'Makefile', 'Makefile');
254
+ }
255
+ if (type === 'rust') {
256
+ checkConfig(configs, cwd, 'Cargo.toml', 'Cargo');
257
+ checkConfig(configs, cwd, 'Cargo.lock', 'Cargo lock');
258
+ checkConfig(configs, cwd, 'rust-toolchain.toml', 'Rust toolchain');
259
+ checkConfig(configs, cwd, 'rustfmt.toml', 'Rustfmt config');
260
+ checkConfig(configs, cwd, 'clippy.toml', 'Clippy config');
75
261
  }
76
262
  return configs;
77
263
  }
@@ -97,7 +283,7 @@ function getGitInfo(cwd) {
97
283
  }
98
284
  }
99
285
  function getKeyFiles(cwd, files) {
100
- const priority = ['package.json', 'tsconfig.json', 'README.md', 'Dockerfile'];
286
+ const priority = ['package.json', 'tsconfig.json', 'README.md', 'Dockerfile', '.env.example'];
101
287
  const result = [];
102
288
  for (const name of priority) {
103
289
  const found = files.find(f => f.path === name || f.path.endsWith('/' + name));
@@ -109,22 +295,17 @@ function getKeyFiles(cwd, files) {
109
295
  }
110
296
  function buildTree(files) {
111
297
  const root = { name: '', type: 'directory', children: [] };
112
- const dirMap = new Map();
113
298
  for (const file of files) {
114
299
  const parts = file.path.split('/');
115
300
  const topDir = parts[0];
116
- if (!dirMap.has(topDir)) {
117
- dirMap.set(topDir, []);
118
- }
119
- dirMap.get(topDir).push(file);
120
- }
121
- for (const [dir, dirFiles] of dirMap) {
122
- if (dirFiles.length === 1 && dirFiles[0].path === dir) {
123
- const file = dirFiles[0];
124
- root.children.push({ name: dir, type: 'file', size: file.size });
125
- }
126
- else {
127
- root.children.push({ name: dir + '/', type: 'directory' });
301
+ const existing = root.children?.find(c => c.name === topDir || c.name === topDir + '/');
302
+ if (!existing) {
303
+ if (parts.length === 1) {
304
+ root.children.push({ name: topDir, type: 'file', size: file.size });
305
+ }
306
+ else {
307
+ root.children.push({ name: topDir + '/', type: 'directory' });
308
+ }
128
309
  }
129
310
  }
130
311
  root.children?.sort((a, b) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAY,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAW,MAAM,WAAW,CAAC;AAiDvD,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,KAAoB;IAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAEzC,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,SAAS;QACT,YAAY;QACZ,WAAW;QACX,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC;QAC3B,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChH,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,IAAiB;IACrD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC5E,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;YAC7D,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,SAAS,CAAC;YAChC,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,OAAO,CAAC;YAC/B,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAC;YACnC,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW,EAAE,IAAiB;IACzD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACxD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC1D,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,IAAiB;IACrD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC;QAChE,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;QAC9D,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;QAC/D,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;QAC9D,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,CAAC;QACnE,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;QAC/D,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAC7D,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;QAC/D,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,OAAsB,EAAE,GAAW,EAAE,IAAY,EAAE,IAAY;IAClF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACtC,CAAC,CAAC,UAAU,CAAC;QAEf,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,KAAoB;IACpD,MAAM,QAAQ,GAAG,CAAC,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;QAC9E,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,SAAS,CAAC,KAAoB;IACrC,MAAM,IAAI,GAAa,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACrE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEhD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC;QACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,EAAE,WAAoB,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,eAAe,SAiBxB,CAAC"}
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,eAAe,SAoDxB,CAAC"}
@@ -1,19 +1,53 @@
1
1
  import { Command } from 'commander';
2
+ import { listTemplates, getTemplate, createTemplate } from '../../template/index.js';
2
3
  export const templateCommand = new Command('template')
3
- .description('Manage context templates (Pro)')
4
+ .description('Manage context templates')
4
5
  .argument('[action]', 'Action: list, create, use')
5
6
  .argument('[name]', 'Template name')
6
- .action((action) => {
7
- if (!action) {
8
- console.log(' Usage: ctx template <list|create|use> [name]');
9
- console.log('\n Available templates:');
10
- console.log(' standard Default context template');
11
- console.log('\n Pro templates (coming soon):');
12
- console.log(' review Code review context');
13
- console.log(' debug Debugging context');
14
- console.log(' onboard Onboarding context');
7
+ .action((action, name) => {
8
+ const cwd = process.cwd();
9
+ if (!action || action === 'list') {
10
+ const { builtIn, custom } = listTemplates(cwd);
11
+ console.log(' Available templates:');
12
+ for (const tmpl of builtIn) {
13
+ console.log(` ${tmpl.name.padEnd(12)} ${tmpl.description}`);
14
+ }
15
+ if (custom.length > 0) {
16
+ console.log('\n Custom templates:');
17
+ for (const tmpl of custom) {
18
+ console.log(` ${tmpl.name.padEnd(12)} ${tmpl.description}`);
19
+ }
20
+ }
15
21
  return;
16
22
  }
17
- console.log(` ✗ Template management is a Pro feature. Coming soon.`);
23
+ if (action === 'use') {
24
+ if (!name) {
25
+ console.log(' Usage: ctx template use <name>');
26
+ return;
27
+ }
28
+ const tmpl = getTemplate(cwd, name);
29
+ if (tmpl) {
30
+ console.log(` Using template: ${name}`);
31
+ console.log(` ${tmpl.description}`);
32
+ }
33
+ else {
34
+ console.log(` ✗ Template "${name}" not found.`);
35
+ console.log(' Run "ctx template list" to see available templates.');
36
+ }
37
+ return;
38
+ }
39
+ if (action === 'create') {
40
+ if (!name) {
41
+ console.log(' Usage: ctx template create <name>');
42
+ return;
43
+ }
44
+ createTemplate(cwd, name, {
45
+ name,
46
+ description: `Custom template: ${name}`,
47
+ });
48
+ console.log(` ✓ Template "${name}" created in .ctx/templates/`);
49
+ return;
50
+ }
51
+ console.log(` Usage: ctx template <list|create|use> [name]`);
18
52
  });
19
53
  //# sourceMappingURL=template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/cli/commands/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,gCAAgC,CAAC;KAC7C,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAC;KACjD,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;KACnC,MAAM,CAAC,CAAC,MAAe,EAAE,EAAE;IAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/cli/commands/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAErF,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,0BAA0B,CAAC;KACvC,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAC;KACjD,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;KACnC,MAAM,CAAC,CAAC,MAAe,EAAE,IAAa,EAAE,EAAE;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACjC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,cAAc,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QACD,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE;YACxB,IAAI;YACJ,WAAW,EAAE,oBAAoB,IAAI,EAAE;SACxC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,8BAA8B,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,YAAY,SAMrB,CAAC"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,YAAY,SAerB,CAAC"}
@@ -1,9 +1,20 @@
1
1
  import { Command } from 'commander';
2
+ import { startWatching } from '../../watch/index.js';
2
3
  export const watchCommand = new Command('watch')
3
- .description('Watch files and auto-update context (Pro)')
4
+ .description('Watch files and auto-update context')
4
5
  .option('--debounce <ms>', 'Debounce time in milliseconds', '1000')
5
- .action((options) => {
6
- console.log(' ✗ ctx watch is a Pro feature. Coming soon.');
7
- console.log(' Get notified: https://ctx.dev');
6
+ .option('--format <format>', 'Output format: text, markdown, json')
7
+ .action(async (options) => {
8
+ try {
9
+ await startWatching({
10
+ cwd: process.cwd(),
11
+ debounceMs: parseInt(options.debounce, 10) || 1000,
12
+ format: options.format,
13
+ });
14
+ }
15
+ catch (error) {
16
+ console.error('Error in watch mode:', error instanceof Error ? error.message : error);
17
+ process.exit(1);
18
+ }
8
19
  });
9
20
  //# sourceMappingURL=watch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,EAAE,MAAM,CAAC;KAClE,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAClB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,EAAE,MAAM,CAAC;KAClE,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,CAAC;KAClE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,aAAa,CAAC;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,IAAI;YAClD,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;QACrC,gBAAgB,EAAE,OAAO,CAAC;QAC1B,WAAW,EAAE,OAAO,CAAC;QACrB,aAAa,EAAE,OAAO,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED,eAAO,MAAM,cAAc,EAAE,SAgC5B,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;QACrC,gBAAgB,EAAE,OAAO,CAAC;QAC1B,WAAW,EAAE,OAAO,CAAC;QACrB,aAAa,EAAE,OAAO,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED,eAAO,MAAM,cAAc,EAAE,SAkC5B,CAAC"}
@@ -14,6 +14,8 @@ export const DEFAULT_CONFIG = {
14
14
  'build',
15
15
  '.next',
16
16
  'coverage',
17
+ '.env',
18
+ '.env.*',
17
19
  '*.log',
18
20
  '.cache',
19
21
  '.turbo',
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,OAAO,EAAE;QACP,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,MAAM;KACb;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,EAAE;QACX,OAAO,EAAE;YACP,cAAc;YACd,MAAM;YACN,MAAM;YACN,OAAO;YACP,OAAO;YACP,UAAU;YACV,OAAO;YACP,QAAQ;YACR,QAAQ;SACT;KACF;IACD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,IAAI;QACtB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,KAAK;QACpB,QAAQ,EAAE,EAAE;KACb;IACD,SAAS,EAAE;QACT,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,EAAE;KACX;CACF,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,OAAO,EAAE;QACP,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,MAAM;KACb;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,EAAE;QACX,OAAO,EAAE;YACP,cAAc;YACd,MAAM;YACN,MAAM;YACN,OAAO;YACP,OAAO;YACP,UAAU;YACV,MAAM;YACN,QAAQ;YACR,OAAO;YACP,QAAQ;YACR,QAAQ;SACT;KACF;IACD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,IAAI;QACtB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,KAAK;QACpB,QAAQ,EAAE,EAAE;KACb;IACD,SAAS,EAAE;QACT,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,EAAE;KACX;CACF,CAAC"}
@@ -9,7 +9,7 @@ export function formatJson(info) {
9
9
  : null,
10
10
  structure: info.structure.children?.map(c => c.name) ?? [],
11
11
  configFiles: info.configFiles.map(c => ({
12
- path: c.path,
12
+ path: c.path.split('/').pop() || c.path,
13
13
  type: c.type,
14
14
  })),
15
15
  keyFiles: info.keyFiles.slice(0, 5).map(f => ({
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/formatter/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,IAAiB;IAC1C,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,OAAO,EAAE,IAAI,CAAC,IAAI;QAClB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,GAAG,EAAE,IAAI,CAAC,OAAO;YACf,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACjC,CAAC,CAAC,IAAI;QACR,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;QAC1D,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC;QACH,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE;SACnC,CAAC,CAAC;KACJ,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/formatter/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,IAAiB;IAC1C,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,OAAO,EAAE,IAAI,CAAC,IAAI;QAClB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,GAAG,EAAE,IAAI,CAAC,OAAO;YACf,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACjC,CAAC,CAAC,IAAI;QACR,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;QAC1D,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI;YACvC,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC;QACH,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE;SACnC,CAAC,CAAC;KACJ,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ export interface ContextTemplate {
2
+ name: string;
3
+ description: string;
4
+ scan?: {
5
+ maxDepth?: number;
6
+ maxFiles?: number;
7
+ include?: string[];
8
+ exclude?: string[];
9
+ };
10
+ output?: {
11
+ format?: 'text' | 'markdown' | 'json';
12
+ showDependencies?: boolean;
13
+ showGitInfo?: boolean;
14
+ maxFiles?: number;
15
+ };
16
+ }
17
+ export declare function listTemplates(cwd: string): {
18
+ builtIn: ContextTemplate[];
19
+ custom: ContextTemplate[];
20
+ };
21
+ export declare function getTemplate(cwd: string, name: string): ContextTemplate | null;
22
+ export declare function createTemplate(cwd: string, name: string, template: ContextTemplate): void;
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/template/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;QACtC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAiED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAcpG;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAG7E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAWzF"}
@@ -0,0 +1,93 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ const TEMPLATES_DIR = '.ctx/templates';
4
+ const BUILT_IN_TEMPLATES = {
5
+ standard: {
6
+ name: 'standard',
7
+ description: 'Default context template',
8
+ },
9
+ review: {
10
+ name: 'review',
11
+ description: 'Code review context — focuses on changed files and structure',
12
+ scan: {
13
+ maxFiles: 100,
14
+ },
15
+ output: {
16
+ format: 'text',
17
+ maxFiles: 20,
18
+ },
19
+ },
20
+ debug: {
21
+ name: 'debug',
22
+ description: 'Debugging context — includes more config and dependency details',
23
+ scan: {
24
+ maxDepth: 8,
25
+ },
26
+ output: {
27
+ format: 'markdown',
28
+ showDependencies: true,
29
+ },
30
+ },
31
+ onboard: {
32
+ name: 'onboard',
33
+ description: 'Onboarding context — comprehensive project overview',
34
+ scan: {
35
+ maxDepth: 8,
36
+ maxFiles: 200,
37
+ },
38
+ output: {
39
+ format: 'markdown',
40
+ maxFiles: 100,
41
+ },
42
+ },
43
+ };
44
+ function getTemplatesDir(cwd) {
45
+ return resolve(cwd, TEMPLATES_DIR);
46
+ }
47
+ function getAllTemplates(cwd) {
48
+ const templates = { ...BUILT_IN_TEMPLATES };
49
+ const dir = getTemplatesDir(cwd);
50
+ if (existsSync(dir)) {
51
+ const files = readdirSync(dir).filter(f => f.endsWith('.json'));
52
+ for (const file of files) {
53
+ try {
54
+ const content = readFileSync(resolve(dir, file), 'utf-8');
55
+ const tmpl = JSON.parse(content);
56
+ templates[tmpl.name] = tmpl;
57
+ }
58
+ catch { /* skip invalid */ }
59
+ }
60
+ }
61
+ return templates;
62
+ }
63
+ export function listTemplates(cwd) {
64
+ const all = getAllTemplates(cwd);
65
+ const builtIn = [];
66
+ const custom = [];
67
+ for (const [name, tmpl] of Object.entries(all)) {
68
+ if (BUILT_IN_TEMPLATES[name]) {
69
+ builtIn.push(tmpl);
70
+ }
71
+ else {
72
+ custom.push(tmpl);
73
+ }
74
+ }
75
+ return { builtIn, custom };
76
+ }
77
+ export function getTemplate(cwd, name) {
78
+ const all = getAllTemplates(cwd);
79
+ return all[name] || null;
80
+ }
81
+ export function createTemplate(cwd, name, template) {
82
+ const safe = name.replace(/[^a-zA-Z0-9_-]/g, '');
83
+ if (safe !== name) {
84
+ console.log(` ✗ Invalid template name. Use only letters, numbers, hyphens, and underscores.`);
85
+ return;
86
+ }
87
+ const dir = getTemplatesDir(cwd);
88
+ if (!existsSync(dir)) {
89
+ mkdirSync(dir, { recursive: true });
90
+ }
91
+ writeFileSync(resolve(dir, `${safe}.json`), JSON.stringify(template, null, 2), 'utf-8');
92
+ }
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/template/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAmBvC,MAAM,kBAAkB,GAAoC;IAC1D,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,0BAA0B;KACxC;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,8DAA8D;QAC3E,IAAI,EAAE;YACJ,QAAQ,EAAE,GAAG;SACd;QACD,MAAM,EAAE;YACN,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,EAAE;SACb;KACF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,iEAAiE;QAC9E,IAAI,EAAE;YACJ,QAAQ,EAAE,CAAC;SACZ;QACD,MAAM,EAAE;YACN,MAAM,EAAE,UAAU;YAClB,gBAAgB,EAAE,IAAI;SACvB;KACF;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,qDAAqD;QAClE,IAAI,EAAE;YACJ,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,GAAG;SACd;QACD,MAAM,EAAE;YACN,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,GAAG;SACd;KACF;CACF,CAAC;AAEF,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,SAAS,GAAG,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAEjC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAChE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;gBACpD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,IAAY;IACnD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,IAAY,EAAE,QAAyB;IACjF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { OutputFormat } from '../formatter/index.js';
2
+ export interface WatchOptions {
3
+ cwd: string;
4
+ debounceMs: number;
5
+ format?: OutputFormat;
6
+ onChange?: (output: string) => void;
7
+ }
8
+ export declare function startWatching(options: WatchOptions): Promise<void>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watch/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAKnE,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsExE"}
@@ -0,0 +1,73 @@
1
+ import { watch, existsSync } from 'node:fs';
2
+ import { scanProject } from '../scanner/index.js';
3
+ import { analyzeProject } from '../analyzer/index.js';
4
+ import { formatOutput } from '../formatter/index.js';
5
+ import { loadConfig } from '../config/index.js';
6
+ import { copyToClipboard } from '../utils/clipboard.js';
7
+ export async function startWatching(options) {
8
+ const { cwd, debounceMs, format } = options;
9
+ const config = loadConfig(cwd);
10
+ let timeout = null;
11
+ let running = false;
12
+ const generate = async () => {
13
+ if (running)
14
+ return;
15
+ running = true;
16
+ try {
17
+ const scanResult = await scanProject({
18
+ cwd,
19
+ maxDepth: config.scan.maxDepth,
20
+ maxFiles: config.scan.maxFiles,
21
+ include: config.scan.include,
22
+ exclude: config.scan.exclude,
23
+ });
24
+ const projectInfo = analyzeProject(cwd, scanResult.files);
25
+ const fmt = format || config.output.format;
26
+ const output = formatOutput(projectInfo, fmt);
27
+ await copyToClipboard(output);
28
+ console.clear();
29
+ console.log(output);
30
+ console.log('\n ✓ Watching for changes... (Ctrl+C to stop)');
31
+ }
32
+ finally {
33
+ running = false;
34
+ }
35
+ };
36
+ const watchedDirs = new Set();
37
+ const dirsToWatch = [cwd];
38
+ for (const dir of dirsToWatch) {
39
+ if (watchedDirs.has(dir))
40
+ continue;
41
+ if (!existsSync(dir))
42
+ continue;
43
+ watchedDirs.add(dir);
44
+ const watcher = watch(dir, { recursive: true }, (eventType, filename) => {
45
+ if (!filename)
46
+ return;
47
+ const relativePath = filename.toString();
48
+ const ignorePatterns = [
49
+ 'node_modules', '.git', 'dist', 'build', '.next',
50
+ 'coverage', '.env', '.cache', '.turbo', '.ctx',
51
+ ];
52
+ const parts = relativePath.split('/');
53
+ for (const part of parts) {
54
+ if (ignorePatterns.includes(part))
55
+ return;
56
+ }
57
+ if (timeout)
58
+ clearTimeout(timeout);
59
+ timeout = setTimeout(generate, debounceMs);
60
+ });
61
+ process.on('SIGINT', () => {
62
+ watcher.close();
63
+ console.log('\n ✗ Watch stopped.');
64
+ process.exit(0);
65
+ });
66
+ process.on('SIGTERM', () => {
67
+ watcher.close();
68
+ process.exit(0);
69
+ });
70
+ }
71
+ await generate();
72
+ }
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/watch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAe,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAgB,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAUxD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAqB;IACvD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAE/B,IAAI,OAAO,GAAyC,IAAI,CAAC;IACzD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC;gBACnC,GAAG;gBACH,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;gBAC9B,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;gBAC9B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;gBAC5B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;aAC7B,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;YAC1D,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,GAAmB,CAAC,CAAC;YAE9D,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;YAC9B,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAChE,CAAC;gBAAS,CAAC;YACT,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAErB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE;YACtE,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAEzC,MAAM,cAAc,GAAG;gBACrB,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;gBAChD,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;aAC/C,CAAC;YACF,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,OAAO;YAC5C,CAAC;YAED,IAAI,OAAO;gBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,EAAE,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ctxdotdev",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Project context for AI coding tools — one command, perfect context, every AI tool",
5
5
  "bin": {
6
6
  "ctx": "dist/cli/index.js"
@@ -39,8 +39,7 @@
39
39
  "node": ">=18"
40
40
  },
41
41
  "dependencies": {
42
- "chalk": "^5.3.0",
43
- "clipboardy": "^4.0.0",
42
+ "clipboardy": "^4.0.0",
44
43
  "commander": "^12.0.0",
45
44
  "fast-glob": "^3.3.2",
46
45
  "ignore": "^5.3.1"