@stan-chen/simple-cli 0.2.2 → 0.2.4

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.
Files changed (100) hide show
  1. package/README.md +58 -271
  2. package/dist/anyllm.py +62 -0
  3. package/dist/builtins.d.ts +726 -0
  4. package/dist/builtins.js +481 -0
  5. package/dist/cli.d.ts +0 -4
  6. package/dist/cli.js +37 -279
  7. package/dist/engine.d.ts +33 -0
  8. package/dist/engine.js +138 -0
  9. package/dist/learnings.d.ts +15 -0
  10. package/dist/learnings.js +54 -0
  11. package/dist/llm.d.ts +18 -0
  12. package/dist/llm.js +66 -0
  13. package/dist/mcp.d.ts +132 -0
  14. package/dist/mcp.js +43 -0
  15. package/dist/skills.d.ts +5 -16
  16. package/dist/skills.js +91 -253
  17. package/dist/tui.d.ts +1 -0
  18. package/dist/tui.js +10 -0
  19. package/package.json +88 -78
  20. package/dist/commands/add.d.ts +0 -9
  21. package/dist/commands/add.js +0 -50
  22. package/dist/commands/git/commit.d.ts +0 -12
  23. package/dist/commands/git/commit.js +0 -97
  24. package/dist/commands/git/status.d.ts +0 -6
  25. package/dist/commands/git/status.js +0 -42
  26. package/dist/commands/index.d.ts +0 -16
  27. package/dist/commands/index.js +0 -376
  28. package/dist/commands/mcp/status.d.ts +0 -6
  29. package/dist/commands/mcp/status.js +0 -31
  30. package/dist/commands/swarm.d.ts +0 -36
  31. package/dist/commands/swarm.js +0 -236
  32. package/dist/commands.d.ts +0 -32
  33. package/dist/commands.js +0 -427
  34. package/dist/context.d.ts +0 -116
  35. package/dist/context.js +0 -327
  36. package/dist/index.d.ts +0 -6
  37. package/dist/index.js +0 -109
  38. package/dist/lib/agent.d.ts +0 -98
  39. package/dist/lib/agent.js +0 -281
  40. package/dist/lib/editor.d.ts +0 -74
  41. package/dist/lib/editor.js +0 -441
  42. package/dist/lib/git.d.ts +0 -164
  43. package/dist/lib/git.js +0 -351
  44. package/dist/lib/ui.d.ts +0 -159
  45. package/dist/lib/ui.js +0 -252
  46. package/dist/mcp/client.d.ts +0 -22
  47. package/dist/mcp/client.js +0 -81
  48. package/dist/mcp/manager.d.ts +0 -186
  49. package/dist/mcp/manager.js +0 -446
  50. package/dist/prompts/provider.d.ts +0 -22
  51. package/dist/prompts/provider.js +0 -78
  52. package/dist/providers/index.d.ts +0 -15
  53. package/dist/providers/index.js +0 -82
  54. package/dist/providers/multi.d.ts +0 -11
  55. package/dist/providers/multi.js +0 -28
  56. package/dist/registry.d.ts +0 -24
  57. package/dist/registry.js +0 -379
  58. package/dist/repoMap.d.ts +0 -5
  59. package/dist/repoMap.js +0 -79
  60. package/dist/router.d.ts +0 -41
  61. package/dist/router.js +0 -108
  62. package/dist/swarm/coordinator.d.ts +0 -86
  63. package/dist/swarm/coordinator.js +0 -257
  64. package/dist/swarm/index.d.ts +0 -28
  65. package/dist/swarm/index.js +0 -29
  66. package/dist/swarm/task.d.ts +0 -104
  67. package/dist/swarm/task.js +0 -221
  68. package/dist/swarm/types.d.ts +0 -132
  69. package/dist/swarm/types.js +0 -37
  70. package/dist/swarm/worker.d.ts +0 -107
  71. package/dist/swarm/worker.js +0 -299
  72. package/dist/tools/analyzeFile.d.ts +0 -16
  73. package/dist/tools/analyzeFile.js +0 -43
  74. package/dist/tools/git.d.ts +0 -40
  75. package/dist/tools/git.js +0 -236
  76. package/dist/tools/glob.d.ts +0 -34
  77. package/dist/tools/glob.js +0 -165
  78. package/dist/tools/grep.d.ts +0 -53
  79. package/dist/tools/grep.js +0 -296
  80. package/dist/tools/linter.d.ts +0 -35
  81. package/dist/tools/linter.js +0 -349
  82. package/dist/tools/listDir.d.ts +0 -29
  83. package/dist/tools/listDir.js +0 -50
  84. package/dist/tools/memory.d.ts +0 -34
  85. package/dist/tools/memory.js +0 -215
  86. package/dist/tools/readFiles.d.ts +0 -25
  87. package/dist/tools/readFiles.js +0 -31
  88. package/dist/tools/reloadTools.d.ts +0 -11
  89. package/dist/tools/reloadTools.js +0 -22
  90. package/dist/tools/runCommand.d.ts +0 -32
  91. package/dist/tools/runCommand.js +0 -79
  92. package/dist/tools/scraper.d.ts +0 -31
  93. package/dist/tools/scraper.js +0 -211
  94. package/dist/tools/writeFiles.d.ts +0 -63
  95. package/dist/tools/writeFiles.js +0 -87
  96. package/dist/ui/server.d.ts +0 -5
  97. package/dist/ui/server.js +0 -74
  98. package/dist/watcher.d.ts +0 -35
  99. package/dist/watcher.js +0 -164
  100. /package/{docs/assets → assets}/logo.jpeg +0 -0
package/package.json CHANGED
@@ -1,78 +1,88 @@
1
- {
2
- "name": "@stan-chen/simple-cli",
3
- "version": "0.2.2",
4
- "description": "A lean, lightweight coding agent. Packs a punch with token efficiency.",
5
- "type": "module",
6
- "main": "dist/cli.js",
7
- "bin": {
8
- "simple": "dist/cli.js"
9
- },
10
- "scripts": {
11
- "start": "node --loader ts-node/esm src/cli.ts",
12
- "dev": "node --loader ts-node/esm --watch src/index.ts",
13
- "build": "tsc",
14
- "typecheck": "tsc --noEmit",
15
- "test": "vitest run",
16
- "test:watch": "vitest",
17
- "test:coverage": "vitest run --coverage",
18
- "lint": "eslint src/ tests/",
19
- "format": "prettier --write src/ tests/"
20
- },
21
- "keywords": [
22
- "cli",
23
- "agent",
24
- "coding-assistant",
25
- "llm",
26
- "mcp",
27
- "ai",
28
- "openai",
29
- "anthropic",
30
- "gemini",
31
- "litellm",
32
- "aider"
33
- ],
34
- "license": "MIT",
35
- "engines": {
36
- "node": ">=18.0.0"
37
- },
38
- "dependencies": {
39
- "@clack/prompts": "^0.7.0",
40
- "@modelcontextprotocol/sdk": "^1.0.0",
41
- "@oclif/core": "^4.0.0",
42
- "chalk": "^5.3.0",
43
- "chokidar": "^5.0.0",
44
- "diff": "^5.2.0",
45
- "dotenv": "^16.4.7",
46
- "fast-glob": "^3.3.2",
47
- "fast-levenshtein": "^3.0.0",
48
- "glob": "^13.0.0",
49
- "gpt-tokenizer": "^2.5.0",
50
- "jsonrepair": "^3.13.2",
51
- "openai": "^6.16.0",
52
- "ora": "^8.0.0",
53
- "picocolors": "^1.0.0",
54
- "simple-git": "^3.22.0",
55
- "ts-morph": "^22.0.0",
56
- "turndown": "^7.2.0",
57
- "yaml": "^2.8.2",
58
- "zod": "^3.24.1"
59
- },
60
- "devDependencies": {
61
- "@oclif/test": "^4.0.0",
62
- "@types/chokidar": "^1.7.5",
63
- "@types/diff": "^5.2.3",
64
- "@types/fast-levenshtein": "^0.0.4",
65
- "@types/node": "^22.19.7",
66
- "@types/turndown": "^5.0.5",
67
- "oclif": "^4.0.0",
68
- "ts-node": "^10.9.2",
69
- "tsx": "^4.19.2",
70
- "typescript": "^5.7.2",
71
- "vitest": "^2.1.8"
72
- },
73
- "files": [
74
- "dist",
75
- "README.md",
76
- "docs/assets/logo.jpeg"
77
- ]
78
- }
1
+ {
2
+ "name": "@stan-chen/simple-cli",
3
+ "version": "0.2.4",
4
+ "description": "A lean, lightweight coding agent. Packs a punch with token efficiency.",
5
+ "type": "module",
6
+ "main": "dist/cli.js",
7
+ "bin": {
8
+ "simple": "dist/cli.js"
9
+ },
10
+ "scripts": {
11
+ "start": "node --loader ts-node/esm src/cli.ts",
12
+ "dev": "node --loader ts-node/esm --watch src/cli.ts",
13
+ "build": "tsc && node -e \"require('fs').copyFileSync('src/anyllm.py', 'dist/anyllm.py')\"",
14
+ "typecheck": "tsc --noEmit",
15
+ "test": "vitest run",
16
+ "test:watch": "vitest",
17
+ "test:coverage": "vitest run --coverage",
18
+ "lint": "eslint src/ tests/",
19
+ "format": "prettier --write src/ tests/"
20
+ },
21
+ "keywords": [
22
+ "cli",
23
+ "agent",
24
+ "coding-assistant",
25
+ "llm",
26
+ "mcp",
27
+ "ai",
28
+ "openai",
29
+ "anthropic",
30
+ "gemini",
31
+ "litellm",
32
+ "aider"
33
+ ],
34
+ "license": "MIT",
35
+ "engines": {
36
+ "node": ">=18.0.0"
37
+ },
38
+ "dependencies": {
39
+ "@ai-sdk/anthropic": "^3.0.35",
40
+ "@ai-sdk/google": "^3.0.20",
41
+ "@ai-sdk/openai": "^3.0.25",
42
+ "@clack/prompts": "^0.7.0",
43
+ "@modelcontextprotocol/sdk": "^1.0.0",
44
+ "@oclif/core": "^4.0.0",
45
+ "@types/cors": "^2.8.19",
46
+ "@types/express": "^5.0.6",
47
+ "@types/node-fetch": "^2.6.13",
48
+ "ai": "^6.0.67",
49
+ "body-parser": "^1.20.4",
50
+ "chalk": "^5.3.0",
51
+ "chokidar": "^5.0.0",
52
+ "cors": "^2.8.6",
53
+ "diff": "^5.2.0",
54
+ "dotenv": "^16.4.7",
55
+ "express": "^4.22.1",
56
+ "fast-glob": "^3.3.2",
57
+ "fast-levenshtein": "^3.0.0",
58
+ "glob": "^13.0.0",
59
+ "gpt-tokenizer": "^2.5.0",
60
+ "jsonrepair": "^3.13.2",
61
+ "node-fetch": "^3.3.2",
62
+ "ora": "^8.0.0",
63
+ "picocolors": "^1.0.0",
64
+ "simple-git": "^3.22.0",
65
+ "ts-morph": "^22.0.0",
66
+ "turndown": "^7.2.0",
67
+ "yaml": "^2.8.2",
68
+ "zod": "^3.25.76"
69
+ },
70
+ "devDependencies": {
71
+ "@oclif/test": "^4.0.0",
72
+ "@types/chokidar": "^1.7.5",
73
+ "@types/diff": "^5.2.3",
74
+ "@types/fast-levenshtein": "^0.0.4",
75
+ "@types/node": "^22.19.7",
76
+ "@types/turndown": "^5.0.5",
77
+ "oclif": "^4.0.0",
78
+ "ts-node": "^10.9.2",
79
+ "tsx": "^4.19.2",
80
+ "typescript": "^5.7.2",
81
+ "vitest": "^2.1.8"
82
+ },
83
+ "files": [
84
+ "dist",
85
+ "README.md",
86
+ "assets/logo.jpeg"
87
+ ]
88
+ }
@@ -1,9 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- export default class Add extends Command {
3
- static description: string;
4
- static args: {
5
- files: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
6
- };
7
- static examples: string[];
8
- run(): Promise<void>;
9
- }
@@ -1,50 +0,0 @@
1
- import { Command, Args } from '@oclif/core';
2
- import * as ui from '../lib/ui.js';
3
- import { getContextManager } from '../context.js';
4
- import { resolve } from 'path';
5
- import { existsSync } from 'fs';
6
- export default class Add extends Command {
7
- static description = 'Add files to the chat context';
8
- static args = {
9
- files: Args.string({
10
- description: 'Files to add (supports glob patterns)',
11
- required: true,
12
- }),
13
- };
14
- static examples = [
15
- '<%= config.bin %> add src/index.ts',
16
- '<%= config.bin %> add "src/**/*.ts"',
17
- '<%= config.bin %> add package.json tsconfig.json',
18
- ];
19
- async run() {
20
- const { args, argv } = await this.parse(Add);
21
- const ctx = getContextManager();
22
- // Handle multiple files from argv
23
- const files = argv;
24
- let added = 0;
25
- for (const file of files) {
26
- const fullPath = resolve(process.cwd(), file);
27
- if (file.includes('*')) {
28
- // Handle glob pattern
29
- const { execute } = await import('../tools/glob.js');
30
- const result = await execute({ pattern: file, cwd: process.cwd(), maxResults: 1000, includeDirectories: false });
31
- for (const match of result.matches) {
32
- if (ctx.addFile(match)) {
33
- ui.success(`Added ${match}`);
34
- added++;
35
- }
36
- }
37
- }
38
- else if (existsSync(fullPath)) {
39
- if (ctx.addFile(file)) {
40
- ui.success(`Added ${file}`);
41
- added++;
42
- }
43
- }
44
- else {
45
- ui.error(`File not found: ${file}`);
46
- }
47
- }
48
- ui.log(`Added ${added} file(s) to context`);
49
- }
50
- }
@@ -1,12 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- import 'dotenv/config';
3
- export default class GitCommit extends Command {
4
- static description: string;
5
- static flags: {
6
- message: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
- ai: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
- all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- };
10
- static examples: string[];
11
- run(): Promise<void>;
12
- }
@@ -1,97 +0,0 @@
1
- import { Command, Flags } from '@oclif/core';
2
- import * as ui from '../../lib/ui.js';
3
- import { getGitManager, generateCommitMessage } from '../../lib/git.js';
4
- import { createProvider } from '../../providers/index.js';
5
- import 'dotenv/config';
6
- export default class GitCommit extends Command {
7
- static description = 'Commit changes with optional AI-generated message';
8
- static flags = {
9
- message: Flags.string({
10
- char: 'm',
11
- description: 'Commit message',
12
- }),
13
- ai: Flags.boolean({
14
- description: 'Generate commit message using AI',
15
- default: false,
16
- }),
17
- all: Flags.boolean({
18
- char: 'a',
19
- description: 'Stage all changes',
20
- default: false,
21
- }),
22
- };
23
- static examples = [
24
- '<%= config.bin %> git commit -m "feat: add new feature"',
25
- '<%= config.bin %> git commit --ai',
26
- '<%= config.bin %> git commit -a --ai',
27
- ];
28
- async run() {
29
- const { flags } = await this.parse(GitCommit);
30
- const git = getGitManager();
31
- if (!(await git.isRepo())) {
32
- ui.error('Not a git repository');
33
- return;
34
- }
35
- // Stage all if requested
36
- if (flags.all) {
37
- await git.addAll();
38
- }
39
- // Get diff
40
- const diff = await git.stagedDiff();
41
- if (!diff) {
42
- const status = await git.status();
43
- if (status.modified.length === 0 && status.created.length === 0) {
44
- ui.error('Nothing to commit');
45
- return;
46
- }
47
- // Auto-stage if no staged changes
48
- await git.addAll();
49
- }
50
- // Get or generate message
51
- let message = flags.message;
52
- if (!message && flags.ai) {
53
- const provider = createProvider();
54
- const currentDiff = await git.stagedDiff() || await git.diff();
55
- message = await ui.spin('Generating commit message...', async () => {
56
- return generateCommitMessage(currentDiff, async (prompt) => {
57
- return provider.generateResponse(prompt, []);
58
- });
59
- });
60
- ui.log(`Generated message: ${message}`);
61
- const confirmed = await ui.confirm({
62
- message: 'Use this message?',
63
- initialValue: true,
64
- });
65
- if (ui.isCancel(confirmed) || !confirmed) {
66
- const custom = await ui.text({
67
- message: 'Enter commit message:',
68
- placeholder: message,
69
- });
70
- if (ui.isCancel(custom)) {
71
- ui.cancel('Commit cancelled');
72
- return;
73
- }
74
- message = custom;
75
- }
76
- }
77
- if (!message) {
78
- const input = await ui.text({
79
- message: 'Enter commit message:',
80
- validate: (v) => (v.trim() ? undefined : 'Message required'),
81
- });
82
- if (ui.isCancel(input)) {
83
- ui.cancel('Commit cancelled');
84
- return;
85
- }
86
- message = input;
87
- }
88
- // Commit
89
- const result = await git.commit({ message });
90
- if (result) {
91
- ui.success(`Committed: ${result.hash} ${result.message}`);
92
- }
93
- else {
94
- ui.error('Commit failed');
95
- }
96
- }
97
- }
@@ -1,6 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- export default class GitStatus extends Command {
3
- static description: string;
4
- static examples: string[];
5
- run(): Promise<void>;
6
- }
@@ -1,42 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- import * as ui from '../../lib/ui.js';
3
- import { getGitManager } from '../../lib/git.js';
4
- export default class GitStatus extends Command {
5
- static description = 'Show git repository status';
6
- static examples = ['<%= config.bin %> git status'];
7
- async run() {
8
- const git = getGitManager();
9
- if (!(await git.isRepo())) {
10
- ui.error('Not a git repository');
11
- return;
12
- }
13
- const status = await git.status();
14
- ui.log(`Branch: ${status.current || 'detached HEAD'}`);
15
- if (status.ahead > 0) {
16
- ui.log(`Ahead of origin by ${status.ahead} commit(s)`);
17
- }
18
- if (status.behind > 0) {
19
- ui.log(`Behind origin by ${status.behind} commit(s)`);
20
- }
21
- const changes = [];
22
- for (const file of status.created) {
23
- changes.push({ path: file, status: 'added' });
24
- }
25
- for (const file of status.modified) {
26
- changes.push({ path: file, status: 'modified' });
27
- }
28
- for (const file of status.deleted) {
29
- changes.push({ path: file, status: 'deleted' });
30
- }
31
- for (const file of status.not_added) {
32
- changes.push({ path: file, status: 'added' });
33
- }
34
- if (changes.length > 0) {
35
- ui.log('\nChanges:');
36
- ui.showFileStatus(changes);
37
- }
38
- else {
39
- ui.success('Working tree clean');
40
- }
41
- }
42
- }
@@ -1,16 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- import 'dotenv/config';
3
- export default class Chat extends Command {
4
- static description: string;
5
- static flags: {
6
- yolo: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
- moe: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
- watch: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- skill: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
- 'auto-commit': import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
- 'auto-lint': import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
- 'auto-test': import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
- 'test-cmd': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
- };
15
- run(): Promise<void>;
16
- }