promptkaizen-agent 0.1.0 → 0.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 +10 -4
- package/dist/backfill/run.d.ts +15 -0
- package/dist/backfill/run.d.ts.map +1 -0
- package/dist/backfill/run.js +33 -0
- package/dist/backfill/run.js.map +1 -0
- package/dist/backfill/scanner.d.ts +82 -0
- package/dist/backfill/scanner.d.ts.map +1 -0
- package/dist/backfill/scanner.js +271 -0
- package/dist/backfill/scanner.js.map +1 -0
- package/dist/cli/detect.d.ts +2 -0
- package/dist/cli/detect.d.ts.map +1 -0
- package/dist/cli/detect.js +40 -0
- package/dist/cli/detect.js.map +1 -0
- package/dist/cli/disable.d.ts +2 -0
- package/dist/cli/disable.d.ts.map +1 -0
- package/dist/cli/disable.js +44 -0
- package/dist/cli/disable.js.map +1 -0
- package/dist/cli/enable.d.ts +2 -0
- package/dist/cli/enable.d.ts.map +1 -0
- package/dist/cli/enable.js +105 -0
- package/dist/cli/enable.js.map +1 -0
- package/dist/cli/hook.d.ts +2 -0
- package/dist/cli/hook.d.ts.map +1 -0
- package/dist/cli/hook.js +406 -0
- package/dist/cli/hook.js.map +1 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +70 -5
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/install-hooks.d.ts +5 -0
- package/dist/cli/install-hooks.d.ts.map +1 -0
- package/dist/cli/install-hooks.js +132 -0
- package/dist/cli/install-hooks.js.map +1 -0
- package/dist/cli/install-systemd.d.ts +17 -0
- package/dist/cli/install-systemd.d.ts.map +1 -0
- package/dist/cli/install-systemd.js +96 -0
- package/dist/cli/install-systemd.js.map +1 -0
- package/dist/cli/install-task.d.ts +28 -0
- package/dist/cli/install-task.d.ts.map +1 -0
- package/dist/cli/install-task.js +119 -0
- package/dist/cli/install-task.js.map +1 -0
- package/dist/cli/mcp.d.ts +2 -0
- package/dist/cli/mcp.d.ts.map +1 -0
- package/dist/cli/mcp.js +148 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/metrics.d.ts +2 -0
- package/dist/cli/metrics.d.ts.map +1 -0
- package/dist/cli/metrics.js +103 -0
- package/dist/cli/metrics.js.map +1 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +211 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/scan.d.ts +2 -0
- package/dist/cli/scan.d.ts.map +1 -0
- package/dist/cli/scan.js +171 -0
- package/dist/cli/scan.js.map +1 -0
- package/dist/cli/start.d.ts.map +1 -1
- package/dist/cli/start.js +112 -18
- package/dist/cli/start.js.map +1 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +105 -19
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/uninstall-systemd.d.ts +8 -0
- package/dist/cli/uninstall-systemd.d.ts.map +1 -0
- package/dist/cli/uninstall-systemd.js +58 -0
- package/dist/cli/uninstall-systemd.js.map +1 -0
- package/dist/cli/uninstall-task.d.ts +8 -0
- package/dist/cli/uninstall-task.d.ts.map +1 -0
- package/dist/cli/uninstall-task.js +44 -0
- package/dist/cli/uninstall-task.js.map +1 -0
- package/dist/config.d.ts +233 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +145 -3
- package/dist/config.js.map +1 -1
- package/dist/console-safe.d.ts +21 -0
- package/dist/console-safe.d.ts.map +1 -0
- package/dist/console-safe.js +71 -0
- package/dist/console-safe.js.map +1 -0
- package/dist/detection-secret.d.ts +8 -0
- package/dist/detection-secret.d.ts.map +1 -0
- package/dist/detection-secret.js +49 -0
- package/dist/detection-secret.js.map +1 -0
- package/dist/env-detect.d.ts +44 -0
- package/dist/env-detect.d.ts.map +1 -0
- package/dist/env-detect.js +151 -0
- package/dist/env-detect.js.map +1 -0
- package/dist/exec/executor.d.ts +42 -0
- package/dist/exec/executor.d.ts.map +1 -0
- package/dist/exec/executor.js +135 -0
- package/dist/exec/executor.js.map +1 -0
- package/dist/exec/pk-execute.d.ts +30 -0
- package/dist/exec/pk-execute.d.ts.map +1 -0
- package/dist/exec/pk-execute.js +174 -0
- package/dist/exec/pk-execute.js.map +1 -0
- package/dist/exec/policy-fetcher.d.ts +9 -0
- package/dist/exec/policy-fetcher.d.ts.map +1 -0
- package/dist/exec/policy-fetcher.js +46 -0
- package/dist/exec/policy-fetcher.js.map +1 -0
- package/dist/exec/policy.d.ts +32 -0
- package/dist/exec/policy.d.ts.map +1 -0
- package/dist/exec/policy.js +88 -0
- package/dist/exec/policy.js.map +1 -0
- package/dist/hooks/block-store.d.ts +14 -0
- package/dist/hooks/block-store.d.ts.map +1 -0
- package/dist/hooks/block-store.js +26 -0
- package/dist/hooks/block-store.js.map +1 -0
- package/dist/hooks/claude-hook.d.ts +55 -0
- package/dist/hooks/claude-hook.d.ts.map +1 -0
- package/dist/hooks/claude-hook.js +122 -0
- package/dist/hooks/claude-hook.js.map +1 -0
- package/dist/hooks/continuity.d.ts +48 -0
- package/dist/hooks/continuity.d.ts.map +1 -0
- package/dist/hooks/continuity.js +92 -0
- package/dist/hooks/continuity.js.map +1 -0
- package/dist/hooks/observation.d.ts +27 -0
- package/dist/hooks/observation.d.ts.map +1 -0
- package/dist/hooks/observation.js +0 -0
- package/dist/hooks/observation.js.map +1 -0
- package/dist/hooks/platforms.d.ts +24 -0
- package/dist/hooks/platforms.d.ts.map +1 -0
- package/dist/hooks/platforms.js +57 -0
- package/dist/hooks/platforms.js.map +1 -0
- package/dist/hooks/read-cache.d.ts +71 -0
- package/dist/hooks/read-cache.d.ts.map +1 -0
- package/dist/hooks/read-cache.js +166 -0
- package/dist/hooks/read-cache.js.map +1 -0
- package/dist/hooks/reduction.d.ts +78 -0
- package/dist/hooks/reduction.d.ts.map +1 -0
- package/dist/hooks/reduction.js +111 -0
- package/dist/hooks/reduction.js.map +1 -0
- package/dist/hooks/settings-merge.d.ts +32 -0
- package/dist/hooks/settings-merge.d.ts.map +1 -0
- package/dist/hooks/settings-merge.js +74 -0
- package/dist/hooks/settings-merge.js.map +1 -0
- package/dist/hooks/snapshot.d.ts +37 -0
- package/dist/hooks/snapshot.d.ts.map +1 -0
- package/dist/hooks/snapshot.js +180 -0
- package/dist/hooks/snapshot.js.map +1 -0
- package/dist/index.js +64 -5
- package/dist/index.js.map +1 -1
- package/dist/mask-rules-fetcher.d.ts +15 -0
- package/dist/mask-rules-fetcher.d.ts.map +1 -0
- package/dist/mask-rules-fetcher.js +67 -0
- package/dist/mask-rules-fetcher.js.map +1 -0
- package/dist/mcp/server.d.ts +118 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +240 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/onboarding-report.d.ts +66 -0
- package/dist/onboarding-report.d.ts.map +1 -0
- package/dist/onboarding-report.js +152 -0
- package/dist/onboarding-report.js.map +1 -0
- package/dist/onboarding.d.ts +55 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +98 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/pii-masker.d.ts +55 -1
- package/dist/pii-masker.d.ts.map +1 -1
- package/dist/pii-masker.js +137 -58
- package/dist/pii-masker.js.map +1 -1
- package/dist/privacy.d.ts +13 -0
- package/dist/privacy.d.ts.map +1 -0
- package/dist/privacy.js +67 -0
- package/dist/privacy.js.map +1 -0
- package/dist/residency.d.ts +21 -0
- package/dist/residency.d.ts.map +1 -0
- package/dist/residency.js +68 -0
- package/dist/residency.js.map +1 -0
- package/dist/secret-detector.d.ts +101 -0
- package/dist/secret-detector.d.ts.map +1 -0
- package/dist/secret-detector.js +516 -0
- package/dist/secret-detector.js.map +1 -0
- package/dist/store/local-store.d.ts +167 -0
- package/dist/store/local-store.d.ts.map +1 -0
- package/dist/store/local-store.js +538 -0
- package/dist/store/local-store.js.map +1 -0
- package/dist/store/schema.d.ts +38 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +189 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/types.d.ts +25 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/watcher.d.ts +6 -0
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +13 -2
- package/dist/watcher.js.map +1 -1
- package/package.json +4 -2
package/dist/cli/init.js
CHANGED
|
@@ -8,7 +8,12 @@ const promises_1 = __importDefault(require("fs/promises"));
|
|
|
8
8
|
const os_1 = __importDefault(require("os"));
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
10
10
|
const readline_1 = __importDefault(require("readline"));
|
|
11
|
+
const env_detect_1 = require("../env-detect");
|
|
12
|
+
const onboarding_1 = require("../onboarding");
|
|
13
|
+
const version_1 = require("../version");
|
|
11
14
|
const CONFIG_PATH = path_1.default.join(os_1.default.homedir(), '.promptkaizen', 'agent.config.json');
|
|
15
|
+
// 検出 0 件 / スキップ時の既定 watchPaths (後でログが現れたら拾えるよう標準パスを残す)。
|
|
16
|
+
const DEFAULT_WATCH_PATHS = ['~/.claude/projects/**/*.jsonl', '~/.codex/sessions/**/*.jsonl'];
|
|
12
17
|
const ENDPOINTS = {
|
|
13
18
|
stg: 'https://asia-northeast1-promptkaizen-stg.cloudfunctions.net/receiveObservations',
|
|
14
19
|
prod: 'https://asia-northeast1-promptkaizen-prod.cloudfunctions.net/receiveObservations',
|
|
@@ -25,12 +30,16 @@ const ENDPOINTS = {
|
|
|
25
30
|
*/
|
|
26
31
|
async function runInit(argv) {
|
|
27
32
|
const flags = parseFlags(argv);
|
|
33
|
+
// オンボーディング・ファネルの起点 (#109): TTV の計測開始点。
|
|
34
|
+
await (0, onboarding_1.recordStage)('init', { agentVersion: version_1.AGENT_VERSION });
|
|
28
35
|
const isYes = flags.yes;
|
|
29
36
|
const envApiKey = process.env.PK_API_KEY?.trim() || '';
|
|
30
37
|
const apiKeyFromFlag = (flags.apiKey ?? envApiKey).trim();
|
|
31
38
|
const envFromFlag = (flags.env ?? '').trim().toLowerCase();
|
|
32
39
|
const maskEmailsFromFlag = flags.maskEmails;
|
|
33
|
-
|
|
40
|
+
// Issue #68: 完全ローカル動作。apiKey/apiEndpoint なしの config を書き、送信ゼロにする。
|
|
41
|
+
const localOnly = flags.localOnly;
|
|
42
|
+
const nonInteractive = isYes || localOnly || (apiKeyFromFlag && envFromFlag);
|
|
34
43
|
const rl = nonInteractive
|
|
35
44
|
? null
|
|
36
45
|
: readline_1.default.createInterface({ input: process.stdin, output: process.stdout });
|
|
@@ -49,6 +58,27 @@ async function runInit(argv) {
|
|
|
49
58
|
return;
|
|
50
59
|
}
|
|
51
60
|
}
|
|
61
|
+
// 環境オートディテクト (#105): 質問なしで解析対象 (Claude Code / Codex) を確定する。
|
|
62
|
+
// 手入力フォールバックは検出 0 件のときだけに限定し、最初の摩擦を消す。
|
|
63
|
+
const watchPaths = await resolveWatchPaths(ask, Boolean(nonInteractive));
|
|
64
|
+
// Issue #68: 完全ローカル動作なら endpoint/apiKey を尋ねずローカル専用 config を書く。
|
|
65
|
+
if (localOnly) {
|
|
66
|
+
const maskEmails = maskEmailsFromFlag;
|
|
67
|
+
const config = {
|
|
68
|
+
watchPaths,
|
|
69
|
+
exclude: [],
|
|
70
|
+
localStore: { enabled: true },
|
|
71
|
+
privacy: { sendPromptBody: false },
|
|
72
|
+
agent: { skipInitialBacklog: true },
|
|
73
|
+
pii: { maskFilePaths: true, maskApiKeys: true, maskEmails, customPatterns: [], syncOrgRules: false },
|
|
74
|
+
telemetry: { level: 'info' },
|
|
75
|
+
};
|
|
76
|
+
await promises_1.default.mkdir(path_1.default.dirname(CONFIG_PATH), { recursive: true });
|
|
77
|
+
await promises_1.default.writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
78
|
+
console.log(`✅ Local-only config written to ${CONFIG_PATH} (no cloud send)`);
|
|
79
|
+
console.log('🔒 解析はこのマシン内で完結します(クラウドへの送信なし/秘密情報はマスク)');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
52
82
|
// 1. environment
|
|
53
83
|
const envAns = envFromFlag ||
|
|
54
84
|
(await ask('Environment? [stg / prod / custom] (default: stg): ', 'stg')) ||
|
|
@@ -85,7 +115,7 @@ async function runInit(argv) {
|
|
|
85
115
|
const config = {
|
|
86
116
|
apiEndpoint,
|
|
87
117
|
apiKey,
|
|
88
|
-
watchPaths
|
|
118
|
+
watchPaths,
|
|
89
119
|
exclude: [],
|
|
90
120
|
batch: { intervalMs: 5000, maxEntries: 50 },
|
|
91
121
|
agent: { skipInitialBacklog: true },
|
|
@@ -100,10 +130,13 @@ async function runInit(argv) {
|
|
|
100
130
|
await promises_1.default.mkdir(path_1.default.dirname(CONFIG_PATH), { recursive: true });
|
|
101
131
|
await promises_1.default.writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
102
132
|
console.log(`✅ Config written to ${CONFIG_PATH}`);
|
|
133
|
+
// ローカル完結の訴求 (#104)。online でも解析は端末内で行い、送信はマスク後メタのみ。
|
|
134
|
+
console.log('🔒 解析はこのマシン内で実行されます。秘密情報はマスクしてから扱い、生の秘密はローカルにも残しません');
|
|
103
135
|
if (!nonInteractive) {
|
|
104
136
|
console.log('\nNext steps:');
|
|
105
|
-
console.log(' promptkaizen-agent
|
|
106
|
-
console.log(' promptkaizen-agent
|
|
137
|
+
console.log(' promptkaizen-agent report # 初回レポート(スコア付きサマリ)を表示 ← まずこれ');
|
|
138
|
+
console.log(' promptkaizen-agent enable # 今後のセッションを自動チェック(hooks + 常駐監視)');
|
|
139
|
+
console.log(' promptkaizen-agent scan # 検出ヒットの詳細一覧');
|
|
107
140
|
console.log(' promptkaizen-agent status # health check');
|
|
108
141
|
}
|
|
109
142
|
}
|
|
@@ -111,8 +144,38 @@ async function runInit(argv) {
|
|
|
111
144
|
rl?.close();
|
|
112
145
|
}
|
|
113
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* 環境オートディテクト (#105) で watchPaths を確定する。
|
|
149
|
+
* - 検出あり: 質問なしで検出ツールの glob を採用。
|
|
150
|
+
* - 検出 0 件 (対話時のみ): カスタムパス/glob を 1 度だけ尋ねる。glob でなければ
|
|
151
|
+
* ディレクトリとみなして `/**/*.jsonl` を補う。空入力 / 非対話なら標準パスを既定にする。
|
|
152
|
+
*/
|
|
153
|
+
async function resolveWatchPaths(ask, nonInteractive) {
|
|
154
|
+
const env = await (0, env_detect_1.detectEnvironment)();
|
|
155
|
+
if (!nonInteractive) {
|
|
156
|
+
console.log('検出された環境:');
|
|
157
|
+
for (const line of (0, env_detect_1.formatDetectionSummary)(env))
|
|
158
|
+
console.log(line);
|
|
159
|
+
console.log('');
|
|
160
|
+
}
|
|
161
|
+
if (env.anyDetected) {
|
|
162
|
+
if (!nonInteractive) {
|
|
163
|
+
console.log(`✅ 解析対象を自動確定しました(${env.detected.map((t) => t.label).join(' + ')})\n`);
|
|
164
|
+
}
|
|
165
|
+
return env.watchPaths;
|
|
166
|
+
}
|
|
167
|
+
// 検出 0 件のときだけ手入力フォールバック。
|
|
168
|
+
const custom = (await ask('履歴が見つかりませんでした。監視するログのパス/glob を入力(空でスキップ): ', '')).trim();
|
|
169
|
+
if (custom) {
|
|
170
|
+
return [custom.includes('*') ? custom : `${custom.replace(/\/+$/, '')}/**/*.jsonl`];
|
|
171
|
+
}
|
|
172
|
+
if (!nonInteractive) {
|
|
173
|
+
console.log('標準パス(~/.claude, ~/.codex)を監視対象に設定しました。\n');
|
|
174
|
+
}
|
|
175
|
+
return DEFAULT_WATCH_PATHS;
|
|
176
|
+
}
|
|
114
177
|
function parseFlags(argv) {
|
|
115
|
-
const out = { maskEmails: false, yes: false };
|
|
178
|
+
const out = { maskEmails: false, yes: false, localOnly: false };
|
|
116
179
|
for (let i = 0; i < argv.length; i++) {
|
|
117
180
|
const a = argv[i];
|
|
118
181
|
if (a === '--api-key' && i + 1 < argv.length)
|
|
@@ -123,6 +186,8 @@ function parseFlags(argv) {
|
|
|
123
186
|
out.maskEmails = true;
|
|
124
187
|
else if (a === '--yes' || a === '-y')
|
|
125
188
|
out.yes = true;
|
|
189
|
+
else if (a === '--local-only')
|
|
190
|
+
out.localOnly = true;
|
|
126
191
|
}
|
|
127
192
|
return out;
|
|
128
193
|
}
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** 後方互換: Claude Code の settings.json パス。 */
|
|
2
|
+
export declare function settingsPath(): string;
|
|
3
|
+
export declare function runInstallHooks(argv: string[]): Promise<void>;
|
|
4
|
+
export declare function runUninstallHooks(argv: string[]): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=install-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-hooks.d.ts","sourceRoot":"","sources":["../../src/cli/install-hooks.ts"],"names":[],"mappings":"AAeA,4CAA4C;AAC5C,wBAAgB,YAAY,IAAI,MAAM,CAErC;AA4BD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCnE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBrE"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.settingsPath = settingsPath;
|
|
7
|
+
exports.runInstallHooks = runInstallHooks;
|
|
8
|
+
exports.runUninstallHooks = runUninstallHooks;
|
|
9
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const settings_merge_1 = require("../hooks/settings-merge");
|
|
13
|
+
const platforms_1 = require("../hooks/platforms");
|
|
14
|
+
// =============================================
|
|
15
|
+
// `promptkaizen-agent install-hooks [--platform claude-code|codex]` / `uninstall-hooks` (Issue #67 / #70)
|
|
16
|
+
// =============================================
|
|
17
|
+
//
|
|
18
|
+
// 対象プラットフォームの hooks 設定ファイルに PromptKaizen の hooks を登録/解除する。
|
|
19
|
+
// claude-code: ~/.claude/settings.json
|
|
20
|
+
// codex: ~/.codex/hooks.json (+ config.toml の [features] hooks = true が別途必要)
|
|
21
|
+
// 既存設定は破壊せずマージ (settings-merge.ts の純粋関数)。OS 非依存。
|
|
22
|
+
/** 後方互換: Claude Code の settings.json パス。 */
|
|
23
|
+
function settingsPath() {
|
|
24
|
+
return (0, platforms_1.getPlatformConfig)('claude-code').settingsFile;
|
|
25
|
+
}
|
|
26
|
+
function parsePlatform(argv) {
|
|
27
|
+
const idx = argv.indexOf('--platform');
|
|
28
|
+
if (idx >= 0 && idx + 1 < argv.length && (0, platforms_1.isHookPlatform)(argv[idx + 1])) {
|
|
29
|
+
return argv[idx + 1];
|
|
30
|
+
}
|
|
31
|
+
return 'claude-code';
|
|
32
|
+
}
|
|
33
|
+
async function readSettings(p) {
|
|
34
|
+
try {
|
|
35
|
+
const raw = await promises_1.default.readFile(p, 'utf8');
|
|
36
|
+
const parsed = JSON.parse(raw);
|
|
37
|
+
return parsed && typeof parsed === 'object' ? parsed : {};
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
const code = e.code;
|
|
41
|
+
if (code === 'ENOENT')
|
|
42
|
+
return {};
|
|
43
|
+
// JSON 壊れ等は上書きすると危険なので中断する。
|
|
44
|
+
throw new Error(`設定ファイルを読めません (${p}): ${e.message}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function writeSettings(p, data) {
|
|
48
|
+
await promises_1.default.mkdir(path_1.default.dirname(p), { recursive: true });
|
|
49
|
+
await promises_1.default.writeFile(p, JSON.stringify(data, null, 2) + '\n', 'utf8');
|
|
50
|
+
}
|
|
51
|
+
async function runInstallHooks(argv) {
|
|
52
|
+
const platform = parsePlatform(argv);
|
|
53
|
+
const cfg = (0, platforms_1.getPlatformConfig)(platform);
|
|
54
|
+
const p = cfg.settingsFile;
|
|
55
|
+
let settings;
|
|
56
|
+
try {
|
|
57
|
+
settings = await readSettings(p);
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
console.error(e.message);
|
|
61
|
+
console.error('壊れた設定ファイルは手動で確認してください。');
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
// 既存ファイルがあればバックアップ。
|
|
65
|
+
try {
|
|
66
|
+
await promises_1.default.access(p);
|
|
67
|
+
await promises_1.default.copyFile(p, `${p}.promptkaizen.bak`);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
/* ファイルなし or バックアップ失敗は無視 */
|
|
71
|
+
}
|
|
72
|
+
const merged = (0, settings_merge_1.mergeHooks)(settings, cfg.registrations, cfg.commandMarker);
|
|
73
|
+
await writeSettings(p, merged);
|
|
74
|
+
const label = platform === 'codex' ? 'Codex CLI' : 'Claude Code';
|
|
75
|
+
console.log(`✅ ${label} hooks を登録しました: ${p}`);
|
|
76
|
+
console.log(' PreToolUse で機密情報を含むツール実行を事前ブロックします。');
|
|
77
|
+
if (platform === 'codex') {
|
|
78
|
+
await printCodexFeatureGuidance();
|
|
79
|
+
}
|
|
80
|
+
console.log('\nVerify:');
|
|
81
|
+
console.log(` ${label} を再起動し、ダミーキーを含むツール実行が拒否されることを確認`);
|
|
82
|
+
console.log(` 解除: promptkaizen-agent uninstall-hooks${platform === 'codex' ? ' --platform codex' : ''}`);
|
|
83
|
+
}
|
|
84
|
+
async function runUninstallHooks(argv) {
|
|
85
|
+
const platform = parsePlatform(argv);
|
|
86
|
+
const cfg = (0, platforms_1.getPlatformConfig)(platform);
|
|
87
|
+
const p = cfg.settingsFile;
|
|
88
|
+
let settings;
|
|
89
|
+
try {
|
|
90
|
+
settings = await readSettings(p);
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
console.error(e.message);
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
const label = platform === 'codex' ? 'Codex CLI' : 'Claude Code';
|
|
97
|
+
if (!(0, settings_merge_1.hasOurHooks)(settings, cfg.commandMarker)) {
|
|
98
|
+
console.log(`PromptKaizen の ${label} hooks は登録されていません。`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const next = (0, settings_merge_1.removeHooks)(settings, cfg.commandMarker);
|
|
102
|
+
await writeSettings(p, next);
|
|
103
|
+
console.log(`✅ ${label} hooks を解除しました: ${p} (他の hooks は保持)`);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Codex は ~/.codex/config.toml に [features] hooks = true が必要。自動書き換えはせず、
|
|
107
|
+
* 現状を確認して不足していれば追記内容を案内する (config.toml は手で触る運用が安全)。
|
|
108
|
+
*/
|
|
109
|
+
async function printCodexFeatureGuidance() {
|
|
110
|
+
const tomlPath = path_1.default.join(os_1.default.homedir(), '.codex', 'config.toml');
|
|
111
|
+
let enabled = false;
|
|
112
|
+
let exists = false;
|
|
113
|
+
try {
|
|
114
|
+
const raw = await promises_1.default.readFile(tomlPath, 'utf8');
|
|
115
|
+
exists = true;
|
|
116
|
+
// [features] セクション内の hooks = true を素朴に判定 (厳密な toml パースは不要)。
|
|
117
|
+
enabled = /\[features\][^[]*?\bhooks\s*=\s*true/s.test(raw);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
/* 無ければ未設定扱い */
|
|
121
|
+
}
|
|
122
|
+
if (enabled) {
|
|
123
|
+
console.log(` config.toml の [features] hooks = true は設定済みです (${tomlPath})`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
console.log('\n⚠️ Codex CLI は hooks を有効化する設定が別途必要です。');
|
|
127
|
+
console.log(` ${tomlPath} に以下を追記してください:`);
|
|
128
|
+
console.log('\n [features]');
|
|
129
|
+
console.log(' hooks = true\n');
|
|
130
|
+
console.log(exists ? ' (既存の config.toml に [features] セクションがあれば hooks = true を足すだけ)' : ' (config.toml が無ければ新規作成)');
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=install-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/cli/install-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const SYSTEMD_UNIT_NAME = "promptkaizen-agent.service";
|
|
2
|
+
export declare function unitPath(): string;
|
|
3
|
+
export interface UnitOptions {
|
|
4
|
+
nodeBin: string;
|
|
5
|
+
agentScript: string;
|
|
6
|
+
logDir: string;
|
|
7
|
+
}
|
|
8
|
+
/** systemd user unit の内容を組み立て。テスト容易性のため引数で外部依存を受ける */
|
|
9
|
+
export declare function buildUnit(opts: UnitOptions): string;
|
|
10
|
+
/**
|
|
11
|
+
* `promptkaizen-agent install-systemd`
|
|
12
|
+
*
|
|
13
|
+
* Linux の systemd user unit に agent を登録して、ログイン時に自動起動 + 落ちたら
|
|
14
|
+
* 自動再起動 (install-launchd の Linux 版)。既存 unit があれば上書きして再起動。
|
|
15
|
+
*/
|
|
16
|
+
export declare function runInstallSystemd(_argv: string[]): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=install-systemd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-systemd.d.ts","sourceRoot":"","sources":["../../src/cli/install-systemd.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB,+BAA+B,CAAA;AAE7D,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAkBnD;AAWD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CtE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SYSTEMD_UNIT_NAME = void 0;
|
|
7
|
+
exports.unitPath = unitPath;
|
|
8
|
+
exports.buildUnit = buildUnit;
|
|
9
|
+
exports.runInstallSystemd = runInstallSystemd;
|
|
10
|
+
const child_process_1 = require("child_process");
|
|
11
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
12
|
+
const os_1 = __importDefault(require("os"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
exports.SYSTEMD_UNIT_NAME = 'promptkaizen-agent.service';
|
|
15
|
+
function unitPath() {
|
|
16
|
+
return path_1.default.join(os_1.default.homedir(), '.config', 'systemd', 'user', exports.SYSTEMD_UNIT_NAME);
|
|
17
|
+
}
|
|
18
|
+
/** systemd user unit の内容を組み立て。テスト容易性のため引数で外部依存を受ける */
|
|
19
|
+
function buildUnit(opts) {
|
|
20
|
+
// systemd は引用符付きの space-separated 引数を解釈する。% は specifier なので %% に。
|
|
21
|
+
const exec = [opts.nodeBin, opts.agentScript, 'start'].map(quoteExecArg).join(' ');
|
|
22
|
+
return `[Unit]
|
|
23
|
+
Description=PromptKaizen local observability agent (Claude Code / Codex CLI)
|
|
24
|
+
After=network-online.target
|
|
25
|
+
|
|
26
|
+
[Service]
|
|
27
|
+
ExecStart=${exec}
|
|
28
|
+
Restart=always
|
|
29
|
+
RestartSec=5
|
|
30
|
+
# StandardOutput/Error の append: は systemd 240+ (Ubuntu 20.04+/Debian 11+)
|
|
31
|
+
StandardOutput=append:${escapeUnitValue(path_1.default.join(opts.logDir, 'agent.log'))}
|
|
32
|
+
StandardError=append:${escapeUnitValue(path_1.default.join(opts.logDir, 'agent.error.log'))}
|
|
33
|
+
|
|
34
|
+
[Install]
|
|
35
|
+
WantedBy=default.target
|
|
36
|
+
`;
|
|
37
|
+
}
|
|
38
|
+
/** ExecStart の 1 引数を quote (空白対応) + systemd specifier (%) を escape。 */
|
|
39
|
+
function quoteExecArg(s) {
|
|
40
|
+
return `"${escapeUnitValue(s).replaceAll('"', '\\"')}"`;
|
|
41
|
+
}
|
|
42
|
+
function escapeUnitValue(s) {
|
|
43
|
+
return s.replaceAll('%', '%%');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* `promptkaizen-agent install-systemd`
|
|
47
|
+
*
|
|
48
|
+
* Linux の systemd user unit に agent を登録して、ログイン時に自動起動 + 落ちたら
|
|
49
|
+
* 自動再起動 (install-launchd の Linux 版)。既存 unit があれば上書きして再起動。
|
|
50
|
+
*/
|
|
51
|
+
async function runInstallSystemd(_argv) {
|
|
52
|
+
if (process.platform !== 'linux') {
|
|
53
|
+
console.error('install-systemd is Linux only. Use install-launchd on macOS.');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
// dist/cli/install-systemd.js から見て dist/index.js を絶対パスで指す
|
|
57
|
+
const agentScript = path_1.default.resolve(__dirname, '..', 'index.js');
|
|
58
|
+
await assertExists(agentScript, 'Agent script not found. Did you run `npm run build`?');
|
|
59
|
+
const logDir = path_1.default.join(os_1.default.homedir(), '.promptkaizen');
|
|
60
|
+
await promises_1.default.mkdir(logDir, { recursive: true });
|
|
61
|
+
const unit = buildUnit({
|
|
62
|
+
nodeBin: process.execPath,
|
|
63
|
+
agentScript,
|
|
64
|
+
logDir,
|
|
65
|
+
});
|
|
66
|
+
const dst = unitPath();
|
|
67
|
+
await promises_1.default.mkdir(path_1.default.dirname(dst), { recursive: true });
|
|
68
|
+
await promises_1.default.writeFile(dst, unit, 'utf8');
|
|
69
|
+
console.log(`✅ Wrote unit: ${dst}`);
|
|
70
|
+
try {
|
|
71
|
+
(0, child_process_1.execSync)('systemctl --user daemon-reload', { stdio: 'inherit' });
|
|
72
|
+
(0, child_process_1.execSync)(`systemctl --user enable --now ${exports.SYSTEMD_UNIT_NAME}`, { stdio: 'inherit' });
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
console.error(`systemctl failed: ${e.message}`);
|
|
76
|
+
console.error('Hint: systemd user セッションが無い環境 (一部のコンテナ/WSL) では `sudo loginctl enable-linger $USER` の後にログインし直してください。');
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
console.log(`✅ systemd user unit registered: ${exports.SYSTEMD_UNIT_NAME}`);
|
|
80
|
+
console.log('\nNote: ログアウト後・再起動後も常駐させるには linger を有効化してください:');
|
|
81
|
+
console.log(' sudo loginctl enable-linger $USER');
|
|
82
|
+
console.log('\nVerify with:');
|
|
83
|
+
console.log(` systemctl --user status ${exports.SYSTEMD_UNIT_NAME}`);
|
|
84
|
+
console.log(' tail -f ~/.promptkaizen/agent.log');
|
|
85
|
+
console.log(' promptkaizen-agent status');
|
|
86
|
+
}
|
|
87
|
+
async function assertExists(p, msg) {
|
|
88
|
+
try {
|
|
89
|
+
await promises_1.default.access(p);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
console.error(`${msg} (looked for ${p})`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=install-systemd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-systemd.js","sourceRoot":"","sources":["../../src/cli/install-systemd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const TASK_NAME = "PromptKaizenAgent";
|
|
2
|
+
export interface TaskXmlOptions {
|
|
3
|
+
nodeBin: string;
|
|
4
|
+
agentScript: string;
|
|
5
|
+
logDir: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Task Scheduler のタスク定義 XML を組み立て (Issue #61)。
|
|
9
|
+
* テスト容易性のため引数で外部依存を受ける (install-launchd / install-systemd と同パターン)。
|
|
10
|
+
*
|
|
11
|
+
* 設計:
|
|
12
|
+
* - LogonTrigger + Repetition (PT5M): launchd KeepAlive / systemd Restart=always の代替。
|
|
13
|
+
* Task Scheduler に「クラッシュ時再起動」は無いため、5 分ごとの再実行 +
|
|
14
|
+
* MultipleInstancesPolicy=IgnoreNew (稼働中なら何もしない) で watchdog にする。
|
|
15
|
+
* - 出力リダイレクト: Task Scheduler は stdout を拾えないため cmd /c 経由で
|
|
16
|
+
* ~/.promptkaizen/agent.log へ追記 (launchd/systemd とログの場所を揃える)。
|
|
17
|
+
* - ExecutionTimeLimit=PT0S (常駐のため無制限) / バッテリー時も起動。
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildTaskXml(opts: TaskXmlOptions): string;
|
|
20
|
+
export declare function escapeXml(s: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* `promptkaizen-agent install-task`
|
|
23
|
+
*
|
|
24
|
+
* Windows の Task Scheduler に agent を登録 (ログオン時自動起動 + 5 分間隔の
|
|
25
|
+
* watchdog 再実行)。既存タスクは /F で上書き。
|
|
26
|
+
*/
|
|
27
|
+
export declare function runInstallTask(_argv: string[]): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=install-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-task.d.ts","sourceRoot":"","sources":["../../src/cli/install-task.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS,sBAAsB,CAAA;AAE5C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAqCzD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM3C;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CnE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TASK_NAME = void 0;
|
|
7
|
+
exports.buildTaskXml = buildTaskXml;
|
|
8
|
+
exports.escapeXml = escapeXml;
|
|
9
|
+
exports.runInstallTask = runInstallTask;
|
|
10
|
+
const child_process_1 = require("child_process");
|
|
11
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
12
|
+
const os_1 = __importDefault(require("os"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
exports.TASK_NAME = 'PromptKaizenAgent';
|
|
15
|
+
/**
|
|
16
|
+
* Task Scheduler のタスク定義 XML を組み立て (Issue #61)。
|
|
17
|
+
* テスト容易性のため引数で外部依存を受ける (install-launchd / install-systemd と同パターン)。
|
|
18
|
+
*
|
|
19
|
+
* 設計:
|
|
20
|
+
* - LogonTrigger + Repetition (PT5M): launchd KeepAlive / systemd Restart=always の代替。
|
|
21
|
+
* Task Scheduler に「クラッシュ時再起動」は無いため、5 分ごとの再実行 +
|
|
22
|
+
* MultipleInstancesPolicy=IgnoreNew (稼働中なら何もしない) で watchdog にする。
|
|
23
|
+
* - 出力リダイレクト: Task Scheduler は stdout を拾えないため cmd /c 経由で
|
|
24
|
+
* ~/.promptkaizen/agent.log へ追記 (launchd/systemd とログの場所を揃える)。
|
|
25
|
+
* - ExecutionTimeLimit=PT0S (常駐のため無制限) / バッテリー時も起動。
|
|
26
|
+
*/
|
|
27
|
+
function buildTaskXml(opts) {
|
|
28
|
+
// Windows 専用 XML のため、実行 OS に関わらず backslash で結合する
|
|
29
|
+
// (posix 環境でのビルド/テストでも出力を不変にする)。
|
|
30
|
+
const logFile = path_1.default.win32.join(opts.logDir, 'agent.log');
|
|
31
|
+
// cmd /c "<node> <script> start >> <log> 2>&1" — 各パスは二重引用符で空白対応
|
|
32
|
+
const command = `"${opts.nodeBin}" "${opts.agentScript}" start >> "${logFile}" 2>&1`;
|
|
33
|
+
return `<?xml version="1.0" encoding="UTF-16"?>
|
|
34
|
+
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
|
35
|
+
<RegistrationInfo>
|
|
36
|
+
<Description>PromptKaizen local observability agent (Claude Code / Codex CLI)</Description>
|
|
37
|
+
</RegistrationInfo>
|
|
38
|
+
<Triggers>
|
|
39
|
+
<LogonTrigger>
|
|
40
|
+
<Enabled>true</Enabled>
|
|
41
|
+
<Repetition>
|
|
42
|
+
<Interval>PT5M</Interval>
|
|
43
|
+
<StopAtDurationEnd>false</StopAtDurationEnd>
|
|
44
|
+
</Repetition>
|
|
45
|
+
</LogonTrigger>
|
|
46
|
+
</Triggers>
|
|
47
|
+
<Settings>
|
|
48
|
+
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
|
49
|
+
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
|
|
50
|
+
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
|
|
51
|
+
<StartWhenAvailable>true</StartWhenAvailable>
|
|
52
|
+
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
|
|
53
|
+
<Hidden>true</Hidden>
|
|
54
|
+
</Settings>
|
|
55
|
+
<Actions Context="Author">
|
|
56
|
+
<Exec>
|
|
57
|
+
<Command>C:\\Windows\\System32\\cmd.exe</Command>
|
|
58
|
+
<Arguments>/c ${escapeXml(command)}</Arguments>
|
|
59
|
+
<WorkingDirectory>${escapeXml(opts.logDir)}</WorkingDirectory>
|
|
60
|
+
</Exec>
|
|
61
|
+
</Actions>
|
|
62
|
+
</Task>
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
function escapeXml(s) {
|
|
66
|
+
return s
|
|
67
|
+
.replaceAll('&', '&')
|
|
68
|
+
.replaceAll('<', '<')
|
|
69
|
+
.replaceAll('>', '>')
|
|
70
|
+
.replaceAll('"', '"');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* `promptkaizen-agent install-task`
|
|
74
|
+
*
|
|
75
|
+
* Windows の Task Scheduler に agent を登録 (ログオン時自動起動 + 5 分間隔の
|
|
76
|
+
* watchdog 再実行)。既存タスクは /F で上書き。
|
|
77
|
+
*/
|
|
78
|
+
async function runInstallTask(_argv) {
|
|
79
|
+
if (process.platform !== 'win32') {
|
|
80
|
+
console.error('install-task is Windows only. Use install-launchd (macOS) / install-systemd (Linux).');
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
const agentScript = path_1.default.resolve(__dirname, '..', 'index.js');
|
|
84
|
+
try {
|
|
85
|
+
await promises_1.default.access(agentScript);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
console.error(`Agent script not found. Did you run \`npm run build\`? (looked for ${agentScript})`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
const logDir = path_1.default.join(os_1.default.homedir(), '.promptkaizen');
|
|
92
|
+
await promises_1.default.mkdir(logDir, { recursive: true });
|
|
93
|
+
const xml = buildTaskXml({
|
|
94
|
+
nodeBin: process.execPath,
|
|
95
|
+
agentScript,
|
|
96
|
+
logDir,
|
|
97
|
+
});
|
|
98
|
+
// schtasks /XML は UTF-16LE (BOM 付き) を要求する。
|
|
99
|
+
const xmlPath = path_1.default.join(logDir, 'task.xml');
|
|
100
|
+
await promises_1.default.writeFile(xmlPath, '\uFEFF' + xml, { encoding: 'utf16le' });
|
|
101
|
+
console.log(`✅ Wrote task XML: ${xmlPath}`);
|
|
102
|
+
try {
|
|
103
|
+
(0, child_process_1.execFileSync)('schtasks', ['/Create', '/TN', exports.TASK_NAME, '/XML', xmlPath, '/F'], {
|
|
104
|
+
stdio: 'inherit',
|
|
105
|
+
});
|
|
106
|
+
// 登録直後に即時起動 (LogonTrigger は次回ログオンまで発火しないため)。
|
|
107
|
+
(0, child_process_1.execFileSync)('schtasks', ['/Run', '/TN', exports.TASK_NAME], { stdio: 'ignore' });
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
console.error(`schtasks failed: ${e.message}`);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
console.log(`✅ Task Scheduler task registered: ${exports.TASK_NAME}`);
|
|
114
|
+
console.log('\nVerify with:');
|
|
115
|
+
console.log(` schtasks /Query /TN ${exports.TASK_NAME}`);
|
|
116
|
+
console.log(' type %USERPROFILE%\\.promptkaizen\\agent.log');
|
|
117
|
+
console.log(' promptkaizen-agent status');
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=install-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-task.js","sourceRoot":"","sources":["../../src/cli/install-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/cli/mcp.ts"],"names":[],"mappings":"AAwBA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA8H5C"}
|