yuangs 2.30.0 → 2.32.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 +246 -589
- package/dist/agent/llmAdapter.js +1 -1
- package/dist/agent/llmAdapter.js.map +1 -1
- package/dist/agent/selectModel.js +1 -1
- package/dist/agent/selectModel.js.map +1 -1
- package/dist/cli.js +15 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/handleAICommand.js +1 -1
- package/dist/commands/handleAICommand.js.map +1 -1
- package/dist/core/capabilitySystem.js +2 -2
- package/dist/core/capabilitySystem.js.map +1 -1
- package/dist/governance/GovernanceEngine.d.ts +20 -0
- package/dist/governance/GovernanceEngine.js +95 -0
- package/dist/governance/GovernanceEngine.js.map +1 -0
- package/dist/governance/GovernedAction.d.ts +107 -0
- package/dist/governance/GovernedAction.js +9 -0
- package/dist/governance/GovernedAction.js.map +1 -0
- package/dist/governance/actions/CodeChangeAction.d.ts +28 -0
- package/dist/governance/actions/CodeChangeAction.js +139 -0
- package/dist/governance/actions/CodeChangeAction.js.map +1 -0
- package/dist/governance/capability/token.d.ts +45 -0
- package/dist/governance/capability/token.js +103 -0
- package/dist/governance/capability/token.js.map +1 -0
- package/dist/governance/commands/diffEdit.d.ts +2 -0
- package/dist/governance/commands/diffEdit.js +176 -0
- package/dist/governance/commands/diffEdit.js.map +1 -0
- package/dist/governance/execution/sandbox.d.ts +12 -0
- package/dist/governance/execution/sandbox.js +76 -0
- package/dist/governance/execution/sandbox.js.map +1 -0
- package/dist/governance/fsm/stateMachine.d.ts +40 -0
- package/dist/governance/fsm/stateMachine.js +93 -0
- package/dist/governance/fsm/stateMachine.js.map +1 -0
- package/dist/governance/index.d.ts +9 -0
- package/dist/governance/index.js +26 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/review/diffParser.d.ts +12 -0
- package/dist/governance/review/diffParser.js +61 -0
- package/dist/governance/review/diffParser.js.map +1 -0
- package/dist/governance/review/render.d.ts +5 -0
- package/dist/governance/review/render.js +58 -0
- package/dist/governance/review/render.js.map +1 -0
- package/dist/governance/storage/store.d.ts +16 -0
- package/dist/governance/storage/store.js +110 -0
- package/dist/governance/storage/store.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GovernanceStateMachine = void 0;
|
|
4
|
+
exports.assertTransition = assertTransition;
|
|
5
|
+
exports.canTransition = canTransition;
|
|
6
|
+
exports.getNextStates = getNextStates;
|
|
7
|
+
exports.isValidState = isValidState;
|
|
8
|
+
/**
|
|
9
|
+
* Only these state transitions are legally permitted
|
|
10
|
+
* Any other transition is a governance violation
|
|
11
|
+
*/
|
|
12
|
+
const ALLOWED_TRANSITIONS = {
|
|
13
|
+
DRAFT: ["PROPOSED"],
|
|
14
|
+
PROPOSED: ["APPROVED", "REJECTED"],
|
|
15
|
+
APPROVED: ["EXECUTED"],
|
|
16
|
+
EXECUTED: ["OBSERVED"],
|
|
17
|
+
OBSERVED: ["VERIFIED"],
|
|
18
|
+
VERIFIED: [],
|
|
19
|
+
REJECTED: [],
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Throw governance violation if transition is not permitted
|
|
23
|
+
*/
|
|
24
|
+
function assertTransition(from, to) {
|
|
25
|
+
const allowed = ALLOWED_TRANSITIONS[from].includes(to);
|
|
26
|
+
if (!allowed) {
|
|
27
|
+
throw new Error(`Governance violation: illegal state transition ${from} → ${to}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if a transition is valid (without throwing)
|
|
32
|
+
*/
|
|
33
|
+
function canTransition(from, to) {
|
|
34
|
+
return ALLOWED_TRANSITIONS[from].includes(to);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get all possible next states from current state
|
|
38
|
+
*/
|
|
39
|
+
function getNextStates(from) {
|
|
40
|
+
return [...ALLOWED_TRANSITIONS[from]];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Validate that a state is valid
|
|
44
|
+
*/
|
|
45
|
+
function isValidState(state) {
|
|
46
|
+
return [
|
|
47
|
+
"DRAFT",
|
|
48
|
+
"PROPOSED",
|
|
49
|
+
"APPROVED",
|
|
50
|
+
"EXECUTED",
|
|
51
|
+
"OBSERVED",
|
|
52
|
+
"VERIFIED",
|
|
53
|
+
"REJECTED",
|
|
54
|
+
].includes(state);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* State machine for tracking governance state transitions
|
|
58
|
+
* Enforces constitutional invariants
|
|
59
|
+
*/
|
|
60
|
+
class GovernanceStateMachine {
|
|
61
|
+
currentState;
|
|
62
|
+
history = [];
|
|
63
|
+
constructor(initialState) {
|
|
64
|
+
if (!isValidState(initialState)) {
|
|
65
|
+
throw new Error(`Invalid initial state: ${initialState}`);
|
|
66
|
+
}
|
|
67
|
+
this.currentState = initialState;
|
|
68
|
+
}
|
|
69
|
+
get current() {
|
|
70
|
+
return this.currentState;
|
|
71
|
+
}
|
|
72
|
+
get transitionHistory() {
|
|
73
|
+
return [...this.history];
|
|
74
|
+
}
|
|
75
|
+
transition(to, reason) {
|
|
76
|
+
assertTransition(this.currentState, to);
|
|
77
|
+
this.history.push({
|
|
78
|
+
from: this.currentState,
|
|
79
|
+
to,
|
|
80
|
+
timestamp: Date.now(),
|
|
81
|
+
reason,
|
|
82
|
+
});
|
|
83
|
+
this.currentState = to;
|
|
84
|
+
}
|
|
85
|
+
isTerminal() {
|
|
86
|
+
return this.currentState === "VERIFIED" || this.currentState === "REJECTED";
|
|
87
|
+
}
|
|
88
|
+
canProceedTo(state) {
|
|
89
|
+
return canTransition(this.currentState, state);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.GovernanceStateMachine = GovernanceStateMachine;
|
|
93
|
+
//# sourceMappingURL=stateMachine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateMachine.js","sourceRoot":"","sources":["../../../src/governance/fsm/stateMachine.ts"],"names":[],"mappings":";;;AAmBA,4CAWC;AAKD,sCAKC;AAKD,sCAEC;AAKD,oCAUC;AA5DD;;;GAGG;AACH,MAAM,mBAAmB,GAA+C;IACtE,KAAK,EAAE,CAAC,UAAU,CAAC;IACnB,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAClC,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF;;GAEG;AACH,SAAgB,gBAAgB,CAC9B,IAAqB,EACrB,EAAmB;IAEnB,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,kDAAkD,IAAI,MAAM,EAAE,EAAE,CACjE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAC3B,IAAqB,EACrB,EAAmB;IAEnB,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAqB;IACjD,OAAO,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,KAAa;IACxC,OAAO;QACL,OAAO;QACP,UAAU;QACV,UAAU;QACV,UAAU;QACV,UAAU;QACV,UAAU;QACV,UAAU;KACX,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;AAYD;;;GAGG;AACH,MAAa,sBAAsB;IACzB,YAAY,CAAkB;IAC9B,OAAO,GAA6B,EAAE,CAAC;IAE/C,YAAY,YAA6B;QACvC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU,CAAC,EAAmB,EAAE,MAAe;QAC7C,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAExC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,IAAI,CAAC,YAAY;YACvB,EAAE;YACF,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU,IAAI,IAAI,CAAC,YAAY,KAAK,UAAU,CAAC;IAC9E,CAAC;IAED,YAAY,CAAC,KAAsB;QACjC,OAAO,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;CACF;AAvCD,wDAuCC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./GovernedAction";
|
|
2
|
+
export * from "./GovernanceEngine";
|
|
3
|
+
export * from "./actions/CodeChangeAction";
|
|
4
|
+
export * from "./fsm/stateMachine";
|
|
5
|
+
export * from "./review/diffParser";
|
|
6
|
+
export * from "./review/render";
|
|
7
|
+
export * from "./execution/sandbox";
|
|
8
|
+
export * from "./capability/token";
|
|
9
|
+
export * from "./storage/store";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./GovernedAction"), exports);
|
|
18
|
+
__exportStar(require("./GovernanceEngine"), exports);
|
|
19
|
+
__exportStar(require("./actions/CodeChangeAction"), exports);
|
|
20
|
+
__exportStar(require("./fsm/stateMachine"), exports);
|
|
21
|
+
__exportStar(require("./review/diffParser"), exports);
|
|
22
|
+
__exportStar(require("./review/render"), exports);
|
|
23
|
+
__exportStar(require("./execution/sandbox"), exports);
|
|
24
|
+
__exportStar(require("./capability/token"), exports);
|
|
25
|
+
__exportStar(require("./storage/store"), exports);
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/governance/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,qDAAmC;AACnC,6DAA2C;AAC3C,qDAAmC;AACnC,sDAAoC;AACpC,kDAAgC;AAChC,sDAAoC;AACpC,qDAAmC;AACnC,kDAAgC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface DiffFile {
|
|
2
|
+
file: string;
|
|
3
|
+
additions: number;
|
|
4
|
+
deletions: number;
|
|
5
|
+
hunks: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function parseUnifiedDiff(diff: string): DiffFile[];
|
|
8
|
+
export declare function extractFilesFromDiff(diff: string): string[];
|
|
9
|
+
export declare function assessRisk(files: DiffFile[]): {
|
|
10
|
+
level: "low" | "medium" | "high";
|
|
11
|
+
warnings: string[];
|
|
12
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseUnifiedDiff = parseUnifiedDiff;
|
|
4
|
+
exports.extractFilesFromDiff = extractFilesFromDiff;
|
|
5
|
+
exports.assessRisk = assessRisk;
|
|
6
|
+
function parseUnifiedDiff(diff) {
|
|
7
|
+
const files = [];
|
|
8
|
+
let current = null;
|
|
9
|
+
for (const line of diff.split("\n")) {
|
|
10
|
+
if (line.startsWith("diff --git")) {
|
|
11
|
+
if (current) {
|
|
12
|
+
files.push(current);
|
|
13
|
+
}
|
|
14
|
+
const match = line.match(/b\/(.+)$/);
|
|
15
|
+
const file = match ? match[1] : "unknown";
|
|
16
|
+
current = { file, additions: 0, deletions: 0, hunks: [] };
|
|
17
|
+
}
|
|
18
|
+
else if (!current) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
else if (line.startsWith("+") && !line.startsWith("+++")) {
|
|
22
|
+
current.additions++;
|
|
23
|
+
}
|
|
24
|
+
else if (line.startsWith("-") && !line.startsWith("---")) {
|
|
25
|
+
current.deletions++;
|
|
26
|
+
}
|
|
27
|
+
else if (line.startsWith("@@")) {
|
|
28
|
+
current.hunks.push(line);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (current) {
|
|
32
|
+
files.push(current);
|
|
33
|
+
}
|
|
34
|
+
return files;
|
|
35
|
+
}
|
|
36
|
+
function extractFilesFromDiff(diff) {
|
|
37
|
+
const files = [];
|
|
38
|
+
const filePattern = /^\+\+\+ b\/(.+)$/m;
|
|
39
|
+
for (const match of diff.matchAll(filePattern)) {
|
|
40
|
+
files.push(match[1]);
|
|
41
|
+
}
|
|
42
|
+
return files;
|
|
43
|
+
}
|
|
44
|
+
function assessRisk(files) {
|
|
45
|
+
const warnings = [];
|
|
46
|
+
const totalLines = files.reduce((sum, f) => sum + f.additions + f.deletions, 0);
|
|
47
|
+
if (totalLines > 300) {
|
|
48
|
+
warnings.push(`Large changeset: ${totalLines} lines`);
|
|
49
|
+
}
|
|
50
|
+
if (files.length > 10) {
|
|
51
|
+
warnings.push(`Many files touched: ${files.length}`);
|
|
52
|
+
}
|
|
53
|
+
if (totalLines > 1000) {
|
|
54
|
+
return { level: "high", warnings };
|
|
55
|
+
}
|
|
56
|
+
if (totalLines > 300 || files.length > 10) {
|
|
57
|
+
return { level: "medium", warnings };
|
|
58
|
+
}
|
|
59
|
+
return { level: "low", warnings };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=diffParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diffParser.js","sourceRoot":"","sources":["../../../src/governance/review/diffParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DiffFile } from "./diffParser";
|
|
2
|
+
export declare function renderSummary(files: DiffFile[]): void;
|
|
3
|
+
export declare function renderDiffForReview(files: DiffFile[], rationale: string): void;
|
|
4
|
+
export declare function renderRiskAssessment(level: "low" | "medium" | "high", warnings: string[]): void;
|
|
5
|
+
export declare function promptForApproval(): Promise<boolean>;
|
|
@@ -0,0 +1,58 @@
|
|
|
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.renderSummary = renderSummary;
|
|
7
|
+
exports.renderDiffForReview = renderDiffForReview;
|
|
8
|
+
exports.renderRiskAssessment = renderRiskAssessment;
|
|
9
|
+
exports.promptForApproval = promptForApproval;
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
function renderSummary(files) {
|
|
12
|
+
console.log(chalk_1.default.bold("\nDiff Summary\n"));
|
|
13
|
+
for (const f of files) {
|
|
14
|
+
console.log(`${chalk_1.default.cyan(f.file)} ` +
|
|
15
|
+
chalk_1.default.green(`+${f.additions}`) +
|
|
16
|
+
" " +
|
|
17
|
+
chalk_1.default.red(`-${f.deletions}`));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function renderDiffForReview(files, rationale) {
|
|
21
|
+
console.log(chalk_1.default.bold.cyan("=".repeat(60)));
|
|
22
|
+
console.log(chalk_1.default.bold.blue("Proposed Code Change"));
|
|
23
|
+
console.log(chalk_1.default.bold.cyan("=".repeat(60)));
|
|
24
|
+
console.log(`${chalk_1.default.bold("Rationale:")} ${rationale}\n`);
|
|
25
|
+
for (const f of files) {
|
|
26
|
+
console.log(chalk_1.default.yellow(`\n📄 ${f.file}`));
|
|
27
|
+
console.log(` ${chalk_1.default.green("+")} ${f.additions} lines added`);
|
|
28
|
+
console.log(` ${chalk_1.default.red("-")} ${f.deletions} lines deleted`);
|
|
29
|
+
}
|
|
30
|
+
console.log(chalk_1.default.bold.cyan("\n" + "=".repeat(60)));
|
|
31
|
+
}
|
|
32
|
+
function renderRiskAssessment(level, warnings) {
|
|
33
|
+
const levelColor = {
|
|
34
|
+
low: chalk_1.default.green,
|
|
35
|
+
medium: chalk_1.default.yellow,
|
|
36
|
+
high: chalk_1.default.red,
|
|
37
|
+
};
|
|
38
|
+
console.log(chalk_1.default.bold(`\n${levelColor[level]}(\u26a0\ufe0f Risk Level: ${level.toUpperCase()})`));
|
|
39
|
+
if (warnings.length > 0) {
|
|
40
|
+
for (const w of warnings) {
|
|
41
|
+
console.log(chalk_1.default.yellow(` - ${w}`));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function promptForApproval() {
|
|
46
|
+
const readline = require("readline");
|
|
47
|
+
const rl = readline.createInterface({
|
|
48
|
+
input: process.stdin,
|
|
49
|
+
output: process.stdout,
|
|
50
|
+
});
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
rl.question(chalk_1.default.bold.yellow('\nType "YES" to approve, anything else to reject: '), (answer) => {
|
|
53
|
+
rl.close();
|
|
54
|
+
resolve(answer.trim() === "YES");
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/governance/review/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface SerializedAction {
|
|
2
|
+
id: string;
|
|
3
|
+
kind: string;
|
|
4
|
+
state: string;
|
|
5
|
+
payload: any;
|
|
6
|
+
rationale: string;
|
|
7
|
+
provenance: any;
|
|
8
|
+
updatedAt: number;
|
|
9
|
+
executedAt?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function ensureDataDir(): void;
|
|
12
|
+
export declare function atomicWrite(filePath: string, data: string): void;
|
|
13
|
+
export declare function loadActions(): Record<string, SerializedAction>;
|
|
14
|
+
export declare function saveActions(actions: Record<string, SerializedAction>): void;
|
|
15
|
+
export declare function deserializeActions(data: Record<string, any>): Record<string, SerializedAction>;
|
|
16
|
+
export declare function auditActions(actions: Record<string, SerializedAction>): void;
|
|
@@ -0,0 +1,110 @@
|
|
|
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.ensureDataDir = ensureDataDir;
|
|
7
|
+
exports.atomicWrite = atomicWrite;
|
|
8
|
+
exports.loadActions = loadActions;
|
|
9
|
+
exports.saveActions = saveActions;
|
|
10
|
+
exports.deserializeActions = deserializeActions;
|
|
11
|
+
exports.auditActions = auditActions;
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const os_1 = __importDefault(require("os"));
|
|
15
|
+
const DATA_DIR = path_1.default.join(os_1.default.homedir(), ".yuangs");
|
|
16
|
+
const STORE_PATH = path_1.default.join(DATA_DIR, "actions.json");
|
|
17
|
+
function ensureDataDir() {
|
|
18
|
+
if (!fs_1.default.existsSync(DATA_DIR)) {
|
|
19
|
+
fs_1.default.mkdirSync(DATA_DIR, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function atomicWrite(filePath, data) {
|
|
23
|
+
const tmpPath = `${filePath}.tmp.${Date.now()}`;
|
|
24
|
+
try {
|
|
25
|
+
fs_1.default.writeFileSync(tmpPath, data, "utf-8");
|
|
26
|
+
fs_1.default.renameSync(tmpPath, filePath);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (fs_1.default.existsSync(tmpPath)) {
|
|
30
|
+
fs_1.default.unlinkSync(tmpPath);
|
|
31
|
+
}
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function loadActions() {
|
|
36
|
+
ensureDataDir();
|
|
37
|
+
if (!fs_1.default.existsSync(STORE_PATH)) {
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const content = fs_1.default.readFileSync(STORE_PATH, "utf-8");
|
|
42
|
+
const data = JSON.parse(content);
|
|
43
|
+
return deserializeActions(data);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error(`Failed to load actions: ${error}`);
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function saveActions(actions) {
|
|
51
|
+
ensureDataDir();
|
|
52
|
+
try {
|
|
53
|
+
const content = JSON.stringify(actions, null, 2);
|
|
54
|
+
atomicWrite(STORE_PATH, content);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error(`Failed to save actions: ${error}`);
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function deserializeActions(data) {
|
|
62
|
+
const result = {};
|
|
63
|
+
for (const [id, raw] of Object.entries(data)) {
|
|
64
|
+
try {
|
|
65
|
+
result[id] = validateAction(raw);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.warn(`Invalid action ${id}, skipping: ${error}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
function validateAction(raw) {
|
|
74
|
+
if (typeof raw.id !== "string" || !raw.id) {
|
|
75
|
+
throw new Error("Action missing valid id");
|
|
76
|
+
}
|
|
77
|
+
const validStates = [
|
|
78
|
+
"DRAFT",
|
|
79
|
+
"PROPOSED",
|
|
80
|
+
"APPROVED",
|
|
81
|
+
"EXECUTED",
|
|
82
|
+
"OBSERVED",
|
|
83
|
+
"VERIFIED",
|
|
84
|
+
"REJECTED",
|
|
85
|
+
];
|
|
86
|
+
if (!validStates.includes(raw.state)) {
|
|
87
|
+
throw new Error(`Invalid state: ${raw.state}`);
|
|
88
|
+
}
|
|
89
|
+
if (typeof raw.rationale !== "string") {
|
|
90
|
+
throw new Error("Rationale must be a string");
|
|
91
|
+
}
|
|
92
|
+
if (typeof raw.updatedAt !== "number") {
|
|
93
|
+
throw new Error("UpdatedAt must be a number");
|
|
94
|
+
}
|
|
95
|
+
if (raw.state === "EXECUTED" && !raw.executedAt) {
|
|
96
|
+
throw new Error("EXECUTED actions must have executedAt");
|
|
97
|
+
}
|
|
98
|
+
return raw;
|
|
99
|
+
}
|
|
100
|
+
function auditActions(actions) {
|
|
101
|
+
for (const [id, action] of Object.entries(actions)) {
|
|
102
|
+
try {
|
|
103
|
+
validateAction(action);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
throw new Error(`Audit failed for action ${id}: ${error}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/governance/storage/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yuangs",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.32.0",
|
|
4
4
|
"description": "苑广山的个人应用集合 CLI(彩色版)",
|
|
5
5
|
"author": "苑广山",
|
|
6
6
|
"license": "ISC",
|
|
@@ -43,9 +43,11 @@
|
|
|
43
43
|
"marked": "^15.0.12",
|
|
44
44
|
"marked-terminal": "^7.3.0",
|
|
45
45
|
"ora": "^6.3.1",
|
|
46
|
+
"yuangs": "^2.29.0",
|
|
46
47
|
"zod": "^4.3.5"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|
|
50
|
+
"@types/jest": "^30.0.0",
|
|
49
51
|
"@types/js-yaml": "^4.0.9",
|
|
50
52
|
"@types/json5": "^0.0.30",
|
|
51
53
|
"@types/marked": "^5.0.2",
|