sandstream-kit 1.1.0 → 1.3.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 +101 -92
- package/dist/adapters/expo-eas.js +1 -1
- package/dist/adapters/expo-eas.js.map +1 -1
- package/dist/audit-logging-service.js +1 -1
- package/dist/audit-logging-service.js.map +1 -1
- package/dist/author-verification.js +1 -1
- package/dist/author-verification.js.map +1 -1
- package/dist/check-web-search.js +37 -6
- package/dist/check-web-search.js.map +1 -1
- package/dist/cli-shared.d.ts +4 -0
- package/dist/cli-shared.js +11 -0
- package/dist/cli-shared.js.map +1 -0
- package/dist/cli.js +175 -1189
- package/dist/cli.js.map +1 -1
- package/dist/commands/audit.d.ts +1 -0
- package/dist/commands/audit.js +99 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/auth.d.ts +1 -0
- package/dist/commands/auth.js +121 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/env.d.ts +1 -0
- package/dist/commands/env.js +149 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/hooks.d.ts +1 -0
- package/dist/commands/hooks.js +146 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/mcp.d.ts +1 -0
- package/dist/commands/mcp.js +120 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/memory.d.ts +1 -0
- package/dist/commands/memory.js +534 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.js +4 -0
- package/dist/config.js.map +1 -1
- package/dist/mcp-server.js +59 -6
- package/dist/mcp-server.js.map +1 -1
- package/dist/memory/amazonq.d.ts +5 -0
- package/dist/memory/amazonq.js +161 -0
- package/dist/memory/amazonq.js.map +1 -0
- package/dist/memory/cline.d.ts +5 -0
- package/dist/memory/cline.js +117 -0
- package/dist/memory/cline.js.map +1 -0
- package/dist/memory/codex.d.ts +5 -0
- package/dist/memory/codex.js +150 -0
- package/dist/memory/codex.js.map +1 -0
- package/dist/memory/continue.d.ts +5 -0
- package/dist/memory/continue.js +116 -0
- package/dist/memory/continue.js.map +1 -0
- package/dist/memory/cursor.d.ts +4 -0
- package/dist/memory/cursor.js +116 -0
- package/dist/memory/cursor.js.map +1 -0
- package/dist/memory/db.d.ts +12 -1
- package/dist/memory/db.js +43 -1
- package/dist/memory/db.js.map +1 -1
- package/dist/memory/gemini.d.ts +5 -0
- package/dist/memory/gemini.js +176 -0
- package/dist/memory/gemini.js.map +1 -0
- package/dist/memory/hook.d.ts +9 -0
- package/dist/memory/hook.js +34 -1
- package/dist/memory/hook.js.map +1 -1
- package/dist/memory/install.js +1 -0
- package/dist/memory/install.js.map +1 -1
- package/dist/memory/merge.d.ts +18 -0
- package/dist/memory/merge.js +109 -0
- package/dist/memory/merge.js.map +1 -0
- package/dist/memory/parser.d.ts +9 -0
- package/dist/memory/parser.js +40 -3
- package/dist/memory/parser.js.map +1 -1
- package/dist/memory/suggest.d.ts +21 -0
- package/dist/memory/suggest.js +36 -0
- package/dist/memory/suggest.js.map +1 -0
- package/dist/onepassword.js +1 -1
- package/dist/onepassword.js.map +1 -1
- package/dist/open.js +8 -2
- package/dist/open.js.map +1 -1
- package/dist/run.js +1 -1
- package/dist/run.js.map +1 -1
- package/dist/service-auth.d.ts +31 -0
- package/dist/service-auth.js +47 -0
- package/dist/service-auth.js.map +1 -0
- package/dist/stack-detector.js +53 -76
- package/dist/stack-detector.js.map +1 -1
- package/dist/status.d.ts +9 -0
- package/dist/status.js +119 -0
- package/dist/status.js.map +1 -0
- package/package.json +9 -4
- package/dist/memory/backup 2.d.ts +0 -6
- package/dist/memory/backup 2.js +0 -80
- package/dist/memory/backup 2.js.map +0 -1
- package/dist/memory/db 2.d.ts +0 -40
- package/dist/memory/db 2.js +0 -233
- package/dist/memory/db 2.js.map +0 -1
- package/dist/memory/hook 2.d.ts +0 -6
- package/dist/memory/hook 2.js +0 -51
- package/dist/memory/hook 2.js.map +0 -1
- package/dist/memory/hook.test 2.d.ts +0 -1
- package/dist/memory/hook.test 2.js +0 -35
- package/dist/memory/hook.test 2.js.map +0 -1
- package/dist/memory/install 2.d.ts +0 -8
- package/dist/memory/install 2.js +0 -72
- package/dist/memory/install 2.js.map +0 -1
- package/dist/memory/install.test 2.d.ts +0 -1
- package/dist/memory/install.test 2.js +0 -59
- package/dist/memory/install.test 2.js.map +0 -1
- package/dist/memory/pal 2.d.ts +0 -47
- package/dist/memory/pal 2.js +0 -154
- package/dist/memory/pal 2.js.map +0 -1
- package/dist/memory/project 2.d.ts +0 -1
- package/dist/memory/project 2.js +0 -24
- package/dist/memory/project 2.js.map +0 -1
- package/dist/memory/scan 2.d.ts +0 -15
- package/dist/memory/scan 2.js +0 -94
- package/dist/memory/scan 2.js.map +0 -1
- package/dist/memory/scan.test 2.d.ts +0 -1
- package/dist/memory/scan.test 2.js +0 -55
- package/dist/memory/scan.test 2.js.map +0 -1
- package/dist/memory/shared 2.d.ts +0 -33
- package/dist/memory/shared 2.js +0 -120
- package/dist/memory/shared 2.js.map +0 -1
- package/dist/memory/threads 2.d.ts +0 -37
- package/dist/memory/threads 2.js +0 -50
- package/dist/memory/threads 2.js.map +0 -1
- package/dist/memory/threads.test 2.d.ts +0 -1
- package/dist/memory/threads.test 2.js +0 -66
- package/dist/memory/threads.test 2.js.map +0 -1
- package/dist/memory/types 2.d.ts +0 -52
- package/dist/memory/types 2.js +0 -5
- package/dist/memory/types 2.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function cmdAudit(): Promise<boolean>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// `kit audit` commands — extracted from cli.ts (split step 4).
|
|
2
|
+
import { readSecretAuditEvents, groupBySecret, summarize } from "../audit-secrets.js";
|
|
3
|
+
import { readAuditLog } from "../audit.js";
|
|
4
|
+
import { printAuditTable } from "../output.js";
|
|
5
|
+
import { loadConfig } from "../config.js";
|
|
6
|
+
import { resolveConfigPath } from "../cli-shared.js";
|
|
7
|
+
import { c } from "../utils/colors.js";
|
|
8
|
+
import { hasFlag, flagValue } from "../utils/flags.js";
|
|
9
|
+
async function cmdAuditSecrets() {
|
|
10
|
+
const args = process.argv.slice(4); // after "audit secrets"
|
|
11
|
+
const sinceIdx = args.indexOf("--since-days");
|
|
12
|
+
const sinceDays = sinceIdx >= 0 && args[sinceIdx + 1] ? parseInt(args[sinceIdx + 1], 10) : 30;
|
|
13
|
+
const keyFilter = flagValue(args, "--key");
|
|
14
|
+
const jsonMode = hasFlag(args, "--json");
|
|
15
|
+
const events = await readSecretAuditEvents(process.cwd(), sinceDays);
|
|
16
|
+
const { reports, unattributed } = groupBySecret(events);
|
|
17
|
+
const filteredReports = keyFilter
|
|
18
|
+
? reports.filter((r) => r.key === keyFilter)
|
|
19
|
+
: reports;
|
|
20
|
+
const summary = summarize(filteredReports, sinceDays);
|
|
21
|
+
if (jsonMode) {
|
|
22
|
+
console.log(JSON.stringify({ summary, reports: filteredReports, unattributed }, null, 2));
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
console.log(`${c.bold}${c.cyan}kit audit secrets${c.reset} ${c.dim}(last ${sinceDays}d)${c.reset}`);
|
|
26
|
+
console.log(`${c.dim}${"─".repeat(50)}${c.reset}\n`);
|
|
27
|
+
if (events.length === 0) {
|
|
28
|
+
console.log(`${c.dim}No secret-related events in audit log (.kit-audit.jsonl).${c.reset}\n`);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
console.log(`${c.bold}${summary.totalEvents}${c.reset} event(s) across ${c.bold}${summary.keyCount}${c.reset} key(s)`);
|
|
32
|
+
if (summary.topKey) {
|
|
33
|
+
console.log(`${c.dim}Most touched: ${c.bold}${summary.topKey.key}${c.reset}${c.dim} (${summary.topKey.count} events)${c.reset}`);
|
|
34
|
+
}
|
|
35
|
+
console.log();
|
|
36
|
+
for (const r of filteredReports.slice(0, 20)) {
|
|
37
|
+
console.log(`${c.bold}${r.key}${c.reset} ${c.dim}(${r.events.length} events)${c.reset}`);
|
|
38
|
+
for (const e of r.events.slice(-10)) {
|
|
39
|
+
const icon = e.success ? `${c.green}✓${c.reset}` : `${c.red}✗${c.reset}`;
|
|
40
|
+
const ts = e.timestamp.slice(0, 19);
|
|
41
|
+
const agent = e.agent ? `[${e.agent}]` : "";
|
|
42
|
+
const detail = e.detail ? ` ${c.dim}${e.detail}${c.reset}` : "";
|
|
43
|
+
console.log(` ${icon} ${ts} ${e.operation} ${c.dim}${agent}${c.reset}${detail}`);
|
|
44
|
+
}
|
|
45
|
+
if (r.events.length > 10) {
|
|
46
|
+
console.log(` ${c.dim}… ${r.events.length - 10} earlier events truncated${c.reset}`);
|
|
47
|
+
}
|
|
48
|
+
console.log();
|
|
49
|
+
}
|
|
50
|
+
if (!keyFilter && unattributed.length > 0) {
|
|
51
|
+
console.log(`${c.dim}+ ${unattributed.length} event(s) couldn't be tied to a specific key. Use ${c.bold}--json${c.reset}${c.dim} for the full set.${c.reset}\n`);
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
export async function cmdAudit() {
|
|
56
|
+
const args = process.argv.slice(3);
|
|
57
|
+
// Sub-sub: kit audit secrets [--since-days N] [--key NAME] [--json]
|
|
58
|
+
if (args[0] === "secrets") {
|
|
59
|
+
return cmdAuditSecrets();
|
|
60
|
+
}
|
|
61
|
+
// Parse --limit N
|
|
62
|
+
let limit = 20;
|
|
63
|
+
const limitIdx = args.indexOf("--limit");
|
|
64
|
+
if (limitIdx !== -1 && args[limitIdx + 1]) {
|
|
65
|
+
const parsed = parseInt(args[limitIdx + 1], 10);
|
|
66
|
+
if (!isNaN(parsed) && parsed > 0)
|
|
67
|
+
limit = parsed;
|
|
68
|
+
}
|
|
69
|
+
// Parse --operation <name>
|
|
70
|
+
let operationFilter;
|
|
71
|
+
const opIdx = args.indexOf("--operation");
|
|
72
|
+
if (opIdx !== -1 && args[opIdx + 1]) {
|
|
73
|
+
operationFilter = args[opIdx + 1];
|
|
74
|
+
}
|
|
75
|
+
// Determine log file path (use config if available, else default)
|
|
76
|
+
let logFile = ".kit-audit.jsonl";
|
|
77
|
+
try {
|
|
78
|
+
const config = await loadConfig(resolveConfigPath());
|
|
79
|
+
const govFile = config.governance?.audit?.log_file;
|
|
80
|
+
if (govFile)
|
|
81
|
+
logFile = govFile;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// No .kit.toml — use default log file
|
|
85
|
+
}
|
|
86
|
+
let events = await readAuditLog(logFile, limit * 5); // read extra to allow filtering
|
|
87
|
+
if (operationFilter) {
|
|
88
|
+
events = events.filter((e) => e.operation.includes(operationFilter));
|
|
89
|
+
}
|
|
90
|
+
// Apply limit after filter
|
|
91
|
+
events = events.slice(-limit);
|
|
92
|
+
printAuditTable(events);
|
|
93
|
+
if (events.length > 0) {
|
|
94
|
+
console.log();
|
|
95
|
+
console.log(`${c.dim}Showing ${events.length} entries from ${logFile}${c.reset}`);
|
|
96
|
+
}
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function cmdAuth(): Promise<boolean>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// `kit auth` commands (TOTP enrollment + elevation) — extracted from cli.ts (split step 3).
|
|
2
|
+
import { grantElevation, clearElevation, readElevation, verifyTotp, elevationTtlMinutes, enrollTotp, resolveTotpSecret, } from "../elevation.js";
|
|
3
|
+
import { isNonInteractive } from "../environment.js";
|
|
4
|
+
import { promptConfirm } from "../utils/prompt.js";
|
|
5
|
+
import { c } from "../utils/colors.js";
|
|
6
|
+
import { hasFlag, flagValue } from "../utils/flags.js";
|
|
7
|
+
export async function cmdAuth() {
|
|
8
|
+
const sub = process.argv[3];
|
|
9
|
+
if (sub === "elevate")
|
|
10
|
+
return cmdAuthElevate();
|
|
11
|
+
if (sub === "status")
|
|
12
|
+
return cmdAuthStatus();
|
|
13
|
+
if (sub === "revoke")
|
|
14
|
+
return cmdAuthRevoke();
|
|
15
|
+
if (sub === "setup-totp")
|
|
16
|
+
return cmdAuthSetupTotp();
|
|
17
|
+
console.error(`${c.red}Usage: kit auth [elevate | status | revoke | setup-totp]${c.reset}`);
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
async function cmdAuthSetupTotp() {
|
|
21
|
+
// kit auth setup-totp [--issuer <name>] [--account <user@host>] [--overwrite]
|
|
22
|
+
const args = process.argv.slice(4);
|
|
23
|
+
const issuerIdx = args.indexOf("--issuer");
|
|
24
|
+
const accountIdx = args.indexOf("--account");
|
|
25
|
+
const overwrite = hasFlag(args, "--overwrite");
|
|
26
|
+
const issuer = issuerIdx >= 0 ? args[issuerIdx + 1] : "kit";
|
|
27
|
+
const defaultAccount = `${process.env.USER ?? "user"}@${process.env.HOSTNAME ?? "host"}`;
|
|
28
|
+
const accountName = accountIdx >= 0 ? args[accountIdx + 1] : defaultAccount;
|
|
29
|
+
console.log(`${c.bold}${c.cyan}kit auth setup-totp${c.reset}`);
|
|
30
|
+
console.log(`${c.dim}${"─".repeat(50)}${c.reset}\n`);
|
|
31
|
+
let result;
|
|
32
|
+
try {
|
|
33
|
+
result = await enrollTotp({ accountName, issuer, overwrite });
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
37
|
+
console.error(`${c.red}✗ ${msg}${c.reset}`);
|
|
38
|
+
console.error(`${c.dim}If you intentionally want to replace the existing secret, re-run with ${c.bold}--overwrite${c.reset}${c.dim} (your old authenticator entry will stop working).${c.reset}\n`);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
console.log(` ${c.green}✓${c.reset} secret written to ${result.filePath} ${c.dim}(chmod 600)${c.reset}\n`);
|
|
42
|
+
console.log(`${c.bold}Provisioning URI:${c.reset}`);
|
|
43
|
+
console.log(` ${c.dim}${result.uri}${c.reset}\n`);
|
|
44
|
+
console.log(`${c.bold}Or enter the secret manually in your authenticator app:${c.reset}`);
|
|
45
|
+
console.log(` ${c.bold}Secret:${c.reset} ${result.secret}`);
|
|
46
|
+
console.log(` ${c.bold}Account:${c.reset} ${accountName}`);
|
|
47
|
+
console.log(` ${c.bold}Issuer:${c.reset} ${issuer}\n`);
|
|
48
|
+
console.log(`${c.bold}Verify enrollment — the next 6-digit code should be:${c.reset}`);
|
|
49
|
+
console.log(` ${c.bold}${result.currentCode}${c.reset} ${c.dim}(or the one shown in your authenticator right now)${c.reset}\n`);
|
|
50
|
+
console.log(`${c.dim}Future ${c.bold}kit auth elevate${c.reset}${c.dim} runs will prompt for the TOTP code automatically.${c.reset}`);
|
|
51
|
+
console.log(`${c.dim}Override with ${c.bold}KIT_TOTP_SECRET=...${c.reset}${c.dim} in CI / scripted contexts.${c.reset}\n`);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
async function cmdAuthElevate() {
|
|
55
|
+
const args = process.argv.slice(4);
|
|
56
|
+
const scope = flagValue(args, "--scope") ?? "all";
|
|
57
|
+
const ttlIdx = args.indexOf("--ttl-minutes");
|
|
58
|
+
if (ttlIdx >= 0 && args[ttlIdx + 1]) {
|
|
59
|
+
const n = parseInt(args[ttlIdx + 1], 10);
|
|
60
|
+
if (Number.isFinite(n) && n > 0 && n <= 240) {
|
|
61
|
+
process.env.KIT_ELEVATION_TTL_MINUTES = String(n);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
console.log(`${c.bold}${c.cyan}kit auth elevate${c.reset} ${c.dim}(scope=${scope})${c.reset}`);
|
|
65
|
+
console.log(`${c.dim}${"─".repeat(50)}${c.reset}\n`);
|
|
66
|
+
if (isNonInteractive()) {
|
|
67
|
+
console.error(`${c.red}✗ Elevation requires an interactive TTY. Cannot run from agent / CI.${c.reset}`);
|
|
68
|
+
console.error(`${c.dim}For CI deploy jobs that legitimately need a destructive op, set ${c.bold}KIT_ELEVATED=1${c.reset}${c.dim} (and audit-log the use).${c.reset}\n`);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
// Resolve from env first, then ~/.kit/totp-secret (created by
|
|
72
|
+
// `kit auth setup-totp`).
|
|
73
|
+
const totpSecret = await resolveTotpSecret();
|
|
74
|
+
let method = "yes-prompt";
|
|
75
|
+
if (totpSecret) {
|
|
76
|
+
method = "totp";
|
|
77
|
+
const readline = await import("node:readline/promises");
|
|
78
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
79
|
+
try {
|
|
80
|
+
const code = (await rl.question(`Enter 6-digit TOTP from your authenticator: `)).trim();
|
|
81
|
+
if (!verifyTotp(code, totpSecret)) {
|
|
82
|
+
console.error(`${c.red}✗ Invalid TOTP code.${c.reset}`);
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
rl.close();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const ok = await promptConfirm(`Confirm elevation [type YES, default no in 15s]: `, 15_000, false);
|
|
92
|
+
if (!ok) {
|
|
93
|
+
console.log(`${c.dim}Aborted.${c.reset}`);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const state = await grantElevation(scope, method);
|
|
98
|
+
console.log(` ${c.green}✓${c.reset} elevated ${c.dim}scope=${state.scope} method=${state.method} expires=${state.expiresAt}${c.reset}`);
|
|
99
|
+
console.log(`\n${c.dim}Destructive secret ops (rotate, migrate, onecli register, propagate) are unlocked for ${elevationTtlMinutes()}m. Run ${c.bold}kit auth revoke${c.reset}${c.dim} to drop early.${c.reset}\n`);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
async function cmdAuthStatus() {
|
|
103
|
+
const state = await readElevation(process.cwd());
|
|
104
|
+
if (!state) {
|
|
105
|
+
console.log(`${c.dim}Not elevated.${c.reset}`);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
const expires = Date.parse(state.expiresAt);
|
|
109
|
+
const valid = Number.isFinite(expires) && expires > Date.now();
|
|
110
|
+
const status = valid
|
|
111
|
+
? `${c.green}active${c.reset} ${c.dim}(expires ${state.expiresAt})${c.reset}`
|
|
112
|
+
: `${c.red}expired${c.reset} ${c.dim}(at ${state.expiresAt})${c.reset}`;
|
|
113
|
+
console.log(`${status} scope=${state.scope} method=${state.method} granter=${state.granter}`);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
async function cmdAuthRevoke() {
|
|
117
|
+
await clearElevation(process.cwd());
|
|
118
|
+
console.log(`${c.green}✓${c.reset} elevation marker cleared.`);
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function cmdEnv(): Promise<boolean>;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// `kit env` commands — extracted from cli.ts (split step 2).
|
|
2
|
+
import { loadConfig, resolveActiveEnvironment } from "../config.js";
|
|
3
|
+
import { KNOWN_ENVS, writeActiveEnv, readActiveEnv } from "../env-switch.js";
|
|
4
|
+
import { promptConfirm } from "../utils/prompt.js";
|
|
5
|
+
import { inspectEnv } from "../env-inspect.js";
|
|
6
|
+
import { isNonInteractive } from "../environment.js";
|
|
7
|
+
import { c } from "../utils/colors.js";
|
|
8
|
+
import { hasFlag } from "../utils/flags.js";
|
|
9
|
+
import { resolveConfigPath } from "../cli-shared.js";
|
|
10
|
+
async function cmdEnvList() {
|
|
11
|
+
let config;
|
|
12
|
+
try {
|
|
13
|
+
// Load base config without env merge so we can inspect [env.*] sections
|
|
14
|
+
config = await loadConfig(resolveConfigPath(), "dev");
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
console.log(`${c.dim}No .kit.toml found — no environments configured.${c.reset}`);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
const activeEnv = resolveActiveEnvironment();
|
|
21
|
+
const envSections = config.env ?? {};
|
|
22
|
+
const envNames = ["dev", ...Object.keys(envSections).filter((k) => k !== "dev")];
|
|
23
|
+
console.log(`${c.bold}${c.cyan}Environments${c.reset} ${c.dim}(active: ${activeEnv})${c.reset}\n`);
|
|
24
|
+
for (const name of envNames) {
|
|
25
|
+
const isActive = name === activeEnv;
|
|
26
|
+
const marker = isActive ? `${c.green}●${c.reset} ` : " ";
|
|
27
|
+
const override = envSections[name];
|
|
28
|
+
if (!override) {
|
|
29
|
+
console.log(` ${marker}${c.bold}${name}${c.reset} ${c.dim}base config (default)${c.reset}`);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
// Summarise which keys are overridden
|
|
33
|
+
const overrideKeys = [];
|
|
34
|
+
if (override.tools)
|
|
35
|
+
overrideKeys.push(`tools(${Object.keys(override.tools).join(",")})`);
|
|
36
|
+
if (override.secrets)
|
|
37
|
+
overrideKeys.push(`secrets.store=${override.secrets.store ?? "?"}`);
|
|
38
|
+
if (override.services)
|
|
39
|
+
overrideKeys.push(`services(${Object.keys(override.services).join(",")})`);
|
|
40
|
+
if (override.governance)
|
|
41
|
+
overrideKeys.push("governance");
|
|
42
|
+
if (override.skills)
|
|
43
|
+
overrideKeys.push("skills");
|
|
44
|
+
const summary = overrideKeys.length > 0 ? overrideKeys.join(", ") : "no overrides";
|
|
45
|
+
console.log(` ${marker}${c.bold}${name}${c.reset} ${c.dim}${summary}${c.reset}`);
|
|
46
|
+
}
|
|
47
|
+
if (Object.keys(envSections).length === 0) {
|
|
48
|
+
console.log(`${c.dim}\nNo [env.*] sections defined in .kit.toml.${c.reset}`);
|
|
49
|
+
console.log(`${c.dim}Add [env.staging.*] or [env.production.*] to configure per-environment overrides.${c.reset}`);
|
|
50
|
+
}
|
|
51
|
+
console.log();
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
async function cmdEnvSwitch() {
|
|
55
|
+
// argv layout: [node, cli.js, "env", "switch", "<target>"]
|
|
56
|
+
const target = process.argv[4];
|
|
57
|
+
if (!target || !KNOWN_ENVS.includes(target)) {
|
|
58
|
+
console.error(`${c.red}Usage: kit env switch <${KNOWN_ENVS.join("|")}>${c.reset}`);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const env = target;
|
|
62
|
+
console.log(`${c.bold}${c.cyan}kit env switch ${env}${c.reset}`);
|
|
63
|
+
console.log(`${c.dim}${"─".repeat(50)}${c.reset}\n`);
|
|
64
|
+
if (env === "prod" && !isNonInteractive()) {
|
|
65
|
+
console.log(`${c.red}⚠ Switching to ${c.bold}prod${c.reset}${c.red} unlocks production credentials in this shell.${c.reset}`);
|
|
66
|
+
console.log(`${c.dim}Anything that reads ${c.bold}.env.local${c.reset}${c.dim} after this point can call live services.${c.reset}\n`);
|
|
67
|
+
const ok = await promptConfirm(`Continue? [y/N] (auto-no in 10s): `, 10_000, false);
|
|
68
|
+
if (!ok) {
|
|
69
|
+
console.log(`${c.dim}Aborted — active env unchanged.${c.reset}`);
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const state = await writeActiveEnv(env, process.cwd());
|
|
74
|
+
console.log(` ${c.green}✓${c.reset} active env is now ${c.bold}${state.env}${c.reset} ${c.dim}(by ${state.switchedBy} at ${state.switchedAt})${c.reset}`);
|
|
75
|
+
if (env === "prod") {
|
|
76
|
+
console.log(`\n${c.dim}Re-run ${c.bold}kit secrets${c.reset}${c.dim} to materialize prod values into .env.local. ${c.bold}kit env switch dev${c.reset}${c.dim} when done.${c.reset}\n`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(`\n${c.dim}Prod-scoped keys are now refused unless you switch back or set ${c.bold}KIT_PROD_OK=1${c.reset}${c.dim}.${c.reset}\n`);
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
async function cmdEnvCurrent() {
|
|
84
|
+
const state = await readActiveEnv(process.cwd());
|
|
85
|
+
if (!state) {
|
|
86
|
+
console.log(`${c.dim}No active env set (defaulting to ${c.bold}dev${c.reset}${c.dim}). Run ${c.bold}kit env switch <env>${c.reset}${c.dim} to set one.${c.reset}`);
|
|
87
|
+
console.log(`dev`);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
const color = state.env === "prod" ? c.red : state.env === "staging" ? c.yellow : c.green;
|
|
91
|
+
console.log(`${color}${state.env}${c.reset} ${c.dim}(set ${state.switchedAt} by ${state.switchedBy})${c.reset}`);
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
export async function cmdEnv() {
|
|
95
|
+
const args = process.argv.slice(2); // includes "env"
|
|
96
|
+
// Route subcommand: kit env list / switch / current / validate
|
|
97
|
+
if (args[1] === "list")
|
|
98
|
+
return cmdEnvList();
|
|
99
|
+
if (args[1] === "switch")
|
|
100
|
+
return cmdEnvSwitch();
|
|
101
|
+
if (args[1] === "current")
|
|
102
|
+
return cmdEnvCurrent();
|
|
103
|
+
const showValues = hasFlag(args, "--show-values");
|
|
104
|
+
const missingOnly = hasFlag(args, "--missing");
|
|
105
|
+
const jsonMode = hasFlag(args, "--json");
|
|
106
|
+
let config = {};
|
|
107
|
+
try {
|
|
108
|
+
config = await loadConfig(resolveConfigPath());
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Works without .kit.toml — shows .env.local contents only
|
|
112
|
+
}
|
|
113
|
+
const result = await inspectEnv(config, { showValues, missingOnly, cwd: process.cwd() });
|
|
114
|
+
if (jsonMode) {
|
|
115
|
+
console.log(JSON.stringify(result, null, 2));
|
|
116
|
+
return result.ok;
|
|
117
|
+
}
|
|
118
|
+
console.log(`${c.bold}${c.cyan}Environment${c.reset}`);
|
|
119
|
+
console.log(`${c.dim}${"─".repeat(50)}${c.reset}\n`);
|
|
120
|
+
if (!result.envLocalExists) {
|
|
121
|
+
console.log(`${c.yellow}⚠${c.reset} .env.local not found — run ${c.bold}kit secrets${c.reset} to generate it\n`);
|
|
122
|
+
}
|
|
123
|
+
if (result.keys.length === 0) {
|
|
124
|
+
if (missingOnly) {
|
|
125
|
+
console.log(`${c.green}✓${c.reset} All keys are set\n`);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
console.log(`${c.dim}No keys configured or found${c.reset}\n`);
|
|
129
|
+
}
|
|
130
|
+
return result.ok;
|
|
131
|
+
}
|
|
132
|
+
for (const key of result.keys) {
|
|
133
|
+
const icon = key.set ? `${c.green}✓${c.reset}` : `${c.red}✗${c.reset}`;
|
|
134
|
+
const valueStr = key.set
|
|
135
|
+
? showValues
|
|
136
|
+
? `${c.dim}${key.value}${c.reset}`
|
|
137
|
+
: `${c.dim}${key.redacted}${c.reset}`
|
|
138
|
+
: `${c.red}not set${c.reset}`;
|
|
139
|
+
const src = `${c.dim}[${key.source}]${c.reset}`;
|
|
140
|
+
console.log(` ${icon} ${key.name} ${valueStr} ${src}`);
|
|
141
|
+
}
|
|
142
|
+
console.log();
|
|
143
|
+
if (!result.ok && !missingOnly) {
|
|
144
|
+
console.log(`${c.dim}Run ${c.reset}${c.bold}kit env --missing${c.reset}${c.dim} to see only unset keys${c.reset}`);
|
|
145
|
+
console.log(`${c.dim}Run ${c.reset}${c.bold}kit secrets${c.reset}${c.dim} to generate .env.local${c.reset}\n`);
|
|
146
|
+
}
|
|
147
|
+
return result.ok;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function cmdHooks(): Promise<boolean>;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// `kit hooks` commands (git hook install/check/add) — extracted from cli.ts (split step 6).
|
|
2
|
+
import { loadConfig } from "../config.js";
|
|
3
|
+
import { resolveConfigPath, KIT_FILE } from "../cli-shared.js";
|
|
4
|
+
import { isGitRepository, checkHooks } from "../check-hooks.js";
|
|
5
|
+
import { installHooks } from "../hooks.js";
|
|
6
|
+
import { isNonInteractive } from "../environment.js";
|
|
7
|
+
import { promptConfirm } from "../utils/prompt.js";
|
|
8
|
+
import { c } from "../utils/colors.js";
|
|
9
|
+
const BUILTIN_HOOKS = {
|
|
10
|
+
"secret-scan": {
|
|
11
|
+
hookName: "pre-commit",
|
|
12
|
+
commands: ["kit security scan-staged"],
|
|
13
|
+
description: "Block commits that stage known credential patterns (Stripe, AWS, JWT, etc).",
|
|
14
|
+
},
|
|
15
|
+
"post-pull-audit": {
|
|
16
|
+
hookName: "post-merge",
|
|
17
|
+
commands: ["kit security verify-pull"],
|
|
18
|
+
description: "After git pull/merge, audit new deps, gitignore drops, and introduced secrets.",
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
export async function cmdHooks() {
|
|
22
|
+
const subcommand = process.argv[3];
|
|
23
|
+
// Built-in hooks bypass the .kit.toml config path so they're available
|
|
24
|
+
// on any repo, including ones that haven't run `kit init` yet.
|
|
25
|
+
if (subcommand === "add") {
|
|
26
|
+
return cmdHooksAdd();
|
|
27
|
+
}
|
|
28
|
+
const config = await loadConfig(resolveConfigPath());
|
|
29
|
+
if (!config.hooks || Object.keys(config.hooks).length === 0) {
|
|
30
|
+
console.log(`${c.dim}No hooks configured in ${KIT_FILE}${c.reset}`);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
if (!isGitRepository()) {
|
|
34
|
+
console.log(`${c.red}Not a git repository${c.reset}`);
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (subcommand === "install" || !subcommand) {
|
|
38
|
+
console.log(`${c.bold}${c.cyan}Installing git hooks...${c.reset}\n`);
|
|
39
|
+
const results = await installHooks(config.hooks);
|
|
40
|
+
let allOk = true;
|
|
41
|
+
for (const r of results) {
|
|
42
|
+
const icon = r.action === "failed"
|
|
43
|
+
? `${c.red}✗${c.reset}`
|
|
44
|
+
: `${c.green}✓${c.reset}`;
|
|
45
|
+
const label = r.action === "installed"
|
|
46
|
+
? `${c.green}installed${c.reset}`
|
|
47
|
+
: r.action === "updated"
|
|
48
|
+
? `${c.green}updated${c.reset}`
|
|
49
|
+
: r.action === "skipped"
|
|
50
|
+
? `${c.dim}skipped${c.reset}`
|
|
51
|
+
: `${c.red}failed${c.reset}`;
|
|
52
|
+
console.log(` ${icon} ${r.hookName} ${label} ${c.dim}${r.detail}${c.reset}`);
|
|
53
|
+
if (r.action === "failed")
|
|
54
|
+
allOk = false;
|
|
55
|
+
}
|
|
56
|
+
console.log();
|
|
57
|
+
return allOk;
|
|
58
|
+
}
|
|
59
|
+
else if (subcommand === "check") {
|
|
60
|
+
console.log(`${c.bold}${c.cyan}Git Hooks${c.reset}\n`);
|
|
61
|
+
const results = await checkHooks(config.hooks);
|
|
62
|
+
let allOk = true;
|
|
63
|
+
for (const r of results) {
|
|
64
|
+
const icon = !r.installed
|
|
65
|
+
? `${c.red}✗${c.reset}`
|
|
66
|
+
: !r.upToDate
|
|
67
|
+
? `${c.yellow}!${c.reset}`
|
|
68
|
+
: `${c.green}✓${c.reset}`;
|
|
69
|
+
const status = !r.installed
|
|
70
|
+
? `${c.red}not installed${c.reset}`
|
|
71
|
+
: !r.upToDate
|
|
72
|
+
? `${c.yellow}outdated${c.reset}`
|
|
73
|
+
: `${c.green}up-to-date${c.reset}`;
|
|
74
|
+
console.log(` ${icon} ${r.hookName} ${status} ${c.dim}${r.detail}${c.reset}`);
|
|
75
|
+
if (!r.installed || !r.upToDate)
|
|
76
|
+
allOk = false;
|
|
77
|
+
}
|
|
78
|
+
if (!allOk) {
|
|
79
|
+
console.log(`\n${c.dim}Run ${c.reset}${c.bold}kit hooks install${c.reset}${c.dim} to install/update hooks${c.reset}`);
|
|
80
|
+
}
|
|
81
|
+
console.log();
|
|
82
|
+
return allOk;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.error(`Unknown hooks subcommand: ${subcommand}`);
|
|
86
|
+
console.error(`Usage: kit hooks [install|check|add <name>]`);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function cmdHooksAdd() {
|
|
91
|
+
const name = process.argv[4];
|
|
92
|
+
if (!name) {
|
|
93
|
+
console.error(`${c.red}Usage: kit hooks add <name>${c.reset}\n${c.dim}Available built-in hooks:${c.reset}`);
|
|
94
|
+
for (const [k, v] of Object.entries(BUILTIN_HOOKS)) {
|
|
95
|
+
console.error(` ${c.bold}${k}${c.reset} (git ${v.hookName}) — ${v.description}`);
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
const builtin = BUILTIN_HOOKS[name];
|
|
100
|
+
if (!builtin) {
|
|
101
|
+
console.error(`${c.red}No built-in hook named "${name}"${c.reset}`);
|
|
102
|
+
console.error(`${c.dim}Available: ${Object.keys(BUILTIN_HOOKS).join(", ")}${c.reset}`);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
if (!isGitRepository()) {
|
|
106
|
+
console.error(`${c.red}Not a git repository${c.reset}`);
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
console.log(`${c.bold}${c.cyan}kit hooks add ${name}${c.reset} ${c.dim}(git ${builtin.hookName})${c.reset}`);
|
|
110
|
+
console.log(`${c.dim}${"─".repeat(50)}${c.reset}\n`);
|
|
111
|
+
// Check whether the target hook is already present and contains a kit-
|
|
112
|
+
// managed step. If so, just confirm without re-writing.
|
|
113
|
+
const { hooksDir } = await ensureHooksDir();
|
|
114
|
+
const hookPath = `${hooksDir}/${builtin.hookName}`;
|
|
115
|
+
const { existsSync, readFileSync } = await import("node:fs");
|
|
116
|
+
if (existsSync(hookPath)) {
|
|
117
|
+
const existing = readFileSync(hookPath, "utf-8");
|
|
118
|
+
if (existing.includes(builtin.commands[0])) {
|
|
119
|
+
console.log(` ${c.green}✓${c.reset} ${builtin.hookName} already has ${c.bold}${builtin.commands[0]}${c.reset}\n`);
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
console.log(`${c.yellow}⚠ ${builtin.hookName} already exists at ${hookPath}.${c.reset}`);
|
|
123
|
+
console.log(`${c.dim}kit will overwrite it with a managed version that calls back into kit.${c.reset}\n`);
|
|
124
|
+
if (!isNonInteractive()) {
|
|
125
|
+
const ok = await promptConfirm(`Overwrite? [Y/n] (auto-yes in 8s): `, 8000);
|
|
126
|
+
if (!ok) {
|
|
127
|
+
console.log(`${c.dim}Aborted.${c.reset}`);
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const results = await installHooks({ [builtin.hookName]: builtin.commands });
|
|
133
|
+
const r = results[0];
|
|
134
|
+
if (r.action === "failed") {
|
|
135
|
+
console.error(`${c.red}✗ install failed: ${r.detail}${c.reset}`);
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
console.log(` ${c.green}✓${c.reset} ${builtin.hookName} ${c.green}${r.action}${c.reset} ${c.dim}${r.detail}${c.reset}`);
|
|
139
|
+
console.log(`\n${c.dim}Test by staging a file with a fake credential (e.g. ${c.bold}sk_${"test"}_${"A".repeat(20)}${c.reset}${c.dim}) and running ${c.bold}git commit${c.reset}${c.dim} — the commit should be blocked.${c.reset}\n`);
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
async function ensureHooksDir() {
|
|
143
|
+
const { resolve } = await import("node:path");
|
|
144
|
+
return { hooksDir: resolve(process.cwd(), ".git", "hooks") };
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function cmdMcp(): Promise<boolean>;
|