@getripple/core 1.0.5 → 1.0.7

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/dist/index.d.ts CHANGED
@@ -7,5 +7,6 @@ export * from "./graph";
7
7
  export * from "./normalizer";
8
8
  export * from "./policy";
9
9
  export * from "./readiness";
10
+ export * from "./risk";
10
11
  export * from "./staged-check";
11
12
  export * from "./types";
package/dist/index.js CHANGED
@@ -23,6 +23,7 @@ __exportStar(require("./graph"), exports);
23
23
  __exportStar(require("./normalizer"), exports);
24
24
  __exportStar(require("./policy"), exports);
25
25
  __exportStar(require("./readiness"), exports);
26
+ __exportStar(require("./risk"), exports);
26
27
  __exportStar(require("./staged-check"), exports);
27
28
  __exportStar(require("./types"), exports);
28
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,6CAA2B;AAC3B,0CAAwB;AACxB,mDAAiC;AACjC,kDAAgC;AAChC,0CAAwB;AACxB,+CAA6B;AAC7B,2CAAyB;AACzB,8CAA4B;AAC5B,iDAA+B;AAC/B,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,6CAA2B;AAC3B,0CAAwB;AACxB,mDAAiC;AACjC,kDAAgC;AAChC,0CAAwB;AACxB,+CAA6B;AAC7B,2CAAyB;AACzB,8CAA4B;AAC5B,yCAAuB;AACvB,iDAA+B;AAC/B,0CAAwB"}
@@ -1,6 +1,8 @@
1
1
  import { RippleAdapterDetectionSummary } from "./adapters";
2
2
  import { GraphEngine } from "./graph";
3
3
  export declare const RIPPLE_CI_WORKFLOW_PATH = ".github/workflows/ripple.yml";
4
+ export declare const RIPPLE_GITIGNORE_PATH = ".gitignore";
5
+ export declare const RIPPLE_CACHE_GITIGNORE_ENTRY = ".ripple/.cache/";
4
6
  export type RippleReadinessCheck = {
5
7
  ok: boolean;
6
8
  detail: string;
@@ -16,8 +18,15 @@ export type RippleEnforcementReadiness = {
16
18
  explicitPolicy: RippleReadinessCheck;
17
19
  gaps: string[];
18
20
  };
21
+ export type RippleReadinessDecision = "continue" | "setup-required";
19
22
  export type RippleReadinessSummary = {
20
23
  status: "ready" | "needs_setup";
24
+ decision: RippleReadinessDecision;
25
+ canContinue: boolean;
26
+ mustStop: boolean;
27
+ nextRequiredAction: string;
28
+ why: string[];
29
+ fixNow: string[];
21
30
  workspace: string;
22
31
  sourceFiles: number;
23
32
  symbols: number;
@@ -27,6 +36,7 @@ export type RippleReadinessSummary = {
27
36
  checks: {
28
37
  graph: RippleReadinessCheck;
29
38
  git: RippleReadinessCheck;
39
+ gitIgnore: RippleReadinessCheck;
30
40
  ciWorkflow: RippleReadinessCheck;
31
41
  latestIntent: RippleReadinessCheck;
32
42
  };
package/dist/readiness.js CHANGED
@@ -23,13 +23,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.buildRippleReadinessSummary = exports.RIPPLE_CI_WORKFLOW_PATH = void 0;
26
+ exports.buildRippleReadinessSummary = exports.RIPPLE_CACHE_GITIGNORE_ENTRY = exports.RIPPLE_GITIGNORE_PATH = exports.RIPPLE_CI_WORKFLOW_PATH = void 0;
27
27
  const fs = __importStar(require("fs"));
28
28
  const path = __importStar(require("path"));
29
- const child_process_1 = require("child_process");
30
29
  const adapters_1 = require("./adapters");
31
30
  const change_intent_1 = require("./change-intent");
31
+ const git_1 = require("./git");
32
32
  exports.RIPPLE_CI_WORKFLOW_PATH = ".github/workflows/ripple.yml";
33
+ exports.RIPPLE_GITIGNORE_PATH = ".gitignore";
34
+ exports.RIPPLE_CACHE_GITIGNORE_ENTRY = ".ripple/.cache/";
33
35
  function buildRippleReadinessSummary(workspaceRoot, engine) {
34
36
  const sourceFiles = engine.graph.files.size;
35
37
  const symbols = engine.graph.symbols.size;
@@ -39,7 +41,9 @@ function buildRippleReadinessSummary(workspaceRoot, engine) {
39
41
  const latestIntentPath = (0, change_intent_1.defaultChangeIntentPath)(workspaceRoot);
40
42
  const policyPath = path.join(workspaceRoot, ".ripple", "policy.json");
41
43
  const graphOk = sourceFiles > 0;
42
- const gitOk = isGitWorktree(workspaceRoot);
44
+ const gitCheck = gitWorktreeCheck(workspaceRoot);
45
+ const gitOk = gitCheck.ok;
46
+ const gitIgnoreCheck = rippleGitIgnoreCheck(workspaceRoot);
43
47
  const ciWorkflowOk = fs.existsSync(workflowPath);
44
48
  const latestIntentOk = fs.existsSync(latestIntentPath);
45
49
  const explicitPolicyOk = fs.existsSync(policyPath);
@@ -51,11 +55,8 @@ function buildRippleReadinessSummary(workspaceRoot, engine) {
51
55
  : "No supported source files were found",
52
56
  fix: graphOk ? undefined : "Run Ripple from a JavaScript, TypeScript, or Python repo root.",
53
57
  },
54
- git: {
55
- ok: gitOk,
56
- detail: gitOk ? "Inside a git worktree" : "Not inside a git worktree",
57
- fix: gitOk ? undefined : "Run Ripple inside a git repository.",
58
- },
58
+ git: gitCheck,
59
+ gitIgnore: gitIgnoreCheck,
59
60
  ciWorkflow: {
60
61
  ok: ciWorkflowOk,
61
62
  detail: ciWorkflowOk
@@ -76,6 +77,8 @@ function buildRippleReadinessSummary(workspaceRoot, engine) {
76
77
  const enforcement = buildEnforcementReadiness({
77
78
  graphOk,
78
79
  gitOk,
80
+ gitDetail: gitCheck.detail,
81
+ gitIgnoreOk: gitIgnoreCheck.ok,
79
82
  ciWorkflowOk,
80
83
  latestIntentOk,
81
84
  explicitPolicyOk,
@@ -86,8 +89,16 @@ function buildRippleReadinessSummary(workspaceRoot, engine) {
86
89
  if (nextSteps.length === 0) {
87
90
  nextSteps.push("Run ripple ci --base origin/main --intent latest --github-annotations.");
88
91
  }
92
+ const status = Object.values(checks).every((check) => check.ok) ? "ready" : "needs_setup";
93
+ const contract = readinessContract(status, enforcement, nextSteps);
89
94
  return {
90
- status: Object.values(checks).every((check) => check.ok) ? "ready" : "needs_setup",
95
+ status,
96
+ decision: contract.decision,
97
+ canContinue: contract.canContinue,
98
+ mustStop: contract.mustStop,
99
+ nextRequiredAction: contract.nextRequiredAction,
100
+ why: contract.why,
101
+ fixNow: contract.fixNow,
91
102
  workspace: workspaceRoot,
92
103
  sourceFiles,
93
104
  symbols,
@@ -99,6 +110,26 @@ function buildRippleReadinessSummary(workspaceRoot, engine) {
99
110
  };
100
111
  }
101
112
  exports.buildRippleReadinessSummary = buildRippleReadinessSummary;
113
+ function readinessContract(status, enforcement, nextSteps) {
114
+ if (status === "ready") {
115
+ return {
116
+ decision: "continue",
117
+ canContinue: true,
118
+ mustStop: false,
119
+ nextRequiredAction: "Continue with the saved-intent workflow and keep the Ripple CI gate enabled.",
120
+ why: [enforcement.summary],
121
+ fixNow: [],
122
+ };
123
+ }
124
+ return {
125
+ decision: "setup-required",
126
+ canContinue: false,
127
+ mustStop: true,
128
+ nextRequiredAction: "Stop autonomous agent work until Ripple readiness gaps are fixed.",
129
+ why: enforcement.gaps,
130
+ fixNow: nextSteps,
131
+ };
132
+ }
102
133
  function buildEnforcementReadiness(input) {
103
134
  const canGuideAgents = input.graphOk;
104
135
  const canDetectDrift = input.graphOk && input.gitOk && input.latestIntentOk;
@@ -157,7 +188,10 @@ function enforcementGaps(input) {
157
188
  gaps.push("No supported source graph is available.");
158
189
  }
159
190
  if (!input.gitOk) {
160
- gaps.push("Git worktree is required for changed-file and CI drift checks.");
191
+ gaps.push(`${input.gitDetail} Git is required for changed-file and CI drift checks.`);
192
+ }
193
+ if (!input.gitIgnoreOk) {
194
+ gaps.push("Missing .gitignore hygiene for .ripple/.cache/; generated cache files may be committed accidentally.");
161
195
  }
162
196
  if (!input.latestIntentOk) {
163
197
  gaps.push("No latest saved intent exists, so Ripple cannot compare agent work to a plan.");
@@ -177,18 +211,82 @@ function countCallEdges(engine) {
177
211
  });
178
212
  return count;
179
213
  }
180
- function isGitWorktree(workspaceRoot) {
214
+ function gitWorktreeCheck(workspaceRoot) {
181
215
  try {
182
- const output = (0, child_process_1.execFileSync)("git", ["rev-parse", "--is-inside-work-tree"], {
183
- cwd: workspaceRoot,
184
- encoding: "utf8",
185
- stdio: ["ignore", "pipe", "ignore"],
186
- });
187
- return output.trim() === "true";
216
+ const output = (0, git_1.execGit)(workspaceRoot, ["rev-parse", "--is-inside-work-tree"], ["ignore", "pipe", "ignore"]);
217
+ const insideWorktree = output.trim() === "true";
218
+ return {
219
+ ok: insideWorktree,
220
+ detail: insideWorktree
221
+ ? "Inside a git worktree"
222
+ : "Git command ran, but this directory is not inside a git worktree",
223
+ fix: insideWorktree
224
+ ? undefined
225
+ : "Run Ripple from the repository root or initialize git first.",
226
+ };
188
227
  }
189
- catch {
190
- return false;
228
+ catch (err) {
229
+ const detail = err instanceof Error ? err.message : String(err);
230
+ return {
231
+ ok: false,
232
+ detail,
233
+ fix: gitFixFor(detail),
234
+ };
235
+ }
236
+ }
237
+ function gitFixFor(detail) {
238
+ if (/could not be started|EPERM|EACCES/i.test(detail)) {
239
+ return "Run Ripple from a normal terminal, or allow Node.js to execute git in this environment.";
191
240
  }
241
+ if (/not found|ENOENT/i.test(detail)) {
242
+ return "Install Git and make sure git is available on PATH.";
243
+ }
244
+ return "Run Ripple from the repository root or initialize git first.";
245
+ }
246
+ function rippleGitIgnoreCheck(workspaceRoot) {
247
+ const gitignorePath = path.join(workspaceRoot, exports.RIPPLE_GITIGNORE_PATH);
248
+ if (!fs.existsSync(gitignorePath)) {
249
+ return {
250
+ ok: false,
251
+ detail: "Missing .gitignore entry for .ripple/.cache/",
252
+ fix: "Run ripple init or add .ripple/.cache/ to .gitignore.",
253
+ };
254
+ }
255
+ const lines = fs
256
+ .readFileSync(gitignorePath, "utf8")
257
+ .split(/\r?\n/)
258
+ .map((line) => line.trim())
259
+ .filter((line) => line.length > 0 && !line.startsWith("#"));
260
+ const broadRippleIgnore = lines.some(isBroadRippleIgnore);
261
+ if (broadRippleIgnore) {
262
+ return {
263
+ ok: false,
264
+ detail: "Overbroad .ripple/ ignore may hide policy, history, intents, or approvals",
265
+ fix: "Ignore only .ripple/.cache/ so Ripple audit files can be committed intentionally.",
266
+ };
267
+ }
268
+ const cacheIgnored = lines.some(isRippleCacheIgnore);
269
+ return {
270
+ ok: cacheIgnored,
271
+ detail: cacheIgnored
272
+ ? ".ripple/.cache/ is ignored; Ripple audit files remain commit-able"
273
+ : "Missing .gitignore entry for .ripple/.cache/",
274
+ fix: cacheIgnored
275
+ ? undefined
276
+ : "Run ripple init or add .ripple/.cache/ to .gitignore.",
277
+ };
278
+ }
279
+ function isRippleCacheIgnore(line) {
280
+ const normalized = line.replace(/\\/g, "/").replace(/^\/+/, "");
281
+ return (normalized === exports.RIPPLE_CACHE_GITIGNORE_ENTRY ||
282
+ normalized === ".ripple/.cache" ||
283
+ normalized === ".ripple/.cache/**");
284
+ }
285
+ function isBroadRippleIgnore(line) {
286
+ const normalized = line.replace(/\\/g, "/").replace(/^\/+/, "");
287
+ return (normalized === ".ripple" ||
288
+ normalized === ".ripple/" ||
289
+ normalized === ".ripple/**");
192
290
  }
193
291
  function formatWorkspacePath(workspaceRoot, filePath) {
194
292
  const relative = path.relative(workspaceRoot, filePath);
@@ -1 +1 @@
1
- {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,iDAA6C;AAC7C,yCAAoF;AACpF,mDAA0D;AAG7C,QAAA,uBAAuB,GAAG,8BAA8B,CAAC;AAyCtE,SAAgB,2BAA2B,CACzC,aAAqB,EACrB,MAAmB;IAEnB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;IAC1C,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,IAAA,kCAAuB,EAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,+BAAuB,CAAC,CAAC;IACvE,MAAM,gBAAgB,GAAG,IAAA,uCAAuB,EAAC,aAAa,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,WAAW,GAAG,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG;QACb,KAAK,EAAE;YACL,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,OAAO;gBACb,CAAC,CAAC,GAAG,WAAW,kBAAkB,OAAO,aAAa,SAAS,aAAa;gBAC5E,CAAC,CAAC,sCAAsC;YAC1C,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gEAAgE;SAC5F;QACD,GAAG,EAAE;YACH,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,2BAA2B;YACrE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qCAAqC;SAC/D;QACD,UAAU,EAAE;YACV,EAAE,EAAE,YAAY;YAChB,MAAM,EAAE,YAAY;gBAClB,CAAC,CAAC,+BAAuB;gBACzB,CAAC,CAAC,sCAAsC;YAC1C,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB;SACnD;QACD,YAAY,EAAE;YACZ,EAAE,EAAE,cAAc;YAClB,MAAM,EAAE,cAAc;gBACpB,CAAC,CAAC,mBAAmB,CAAC,aAAa,EAAE,gBAAgB,CAAC;gBACtD,CAAC,CAAC,qCAAqC;YACzC,GAAG,EAAE,cAAc;gBACjB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,mEAAmE;SACxE;KACF,CAAC;IACF,MAAM,WAAW,GAAG,yBAAyB,CAAC;QAC5C,OAAO;QACP,KAAK;QACL,YAAY;QACZ,cAAc;QACd,gBAAgB;KACjB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;SACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;SACzB,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;QAClF,SAAS,EAAE,aAAa;QACxB,WAAW;QACX,OAAO;QACP,SAAS;QACT,cAAc;QACd,WAAW;QACX,MAAM;QACN,SAAS;KACV,CAAC;AACJ,CAAC;AAxED,kEAwEC;AAED,SAAS,yBAAyB,CAAC,KAMlC;IACC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC;IACrC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC;IAC5E,MAAM,YAAY,GAAG,cAAc,IAAI,KAAK,CAAC,YAAY,CAAC;IAC1D,MAAM,KAAK,GAAG,gBAAgB,CAAC;QAC7B,cAAc;QACd,cAAc;QACd,YAAY;KACb,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEpC,OAAO;QACL,KAAK;QACL,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC;QAClC,cAAc;QACd,cAAc;QACd,YAAY;QACZ,cAAc,EAAE;YACd,EAAE,EAAE,KAAK,CAAC,gBAAgB;YAC1B,MAAM,EAAE,KAAK,CAAC,gBAAgB;gBAC5B,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,gCAAgC;YACpC,GAAG,EAAE,KAAK,CAAC,gBAAgB;gBACzB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,gEAAgE;SACrE;QACD,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAIzB;IACC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA6B;IACvD,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;QAC9B,OAAO,mGAAmG,CAAC;IAC7G,CAAC;IACD,IAAI,KAAK,KAAK,mBAAmB,EAAE,CAAC;QAClC,OAAO,yFAAyF,CAAC;IACnG,CAAC;IACD,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,OAAO,+FAA+F,CAAC;IACzG,CAAC;IACD,OAAO,kFAAkF,CAAC;AAC5F,CAAC;AAED,SAAS,eAAe,CAAC,KAMxB;IACC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,4FAA4F,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,MAAmB;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACtC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,aAAqB;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,4BAAY,EAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE;YACzE,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,aAAqB,EAAE,QAAgB;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACxD,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"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"}
package/dist/risk.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import type { ControlBoundaryRisk } from "./change-intent";
2
+ import type { StagedCheckFileSummary } from "./staged-check";
3
+ export type RippleRiskLevel = "low" | "medium" | "high" | "critical";
4
+ export type RippleRiskReasonKind = "boundary-crossed" | "intent-drift" | "risky-path" | "blast-radius" | "public-contract" | "test-gap" | "policy-rule" | "readiness-drift";
5
+ export type RippleRiskReason = {
6
+ kind: RippleRiskReasonKind;
7
+ severity: RippleRiskLevel;
8
+ message: string;
9
+ evidence: string[];
10
+ };
11
+ export type RippleRiskSummary = {
12
+ level: RippleRiskLevel;
13
+ score: number;
14
+ summary: string;
15
+ reasons: RippleRiskReason[];
16
+ affectedFiles: string[];
17
+ affectedSymbols: string[];
18
+ requiredActions: string[];
19
+ };
20
+ export type BuildRippleRiskSummaryInput = {
21
+ boundaryRisk: ControlBoundaryRisk;
22
+ allowedFiles: string[];
23
+ allowedSymbols: string[];
24
+ changedFiles: string[];
25
+ changedOutsideBoundaryFiles: string[];
26
+ changedOutsideBoundarySymbols: string[];
27
+ unplannedFiles?: string[];
28
+ unplannedSymbols?: string[];
29
+ verificationTargets: string[];
30
+ nextSteps: string[];
31
+ stagedFiles: StagedCheckFileSummary[];
32
+ };
33
+ export declare function buildRippleRiskSummary(input: BuildRippleRiskSummaryInput): RippleRiskSummary;
package/dist/risk.js ADDED
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildRippleRiskSummary = void 0;
4
+ const GRAPH_RISK_WEIGHT = {
5
+ safe: 0,
6
+ caution: 16,
7
+ dangerous: 32,
8
+ };
9
+ const CONTRACT_RISK_WEIGHT = {
10
+ review: 16,
11
+ high: 28,
12
+ };
13
+ const RISKY_PATH_RULES = [
14
+ {
15
+ pattern: /(^|[\\/])(auth|security|permissions?)([\\/]|$)/i,
16
+ label: "auth/security/permission code",
17
+ severity: "high",
18
+ weight: 24,
19
+ },
20
+ {
21
+ pattern: /(^|[\\/])(payments?|billing|checkout)([\\/]|$)/i,
22
+ label: "payment/billing code",
23
+ severity: "critical",
24
+ weight: 36,
25
+ },
26
+ {
27
+ pattern: /(^|[\\/])(migrations?|schema|database|db)([\\/]|$)/i,
28
+ label: "database/schema/migration code",
29
+ severity: "critical",
30
+ weight: 36,
31
+ },
32
+ {
33
+ pattern: /(^|[\\/])(infra|deploy|deployment|terraform|k8s|kubernetes|docker)([\\/]|$)/i,
34
+ label: "infra/deployment code",
35
+ severity: "high",
36
+ weight: 26,
37
+ },
38
+ {
39
+ pattern: /(^|[\\/])\.github[\\/]workflows[\\/]|(^|[\\/])(config|configs)([\\/]|$)|\.(env|ya?ml|toml|ini)$/i,
40
+ label: "config/CI code",
41
+ severity: "high",
42
+ weight: 22,
43
+ },
44
+ ];
45
+ function buildRippleRiskSummary(input) {
46
+ const reasons = [];
47
+ const affectedFiles = new Set(input.changedFiles);
48
+ const affectedSymbols = new Set([
49
+ ...input.changedOutsideBoundarySymbols,
50
+ ...(input.unplannedSymbols ?? []),
51
+ ]);
52
+ addBoundaryReasons(input, reasons);
53
+ addIntentReasons(input, reasons);
54
+ addPolicyReason(input, reasons);
55
+ addFileRiskReasons(input, reasons, affectedFiles);
56
+ addContractReasons(input, reasons, affectedSymbols);
57
+ addVerificationReason(input, reasons);
58
+ const score = Math.min(100, reasons.reduce((total, reason) => total + reason.weight, 0));
59
+ const level = riskLevelForScore(score);
60
+ const requiredActions = buildRequiredActions(input, reasons);
61
+ return {
62
+ level,
63
+ score,
64
+ summary: buildRiskSummary(level, score, reasons),
65
+ reasons: reasons.map(({ weight: _weight, ...reason }) => reason),
66
+ affectedFiles: Array.from(affectedFiles).sort(),
67
+ affectedSymbols: Array.from(affectedSymbols).sort(),
68
+ requiredActions,
69
+ };
70
+ }
71
+ exports.buildRippleRiskSummary = buildRippleRiskSummary;
72
+ function addBoundaryReasons(input, reasons) {
73
+ if (input.changedOutsideBoundaryFiles.length > 0) {
74
+ reasons.push({
75
+ kind: "boundary-crossed",
76
+ severity: "high",
77
+ weight: 34,
78
+ message: "Agent changed files outside the approved Ripple boundary.",
79
+ evidence: [
80
+ ...input.allowedFiles.map((file) => `allowed file: ${file}`),
81
+ ...input.changedOutsideBoundaryFiles.map((file) => `changed outside boundary: ${file}`),
82
+ ],
83
+ });
84
+ }
85
+ if (input.changedOutsideBoundarySymbols.length > 0) {
86
+ reasons.push({
87
+ kind: "boundary-crossed",
88
+ severity: "high",
89
+ weight: 36,
90
+ message: "Agent changed symbols outside the approved Ripple boundary.",
91
+ evidence: [
92
+ ...input.allowedSymbols.map((symbol) => `allowed symbol: ${symbol}`),
93
+ ...input.changedOutsideBoundarySymbols.map((symbol) => `changed outside boundary: ${symbol}`),
94
+ ],
95
+ });
96
+ }
97
+ }
98
+ function addIntentReasons(input, reasons) {
99
+ const unplannedFiles = input.unplannedFiles ?? [];
100
+ const unplannedSymbols = input.unplannedSymbols ?? [];
101
+ if (unplannedFiles.length > 0) {
102
+ reasons.push({
103
+ kind: "intent-drift",
104
+ severity: "medium",
105
+ weight: 22,
106
+ message: "Agent changed files outside the saved task plan.",
107
+ evidence: unplannedFiles.map((file) => `unplanned file: ${file}`),
108
+ });
109
+ }
110
+ if (unplannedSymbols.length > 0) {
111
+ reasons.push({
112
+ kind: "intent-drift",
113
+ severity: "medium",
114
+ weight: 20,
115
+ message: "Agent changed symbols outside the saved task plan.",
116
+ evidence: unplannedSymbols.map((symbol) => `unplanned symbol: ${symbol}`),
117
+ });
118
+ }
119
+ }
120
+ function addPolicyReason(input, reasons) {
121
+ if (input.boundaryRisk === "high" || input.boundaryRisk === "critical") {
122
+ reasons.push({
123
+ kind: "policy-rule",
124
+ severity: input.boundaryRisk,
125
+ weight: input.boundaryRisk === "critical" ? 55 : 35,
126
+ message: `Saved intent is marked ${input.boundaryRisk} risk by Ripple policy/boundary analysis.`,
127
+ evidence: [`boundary risk: ${input.boundaryRisk}`],
128
+ });
129
+ }
130
+ }
131
+ function addFileRiskReasons(input, reasons, affectedFiles) {
132
+ for (const file of input.stagedFiles) {
133
+ affectedFiles.add(file.file);
134
+ const graphWeight = GRAPH_RISK_WEIGHT[file.modificationRisk];
135
+ if (graphWeight > 0) {
136
+ reasons.push({
137
+ kind: "blast-radius",
138
+ severity: file.modificationRisk === "dangerous" ? "high" : "medium",
139
+ weight: graphWeight,
140
+ message: `${file.file} is marked ${file.modificationRisk} by Ripple graph risk.`,
141
+ evidence: [
142
+ `importer count: ${file.importerCount}`,
143
+ `symbol count: ${file.symbolCount}`,
144
+ ],
145
+ });
146
+ }
147
+ if (file.importerCount >= 5) {
148
+ reasons.push({
149
+ kind: "blast-radius",
150
+ severity: "high",
151
+ weight: 26,
152
+ message: `${file.file} has a large downstream blast radius.`,
153
+ evidence: [`${file.importerCount} direct importers may be affected`],
154
+ });
155
+ }
156
+ else if (file.importerCount >= 2) {
157
+ reasons.push({
158
+ kind: "blast-radius",
159
+ severity: "medium",
160
+ weight: 14,
161
+ message: `${file.file} is shared by multiple downstream files.`,
162
+ evidence: [`${file.importerCount} direct importers may be affected`],
163
+ });
164
+ }
165
+ const riskyPath = RISKY_PATH_RULES.find((rule) => rule.pattern.test(file.file));
166
+ if (riskyPath) {
167
+ reasons.push({
168
+ kind: "risky-path",
169
+ severity: riskyPath.severity,
170
+ weight: riskyPath.weight,
171
+ message: `${file.file} touches ${riskyPath.label}.`,
172
+ evidence: [`changed file: ${file.file}`],
173
+ });
174
+ }
175
+ }
176
+ }
177
+ function addContractReasons(input, reasons, affectedSymbols) {
178
+ const contractRisks = input.stagedFiles.flatMap((file) => file.contractRisks);
179
+ if (contractRisks.length === 0) {
180
+ return;
181
+ }
182
+ const highestRisk = contractRisks.some((contractRisk) => contractRisk.risk === "high")
183
+ ? "high"
184
+ : "review";
185
+ for (const contractRisk of contractRisks) {
186
+ affectedSymbols.add(contractRisk.symbol);
187
+ }
188
+ reasons.push({
189
+ kind: "public-contract",
190
+ severity: highestRisk === "high" ? "high" : "medium",
191
+ weight: Math.max(...contractRisks.map((contractRisk) => CONTRACT_RISK_WEIGHT[contractRisk.risk])),
192
+ message: "Changed exported/public symbols may affect callers or external contracts.",
193
+ evidence: uniqueItems(contractRisks.flatMap((contractRisk) => [
194
+ `symbol: ${contractRisk.symbol}`,
195
+ `callers: ${contractRisk.callers}`,
196
+ `exported: ${contractRisk.exported}`,
197
+ `reason: ${contractRisk.reason}`,
198
+ ])),
199
+ });
200
+ }
201
+ function addVerificationReason(input, reasons) {
202
+ if (input.changedFiles.length > 0 && input.verificationTargets.length === 0) {
203
+ reasons.push({
204
+ kind: "test-gap",
205
+ severity: "medium",
206
+ weight: 10,
207
+ message: "No verification target was detected for this change.",
208
+ evidence: ["verification targets: none"],
209
+ });
210
+ }
211
+ }
212
+ function buildRequiredActions(input, reasons) {
213
+ const actions = [];
214
+ if (input.changedOutsideBoundaryFiles.length > 0 ||
215
+ input.changedOutsideBoundarySymbols.length > 0) {
216
+ actions.push("Undo the outside-boundary change or create a wider human-approved intent.");
217
+ }
218
+ if (reasons.some((reason) => reason.kind === "blast-radius")) {
219
+ actions.push("Review downstream callers/importers before continuing.");
220
+ }
221
+ if (reasons.some((reason) => reason.kind === "public-contract")) {
222
+ actions.push("Review public contract changes before keeping this edit.");
223
+ }
224
+ if (input.verificationTargets.length > 0) {
225
+ actions.push(...input.verificationTargets.map((target) => `Run verification target: ${target}`));
226
+ }
227
+ else if (input.changedFiles.length > 0) {
228
+ actions.push("Run the narrowest relevant test/typecheck before handoff.");
229
+ }
230
+ if (actions.length === 0) {
231
+ actions.push("Continue with normal verification and review for the saved intent.");
232
+ }
233
+ return uniqueItems(actions);
234
+ }
235
+ function buildRiskSummary(level, score, reasons) {
236
+ if (reasons.length === 0) {
237
+ return `LOW risk ${score}/100: no boundary, graph, policy, contract, or verification risk signals were detected.`;
238
+ }
239
+ const topReason = reasons.slice().sort((a, b) => b.weight - a.weight)[0];
240
+ return `${level.toUpperCase()} risk ${score}/100: ${topReason.message}`;
241
+ }
242
+ function riskLevelForScore(score) {
243
+ if (score >= 81) {
244
+ return "critical";
245
+ }
246
+ if (score >= 51) {
247
+ return "high";
248
+ }
249
+ if (score >= 21) {
250
+ return "medium";
251
+ }
252
+ return "low";
253
+ }
254
+ function uniqueItems(items) {
255
+ const seen = new Set();
256
+ return items.filter((item) => {
257
+ if (seen.has(item)) {
258
+ return false;
259
+ }
260
+ seen.add(item);
261
+ return true;
262
+ });
263
+ }
264
+ //# sourceMappingURL=risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.js","sourceRoot":"","sources":["../src/risk.ts"],"names":[],"mappings":"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"}