embark-cli 1.2.2 → 1.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.
- package/.claude/commands/embark-research.md +67 -0
- package/.claude/commands/embark-review.md +84 -0
- package/.claude/settings.json +15 -0
- package/.claude/settings.local.json +7 -1
- package/README.md +40 -0
- package/dist/agents/amp.d.ts +5 -0
- package/dist/agents/amp.d.ts.map +1 -0
- package/dist/agents/amp.js +176 -0
- package/dist/agents/amp.js.map +1 -0
- package/dist/agents/claude.d.ts +5 -0
- package/dist/agents/claude.d.ts.map +1 -0
- package/dist/agents/claude.js +172 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/codex.d.ts +5 -0
- package/dist/agents/codex.d.ts.map +1 -0
- package/dist/agents/codex.js +156 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/gemini.d.ts +5 -0
- package/dist/agents/gemini.d.ts.map +1 -0
- package/dist/agents/gemini.js +156 -0
- package/dist/agents/gemini.js.map +1 -0
- package/dist/agents/index.d.ts +27 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +90 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/cli-history.d.ts +2 -0
- package/dist/cli-history.d.ts.map +1 -0
- package/dist/cli-history.js +101 -0
- package/dist/cli-history.js.map +1 -0
- package/dist/cli-index.d.ts +2 -0
- package/dist/cli-index.d.ts.map +1 -0
- package/dist/cli-index.js +245 -0
- package/dist/cli-index.js.map +1 -0
- package/dist/cli-install.d.ts +2 -0
- package/dist/cli-install.d.ts.map +1 -0
- package/dist/cli-install.js +205 -0
- package/dist/cli-install.js.map +1 -0
- package/dist/cli-search.js +2 -2
- package/dist/cli-search.js.map +1 -1
- package/dist/cli-utils.d.ts +46 -0
- package/dist/cli-utils.d.ts.map +1 -1
- package/dist/cli-utils.js +561 -1
- package/dist/cli-utils.js.map +1 -1
- package/dist/embark-client.d.ts +37 -0
- package/dist/embark-client.d.ts.map +1 -1
- package/dist/embark-client.js +172 -0
- package/dist/embark-client.js.map +1 -1
- package/dist/git-utils.d.ts +7 -1
- package/dist/git-utils.d.ts.map +1 -1
- package/dist/git-utils.js +88 -1
- package/dist/git-utils.js.map +1 -1
- package/dist/handlers.d.ts +1 -0
- package/dist/handlers.d.ts.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/skills/index.d.ts +3 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +150 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/stats-server.d.ts.map +1 -1
- package/dist/stats-server.js +4 -0
- package/dist/stats-server.js.map +1 -1
- package/dist/stats.d.ts +2 -2
- package/dist/stats.d.ts.map +1 -1
- package/package.json +1 -1
- package/test/cli-utils.test.js +102 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EMBARK_REVIEW_SKILL = exports.EMBARK_RESEARCH_SKILL = void 0;
|
|
4
|
+
exports.EMBARK_RESEARCH_SKILL = `# Embark Research
|
|
5
|
+
|
|
6
|
+
Use this skill to research and understand unfamiliar parts of the codebase using semantic code search.
|
|
7
|
+
|
|
8
|
+
## When to Use
|
|
9
|
+
|
|
10
|
+
- Understanding unfamiliar codebases or locating specific functionality
|
|
11
|
+
- Finding implementations, definitions, or usage patterns
|
|
12
|
+
- Identifying code related to specific features or concepts
|
|
13
|
+
- Before making changes to understand the context and impact
|
|
14
|
+
|
|
15
|
+
## Tools Available
|
|
16
|
+
|
|
17
|
+
### \`embark search\`
|
|
18
|
+
|
|
19
|
+
Semantic code search that finds code by meaning, not just exact keywords.
|
|
20
|
+
|
|
21
|
+
\`\`\`bash
|
|
22
|
+
embark search "<descriptive query>" [path]
|
|
23
|
+
embark search -p <path> "<query>"
|
|
24
|
+
embark search --json "<query>" # For structured output
|
|
25
|
+
\`\`\`
|
|
26
|
+
|
|
27
|
+
**Query Tips:**
|
|
28
|
+
- Be descriptive: "function that validates user email addresses" > "email"
|
|
29
|
+
- Include context: "error handling middleware for HTTP requests with logging"
|
|
30
|
+
- Specify what you're looking for: "React component that renders a modal dialog"
|
|
31
|
+
|
|
32
|
+
### \`embark history\`
|
|
33
|
+
|
|
34
|
+
Search through commit messages and changes to understand how code evolved.
|
|
35
|
+
|
|
36
|
+
\`\`\`bash
|
|
37
|
+
embark history "<query>"
|
|
38
|
+
embark history -n 20 "<query>" # Get more results
|
|
39
|
+
embark history --json "<query>" # For structured output
|
|
40
|
+
\`\`\`
|
|
41
|
+
|
|
42
|
+
**Use Cases:**
|
|
43
|
+
- Find when a feature was added: "add user authentication"
|
|
44
|
+
- Find bug fixes: "fix memory leak in worker"
|
|
45
|
+
- Understand refactoring: "refactor database connection"
|
|
46
|
+
|
|
47
|
+
## Research Workflow
|
|
48
|
+
|
|
49
|
+
1. **Start broad**: Use \`embark search\` with general terms to understand the landscape
|
|
50
|
+
2. **Narrow down**: Add path filters (\`-p\`) once you identify relevant directories
|
|
51
|
+
3. **Check history**: Use \`embark history\` to understand why code was written a certain way
|
|
52
|
+
4. **Read the code**: Once you find relevant files, read them to understand the details
|
|
53
|
+
|
|
54
|
+
## Example Session
|
|
55
|
+
|
|
56
|
+
\`\`\`bash
|
|
57
|
+
# Find authentication-related code
|
|
58
|
+
embark search "user authentication login"
|
|
59
|
+
|
|
60
|
+
# Narrow to specific directory
|
|
61
|
+
embark search -p src/auth "JWT token validation"
|
|
62
|
+
|
|
63
|
+
# Understand how auth evolved
|
|
64
|
+
embark history "add JWT authentication"
|
|
65
|
+
embark history "fix authentication bug"
|
|
66
|
+
\`\`\`
|
|
67
|
+
`;
|
|
68
|
+
exports.EMBARK_REVIEW_SKILL = `# Embark Review
|
|
69
|
+
|
|
70
|
+
Use this skill to review code changes using semantic search to understand context and impact.
|
|
71
|
+
|
|
72
|
+
## When to Use
|
|
73
|
+
|
|
74
|
+
- Before committing changes to understand what you're about to commit
|
|
75
|
+
- Reviewing pull requests or branches
|
|
76
|
+
- Understanding the impact of changes on the rest of the codebase
|
|
77
|
+
|
|
78
|
+
## Review Workflow
|
|
79
|
+
|
|
80
|
+
### 1. Check Current Changes
|
|
81
|
+
|
|
82
|
+
First, see what's changed:
|
|
83
|
+
|
|
84
|
+
\`\`\`bash
|
|
85
|
+
git status
|
|
86
|
+
git diff # Unstaged changes
|
|
87
|
+
git diff --staged # Staged changes
|
|
88
|
+
git diff main...HEAD # All changes on current branch
|
|
89
|
+
\`\`\`
|
|
90
|
+
|
|
91
|
+
### 2. Understand Changed Code Context
|
|
92
|
+
|
|
93
|
+
For each significantly changed file, use semantic search to understand:
|
|
94
|
+
|
|
95
|
+
- **Similar patterns**: Find similar code elsewhere that might need the same change
|
|
96
|
+
- **Callers**: Find code that calls the modified functions
|
|
97
|
+
- **Dependencies**: Find code that the modified code depends on
|
|
98
|
+
|
|
99
|
+
\`\`\`bash
|
|
100
|
+
# Find similar patterns
|
|
101
|
+
embark search "similar implementation to <describe the change>"
|
|
102
|
+
|
|
103
|
+
# Find callers of a modified function
|
|
104
|
+
embark search "calls to <function name> to understand impact"
|
|
105
|
+
|
|
106
|
+
# Find related test files
|
|
107
|
+
embark search -p test "tests for <feature being modified>"
|
|
108
|
+
\`\`\`
|
|
109
|
+
|
|
110
|
+
### 3. Check Historical Context
|
|
111
|
+
|
|
112
|
+
Understand why the code was written this way:
|
|
113
|
+
|
|
114
|
+
\`\`\`bash
|
|
115
|
+
# Find related commits
|
|
116
|
+
embark history "changes to <feature name>"
|
|
117
|
+
|
|
118
|
+
# Find bug fixes in this area
|
|
119
|
+
embark history "fix <area being modified>"
|
|
120
|
+
\`\`\`
|
|
121
|
+
|
|
122
|
+
### 4. Review Checklist
|
|
123
|
+
|
|
124
|
+
For each change, verify:
|
|
125
|
+
|
|
126
|
+
- [ ] The change is consistent with similar patterns in the codebase
|
|
127
|
+
- [ ] All callers of modified functions will still work correctly
|
|
128
|
+
- [ ] Related tests exist and cover the changes
|
|
129
|
+
- [ ] The change doesn't reintroduce previously fixed bugs
|
|
130
|
+
|
|
131
|
+
## Example Session
|
|
132
|
+
|
|
133
|
+
\`\`\`bash
|
|
134
|
+
# See what's changed
|
|
135
|
+
git diff --staged
|
|
136
|
+
|
|
137
|
+
# For a change to auth middleware, find similar patterns
|
|
138
|
+
embark search "authentication middleware pattern"
|
|
139
|
+
|
|
140
|
+
# Find what calls this middleware
|
|
141
|
+
embark search "uses auth middleware to protect routes"
|
|
142
|
+
|
|
143
|
+
# Check if there were related bug fixes
|
|
144
|
+
embark history "fix auth middleware"
|
|
145
|
+
|
|
146
|
+
# Find related tests
|
|
147
|
+
embark search -p test "auth middleware test"
|
|
148
|
+
\`\`\`
|
|
149
|
+
`;
|
|
150
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DpC,CAAC;AAEW,QAAA,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiFlC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats-server.d.ts","sourceRoot":"","sources":["../src/stats-server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"stats-server.d.ts","sourceRoot":"","sources":["../src/stats-server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAqDxB,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAiCzE"}
|
package/dist/stats-server.js
CHANGED
|
@@ -145,12 +145,16 @@ function buildRepositoryUsage(allEvents) {
|
|
|
145
145
|
searchCount: 0,
|
|
146
146
|
semanticCount: 0,
|
|
147
147
|
dependencyCount: 0,
|
|
148
|
+
commitsCount: 0,
|
|
148
149
|
};
|
|
149
150
|
}
|
|
150
151
|
repoMap[repo].searchCount += 1;
|
|
151
152
|
if (kind === 'semantic') {
|
|
152
153
|
repoMap[repo].semanticCount += 1;
|
|
153
154
|
}
|
|
155
|
+
else if (kind === 'commits') {
|
|
156
|
+
repoMap[repo].commitsCount += 1;
|
|
157
|
+
}
|
|
154
158
|
else {
|
|
155
159
|
repoMap[repo].dependencyCount += 1;
|
|
156
160
|
}
|
package/dist/stats-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats-server.js","sourceRoot":"","sources":["../src/stats-server.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"stats-server.js","sourceRoot":"","sources":["../src/stats-server.ts"],"names":[],"mappings":"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"}
|
package/dist/stats.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export interface InitializationEvent extends BaseEvent {
|
|
|
21
21
|
}
|
|
22
22
|
export interface SearchEvent extends BaseEvent {
|
|
23
23
|
type: 'search';
|
|
24
|
-
searchKind: 'semantic' | 'dependencies';
|
|
24
|
+
searchKind: 'semantic' | 'dependencies' | 'commits';
|
|
25
25
|
toolName?: string;
|
|
26
26
|
query: string;
|
|
27
27
|
queryLength: number;
|
|
@@ -69,7 +69,7 @@ export interface StatsDay {
|
|
|
69
69
|
events: StatsEvent[];
|
|
70
70
|
}
|
|
71
71
|
interface SearchEventInput {
|
|
72
|
-
searchKind: 'semantic' | 'dependencies';
|
|
72
|
+
searchKind: 'semantic' | 'dependencies' | 'commits';
|
|
73
73
|
toolName?: string;
|
|
74
74
|
query: string;
|
|
75
75
|
repositoryUrls: string[];
|
package/dist/stats.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,QAAA,MAAM,SAAS,QAA8C,CAAC;AAE9D,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QACtC,0BAA0B,EAAE,MAAM,CAAC;QACnC,0BAA0B,EAAE,MAAM,CAAC;KACpC,CAAC;IACF,WAAW,EAAE;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;QAC1B,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,UAAU,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/test/cli-utils.test.js
CHANGED
|
@@ -3,6 +3,7 @@ const test = require('node:test');
|
|
|
3
3
|
|
|
4
4
|
const {
|
|
5
5
|
parseSearchArgs,
|
|
6
|
+
parseInstallArgs,
|
|
6
7
|
formatGrepLine,
|
|
7
8
|
collapseWhitespace,
|
|
8
9
|
} = require('../dist/cli-utils.js');
|
|
@@ -59,3 +60,104 @@ test('collapseWhitespace normalizes newlines', () => {
|
|
|
59
60
|
const collapsed = collapseWhitespace('a\n\nb\tc');
|
|
60
61
|
assert.equal(collapsed, 'a b c');
|
|
61
62
|
});
|
|
63
|
+
|
|
64
|
+
// parseInstallArgs tests
|
|
65
|
+
|
|
66
|
+
test('parseInstallArgs returns defaults with no args', () => {
|
|
67
|
+
const parsed = parseInstallArgs([]);
|
|
68
|
+
assert.equal(parsed.agent, null);
|
|
69
|
+
assert.equal(parsed.scope, 'global');
|
|
70
|
+
assert.equal(parsed.skillsOnly, false);
|
|
71
|
+
assert.equal(parsed.hooksOnly, false);
|
|
72
|
+
assert.equal(parsed.showHelp, false);
|
|
73
|
+
assert.equal(parsed.error, null);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('parseInstallArgs handles --agent flag', () => {
|
|
77
|
+
const parsed = parseInstallArgs(['--agent', 'claude']);
|
|
78
|
+
assert.equal(parsed.agent, 'claude');
|
|
79
|
+
assert.equal(parsed.error, null);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test('parseInstallArgs handles --agent= syntax', () => {
|
|
83
|
+
const parsed = parseInstallArgs(['--agent=codex']);
|
|
84
|
+
assert.equal(parsed.agent, 'codex');
|
|
85
|
+
assert.equal(parsed.error, null);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test('parseInstallArgs rejects invalid agent', () => {
|
|
89
|
+
const parsed = parseInstallArgs(['--agent', 'invalid']);
|
|
90
|
+
assert.equal(parsed.agent, null);
|
|
91
|
+
assert.ok(parsed.error.includes('Invalid agent'));
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test('parseInstallArgs handles --scope flag', () => {
|
|
95
|
+
const parsed = parseInstallArgs(['--scope', 'project']);
|
|
96
|
+
assert.equal(parsed.scope, 'project');
|
|
97
|
+
assert.equal(parsed.error, null);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test('parseInstallArgs handles --scope= syntax', () => {
|
|
101
|
+
const parsed = parseInstallArgs(['--scope=global']);
|
|
102
|
+
assert.equal(parsed.scope, 'global');
|
|
103
|
+
assert.equal(parsed.error, null);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('parseInstallArgs rejects invalid scope', () => {
|
|
107
|
+
const parsed = parseInstallArgs(['--scope', 'invalid']);
|
|
108
|
+
assert.equal(parsed.scope, 'global');
|
|
109
|
+
assert.ok(parsed.error.includes('Invalid scope'));
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('parseInstallArgs handles --skills-only flag', () => {
|
|
113
|
+
const parsed = parseInstallArgs(['--skills-only']);
|
|
114
|
+
assert.equal(parsed.skillsOnly, true);
|
|
115
|
+
assert.equal(parsed.hooksOnly, false);
|
|
116
|
+
assert.equal(parsed.error, null);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('parseInstallArgs handles --hooks-only flag', () => {
|
|
120
|
+
const parsed = parseInstallArgs(['--hooks-only']);
|
|
121
|
+
assert.equal(parsed.skillsOnly, false);
|
|
122
|
+
assert.equal(parsed.hooksOnly, true);
|
|
123
|
+
assert.equal(parsed.error, null);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test('parseInstallArgs rejects both --skills-only and --hooks-only', () => {
|
|
127
|
+
const parsed = parseInstallArgs(['--skills-only', '--hooks-only']);
|
|
128
|
+
assert.ok(parsed.error.includes('Cannot use both'));
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('parseInstallArgs handles --help flag', () => {
|
|
132
|
+
const parsed = parseInstallArgs(['--help']);
|
|
133
|
+
assert.equal(parsed.showHelp, true);
|
|
134
|
+
assert.equal(parsed.error, null);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test('parseInstallArgs handles -h flag', () => {
|
|
138
|
+
const parsed = parseInstallArgs(['-h']);
|
|
139
|
+
assert.equal(parsed.showHelp, true);
|
|
140
|
+
assert.equal(parsed.error, null);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test('parseInstallArgs handles combined flags', () => {
|
|
144
|
+
const parsed = parseInstallArgs([
|
|
145
|
+
'--agent', 'claude',
|
|
146
|
+
'--scope', 'project',
|
|
147
|
+
'--skills-only',
|
|
148
|
+
]);
|
|
149
|
+
assert.equal(parsed.agent, 'claude');
|
|
150
|
+
assert.equal(parsed.scope, 'project');
|
|
151
|
+
assert.equal(parsed.skillsOnly, true);
|
|
152
|
+
assert.equal(parsed.error, null);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test('parseInstallArgs rejects unknown options', () => {
|
|
156
|
+
const parsed = parseInstallArgs(['--unknown']);
|
|
157
|
+
assert.ok(parsed.error.includes('Unknown option'));
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test('parseInstallArgs rejects positional arguments', () => {
|
|
161
|
+
const parsed = parseInstallArgs(['something']);
|
|
162
|
+
assert.ok(parsed.error.includes('Unexpected positional argument'));
|
|
163
|
+
});
|