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.
Files changed (45) hide show
  1. package/README.md +246 -589
  2. package/dist/agent/llmAdapter.js +1 -1
  3. package/dist/agent/llmAdapter.js.map +1 -1
  4. package/dist/agent/selectModel.js +1 -1
  5. package/dist/agent/selectModel.js.map +1 -1
  6. package/dist/cli.js +15 -10
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/handleAICommand.js +1 -1
  9. package/dist/commands/handleAICommand.js.map +1 -1
  10. package/dist/core/capabilitySystem.js +2 -2
  11. package/dist/core/capabilitySystem.js.map +1 -1
  12. package/dist/governance/GovernanceEngine.d.ts +20 -0
  13. package/dist/governance/GovernanceEngine.js +95 -0
  14. package/dist/governance/GovernanceEngine.js.map +1 -0
  15. package/dist/governance/GovernedAction.d.ts +107 -0
  16. package/dist/governance/GovernedAction.js +9 -0
  17. package/dist/governance/GovernedAction.js.map +1 -0
  18. package/dist/governance/actions/CodeChangeAction.d.ts +28 -0
  19. package/dist/governance/actions/CodeChangeAction.js +139 -0
  20. package/dist/governance/actions/CodeChangeAction.js.map +1 -0
  21. package/dist/governance/capability/token.d.ts +45 -0
  22. package/dist/governance/capability/token.js +103 -0
  23. package/dist/governance/capability/token.js.map +1 -0
  24. package/dist/governance/commands/diffEdit.d.ts +2 -0
  25. package/dist/governance/commands/diffEdit.js +176 -0
  26. package/dist/governance/commands/diffEdit.js.map +1 -0
  27. package/dist/governance/execution/sandbox.d.ts +12 -0
  28. package/dist/governance/execution/sandbox.js +76 -0
  29. package/dist/governance/execution/sandbox.js.map +1 -0
  30. package/dist/governance/fsm/stateMachine.d.ts +40 -0
  31. package/dist/governance/fsm/stateMachine.js +93 -0
  32. package/dist/governance/fsm/stateMachine.js.map +1 -0
  33. package/dist/governance/index.d.ts +9 -0
  34. package/dist/governance/index.js +26 -0
  35. package/dist/governance/index.js.map +1 -0
  36. package/dist/governance/review/diffParser.d.ts +12 -0
  37. package/dist/governance/review/diffParser.js +61 -0
  38. package/dist/governance/review/diffParser.js.map +1 -0
  39. package/dist/governance/review/render.d.ts +5 -0
  40. package/dist/governance/review/render.js +58 -0
  41. package/dist/governance/review/render.js.map +1 -0
  42. package/dist/governance/storage/store.d.ts +16 -0
  43. package/dist/governance/storage/store.js +110 -0
  44. package/dist/governance/storage/store.js.map +1 -0
  45. 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.30.0",
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",