@true-and-useful/janee 0.11.2 → 0.11.3
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 +27 -0
- package/dist/core/exec.d.ts +0 -5
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +41 -4
- package/dist/core/exec.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
| 🏠 **Local-first** | Keys encrypted on your machine, never sent to a cloud |
|
|
24
24
|
| 🖥️ **Exec mode** | Run CLI tools with injected credentials — agents never see the keys |
|
|
25
25
|
| 🤖 **GitHub App auth** | Short-lived tokens for autonomous agents — no static PATs |
|
|
26
|
+
| 🔧 **Automatic git auth** | `git push/pull` just works when credentials include GitHub tokens |
|
|
26
27
|
|
|
27
28
|
---
|
|
28
29
|
|
|
@@ -164,6 +165,7 @@ Now agents can run CLI tools through Janee without ever seeing the API key:
|
|
|
164
165
|
janee_exec({
|
|
165
166
|
capability: "twitter",
|
|
166
167
|
command: ["bird", "post", "Hello world!"],
|
|
168
|
+
cwd: "/home/agent/project", // optional working directory
|
|
167
169
|
reason: "User asked to post a tweet"
|
|
168
170
|
})
|
|
169
171
|
```
|
|
@@ -178,6 +180,31 @@ Janee spawns the process with `TWITTER_API_KEY` injected, runs the command, and
|
|
|
178
180
|
- `--timeout` — max execution time (default: 30s)
|
|
179
181
|
|
|
180
182
|
|
|
183
|
+
### Git operations (automatic HTTPS auth)
|
|
184
|
+
|
|
185
|
+
When using exec mode with GitHub credentials, Janee automatically handles git authentication. No extra configuration needed — `git push`, `git pull`, and `git clone` just work:
|
|
186
|
+
|
|
187
|
+
```yaml
|
|
188
|
+
capabilities:
|
|
189
|
+
- name: git-ops
|
|
190
|
+
service: github
|
|
191
|
+
mode: exec
|
|
192
|
+
allowCommands: [git]
|
|
193
|
+
env:
|
|
194
|
+
GH_TOKEN: "{{credential}}"
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
// Agent can push code without ever seeing the token
|
|
199
|
+
janee_exec({
|
|
200
|
+
capability: "git-ops",
|
|
201
|
+
command: ["git", "push", "origin", "main"],
|
|
202
|
+
cwd: "/workspace/my-repo"
|
|
203
|
+
})
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Janee detects `git` commands with `GH_TOKEN`/`GITHUB_TOKEN` in the environment and creates a temporary askpass script for HTTPS authentication. The script is cleaned up automatically after the command completes.
|
|
207
|
+
|
|
181
208
|
### Add GitHub App auth (for autonomous agents)
|
|
182
209
|
|
|
183
210
|
Static tokens are risky for long-running agents. GitHub App auth generates short-lived installation tokens on demand — no long-lived PATs required.
|
package/dist/core/exec.d.ts
CHANGED
|
@@ -65,11 +65,6 @@ export declare function hashPolicyFingerprint(capability: {
|
|
|
65
65
|
timeout?: number;
|
|
66
66
|
env?: Record<string, string>;
|
|
67
67
|
}): string;
|
|
68
|
-
/**
|
|
69
|
-
* Run a command with credentials injected as env vars.
|
|
70
|
-
* Inherits the caller's environment — the only additions are the
|
|
71
|
-
* credential env vars. Output is scrubbed before returning.
|
|
72
|
-
*/
|
|
73
68
|
export declare function executeCommand(command: string[], injectedEnv: Record<string, string>, options: {
|
|
74
69
|
workDir?: string;
|
|
75
70
|
timeout?: number;
|
package/dist/core/exec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAOD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,aAAa,EAAE,MAAM,EAAE,GACtB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAcvC;AAED,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,UAAU,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9E,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmBxB;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9E,MAAM,CAiBR;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,GAAG,MAAM,CAeT;AAkCD,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF,GACA,OAAO,CAAC,UAAU,CAAC,CAqErB"}
|
package/dist/core/exec.js
CHANGED
|
@@ -15,7 +15,9 @@ exports.scrubCredentials = scrubCredentials;
|
|
|
15
15
|
exports.hashPolicyFingerprint = hashPolicyFingerprint;
|
|
16
16
|
exports.executeCommand = executeCommand;
|
|
17
17
|
const child_process_1 = require("child_process");
|
|
18
|
+
const fs_1 = __importDefault(require("fs"));
|
|
18
19
|
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const crypto_1 = require("crypto");
|
|
19
21
|
function countOccurrences(output, needle) {
|
|
20
22
|
if (!needle || needle.length < 8)
|
|
21
23
|
return 0;
|
|
@@ -84,16 +86,41 @@ function hashPolicyFingerprint(capability) {
|
|
|
84
86
|
return `policy-${hash.toString(16)}`;
|
|
85
87
|
}
|
|
86
88
|
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
89
|
+
* When running `git` with a GH/GITHUB token in the env, create a temp
|
|
90
|
+
* askpass script so git can authenticate over HTTPS automatically.
|
|
91
|
+
* Returns the temp file path (caller must clean up) or null.
|
|
90
92
|
*/
|
|
93
|
+
function setupGitAskpass(executable, env) {
|
|
94
|
+
if (path_1.default.basename(executable) !== 'git')
|
|
95
|
+
return null;
|
|
96
|
+
const tokenVar = env.GH_TOKEN ? 'GH_TOKEN'
|
|
97
|
+
: env.GITHUB_TOKEN ? 'GITHUB_TOKEN'
|
|
98
|
+
: null;
|
|
99
|
+
if (!tokenVar)
|
|
100
|
+
return null;
|
|
101
|
+
const askpassPath = path_1.default.join(process.env.TMPDIR || process.env.TMP || '/tmp', `janee-askpass-${(0, crypto_1.randomUUID)()}.sh`);
|
|
102
|
+
fs_1.default.writeFileSync(askpassPath, [
|
|
103
|
+
'#!/bin/sh',
|
|
104
|
+
`case "$1" in`,
|
|
105
|
+
` Username*|username*) echo "x-access-token" ;;`,
|
|
106
|
+
` *) echo "\${${tokenVar}}" ;;`,
|
|
107
|
+
'esac',
|
|
108
|
+
'',
|
|
109
|
+
].join('\n'), { mode: 0o700 });
|
|
110
|
+
return askpassPath;
|
|
111
|
+
}
|
|
91
112
|
async function executeCommand(command, injectedEnv, options) {
|
|
92
113
|
const timeout = options.timeout || 30000;
|
|
93
114
|
const startTime = Date.now();
|
|
115
|
+
const mergedEnv = { ...process.env, ...injectedEnv };
|
|
116
|
+
const askpassFile = setupGitAskpass(command[0], injectedEnv);
|
|
117
|
+
if (askpassFile) {
|
|
118
|
+
mergedEnv.GIT_ASKPASS = askpassFile;
|
|
119
|
+
mergedEnv.GIT_TERMINAL_PROMPT = '0';
|
|
120
|
+
}
|
|
94
121
|
return new Promise((resolve) => {
|
|
95
122
|
const proc = (0, child_process_1.spawn)(command[0], command.slice(1), {
|
|
96
|
-
env:
|
|
123
|
+
env: mergedEnv,
|
|
97
124
|
cwd: options.workDir || process.cwd(),
|
|
98
125
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
99
126
|
});
|
|
@@ -110,6 +137,11 @@ async function executeCommand(command, injectedEnv, options) {
|
|
|
110
137
|
}, timeout);
|
|
111
138
|
proc.on('close', (code) => {
|
|
112
139
|
clearTimeout(timeoutId);
|
|
140
|
+
if (askpassFile)
|
|
141
|
+
try {
|
|
142
|
+
fs_1.default.unlinkSync(askpassFile);
|
|
143
|
+
}
|
|
144
|
+
catch { /* best effort */ }
|
|
113
145
|
const executionTimeMs = Date.now() - startTime;
|
|
114
146
|
const secrets = [
|
|
115
147
|
options.credential,
|
|
@@ -130,6 +162,11 @@ async function executeCommand(command, injectedEnv, options) {
|
|
|
130
162
|
});
|
|
131
163
|
proc.on('error', (error) => {
|
|
132
164
|
clearTimeout(timeoutId);
|
|
165
|
+
if (askpassFile)
|
|
166
|
+
try {
|
|
167
|
+
fs_1.default.unlinkSync(askpassFile);
|
|
168
|
+
}
|
|
169
|
+
catch { /* best effort */ }
|
|
133
170
|
resolve({
|
|
134
171
|
stdout: '',
|
|
135
172
|
stderr: `Failed to execute command: ${error.message}`,
|
package/dist/core/exec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"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"}
|