@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
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
- `aiws change ...`:变更工件工作流
|
|
13
13
|
- `aiws dashboard serve`:本地 change/dashboard API
|
|
14
14
|
- `aiws hooks install/status`
|
|
15
|
-
- `aiws opencode status`
|
|
15
|
+
- `aiws opencode status/supervise`
|
|
16
16
|
- `aiws codex install-skills/status-skills/uninstall-skills`
|
|
17
17
|
|
|
18
18
|
支持工具:
|
|
@@ -55,6 +55,8 @@ AI 工具内:
|
|
|
55
55
|
- simple/local 单点修复:`$ws-dev-lite`
|
|
56
56
|
- 常规实现:`$ws-dev`
|
|
57
57
|
- 中大型任务:`$ws-plan` → `$ws-plan-verify` → `$ws-dev`
|
|
58
|
+
- OpenCode/oMo 自动 bootstrap:`/ws-auto`
|
|
59
|
+
- OpenCode/oMo 自主协作实验:`/ws-autonomy`
|
|
58
60
|
- 提交前:`$ws-review` / `$ws-commit`
|
|
59
61
|
- 交付前:`$ws-deliver` / `$ws-finish`
|
|
60
62
|
|
|
@@ -75,7 +77,7 @@ aiws validate [path] [--stamp]
|
|
|
75
77
|
aiws rollback [path] <timestamp|latest>
|
|
76
78
|
|
|
77
79
|
aiws change new <change-id> [--no-design]
|
|
78
|
-
aiws change start <change-id> [--switch|--no-switch
|
|
80
|
+
aiws change start <change-id> [--switch|--no-switch]
|
|
79
81
|
aiws change status [change-id]
|
|
80
82
|
aiws change next [change-id]
|
|
81
83
|
aiws change sync [change-id]
|
|
@@ -87,6 +89,8 @@ aiws dashboard serve [--host 127.0.0.1] [--port 3456]
|
|
|
87
89
|
aiws hooks install [path]
|
|
88
90
|
aiws hooks status [path]
|
|
89
91
|
aiws opencode status [path]
|
|
92
|
+
aiws opencode auto [path] [--session <name>] [--window <name>] [--once] [--poll-ms <ms>] [--no-update]
|
|
93
|
+
aiws opencode supervise [path] [--session <name>] [--window <name>] [--once] [--poll-ms <ms>]
|
|
90
94
|
aiws codex install-skills
|
|
91
95
|
aiws codex status-skills
|
|
92
96
|
aiws codex uninstall-skills
|
|
@@ -116,6 +120,18 @@ aiws codex uninstall-skills
|
|
|
116
120
|
|
|
117
121
|
目标是统一 workflow 入口,不保证工具自动发现或自动加载。
|
|
118
122
|
|
|
123
|
+
OpenCode/oMo 补充:
|
|
124
|
+
- `.opencode/oh-my-opencode.json.example` 提供 autonomy 示例配置(`prompt_append` / `backgroundTasks` / `experimental.auto_resume`)
|
|
125
|
+
- 同一份 oMo 示例配置还会声明 approval whitelist policy(只读命令 + evidence 写路径;宿主权限保持 `manual-only`)
|
|
126
|
+
- `.claude/settings.json.example` 提供 hook 兼容层示例
|
|
127
|
+
- `.opencode/helpers/approval-whitelist-check.sh` 把 whitelist policy 转成 `allow/deny/manual` 判定,并落审计日志
|
|
128
|
+
- `.opencode/helpers/approval-whitelist-run.sh` 在 `allow` 时执行简单命令,并落执行摘要
|
|
129
|
+
- `.opencode/helpers/approval-whitelist-watchdog.sh` 轮询队列并调用 runner,适合外部蜂群/守护进程接入
|
|
130
|
+
- `/ws-auto` 会先触发 `aiws opencode auto .`:必要时刷新托管内容,再按条件确保 watchdog 已在 tmux 中运行
|
|
131
|
+
- `aiws opencode auto .` 会在需要时自动执行 `aiws update .`;若 oMo 已启用且 tmux 可用,再继续启动 watchdog
|
|
132
|
+
- `aiws opencode supervise .` 会显式确保 tmux 中已有一个 watchdog window;若当前不在 tmux,则会为该工作区起一个 detached session
|
|
133
|
+
- `.opencode/helpers/tmux-swarm-scan.sh` / `tmux-swarm-rescue.sh` 提供可选的 tmux 巡检与安全救援 helper
|
|
134
|
+
|
|
119
135
|
## 运行要求
|
|
120
136
|
|
|
121
137
|
- Node.js >= 20
|
package/bin/aiws.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { cliMain } from "../
|
|
3
|
-
import { UserError } from "../
|
|
2
|
+
import { cliMain } from "../dist/cli.js";
|
|
3
|
+
import { UserError } from "../dist/errors.js";
|
|
4
4
|
|
|
5
5
|
try {
|
|
6
6
|
const exitCode = await cliMain(process.argv.slice(2));
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { readText } from "./fs.js";
|
|
4
|
+
export async function loadAiwsPackage() {
|
|
5
|
+
const here = fileURLToPath(import.meta.url);
|
|
6
|
+
const rootDir = path.resolve(path.dirname(here), "..");
|
|
7
|
+
const pkg = JSON.parse(await readText(path.join(rootDir, "package.json")));
|
|
8
|
+
const version = String(pkg.version || "").trim() || "0.0.0";
|
|
9
|
+
return { rootDir, version };
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=aiws-package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiws-package.js","sourceRoot":"","sources":["../src/aiws-package.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC;IAC5D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** All AIWS-managed directories live under this subdirectory */
|
|
2
|
+
export declare const AIWS_DIR = ".aiws";
|
|
3
|
+
/** Changes directory: .aiws/changes/ */
|
|
4
|
+
export declare function changesDir(root: string): string;
|
|
5
|
+
/** Single change directory: .aiws/changes/{changeId}/ */
|
|
6
|
+
export declare function changeDir(root: string, changeId: string): string;
|
|
7
|
+
/** Changes archive: .aiws/changes/archive/ */
|
|
8
|
+
export declare function changesArchiveDir(root: string): string;
|
|
9
|
+
/** Changes templates: .aiws/changes/templates/ */
|
|
10
|
+
export declare function changesTemplatesDir(root: string): string;
|
|
11
|
+
/** Tools directory: .aiws/tools/ */
|
|
12
|
+
export declare function toolsDir(root: string): string;
|
|
13
|
+
/** Tmp directory: .aiws/tmp/ */
|
|
14
|
+
export declare function tmpDir(root: string): string;
|
|
15
|
+
/** Plan directory: .aiws/plan/ */
|
|
16
|
+
export declare function planDir(root: string): string;
|
|
17
|
+
/** Requirements directory: .aiws/requirements/ */
|
|
18
|
+
export declare function requirementsDir(root: string): string;
|
|
19
|
+
/** Issues directory: .aiws/issues/ */
|
|
20
|
+
export declare function issuesDir(root: string): string;
|
|
21
|
+
/** Memory-bank directory: .aiws/memory-bank/ */
|
|
22
|
+
export declare function memoryBankDir(root: string): string;
|
|
23
|
+
/** Secrets directory: .aiws/secrets/ */
|
|
24
|
+
export declare function secretsDir(root: string): string;
|
|
25
|
+
export declare const CHANGES_REL = ".aiws/changes";
|
|
26
|
+
export declare const TOOLS_REL = ".aiws/tools";
|
|
27
|
+
export declare const TMP_REL = ".aiws/tmp";
|
|
28
|
+
export declare const PLAN_REL = ".aiws/plan";
|
|
29
|
+
export declare const REQUIREMENTS_REL = ".aiws/requirements";
|
|
30
|
+
export declare const ISSUES_REL = ".aiws/issues";
|
|
31
|
+
export declare const MEMORY_BANK_REL = ".aiws/memory-bank";
|
|
32
|
+
export declare const SECRETS_REL = ".aiws/secrets";
|
|
33
|
+
export declare function validateStampDir(root: string): string;
|
|
34
|
+
export declare function changeSyncStampDir(root: string): string;
|
|
35
|
+
export declare function changeArchiveStampDir(root: string): string;
|
|
36
|
+
export declare function tmpReviewDir(root: string): string;
|
|
37
|
+
export declare function changeJournalDir(root: string, changeId: string): string;
|
|
38
|
+
export declare function changeEvidenceDir(root: string, changeId: string): string;
|
|
39
|
+
export declare function changeReviewDir(root: string, changeId: string): string;
|
|
40
|
+
export declare function changeAnalysisDir(root: string, changeId: string): string;
|
|
41
|
+
export declare function changeRelPrefix(changeId: string): string;
|
|
42
|
+
export declare function changeEvidenceRelPrefix(changeId: string): string;
|
|
43
|
+
export declare function changeReviewRelPrefix(changeId: string): string;
|
|
44
|
+
export declare const REQUIRED_WRITE_ALLOW_PATHS: string[];
|
|
45
|
+
export declare const REQUIRED_DENY_PATHS: string[];
|
|
46
|
+
export declare const WORKSPACE_SIGNAL_REL: string[];
|
|
47
|
+
export declare const DIR_MIGRATION_MAP: Record<string, string>;
|
|
48
|
+
export declare const FILE_MIGRATION_MAP: Record<string, string>;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
// ── Base directories (all relative to gitRoot/workspaceRoot) ──
|
|
3
|
+
/** All AIWS-managed directories live under this subdirectory */
|
|
4
|
+
export const AIWS_DIR = ".aiws";
|
|
5
|
+
/** Changes directory: .aiws/changes/ */
|
|
6
|
+
export function changesDir(root) {
|
|
7
|
+
return path.join(root, AIWS_DIR, "changes");
|
|
8
|
+
}
|
|
9
|
+
/** Single change directory: .aiws/changes/{changeId}/ */
|
|
10
|
+
export function changeDir(root, changeId) {
|
|
11
|
+
return path.join(root, AIWS_DIR, "changes", changeId);
|
|
12
|
+
}
|
|
13
|
+
/** Changes archive: .aiws/changes/archive/ */
|
|
14
|
+
export function changesArchiveDir(root) {
|
|
15
|
+
return path.join(root, AIWS_DIR, "changes", "archive");
|
|
16
|
+
}
|
|
17
|
+
/** Changes templates: .aiws/changes/templates/ */
|
|
18
|
+
export function changesTemplatesDir(root) {
|
|
19
|
+
return path.join(root, AIWS_DIR, "changes", "templates");
|
|
20
|
+
}
|
|
21
|
+
/** Tools directory: .aiws/tools/ */
|
|
22
|
+
export function toolsDir(root) {
|
|
23
|
+
return path.join(root, AIWS_DIR, "tools");
|
|
24
|
+
}
|
|
25
|
+
/** Tmp directory: .aiws/tmp/ */
|
|
26
|
+
export function tmpDir(root) {
|
|
27
|
+
return path.join(root, AIWS_DIR, "tmp");
|
|
28
|
+
}
|
|
29
|
+
/** Plan directory: .aiws/plan/ */
|
|
30
|
+
export function planDir(root) {
|
|
31
|
+
return path.join(root, AIWS_DIR, "plan");
|
|
32
|
+
}
|
|
33
|
+
/** Requirements directory: .aiws/requirements/ */
|
|
34
|
+
export function requirementsDir(root) {
|
|
35
|
+
return path.join(root, AIWS_DIR, "requirements");
|
|
36
|
+
}
|
|
37
|
+
/** Issues directory: .aiws/issues/ */
|
|
38
|
+
export function issuesDir(root) {
|
|
39
|
+
return path.join(root, AIWS_DIR, "issues");
|
|
40
|
+
}
|
|
41
|
+
/** Memory-bank directory: .aiws/memory-bank/ */
|
|
42
|
+
export function memoryBankDir(root) {
|
|
43
|
+
return path.join(root, AIWS_DIR, "memory-bank");
|
|
44
|
+
}
|
|
45
|
+
/** Secrets directory: .aiws/secrets/ */
|
|
46
|
+
export function secretsDir(root) {
|
|
47
|
+
return path.join(root, AIWS_DIR, "secrets");
|
|
48
|
+
}
|
|
49
|
+
// ── Relative path segments (for string matching, manifest entries, etc.) ──
|
|
50
|
+
export const CHANGES_REL = ".aiws/changes";
|
|
51
|
+
export const TOOLS_REL = ".aiws/tools";
|
|
52
|
+
export const TMP_REL = ".aiws/tmp";
|
|
53
|
+
export const PLAN_REL = ".aiws/plan";
|
|
54
|
+
export const REQUIREMENTS_REL = ".aiws/requirements";
|
|
55
|
+
export const ISSUES_REL = ".aiws/issues";
|
|
56
|
+
export const MEMORY_BANK_REL = ".aiws/memory-bank";
|
|
57
|
+
export const SECRETS_REL = ".aiws/secrets";
|
|
58
|
+
// ── Tmp sub-paths (for stamps etc.) ──
|
|
59
|
+
export function validateStampDir(root) {
|
|
60
|
+
return path.join(root, AIWS_DIR, "tmp", "aiws-validate");
|
|
61
|
+
}
|
|
62
|
+
export function changeSyncStampDir(root) {
|
|
63
|
+
return path.join(root, AIWS_DIR, "tmp", "change-sync");
|
|
64
|
+
}
|
|
65
|
+
export function changeArchiveStampDir(root) {
|
|
66
|
+
return path.join(root, AIWS_DIR, "tmp", "change-archive");
|
|
67
|
+
}
|
|
68
|
+
export function tmpReviewDir(root) {
|
|
69
|
+
return path.join(root, AIWS_DIR, "tmp", "review");
|
|
70
|
+
}
|
|
71
|
+
// ── Convenience: single change subdir helpers ──
|
|
72
|
+
export function changeJournalDir(root, changeId) {
|
|
73
|
+
return path.join(changeDir(root, changeId), "journal");
|
|
74
|
+
}
|
|
75
|
+
export function changeEvidenceDir(root, changeId) {
|
|
76
|
+
return path.join(changeDir(root, changeId), "evidence");
|
|
77
|
+
}
|
|
78
|
+
export function changeReviewDir(root, changeId) {
|
|
79
|
+
return path.join(changeDir(root, changeId), "review");
|
|
80
|
+
}
|
|
81
|
+
export function changeAnalysisDir(root, changeId) {
|
|
82
|
+
return path.join(changeDir(root, changeId), "analysis");
|
|
83
|
+
}
|
|
84
|
+
// ── Relative prefix strings for analyzeEvidencePaths ──
|
|
85
|
+
export function changeRelPrefix(changeId) {
|
|
86
|
+
return `${CHANGES_REL}/${changeId}/`;
|
|
87
|
+
}
|
|
88
|
+
export function changeEvidenceRelPrefix(changeId) {
|
|
89
|
+
return `${CHANGES_REL}/${changeId}/evidence/`;
|
|
90
|
+
}
|
|
91
|
+
export function changeReviewRelPrefix(changeId) {
|
|
92
|
+
return `${CHANGES_REL}/${changeId}/review/`;
|
|
93
|
+
}
|
|
94
|
+
// ── OpenCode env path constants ──
|
|
95
|
+
export const REQUIRED_WRITE_ALLOW_PATHS = [
|
|
96
|
+
".aiws/tmp/",
|
|
97
|
+
".aiws/changes/*/analysis/",
|
|
98
|
+
".aiws/changes/*/review/",
|
|
99
|
+
".aiws/changes/*/evidence/",
|
|
100
|
+
];
|
|
101
|
+
export const REQUIRED_DENY_PATHS = [
|
|
102
|
+
".aiws/secrets/",
|
|
103
|
+
".env*",
|
|
104
|
+
];
|
|
105
|
+
// ── Legacy detection signal paths (for manifest.ts detectLegacyWorkspaceTemplateId) ──
|
|
106
|
+
// These check the NEW layout to detect if workspace is already migrated
|
|
107
|
+
export const WORKSPACE_SIGNAL_REL = [
|
|
108
|
+
"AI_PROJECT.md",
|
|
109
|
+
"REQUIREMENTS.md",
|
|
110
|
+
"AI_WORKSPACE.md",
|
|
111
|
+
".aiws/tools/ws_change_check.py",
|
|
112
|
+
".aiws/tools/requirements_contract.py",
|
|
113
|
+
];
|
|
114
|
+
// ── Migration: old → new directory mapping ──
|
|
115
|
+
export const DIR_MIGRATION_MAP = {
|
|
116
|
+
"changes": ".aiws/changes",
|
|
117
|
+
"tools": ".aiws/tools",
|
|
118
|
+
"requirements": ".aiws/requirements",
|
|
119
|
+
"issues": ".aiws/issues",
|
|
120
|
+
"memory-bank": ".aiws/memory-bank",
|
|
121
|
+
"secrets": ".aiws/secrets",
|
|
122
|
+
".agentdocs": ".aiws",
|
|
123
|
+
"plan": ".aiws/plan",
|
|
124
|
+
};
|
|
125
|
+
// ── Single file migration ──
|
|
126
|
+
export const FILE_MIGRATION_MAP = {
|
|
127
|
+
".ws-change.json": ".aiws/ws-change.json",
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=aiws-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiws-paths.js","sourceRoot":"","sources":["../src/aiws-paths.ts"],"names":[],"mappings":"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"}
|
package/dist/backup.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare function formatBackupTimestamp(d: Date): string;
|
|
2
|
+
export interface BackupSessionOptions {
|
|
3
|
+
workspaceRoot: string;
|
|
4
|
+
operation: "init" | "update";
|
|
5
|
+
}
|
|
6
|
+
export interface BackupFileInfo {
|
|
7
|
+
existed: boolean;
|
|
8
|
+
mode: number | null;
|
|
9
|
+
}
|
|
10
|
+
export declare class BackupSession {
|
|
11
|
+
workspaceRoot: string;
|
|
12
|
+
operation: "init" | "update";
|
|
13
|
+
timestamp: string;
|
|
14
|
+
backupRoot: string;
|
|
15
|
+
files: Map<string, BackupFileInfo>;
|
|
16
|
+
protected _prepared: boolean;
|
|
17
|
+
constructor(options: BackupSessionOptions);
|
|
18
|
+
_prepare(): Promise<void>;
|
|
19
|
+
recordFile(relPosix: string, options?: {
|
|
20
|
+
recordMissing?: boolean;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
finalize(options?: {
|
|
23
|
+
extra?: any;
|
|
24
|
+
}): Promise<string | null>;
|
|
25
|
+
}
|
|
26
|
+
export declare function resolveBackupRoot(workspaceRoot: string, stamp: string): Promise<string>;
|
|
27
|
+
export declare function rollbackFromBackup(workspaceRoot: string, backupRoot: string): Promise<void>;
|
package/dist/backup.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ensureDir, pathExists } from "./fs.js";
|
|
4
|
+
import { joinRel, normalizeRel } from "./path-utils.js";
|
|
5
|
+
import { UserError } from "./errors.js";
|
|
6
|
+
export function formatBackupTimestamp(d) {
|
|
7
|
+
return d.toISOString().replace(/\.\d{3}Z$/, "Z").replaceAll(":", "-");
|
|
8
|
+
}
|
|
9
|
+
export class BackupSession {
|
|
10
|
+
workspaceRoot;
|
|
11
|
+
operation;
|
|
12
|
+
timestamp;
|
|
13
|
+
backupRoot;
|
|
14
|
+
files;
|
|
15
|
+
_prepared;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.workspaceRoot = options.workspaceRoot;
|
|
18
|
+
this.operation = options.operation;
|
|
19
|
+
this.timestamp = formatBackupTimestamp(new Date());
|
|
20
|
+
this.backupRoot = path.join(this.workspaceRoot, ".aiws", "backups", this.timestamp);
|
|
21
|
+
this.files = new Map();
|
|
22
|
+
this._prepared = false;
|
|
23
|
+
}
|
|
24
|
+
async _prepare() {
|
|
25
|
+
if (this._prepared)
|
|
26
|
+
return;
|
|
27
|
+
await ensureDir(this.backupRoot);
|
|
28
|
+
this._prepared = true;
|
|
29
|
+
}
|
|
30
|
+
async recordFile(relPosix, options) {
|
|
31
|
+
const rel = normalizeRel(relPosix);
|
|
32
|
+
if (this.files.has(rel))
|
|
33
|
+
return;
|
|
34
|
+
const abs = joinRel(this.workspaceRoot, rel);
|
|
35
|
+
const exists = await pathExists(abs);
|
|
36
|
+
if (!exists) {
|
|
37
|
+
if (options?.recordMissing) {
|
|
38
|
+
this.files.set(rel, { existed: false, mode: null });
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const st = await fs.stat(abs);
|
|
43
|
+
if (!st.isFile()) {
|
|
44
|
+
if (options?.recordMissing)
|
|
45
|
+
this.files.set(rel, { existed: false, mode: null });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
await this._prepare();
|
|
49
|
+
const dest = joinRel(this.backupRoot, rel);
|
|
50
|
+
await ensureDir(path.dirname(dest));
|
|
51
|
+
await fs.copyFile(abs, dest);
|
|
52
|
+
try {
|
|
53
|
+
await fs.chmod(dest, st.mode & 0o777);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// ignore chmod errors
|
|
57
|
+
}
|
|
58
|
+
this.files.set(rel, { existed: true, mode: st.mode & 0o777 });
|
|
59
|
+
}
|
|
60
|
+
async finalize(options) {
|
|
61
|
+
if (!this._prepared && this.files.size === 0)
|
|
62
|
+
return null;
|
|
63
|
+
await this._prepare();
|
|
64
|
+
const meta = {
|
|
65
|
+
operation: this.operation,
|
|
66
|
+
timestamp: this.timestamp,
|
|
67
|
+
created_at: new Date().toISOString(),
|
|
68
|
+
files: Array.from(this.files.entries()).map(([p, v]) => ({ path: p, existed: v.existed, mode: v.mode })),
|
|
69
|
+
extra: options?.extra ?? null,
|
|
70
|
+
};
|
|
71
|
+
await fs.writeFile(path.join(this.backupRoot, "backup.json"), JSON.stringify(meta, null, 2) + "\n", "utf8");
|
|
72
|
+
return this.backupRoot;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export async function resolveBackupRoot(workspaceRoot, stamp) {
|
|
76
|
+
const backupsRoot = path.join(workspaceRoot, ".aiws", "backups");
|
|
77
|
+
if (stamp === "latest") {
|
|
78
|
+
if (!(await pathExists(backupsRoot)))
|
|
79
|
+
throw new UserError("No backups found.");
|
|
80
|
+
const entries = await fs.readdir(backupsRoot, { withFileTypes: true });
|
|
81
|
+
const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();
|
|
82
|
+
const latest = dirs[dirs.length - 1];
|
|
83
|
+
if (!latest)
|
|
84
|
+
throw new UserError("No backups found.");
|
|
85
|
+
return path.join(backupsRoot, latest);
|
|
86
|
+
}
|
|
87
|
+
const target = path.join(backupsRoot, stamp);
|
|
88
|
+
if (!(await pathExists(target))) {
|
|
89
|
+
throw new UserError(`Backup not found: ${stamp}`, { details: `Missing: ${target}` });
|
|
90
|
+
}
|
|
91
|
+
return target;
|
|
92
|
+
}
|
|
93
|
+
export async function rollbackFromBackup(workspaceRoot, backupRoot) {
|
|
94
|
+
const metaPath = path.join(backupRoot, "backup.json");
|
|
95
|
+
if (!(await pathExists(metaPath))) {
|
|
96
|
+
throw new UserError("backup.json not found; cannot rollback safely.", { details: `Missing: ${metaPath}` });
|
|
97
|
+
}
|
|
98
|
+
const meta = JSON.parse(await fs.readFile(metaPath, "utf8"));
|
|
99
|
+
const files = Array.isArray(meta.files) ? meta.files : [];
|
|
100
|
+
for (const f of files) {
|
|
101
|
+
const rel = normalizeRel(String(f.path || ""));
|
|
102
|
+
if (!rel)
|
|
103
|
+
continue;
|
|
104
|
+
const dest = joinRel(workspaceRoot, rel);
|
|
105
|
+
if (f.existed) {
|
|
106
|
+
const src = joinRel(backupRoot, rel);
|
|
107
|
+
await ensureDir(path.dirname(dest));
|
|
108
|
+
await fs.copyFile(src, dest);
|
|
109
|
+
if (typeof f.mode === "number") {
|
|
110
|
+
try {
|
|
111
|
+
await fs.chmod(dest, f.mode);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// ignore chmod errors
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
if (await pathExists(dest)) {
|
|
120
|
+
await fs.rm(dest, { force: true });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../src/backup.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function cliMain(argv: string[]): Promise<number>;
|