@vovy-ai/go 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -0
- package/dist/index.js +37 -2
- package/package.json +3 -3
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# @vovy-ai/go
|
|
2
|
+
|
|
3
|
+
Free, forever, drop-in skills for vibe coding safely — the `vovy` CLI installer.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
npx @vovy-ai/go install
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
That's it. It detects which AI coding tool you have installed — [Claude Code](https://claude.com/claude-code), [Codex CLI](https://developers.openai.com/codex), [Cursor](https://cursor.com), [Cline](https://cline.bot), or [Windsurf](https://windsurf.com) — and writes Vovy's skills there. Your very next prompt gets the benefit.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
npx @vovy-ai/go doctor # check everything is installed correctly
|
|
13
|
+
npx @vovy-ai/go uninstall # remove everything Vovy wrote, cleanly
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Installed globally (`npm i -g @vovy-ai/go`), the command is just `vovy`.
|
|
17
|
+
|
|
18
|
+
## Why this is free, forever
|
|
19
|
+
|
|
20
|
+
Vovy never runs its own AI model and never calls a Vovy-hosted server. It only writes markdown skill files that your existing AI coding tool reads for free, using the model you already pay for. No account, no API key, no cost, ever.
|
|
21
|
+
|
|
22
|
+
## What it installs
|
|
23
|
+
|
|
24
|
+
Three skills that make AI coding assistants safer and better-scoped for non-technical founders:
|
|
25
|
+
|
|
26
|
+
| Skill | What it does |
|
|
27
|
+
|---|---|
|
|
28
|
+
| **Prompt Rescoper** | Rewrites vague, oversized requests into a small, reviewable spec before any code is written. |
|
|
29
|
+
| **Project Skill Drafter** | Analyzes your actual project and drafts a project-specific skill so future requests already know your stack. |
|
|
30
|
+
| **Founder Explainer** | Explains destructive/high-stakes actions in plain English before they happen, and flags common vibe-coding security mistakes. |
|
|
31
|
+
|
|
32
|
+
Full docs, architecture, and source: **[github.com/Vovy-AI/vovy-cli](https://github.com/Vovy-AI/vovy-cli)**
|
|
33
|
+
|
|
34
|
+
## License
|
|
35
|
+
|
|
36
|
+
MIT
|
package/dist/index.js
CHANGED
|
@@ -53,10 +53,40 @@ function runInstall(opts) {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
// src/commands/doctor.ts
|
|
56
|
+
var MCP_TOOL_METADATA = [
|
|
57
|
+
{
|
|
58
|
+
name: "analyze_project",
|
|
59
|
+
title: "Analyze Project",
|
|
60
|
+
description: "Deterministic, non-LLM static analysis of a project: detected framework/stack, package manager, test runner, top-level directories, and any obvious security footguns (e.g. an untracked .env). No network access, no guessing."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "search_codebase",
|
|
64
|
+
title: "Search Codebase",
|
|
65
|
+
description: `Deterministic, non-LLM symbol search over a JS/TS/JSX/TSX project via tree-sitter (no embeddings, no network access). Use this BEFORE reading whole files to answer a 'where is X handled' / 'how does Y work' question \u2014 it finds the exact symbol or file first so you read only what's relevant, not entire files. Actions: "overview" (top-level functions/classes/interfaces/exports in one file, needs filePath), "find_symbol" (declaration sites of a name across the project, needs query), "find_references" (identifier-boundary-aware usage sites of a name \u2014 more precise than grep since it never matches inside a string/comment, needs query), "pattern" (plain regex/text search fallback for non-code content, needs query).`
|
|
66
|
+
}
|
|
67
|
+
];
|
|
68
|
+
function estimateTokens(text) {
|
|
69
|
+
return Math.ceil(text.length / 4);
|
|
70
|
+
}
|
|
71
|
+
function computeTokenFootprint() {
|
|
72
|
+
const skills = getAllSkills2();
|
|
73
|
+
const skillsEstTokens = skills.reduce((sum, skill) => sum + estimateTokens(skill.raw), 0);
|
|
74
|
+
const toolsEstTokens = MCP_TOOL_METADATA.reduce(
|
|
75
|
+
(sum, tool) => sum + estimateTokens(tool.name + tool.title + tool.description),
|
|
76
|
+
0
|
|
77
|
+
);
|
|
78
|
+
return {
|
|
79
|
+
skillCount: skills.length,
|
|
80
|
+
skillsEstTokens,
|
|
81
|
+
toolCount: MCP_TOOL_METADATA.length,
|
|
82
|
+
toolsEstTokens,
|
|
83
|
+
totalEstTokens: skillsEstTokens + toolsEstTokens
|
|
84
|
+
};
|
|
85
|
+
}
|
|
56
86
|
function runDoctor(env, hosts, scope) {
|
|
57
87
|
const dryRunResults = runInstall({ env, hosts, scope, dryRun: true });
|
|
58
88
|
const totalSkillCount = getAllSkills2().length;
|
|
59
|
-
|
|
89
|
+
const reports = dryRunResults.map(({ adapter, skillResults, mcpResult }) => {
|
|
60
90
|
const entries = skillResults.map((r) => ({
|
|
61
91
|
skillId: r.skillId,
|
|
62
92
|
path: r.path,
|
|
@@ -73,6 +103,7 @@ function runDoctor(env, hosts, scope) {
|
|
|
73
103
|
healthy: entries.length === totalSkillCount && entries.every((e) => e.status === "ok") && (mcp === null || mcp.status === "ok")
|
|
74
104
|
};
|
|
75
105
|
});
|
|
106
|
+
return { reports, tokenFootprint: computeTokenFootprint() };
|
|
76
107
|
}
|
|
77
108
|
|
|
78
109
|
// src/commands/uninstall.ts
|
|
@@ -194,7 +225,7 @@ function cmdDoctor(argv) {
|
|
|
194
225
|
const flags = parseCommonFlags(argv);
|
|
195
226
|
if (flags.help) return console.log(HELP);
|
|
196
227
|
const env = realEnv();
|
|
197
|
-
const reports = runDoctor(env, flags.hosts, flags.scope);
|
|
228
|
+
const { reports, tokenFootprint } = runDoctor(env, flags.hosts, flags.scope);
|
|
198
229
|
if (reports.length === 0) {
|
|
199
230
|
console.log("No supported host tools detected on this machine \u2014 nothing to check.");
|
|
200
231
|
return;
|
|
@@ -211,6 +242,10 @@ ${adapter.label}: ${healthy ? "OK" : "needs `npx @vovy-ai/go install`"}`);
|
|
|
211
242
|
console.log(` [${mcp.status === "ok" ? "x" : " "}] mcp server (${mcp.status})`);
|
|
212
243
|
}
|
|
213
244
|
}
|
|
245
|
+
console.log(
|
|
246
|
+
`
|
|
247
|
+
Estimated always-on token footprint: ~${tokenFootprint.totalEstTokens} tokens (${tokenFootprint.skillCount} skill files ~${tokenFootprint.skillsEstTokens}, ${tokenFootprint.toolCount} MCP tool definitions ~${tokenFootprint.toolsEstTokens}) \u2014 what every session pays whether or not a skill fires. chars/4 estimate, not an exact tokenizer count.`
|
|
248
|
+
);
|
|
214
249
|
process.exitCode = allHealthy ? 0 : 1;
|
|
215
250
|
}
|
|
216
251
|
function cmdUninstall(argv) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vovy-ai/go",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Free, forever, drop-in MCP server + skill pack that teaches non-technical founders to vibe code safely. npx @vovy-ai/go install",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"dist"
|
|
12
12
|
],
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@vovy-ai/
|
|
15
|
-
"@vovy-ai/
|
|
14
|
+
"@vovy-ai/skills": "0.3.0",
|
|
15
|
+
"@vovy-ai/host-detect": "0.1.1"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"tsup": "^8.3.5",
|