@ryuenn3123/agentic-senior-core 2.0.24 → 2.0.25

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/.cursorrules CHANGED
@@ -1,6 +1,6 @@
1
1
  # AGENTIC-SENIOR-CORE DYNAMIC GOVERNANCE RULESET
2
2
 
3
- Generated by Agentic-Senior-Core CLI v2.0.24
3
+ Generated by Agentic-Senior-Core CLI v2.0.25
4
4
  Timestamp: 2026-04-15T00:14:51.184Z
5
5
  Selected profile: beginner
6
6
  Selected policy file: .agent-context/policies/llm-judge-threshold.json
@@ -30,9 +30,16 @@ jobs:
30
30
  node ./scripts/detection-benchmark.mjs > detection-benchmark-report.json
31
31
  test -s detection-benchmark-report.json
32
32
 
33
+ - name: Run benchmark anti-regression gate
34
+ run: |
35
+ node ./scripts/benchmark-gate.mjs > benchmark-gate-report.json
36
+ test -s benchmark-gate-report.json
37
+
33
38
  - name: Upload benchmark artifact
34
39
  if: always()
35
40
  uses: actions/upload-artifact@v4
36
41
  with:
37
42
  name: detection-benchmark-report
38
- path: detection-benchmark-report.json
43
+ path: |
44
+ detection-benchmark-report.json
45
+ benchmark-gate-report.json
package/.windsurfrules CHANGED
@@ -1,6 +1,6 @@
1
1
  # AGENTIC-SENIOR-CORE DYNAMIC GOVERNANCE RULESET
2
2
 
3
- Generated by Agentic-Senior-Core CLI v2.0.24
3
+ Generated by Agentic-Senior-Core CLI v2.0.25
4
4
  Timestamp: 2026-04-15T00:14:51.184Z
5
5
  Selected profile: beginner
6
6
  Selected policy file: .agent-context/policies/llm-judge-threshold.json
@@ -184,7 +184,15 @@ export async function runProjectDiscovery(userInterface, options = {}) {
184
184
  }
185
185
 
186
186
  if (!projectName) {
187
- projectName = (await userInterface.question('Project name: ')).trim();
187
+ const projectNamePrompt = defaultProjectName
188
+ ? `Project name (press Enter to use folder name: ${defaultProjectName}): `
189
+ : 'Project name: ';
190
+
191
+ projectName = (await userInterface.question(projectNamePrompt)).trim();
192
+
193
+ if (!projectName && defaultProjectName) {
194
+ projectName = defaultProjectName;
195
+ }
188
196
  }
189
197
 
190
198
  if (!projectName) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuenn3123/agentic-senior-core",
3
- "version": "2.0.24",
3
+ "version": "2.0.25",
4
4
  "type": "module",
5
5
  "description": "Force your AI Agent to code like a Staff Engineer, not a Junior.",
6
6
  "bin": {
@@ -36,6 +36,7 @@ const REQUIRED_FRONTEND_PARITY_SNIPPETS = [
36
36
  'UX Narrative and Conversion Clarity',
37
37
  'Release Evidence',
38
38
  ];
39
+ const BENCHMARK_GATE_SCRIPT_PATH = 'scripts/benchmark-gate.mjs';
39
40
 
40
41
  function readText(relativeFilePath) {
41
42
  const absolutePath = resolve(REPOSITORY_ROOT, relativeFilePath);
@@ -54,6 +55,46 @@ function pushResult(results, isPassed, checkName, details) {
54
55
  });
55
56
  }
56
57
 
58
+ function parseMachineReadableReport(rawOutput) {
59
+ if (typeof rawOutput !== 'string' || rawOutput.trim().length === 0) {
60
+ return null;
61
+ }
62
+
63
+ try {
64
+ return JSON.parse(rawOutput);
65
+ } catch {
66
+ return null;
67
+ }
68
+ }
69
+
70
+ function runMachineReadableScript(scriptRelativePath) {
71
+ try {
72
+ const rawOutput = execFileSync('node', [scriptRelativePath], {
73
+ cwd: REPOSITORY_ROOT,
74
+ encoding: 'utf8',
75
+ maxBuffer: 1024 * 1024,
76
+ });
77
+
78
+ return {
79
+ report: parseMachineReadableReport(rawOutput),
80
+ executionErrorMessage: null,
81
+ };
82
+ } catch (scriptExecutionError) {
83
+ const rawOutput = scriptExecutionError && typeof scriptExecutionError === 'object' && 'stdout' in scriptExecutionError
84
+ ? String(scriptExecutionError.stdout ?? '')
85
+ : '';
86
+ const parsedReport = parseMachineReadableReport(rawOutput);
87
+ const executionErrorMessage = scriptExecutionError instanceof Error
88
+ ? scriptExecutionError.message
89
+ : 'Unknown execution error';
90
+
91
+ return {
92
+ report: parsedReport,
93
+ executionErrorMessage,
94
+ };
95
+ }
96
+ }
97
+
57
98
  function validateCompatibilityManifestShape(parsedManifest, skillDomainName) {
58
99
  const validationErrors = [];
59
100
 
@@ -82,6 +123,7 @@ function validateCompatibilityManifestShape(parsedManifest, skillDomainName) {
82
123
 
83
124
  function runReleaseGate() {
84
125
  const results = [];
126
+ const diagnostics = {};
85
127
  const packageJsonPath = 'package.json';
86
128
  const changelogPath = 'CHANGELOG.md';
87
129
  const roadmapPath = 'docs/roadmap.md';
@@ -245,12 +287,48 @@ function runReleaseGate() {
245
287
  pushResult(results, false, 'frontend-usability-audit', `Failed to execute frontend usability audit: ${frontendAuditErrorMessage}`);
246
288
  }
247
289
 
290
+ const benchmarkGateExecution = runMachineReadableScript(BENCHMARK_GATE_SCRIPT_PATH);
291
+ if (!benchmarkGateExecution.report) {
292
+ const failureDetails = benchmarkGateExecution.executionErrorMessage
293
+ ? `Benchmark gate execution failed before producing a machine-readable report: ${benchmarkGateExecution.executionErrorMessage}`
294
+ : 'Benchmark gate did not produce machine-readable JSON output';
295
+ pushResult(results, false, 'benchmark-threshold-gate', failureDetails);
296
+ } else {
297
+ diagnostics.benchmarkGate = benchmarkGateExecution.report;
298
+ pushResult(
299
+ results,
300
+ true,
301
+ 'benchmark-threshold-gate',
302
+ `Benchmark threshold gate executed (passed=${benchmarkGateExecution.report.passed}, failures=${benchmarkGateExecution.report.failureCount})`
303
+ );
304
+
305
+ if (benchmarkGateExecution.report.passed === true) {
306
+ pushResult(results, true, 'benchmark-regression-block', 'Benchmark thresholds are healthy; release remains eligible');
307
+ } else {
308
+ const failedBenchmarkChecks = Array.isArray(benchmarkGateExecution.report.results)
309
+ ? benchmarkGateExecution.report.results
310
+ .filter((benchmarkCheckResult) => !benchmarkCheckResult.passed)
311
+ .map((benchmarkCheckResult) => `${benchmarkCheckResult.checkName}: ${benchmarkCheckResult.details}`)
312
+ : [];
313
+ const failureSummary = failedBenchmarkChecks.length > 0
314
+ ? failedBenchmarkChecks.join('; ')
315
+ : 'Benchmark gate failed but did not report individual failed checks';
316
+ pushResult(
317
+ results,
318
+ false,
319
+ 'benchmark-regression-block',
320
+ `Benchmark threshold regression detected. ${failureSummary}`
321
+ );
322
+ }
323
+ }
324
+
248
325
  const failureCount = results.filter((checkResult) => !checkResult.passed).length;
249
326
  const releaseGateReport = {
250
327
  generatedAt: new Date().toISOString(),
251
328
  gateName: 'release-gate',
252
329
  passed: failureCount === 0,
253
330
  failureCount,
331
+ diagnostics,
254
332
  results,
255
333
  };
256
334