@aipper/aiws 0.0.28 → 0.0.30
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 +18 -2
- package/bin/aiws.js +2 -2
- package/dist/aiws-package.d.ts +4 -0
- package/dist/aiws-package.js +11 -0
- package/dist/aiws-package.js.map +1 -0
- package/dist/aiws-paths.d.ts +48 -0
- package/dist/aiws-paths.js +129 -0
- package/dist/aiws-paths.js.map +1 -0
- package/dist/backup.d.ts +27 -0
- package/dist/backup.js +125 -0
- package/dist/backup.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +773 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-prompts.d.ts +17 -0
- package/dist/codex-prompts.js +49 -0
- package/dist/codex-prompts.js.map +1 -0
- package/dist/codex-skills.d.ts +17 -0
- package/dist/codex-skills.js +75 -0
- package/dist/codex-skills.js.map +1 -0
- package/dist/commands/change-advice.d.ts +25 -0
- package/dist/commands/change-advice.js +197 -0
- package/dist/commands/change-advice.js.map +1 -0
- package/dist/commands/change-evidence-command.d.ts +29 -0
- package/dist/commands/change-evidence-command.js +213 -0
- package/dist/commands/change-evidence-command.js.map +1 -0
- package/dist/commands/change-evidence-entry.d.ts +16 -0
- package/dist/commands/change-evidence-entry.js +35 -0
- package/dist/commands/change-evidence-entry.js.map +1 -0
- package/dist/commands/change-evidence.d.ts +108 -0
- package/dist/commands/change-evidence.js +341 -0
- package/dist/commands/change-evidence.js.map +1 -0
- package/dist/commands/change-finish.d.ts +71 -0
- package/dist/commands/change-finish.js +387 -0
- package/dist/commands/change-finish.js.map +1 -0
- package/dist/commands/change-git-status.d.ts +22 -0
- package/dist/commands/change-git-status.js +50 -0
- package/dist/commands/change-git-status.js.map +1 -0
- package/dist/commands/change-lifecycle-entry.d.ts +29 -0
- package/{src → dist}/commands/change-lifecycle-entry.js +21 -28
- package/dist/commands/change-lifecycle-entry.js.map +1 -0
- package/dist/commands/change-lifecycle.d.ts +56 -0
- package/dist/commands/change-lifecycle.js +211 -0
- package/dist/commands/change-lifecycle.js.map +1 -0
- package/dist/commands/change-metrics-command.d.ts +12 -0
- package/dist/commands/change-metrics-command.js +110 -0
- package/dist/commands/change-metrics-command.js.map +1 -0
- package/dist/commands/change-next-command.d.ts +18 -0
- package/dist/commands/change-next-command.js +138 -0
- package/dist/commands/change-next-command.js.map +1 -0
- package/dist/commands/change-review-gates.d.ts +107 -0
- package/dist/commands/change-review-gates.js +329 -0
- package/dist/commands/change-review-gates.js.map +1 -0
- package/dist/commands/change-scope-gate.d.ts +21 -0
- package/dist/commands/change-scope-gate.js +32 -0
- package/dist/commands/change-scope-gate.js.map +1 -0
- package/dist/commands/change-start.d.ts +30 -0
- package/dist/commands/change-start.js +91 -0
- package/dist/commands/change-start.js.map +1 -0
- package/dist/commands/change-state-command.d.ts +3 -0
- package/dist/commands/change-state-command.js +32 -0
- package/dist/commands/change-state-command.js.map +1 -0
- package/dist/commands/change-status-command.d.ts +13 -0
- package/dist/commands/change-status-command.js +126 -0
- package/dist/commands/change-status-command.js.map +1 -0
- package/dist/commands/change-status-context.d.ts +58 -0
- package/dist/commands/change-status-context.js +166 -0
- package/dist/commands/change-status-context.js.map +1 -0
- package/dist/commands/change-task-stats.d.ts +24 -0
- package/dist/commands/change-task-stats.js +66 -0
- package/dist/commands/change-task-stats.js.map +1 -0
- package/dist/commands/change-validate-entry.d.ts +17 -0
- package/dist/commands/change-validate-entry.js +44 -0
- package/dist/commands/change-validate-entry.js.map +1 -0
- package/dist/commands/change-validate.d.ts +32 -0
- package/dist/commands/change-validate.js +128 -0
- package/dist/commands/change-validate.js.map +1 -0
- package/dist/commands/change.d.ts +322 -0
- package/dist/commands/change.js +1731 -0
- package/dist/commands/change.js.map +1 -0
- package/dist/commands/codex-install-prompts.d.ts +4 -0
- package/dist/commands/codex-install-prompts.js +68 -0
- package/dist/commands/codex-install-prompts.js.map +1 -0
- package/dist/commands/codex-install-skills.d.ts +4 -0
- package/dist/commands/codex-install-skills.js +74 -0
- package/dist/commands/codex-install-skills.js.map +1 -0
- package/dist/commands/codex-status-prompts.d.ts +4 -0
- package/dist/commands/codex-status-prompts.js +44 -0
- package/dist/commands/codex-status-prompts.js.map +1 -0
- package/dist/commands/codex-status-skills.d.ts +4 -0
- package/dist/commands/codex-status-skills.js +54 -0
- package/dist/commands/codex-status-skills.js.map +1 -0
- package/dist/commands/codex-uninstall-prompts.d.ts +4 -0
- package/dist/commands/codex-uninstall-prompts.js +51 -0
- package/dist/commands/codex-uninstall-prompts.js.map +1 -0
- package/dist/commands/codex-uninstall-skills.d.ts +4 -0
- package/dist/commands/codex-uninstall-skills.js +59 -0
- package/dist/commands/codex-uninstall-skills.js.map +1 -0
- package/dist/commands/dashboard.d.ts +222 -0
- package/dist/commands/dashboard.js +193 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/hooks-install.d.ts +4 -0
- package/dist/commands/hooks-install.js +90 -0
- package/dist/commands/hooks-install.js.map +1 -0
- package/dist/commands/hooks-status.d.ts +4 -0
- package/dist/commands/hooks-status.js +89 -0
- package/dist/commands/hooks-status.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +100 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/opencode-auto.d.ts +11 -0
- package/dist/commands/opencode-auto.js +158 -0
- package/dist/commands/opencode-auto.js.map +1 -0
- package/dist/commands/opencode-status.d.ts +4 -0
- package/dist/commands/opencode-status.js +75 -0
- package/dist/commands/opencode-status.js.map +1 -0
- package/dist/commands/opencode-supervise.d.ts +24 -0
- package/dist/commands/opencode-supervise.js +188 -0
- package/dist/commands/opencode-supervise.js.map +1 -0
- package/dist/commands/rollback.d.ts +4 -0
- package/dist/commands/rollback.js +12 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.js +212 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +4 -0
- package/dist/commands/validate.js +222 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/ws-commit.d.ts +5 -0
- package/dist/commands/ws-commit.js +39 -0
- package/dist/commands/ws-commit.js.map +1 -0
- package/dist/commands/ws-deliver.d.ts +5 -0
- package/dist/commands/ws-deliver.js +59 -0
- package/dist/commands/ws-deliver.js.map +1 -0
- package/dist/commands/ws-finish.d.ts +5 -0
- package/dist/commands/ws-finish.js +142 -0
- package/dist/commands/ws-finish.js.map +1 -0
- package/dist/commands/ws-handoff.d.ts +5 -0
- package/dist/commands/ws-handoff.js +35 -0
- package/dist/commands/ws-handoff.js.map +1 -0
- package/dist/commands/ws-migrate.d.ts +5 -0
- package/dist/commands/ws-migrate.js +41 -0
- package/dist/commands/ws-migrate.js.map +1 -0
- package/dist/commands/ws-plan-verify.d.ts +5 -0
- package/dist/commands/ws-plan-verify.js +38 -0
- package/dist/commands/ws-plan-verify.js.map +1 -0
- package/dist/commands/ws-pull.d.ts +5 -0
- package/dist/commands/ws-pull.js +26 -0
- package/dist/commands/ws-pull.js.map +1 -0
- package/dist/commands/ws-push.d.ts +5 -0
- package/dist/commands/ws-push.js +68 -0
- package/dist/commands/ws-push.js.map +1 -0
- package/dist/commands/ws-submodule-setup.d.ts +5 -0
- package/dist/commands/ws-submodule-setup.js +55 -0
- package/dist/commands/ws-submodule-setup.js.map +1 -0
- package/dist/commands/ws-verify-before-complete.d.ts +5 -0
- package/dist/commands/ws-verify-before-complete.js +35 -0
- package/dist/commands/ws-verify-before-complete.js.map +1 -0
- package/dist/dashboard/app.d.ts +1 -0
- package/dist/dashboard/app.js +370 -0
- package/dist/dashboard/app.js.map +1 -0
- package/dist/delegation/cli.d.ts +6 -0
- package/dist/delegation/cli.js +14 -0
- package/dist/delegation/cli.js.map +1 -0
- package/dist/delegation/index.d.ts +35 -0
- package/dist/delegation/index.js +118 -0
- package/dist/delegation/index.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -0
- package/dist/exec.d.ts +9 -0
- package/dist/exec.js +22 -0
- package/dist/exec.js.map +1 -0
- package/dist/fs.d.ts +9 -0
- package/dist/fs.js +62 -0
- package/dist/fs.js.map +1 -0
- package/dist/governance.d.ts +10 -0
- package/dist/governance.js +135 -0
- package/dist/governance.js.map +1 -0
- package/dist/hash.d.ts +3 -0
- package/dist/hash.js +13 -0
- package/dist/hash.js.map +1 -0
- package/dist/hooks/deploy-claude.d.ts +13 -0
- package/dist/hooks/deploy-claude.js +67 -0
- package/dist/hooks/deploy-claude.js.map +1 -0
- package/dist/journal.d.ts +22 -0
- package/dist/journal.js +112 -0
- package/dist/journal.js.map +1 -0
- package/dist/json-schema-lite.d.ts +22 -0
- package/dist/json-schema-lite.js +148 -0
- package/dist/json-schema-lite.js.map +1 -0
- package/dist/managed-blocks.d.ts +24 -0
- package/dist/managed-blocks.js +84 -0
- package/dist/managed-blocks.js.map +1 -0
- package/dist/manifest.d.ts +24 -0
- package/dist/manifest.js +145 -0
- package/dist/manifest.js.map +1 -0
- package/dist/opencode-env.d.ts +62 -0
- package/dist/opencode-env.js +178 -0
- package/dist/opencode-env.js.map +1 -0
- package/dist/path-utils.d.ts +2 -0
- package/dist/path-utils.js +8 -0
- package/dist/path-utils.js.map +1 -0
- package/dist/spec.d.ts +17 -0
- package/dist/spec.js +174 -0
- package/dist/spec.js.map +1 -0
- package/dist/template.d.ts +20 -0
- package/dist/template.js +123 -0
- package/dist/template.js.map +1 -0
- package/dist/workspace.d.ts +4 -0
- package/dist/workspace.js +19 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +11 -3
- package/src/aiws-package.js +0 -15
- package/src/backup.js +0 -149
- package/src/cli.js +0 -647
- package/src/codex-prompts.js +0 -74
- package/src/codex-skills.js +0 -111
- package/src/commands/change-advice.js +0 -200
- package/src/commands/change-evidence-command.js +0 -242
- package/src/commands/change-evidence-entry.js +0 -40
- package/src/commands/change-evidence.js +0 -340
- package/src/commands/change-finish.js +0 -484
- package/src/commands/change-git-status.js +0 -53
- package/src/commands/change-lifecycle.js +0 -236
- package/src/commands/change-metrics-command.js +0 -110
- package/src/commands/change-next-command.js +0 -129
- package/src/commands/change-review-gates.js +0 -315
- package/src/commands/change-scope-gate.js +0 -34
- package/src/commands/change-start.js +0 -120
- package/src/commands/change-state-command.js +0 -40
- package/src/commands/change-status-command.js +0 -134
- package/src/commands/change-status-context.js +0 -202
- package/src/commands/change-task-stats.js +0 -64
- package/src/commands/change-validate-entry.js +0 -45
- package/src/commands/change-validate.js +0 -127
- package/src/commands/change.js +0 -2087
- package/src/commands/codex-install-prompts.js +0 -68
- package/src/commands/codex-install-skills.js +0 -74
- package/src/commands/codex-status-prompts.js +0 -55
- package/src/commands/codex-status-skills.js +0 -63
- package/src/commands/codex-uninstall-prompts.js +0 -55
- package/src/commands/codex-uninstall-skills.js +0 -62
- package/src/commands/dashboard.js +0 -205
- package/src/commands/hooks-install.js +0 -92
- package/src/commands/hooks-status.js +0 -95
- package/src/commands/init.js +0 -93
- package/src/commands/opencode-status.js +0 -61
- package/src/commands/rollback.js +0 -13
- package/src/commands/update.js +0 -133
- package/src/commands/validate.js +0 -222
- package/src/dashboard/app.js +0 -371
- package/src/errors.js +0 -15
- package/src/exec.js +0 -34
- package/src/fs.js +0 -91
- package/src/governance.js +0 -159
- package/src/hash.js +0 -25
- package/src/json-schema-lite.js +0 -164
- package/src/managed-blocks.js +0 -131
- package/src/manifest.js +0 -153
- package/src/opencode-env.js +0 -76
- package/src/path-utils.js +0 -20
- package/src/spec.js +0 -195
- package/src/template.js +0 -187
- package/src/workspace.js +0 -23
- /package/{src → dist}/dashboard/index.html +0 -0
- /package/{src → dist}/dashboard/style.css +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import { loadTemplate } from "../spec.js";
|
|
4
|
+
import { expandManifestEntries, copyTemplateFileToWorkspace, applyManagedBlocksFromTemplate } from "../template.js";
|
|
5
|
+
import { loadAiwsPackage } from "../aiws-package.js";
|
|
6
|
+
import { writeWorkspaceManifest } from "../manifest.js";
|
|
7
|
+
import { resolveWorkspaceRoot } from "../workspace.js";
|
|
8
|
+
import { joinRel, normalizeRel } from "../path-utils.js";
|
|
9
|
+
import { pathExists } from "../fs.js";
|
|
10
|
+
import { BackupSession } from "../backup.js";
|
|
11
|
+
import { deployClaudeHooks } from "../hooks/deploy-claude.js";
|
|
12
|
+
/**
|
|
13
|
+
* @param {{ targetPath: string, templateId: string }} options
|
|
14
|
+
*/
|
|
15
|
+
export async function initCommand(options) {
|
|
16
|
+
const workspaceRoot = await resolveWorkspaceRoot(options.targetPath, { create: true });
|
|
17
|
+
const tpl = await loadTemplate(options.templateId);
|
|
18
|
+
const aiws = await loadAiwsPackage();
|
|
19
|
+
const defaults = tpl.manifest.defaults || {};
|
|
20
|
+
const includeOptional = defaults.include_optional !== false;
|
|
21
|
+
const tools = Array.isArray(defaults.tools) ? defaults.tools.map(String) : ["claude", "opencode", "codex"];
|
|
22
|
+
const required = await expandManifestEntries(tpl.templateDir, tpl.manifest.required || []);
|
|
23
|
+
const optional = includeOptional ? await expandManifestEntries(tpl.templateDir, tpl.manifest.optional || []) : [];
|
|
24
|
+
const allFiles = Array.from(new Set([...required, ...optional]));
|
|
25
|
+
const update = tpl.manifest.update || {};
|
|
26
|
+
const replaceFiles = new Set((update.replace_file || []).map(normalizeRel));
|
|
27
|
+
const managedBlocks = update.managed_blocks && typeof update.managed_blocks === "object" ? update.managed_blocks : {};
|
|
28
|
+
// If we are overwriting existing files, take a backup for rollback.
|
|
29
|
+
const backup = new BackupSession({ workspaceRoot, operation: "init" });
|
|
30
|
+
await backup.recordFile(".aiws/manifest.json");
|
|
31
|
+
for (const f of replaceFiles) {
|
|
32
|
+
if (f && f !== ".aiws/manifest.json")
|
|
33
|
+
await backup.recordFile(f);
|
|
34
|
+
}
|
|
35
|
+
for (const f of Object.keys(managedBlocks))
|
|
36
|
+
await backup.recordFile(f);
|
|
37
|
+
await backup.finalize({ extra: { template_id: tpl.templateId } });
|
|
38
|
+
// Ensure .aiws directory (manifest will be generated at the end)
|
|
39
|
+
await fs.mkdir(path.join(workspaceRoot, ".aiws"), { recursive: true });
|
|
40
|
+
for (const rel of allFiles) {
|
|
41
|
+
const r = normalizeRel(rel);
|
|
42
|
+
if (!r)
|
|
43
|
+
continue;
|
|
44
|
+
if (r === ".aiws/manifest.json") {
|
|
45
|
+
// Always generated, never copied from template.
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (replaceFiles.has(r)) {
|
|
49
|
+
await copyTemplateFileToWorkspace({
|
|
50
|
+
templateDir: tpl.templateDir,
|
|
51
|
+
workspaceRoot,
|
|
52
|
+
relPosix: r,
|
|
53
|
+
chmod: r.startsWith(".githooks/") ? 0o755 : undefined,
|
|
54
|
+
});
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (Object.prototype.hasOwnProperty.call(managedBlocks, r)) {
|
|
58
|
+
const blockIds = Array.isArray(managedBlocks[r]) ? managedBlocks[r].map(String) : [];
|
|
59
|
+
await applyManagedBlocksFromTemplate({
|
|
60
|
+
templateDir: tpl.templateDir,
|
|
61
|
+
workspaceRoot,
|
|
62
|
+
fileRel: r,
|
|
63
|
+
blockIds,
|
|
64
|
+
insertIfMissing: true,
|
|
65
|
+
});
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// unmanaged: only create if missing
|
|
69
|
+
const dest = joinRel(workspaceRoot, r);
|
|
70
|
+
if (await pathExists(dest))
|
|
71
|
+
continue;
|
|
72
|
+
await copyTemplateFileToWorkspace({ templateDir: tpl.templateDir, workspaceRoot, relPosix: r });
|
|
73
|
+
}
|
|
74
|
+
// Ensure replace_file-only entries (not listed in required/optional) are also copied
|
|
75
|
+
for (const r of replaceFiles) {
|
|
76
|
+
if (!r || r === ".aiws/manifest.json")
|
|
77
|
+
continue;
|
|
78
|
+
const dest = joinRel(workspaceRoot, r);
|
|
79
|
+
if (await pathExists(dest))
|
|
80
|
+
continue;
|
|
81
|
+
await copyTemplateFileToWorkspace({ templateDir: tpl.templateDir, workspaceRoot, relPosix: r });
|
|
82
|
+
}
|
|
83
|
+
const now = new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
84
|
+
await writeWorkspaceManifest({
|
|
85
|
+
workspaceRoot,
|
|
86
|
+
templateId: tpl.templateId,
|
|
87
|
+
specVersion: tpl.specVersion,
|
|
88
|
+
aiwsVersion: aiws.version,
|
|
89
|
+
installedAt: now,
|
|
90
|
+
updatedAt: now,
|
|
91
|
+
tools,
|
|
92
|
+
templateManifest: tpl.manifest,
|
|
93
|
+
});
|
|
94
|
+
// Deploy Claude Code session hooks to ~/.claude/settings.json
|
|
95
|
+
if (tools.includes("claude")) {
|
|
96
|
+
await deployClaudeHooks({ force: false });
|
|
97
|
+
}
|
|
98
|
+
console.log(`✓ aiws init: ${workspaceRoot} (template=${tpl.templateId})`);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { UserError } from "../errors.js";
|
|
3
|
+
import { pathExists, readText } from "../fs.js";
|
|
4
|
+
import { loadAiwsPackage } from "../aiws-package.js";
|
|
5
|
+
import { loadTemplate } from "../spec.js";
|
|
6
|
+
import { resolveWorkspaceRoot } from "../workspace.js";
|
|
7
|
+
import { updateCommand } from "./update.js";
|
|
8
|
+
import { detectOpenCodeEnvironment } from "../opencode-env.js";
|
|
9
|
+
import { ensureOpenCodeWatchdog, tmuxInstalled } from "./opencode-supervise.js";
|
|
10
|
+
const REQUIRED_TRUTH_FILES = ["AI_PROJECT.md", "REQUIREMENTS.md", "AI_WORKSPACE.md"];
|
|
11
|
+
const REQUIRED_AUTONOMY_FILES = [
|
|
12
|
+
".opencode/oh-my-opencode.json.example",
|
|
13
|
+
".claude/settings.json.example",
|
|
14
|
+
".opencode/helpers/approval-whitelist-check.sh",
|
|
15
|
+
".opencode/helpers/approval-whitelist-run.sh",
|
|
16
|
+
".opencode/helpers/approval-whitelist-watchdog.sh",
|
|
17
|
+
".opencode/helpers/tmux-swarm-scan.sh",
|
|
18
|
+
".opencode/helpers/tmux-swarm-rescue.sh",
|
|
19
|
+
".opencode/skills/ws-autonomy/SKILL.md",
|
|
20
|
+
".opencode/commands/ws-autonomy.md",
|
|
21
|
+
".opencode/command/ws-autonomy.md",
|
|
22
|
+
".opencode/skills/ws-auto/SKILL.md",
|
|
23
|
+
".opencode/commands/ws-auto.md",
|
|
24
|
+
".opencode/command/ws-auto.md",
|
|
25
|
+
];
|
|
26
|
+
async function collectMissingPaths(workspaceRoot, relPaths) {
|
|
27
|
+
/** @type {string[]} */
|
|
28
|
+
const missing = [];
|
|
29
|
+
for (const rel of relPaths) {
|
|
30
|
+
if (!(await pathExists(path.join(workspaceRoot, rel)))) {
|
|
31
|
+
missing.push(rel);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return missing;
|
|
35
|
+
}
|
|
36
|
+
async function readWorkspaceManifest(workspaceRoot) {
|
|
37
|
+
const manifestPath = path.join(workspaceRoot, ".aiws", "manifest.json");
|
|
38
|
+
if (!(await pathExists(manifestPath))) {
|
|
39
|
+
throw new UserError("Missing .aiws/manifest.json. Run `aiws init .` first.");
|
|
40
|
+
}
|
|
41
|
+
return JSON.parse(await readText(manifestPath));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @param {string} workspaceRoot
|
|
45
|
+
*/
|
|
46
|
+
async function detectAutoBootstrapState(workspaceRoot) {
|
|
47
|
+
const env = await detectOpenCodeEnvironment(workspaceRoot);
|
|
48
|
+
const manifest = await readWorkspaceManifest(workspaceRoot);
|
|
49
|
+
const templateId = String(manifest.template_id || "workspace");
|
|
50
|
+
const tpl = await loadTemplate(templateId);
|
|
51
|
+
const aiws = await loadAiwsPackage();
|
|
52
|
+
const truthMissing = await collectMissingPaths(workspaceRoot, REQUIRED_TRUTH_FILES);
|
|
53
|
+
const autonomyMissing = await collectMissingPaths(workspaceRoot, REQUIRED_AUTONOMY_FILES);
|
|
54
|
+
/** @type {string[]} */
|
|
55
|
+
const updateReasons = [];
|
|
56
|
+
if (autonomyMissing.length > 0) {
|
|
57
|
+
updateReasons.push(`autonomy_files_missing=${autonomyMissing.join(",")}`);
|
|
58
|
+
}
|
|
59
|
+
if (String(manifest.spec_version || "") !== String(tpl.specVersion || "")) {
|
|
60
|
+
updateReasons.push(`spec_version=${String(manifest.spec_version || "(missing)")}->${String(tpl.specVersion || "(missing)")}`);
|
|
61
|
+
}
|
|
62
|
+
if (String(manifest.aiws_version || "") !== String(aiws.version || "")) {
|
|
63
|
+
updateReasons.push(`aiws_version=${String(manifest.aiws_version || "(missing)")}->${String(aiws.version || "(missing)")}`);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
env,
|
|
67
|
+
manifest,
|
|
68
|
+
truthMissing,
|
|
69
|
+
autonomyMissing,
|
|
70
|
+
updateRequired: updateReasons.length > 0,
|
|
71
|
+
updateReasons,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* @param {{
|
|
76
|
+
* targetPath: string,
|
|
77
|
+
* sessionName?: string,
|
|
78
|
+
* windowName?: string,
|
|
79
|
+
* once?: boolean,
|
|
80
|
+
* pollMs?: string,
|
|
81
|
+
* noUpdate?: boolean,
|
|
82
|
+
* }} options
|
|
83
|
+
*/
|
|
84
|
+
export async function opencodeAutoCommand(options) {
|
|
85
|
+
const workspaceRoot = await resolveWorkspaceRoot(options.targetPath, { create: false });
|
|
86
|
+
let state = await detectAutoBootstrapState(workspaceRoot);
|
|
87
|
+
let updateApplied = false;
|
|
88
|
+
console.log(`✓ aiws opencode auto: ${workspaceRoot}`);
|
|
89
|
+
console.log(`found_truth: ${state.truthMissing.length === 0 ? REQUIRED_TRUTH_FILES.join(", ") : "(incomplete)"}`);
|
|
90
|
+
if (state.truthMissing.length > 0) {
|
|
91
|
+
console.log(`update: skipped (missing truth files: ${state.truthMissing.join(", ")})`);
|
|
92
|
+
console.log(`mode: ${state.env.mode}`);
|
|
93
|
+
console.log(`watchdog: skipped (missing truth files: ${state.truthMissing.join(", ")})`);
|
|
94
|
+
console.log("next: 先补齐真值文件,再重新运行 `aiws opencode auto .` 或 `/ws-preflight`。");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (state.updateRequired && options.noUpdate !== true) {
|
|
98
|
+
console.log(`update: required (${state.updateReasons.join("; ")})`);
|
|
99
|
+
await updateCommand({ targetPath: workspaceRoot });
|
|
100
|
+
updateApplied = true;
|
|
101
|
+
state = await detectAutoBootstrapState(workspaceRoot);
|
|
102
|
+
}
|
|
103
|
+
else if (state.updateRequired) {
|
|
104
|
+
console.log(`update: required but skipped (--no-update)`);
|
|
105
|
+
console.log(`update_reasons: ${state.updateReasons.join("; ")}`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
console.log("update: not needed");
|
|
109
|
+
}
|
|
110
|
+
console.log(`mode: ${state.env.mode}`);
|
|
111
|
+
if (updateApplied) {
|
|
112
|
+
console.log("update_applied: true");
|
|
113
|
+
}
|
|
114
|
+
if (state.env.configStatus === "invalid") {
|
|
115
|
+
console.log(`watchdog: skipped (invalid config: ${state.env.rel.configPath})`);
|
|
116
|
+
console.log(`next: 修复 ${state.env.rel.configPath} 的 JSON,然后重新运行 \`aiws opencode auto .\`.`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (!state.env.configExists) {
|
|
120
|
+
console.log("watchdog: skipped (oMo config missing)");
|
|
121
|
+
console.log(`next: 如需启用 autonomous bootstrap,可复制 ${state.env.rel.examplePath} -> ${state.env.rel.configPath},然后重新运行 \`aiws opencode auto .\`.`);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (!state.env.watchdogSuperviseReady) {
|
|
125
|
+
console.log("watchdog: skipped (approval/watchdog chain incomplete)");
|
|
126
|
+
console.log("next: 先运行 `aiws opencode status .` 查看缺哪一项;如是托管文件缺失,可运行 `aiws update .`。");
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (!tmuxInstalled()) {
|
|
130
|
+
console.log("watchdog: skipped (tmux missing)");
|
|
131
|
+
console.log("next: 安装 tmux 后重新运行 `aiws opencode auto .`,或手工执行 approval-whitelist-watchdog helper。");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const ensureResult = ensureOpenCodeWatchdog({
|
|
135
|
+
workspaceRoot,
|
|
136
|
+
env: state.env,
|
|
137
|
+
sessionName: options.sessionName,
|
|
138
|
+
windowName: options.windowName,
|
|
139
|
+
once: options.once === true,
|
|
140
|
+
pollMs: options.pollMs ?? null,
|
|
141
|
+
});
|
|
142
|
+
console.log(`watchdog: ${ensureResult.state}`);
|
|
143
|
+
console.log(`tmux session: ${ensureResult.sessionName}${ensureResult.currentSession ? " (current)" : ""}`);
|
|
144
|
+
console.log(`watchdog window: ${ensureResult.windowName}`);
|
|
145
|
+
console.log(`watchdog helper: ${ensureResult.helperRelPath}`);
|
|
146
|
+
if (ensureResult.once) {
|
|
147
|
+
console.log("watchdog_mode: once");
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
console.log(`watchdog_mode: loop${ensureResult.pollMs !== null ? ` (poll_ms=${ensureResult.pollMs})` : ""}`);
|
|
151
|
+
}
|
|
152
|
+
if (state.env.autonomyReady) {
|
|
153
|
+
console.log("next: watchdog 已就绪,可继续 `/ws-auto` -> `/using-aiws` / `/ws-plan` / `/ws-autonomy`。");
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
console.log("next: watchdog 已启动,但 autonomy contract 尚未完整;建议先运行 `aiws opencode status .` 或 `/ws-autonomy` 查看缺口。");
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=opencode-auto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-auto.js","sourceRoot":"","sources":["../../src/commands/opencode-auto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { resolveWorkspaceRoot } from "../workspace.js";
|
|
2
|
+
import { detectOpenCodeEnvironment } from "../opencode-env.js";
|
|
3
|
+
/**
|
|
4
|
+
* @param {{ targetPath: string }} options
|
|
5
|
+
*/
|
|
6
|
+
export async function opencodeStatusCommand(options) {
|
|
7
|
+
const workspaceRoot = await resolveWorkspaceRoot(options.targetPath, { create: false });
|
|
8
|
+
const env = await detectOpenCodeEnvironment(workspaceRoot);
|
|
9
|
+
console.log(`✓ aiws opencode status: ${workspaceRoot}`);
|
|
10
|
+
console.log(`.opencode/: ${env.opencodeDirExists ? "ok" : "missing"}`);
|
|
11
|
+
console.log(`mode: ${env.mode}`);
|
|
12
|
+
console.log(`oMo config: ${env.configStatus === "loaded"
|
|
13
|
+
? `${env.rel.configPath} (ok)`
|
|
14
|
+
: env.configStatus === "invalid"
|
|
15
|
+
? `${env.rel.configPath} (invalid JSON: ${env.configError})`
|
|
16
|
+
: "missing"}`);
|
|
17
|
+
console.log(`oMo example: ${env.exampleExists ? `${env.rel.examplePath} (present)` : "missing"}`);
|
|
18
|
+
console.log(`recommended_agents_ready: ${env.recommendedAgentsReady}`);
|
|
19
|
+
console.log(`enabled_agents: ${env.enabledAgents.length > 0 ? env.enabledAgents.join(", ") : "(none)"}`);
|
|
20
|
+
const planner = env.agents["planner-sisyphus"];
|
|
21
|
+
const librarian = env.agents.librarian;
|
|
22
|
+
const explore = env.agents.explore;
|
|
23
|
+
const oracle = env.agents.oracle;
|
|
24
|
+
console.log(`aiws_roles: planner=${planner.enabled ? "planner-sisyphus" : "missing"}, explorer=${[
|
|
25
|
+
explore.enabled ? "explore" : "",
|
|
26
|
+
librarian.enabled ? "librarian" : "",
|
|
27
|
+
]
|
|
28
|
+
.filter(Boolean)
|
|
29
|
+
.join("+") || "missing"}, reviewer=${oracle.enabled ? "oracle" : "missing"}, integrator=current-agent`);
|
|
30
|
+
if (planner.present) {
|
|
31
|
+
console.log(`planner-sisyphus.replace_plan: ${planner.replacePlan === null ? "(unset)" : String(planner.replacePlan)}`);
|
|
32
|
+
console.log(`planner-sisyphus.prompt_append: ${planner.promptAppendConfigured ? "configured" : "missing"}`);
|
|
33
|
+
}
|
|
34
|
+
console.log(`background_tasks: ${env.backgroundTasksConfigured ? "configured" : "missing"}`);
|
|
35
|
+
console.log(`auto_resume: ${env.autoResumeEnabled ? "true" : "false"}`);
|
|
36
|
+
console.log(`approval_whitelist: ${env.approvalWhitelist.present
|
|
37
|
+
? env.approvalWhitelist.configured
|
|
38
|
+
? `configured (${env.approvalWhitelist.mode || "unset"})`
|
|
39
|
+
: "incomplete"
|
|
40
|
+
: "missing"}`);
|
|
41
|
+
console.log(`host_permission_mode: ${env.approvalWhitelist.hostPermissionMode || "missing"}`);
|
|
42
|
+
console.log(`approval_helper: ${env.approvalWhitelistHelperExists ? `${env.rel.approvalWhitelistHelperPath} (present)` : "missing"}`);
|
|
43
|
+
console.log(`approval_runner: ${env.approvalWhitelistRunnerExists ? `${env.rel.approvalWhitelistRunnerPath} (present)` : "missing"}`);
|
|
44
|
+
console.log(`approval_watchdog: ${env.approvalWhitelistWatchdogExists ? `${env.rel.approvalWhitelistWatchdogPath} (present)` : "missing"}`);
|
|
45
|
+
console.log(`watchdog_supervisor: ${env.watchdogSuperviseReady ? "configured" : "incomplete"}`);
|
|
46
|
+
console.log(`claude_hooks_example: ${env.claudeSettingsExampleExists ? `${env.rel.claudeSettingsExamplePath} (present)` : "missing"}`);
|
|
47
|
+
console.log(`tmux_helpers: scan=${env.tmuxScanHelperExists ? env.rel.tmuxScanHelperPath : "missing"}, rescue=${env.tmuxRescueHelperExists ? env.rel.tmuxRescueHelperPath : "missing"}`);
|
|
48
|
+
console.log(`autonomy_ready: ${env.autonomyReady}`);
|
|
49
|
+
if (env.configStatus === "invalid") {
|
|
50
|
+
console.log(`Next: 修复 ${env.rel.configPath} 的 JSON,然后重新运行 aiws opencode status .`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (!env.configExists && env.exampleExists) {
|
|
54
|
+
console.log(`Next: 如需启用 oMo 优先模式,可复制 ${env.rel.examplePath} -> ${env.rel.configPath} 后按项目调整 agents;随后运行 \`aiws opencode auto .\` 或 \`/ws-auto\`.`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (env.mode === "oMo-enabled" && !env.recommendedAgentsReady) {
|
|
58
|
+
console.log("Next: 补齐 planner-sisyphus / librarian / explore / oracle,或接受 fallback 到 standard-opencode。");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (env.mode === "oMo-enabled" && !env.autonomyReady) {
|
|
62
|
+
console.log("Next: 如需 autonomous 模式,补齐 planner-sisyphus.prompt_append / backgroundTasks / experimental.auto_resume / approval whitelist,并确认 .claude/settings.json.example / approval helper / approval runner / approval watchdog / tmux helpers 存在。");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (env.mode === "oMo-enabled") {
|
|
66
|
+
if (env.watchdogSuperviseReady) {
|
|
67
|
+
console.log("Next: 如需一键做 bootstrap + watchdog ensure,运行 `aiws opencode auto .` 或 `/ws-auto`;若只想单独拉起 watchdog,再用 `aiws opencode supervise .`。");
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log("Next: 运行 /ws-autonomy 或 /using-aiws,确认当前仓库的 completion/retry/rescue 合同。");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
console.log("Next: 当前按 standard-opencode 运行;如需多 agent 优先委托,可启用 oh-my-opencode 项目配置。");
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=opencode-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-status.js","sourceRoot":"","sources":["../../src/commands/opencode-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare function tmuxInstalled(): boolean;
|
|
2
|
+
/**
|
|
3
|
+
* @param {{
|
|
4
|
+
* workspaceRoot: string,
|
|
5
|
+
* env: Awaited<ReturnType<typeof detectOpenCodeEnvironment>>,
|
|
6
|
+
* sessionName?: string,
|
|
7
|
+
* windowName?: string,
|
|
8
|
+
* once?: boolean,
|
|
9
|
+
* pollMs?: string | null,
|
|
10
|
+
* }} options
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureOpenCodeWatchdog(options: any): {
|
|
13
|
+
sessionName: any;
|
|
14
|
+
windowName: any;
|
|
15
|
+
helperRelPath: any;
|
|
16
|
+
state: string;
|
|
17
|
+
currentSession: boolean;
|
|
18
|
+
once: boolean;
|
|
19
|
+
pollMs: number | null;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* @param {{ targetPath: string, sessionName?: string, windowName?: string, once?: boolean, pollMs?: string }} options
|
|
23
|
+
*/
|
|
24
|
+
export declare function opencodeSuperviseCommand(options: any): Promise<void>;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { UserError } from "../errors.js";
|
|
5
|
+
import { resolveWorkspaceRoot } from "../workspace.js";
|
|
6
|
+
import { detectOpenCodeEnvironment } from "../opencode-env.js";
|
|
7
|
+
function shellQuote(value) {
|
|
8
|
+
return `'${String(value).replaceAll("'", `'\\''`)}'`;
|
|
9
|
+
}
|
|
10
|
+
function sanitizeName(value) {
|
|
11
|
+
return String(value || "")
|
|
12
|
+
.replaceAll(/[^A-Za-z0-9._-]+/g, "-")
|
|
13
|
+
.replaceAll(/^-+|-+$/g, "") || "workspace";
|
|
14
|
+
}
|
|
15
|
+
function defaultSessionName(workspaceRoot) {
|
|
16
|
+
const baseName = sanitizeName(path.basename(workspaceRoot));
|
|
17
|
+
const hash = createHash("sha1").update(workspaceRoot).digest("hex").slice(0, 6);
|
|
18
|
+
return `${baseName}-${hash}`;
|
|
19
|
+
}
|
|
20
|
+
function runTmux(args, options = {}) {
|
|
21
|
+
const result = spawnSync("tmux", args, {
|
|
22
|
+
encoding: "utf8",
|
|
23
|
+
env: process.env,
|
|
24
|
+
});
|
|
25
|
+
if (options.allowFailure === true) {
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
if (result.error) {
|
|
29
|
+
throw new UserError(`Failed to run tmux ${args[0] ?? ""}`.trim(), {
|
|
30
|
+
details: result.error instanceof Error ? result.error.message : String(result.error),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (result.status !== 0) {
|
|
34
|
+
const stderr = (result.stderr || "").trim();
|
|
35
|
+
throw new UserError(`tmux ${args[0] ?? ""} failed`, { details: stderr || `exit=${result.status}` });
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
export function tmuxInstalled() {
|
|
40
|
+
const result = spawnSync("tmux", ["-V"], {
|
|
41
|
+
encoding: "utf8",
|
|
42
|
+
env: process.env,
|
|
43
|
+
});
|
|
44
|
+
return !result.error && result.status === 0;
|
|
45
|
+
}
|
|
46
|
+
function parsePositiveInt(value, optionName) {
|
|
47
|
+
const parsed = Number.parseInt(String(value), 10);
|
|
48
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
49
|
+
throw new UserError(`Invalid ${optionName}: ${value}`, { details: `${optionName} must be a positive integer.` });
|
|
50
|
+
}
|
|
51
|
+
return parsed;
|
|
52
|
+
}
|
|
53
|
+
function buildWatchdogCommand(env, workspaceRoot, options) {
|
|
54
|
+
const autonomyDir = path.join(workspaceRoot, ".aiws", "tmp", "opencode-autonomy");
|
|
55
|
+
const args = [shellQuote(env.approvalWhitelistWatchdogPath), shellQuote(workspaceRoot)];
|
|
56
|
+
if (options.once === true) {
|
|
57
|
+
args.push("--once");
|
|
58
|
+
}
|
|
59
|
+
if (options.pollMs !== null) {
|
|
60
|
+
args.push("--poll-ms", String(options.pollMs));
|
|
61
|
+
}
|
|
62
|
+
return `mkdir -p ${shellQuote(autonomyDir)} && export AIWS_OPENCODE_AUTONOMY_DIR=${shellQuote(autonomyDir)} && exec bash ${args.join(" ")}`;
|
|
63
|
+
}
|
|
64
|
+
function currentTmuxSessionName() {
|
|
65
|
+
if (!process.env.TMUX) {
|
|
66
|
+
return "";
|
|
67
|
+
}
|
|
68
|
+
const result = runTmux(["display-message", "-p", "#S"]);
|
|
69
|
+
return (result.stdout || "").trim();
|
|
70
|
+
}
|
|
71
|
+
function sessionExists(sessionName) {
|
|
72
|
+
const result = runTmux(["has-session", "-t", sessionName], { allowFailure: true });
|
|
73
|
+
return result.status === 0;
|
|
74
|
+
}
|
|
75
|
+
function windowExists(sessionName, windowName) {
|
|
76
|
+
const result = runTmux(["list-windows", "-t", sessionName, "-F", "#W"], { allowFailure: true });
|
|
77
|
+
if (result.status !== 0) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
return String(result.stdout || "")
|
|
81
|
+
.split(/\r?\n/)
|
|
82
|
+
.map((line) => line.trim())
|
|
83
|
+
.filter(Boolean)
|
|
84
|
+
.includes(windowName);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* @param {{
|
|
88
|
+
* workspaceRoot: string,
|
|
89
|
+
* env: Awaited<ReturnType<typeof detectOpenCodeEnvironment>>,
|
|
90
|
+
* sessionName?: string,
|
|
91
|
+
* windowName?: string,
|
|
92
|
+
* once?: boolean,
|
|
93
|
+
* pollMs?: string | null,
|
|
94
|
+
* }} options
|
|
95
|
+
*/
|
|
96
|
+
export function ensureOpenCodeWatchdog(options) {
|
|
97
|
+
const workspaceRoot = options.workspaceRoot;
|
|
98
|
+
const env = options.env;
|
|
99
|
+
if (!tmuxInstalled()) {
|
|
100
|
+
throw new UserError("tmux is required for watchdog supervision.", {
|
|
101
|
+
details: "Install tmux first, or run the watchdog helper manually.",
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (env.configStatus !== "loaded") {
|
|
105
|
+
throw new UserError("oMo config is not ready for supervision.", {
|
|
106
|
+
details: `Expected ${env.rel.configPath} to exist and be valid JSON before starting watchdog supervision.`,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (!env.approvalWhitelist.configured) {
|
|
110
|
+
throw new UserError("approval whitelist policy is not ready.", {
|
|
111
|
+
details: "Enable aiws.autonomy.approval_whitelist with assist-only + manual-only before starting watchdog supervision.",
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
if (!env.approvalWhitelistHelperExists || !env.approvalWhitelistRunnerExists || !env.approvalWhitelistWatchdogExists) {
|
|
115
|
+
throw new UserError("watchdog helper chain is incomplete.", {
|
|
116
|
+
details: "Expected approval-whitelist-check.sh, approval-whitelist-run.sh, and approval-whitelist-watchdog.sh to exist under .opencode/helpers/.",
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const pollMs = options.pollMs ? parsePositiveInt(options.pollMs, "--poll-ms") : null;
|
|
120
|
+
const currentSession = currentTmuxSessionName();
|
|
121
|
+
const sessionName = options.sessionName || currentSession || defaultSessionName(workspaceRoot);
|
|
122
|
+
const windowName = options.windowName || "watchdog";
|
|
123
|
+
const command = buildWatchdogCommand(env, workspaceRoot, {
|
|
124
|
+
once: options.once === true,
|
|
125
|
+
pollMs,
|
|
126
|
+
});
|
|
127
|
+
const existed = sessionExists(sessionName);
|
|
128
|
+
if (existed && windowExists(sessionName, windowName)) {
|
|
129
|
+
return {
|
|
130
|
+
sessionName,
|
|
131
|
+
windowName,
|
|
132
|
+
helperRelPath: env.rel.approvalWhitelistWatchdogPath,
|
|
133
|
+
state: "already-running",
|
|
134
|
+
currentSession: Boolean(currentSession && sessionName === currentSession),
|
|
135
|
+
once: options.once === true,
|
|
136
|
+
pollMs,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
if (existed) {
|
|
140
|
+
runTmux(["new-window", "-d", "-t", sessionName, "-n", windowName, "-c", workspaceRoot, command]);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
runTmux(["new-session", "-d", "-s", sessionName, "-n", windowName, "-c", workspaceRoot, command]);
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
sessionName,
|
|
147
|
+
windowName,
|
|
148
|
+
helperRelPath: env.rel.approvalWhitelistWatchdogPath,
|
|
149
|
+
state: existed ? "created" : "started-with-new-session",
|
|
150
|
+
currentSession: Boolean(currentSession && sessionName === currentSession),
|
|
151
|
+
once: options.once === true,
|
|
152
|
+
pollMs,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* @param {{ targetPath: string, sessionName?: string, windowName?: string, once?: boolean, pollMs?: string }} options
|
|
157
|
+
*/
|
|
158
|
+
export async function opencodeSuperviseCommand(options) {
|
|
159
|
+
const workspaceRoot = await resolveWorkspaceRoot(options.targetPath, { create: false });
|
|
160
|
+
const env = await detectOpenCodeEnvironment(workspaceRoot);
|
|
161
|
+
const result = ensureOpenCodeWatchdog({
|
|
162
|
+
workspaceRoot,
|
|
163
|
+
env,
|
|
164
|
+
sessionName: options.sessionName,
|
|
165
|
+
windowName: options.windowName,
|
|
166
|
+
once: options.once,
|
|
167
|
+
pollMs: options.pollMs ?? null,
|
|
168
|
+
});
|
|
169
|
+
console.log(`✓ aiws opencode supervise: ${workspaceRoot}`);
|
|
170
|
+
console.log(`tmux session: ${result.sessionName}${result.currentSession ? " (current)" : ""}`);
|
|
171
|
+
if (result.state === "already-running") {
|
|
172
|
+
console.log(`watchdog window: ${result.windowName} (already running)`);
|
|
173
|
+
}
|
|
174
|
+
else if (result.state === "created") {
|
|
175
|
+
console.log(`watchdog window: ${result.windowName} (created)`);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
console.log(`watchdog window: ${result.windowName} (started with new session)`);
|
|
179
|
+
}
|
|
180
|
+
console.log(`watchdog helper: ${result.helperRelPath}`);
|
|
181
|
+
if (result.once) {
|
|
182
|
+
console.log("mode: once");
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
console.log(`mode: loop${result.pollMs !== null ? ` (poll_ms=${result.pollMs})` : ""}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=opencode-supervise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-supervise.js","sourceRoot":"","sources":["../../src/commands/opencode-supervise.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { resolveWorkspaceRoot } from "../workspace.js";
|
|
2
|
+
import { resolveBackupRoot, rollbackFromBackup } from "../backup.js";
|
|
3
|
+
/**
|
|
4
|
+
* @param {{ targetPath: string, stamp: string }} options
|
|
5
|
+
*/
|
|
6
|
+
export async function rollbackCommand(options) {
|
|
7
|
+
const workspaceRoot = await resolveWorkspaceRoot(options.targetPath, { create: false });
|
|
8
|
+
const backupRoot = await resolveBackupRoot(workspaceRoot, options.stamp);
|
|
9
|
+
await rollbackFromBackup(workspaceRoot, backupRoot);
|
|
10
|
+
console.log(`✓ aiws rollback: ${workspaceRoot} (${options.stamp})`);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=rollback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAErE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAY;IAChD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACxF,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,kBAAkB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;AACtE,CAAC"}
|