@ryuenn3123/agentic-senior-core 3.0.40 → 3.0.42
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/.agent-context/prompts/bootstrap-design.md +8 -9
- package/.agent-context/prompts/init-project.md +1 -1
- package/.agent-context/review-checklists/pr-checklist.md +2 -0
- package/.agent-context/rules/frontend-architecture.md +4 -0
- package/.agent-context/state/README.md +1 -3
- package/.agent-context/state/benchmark-reproducibility.json +4 -4
- package/.cursor/rules/agentic-senior-core.mdc +1 -1
- package/.cursorrules +1 -1
- package/.gemini/instructions.md +1 -1
- package/.github/copilot-instructions.md +1 -1
- package/.github/instructions/agentic-senior-core.instructions.md +1 -1
- package/.instructions.md +1 -0
- package/.windsurf/rules/agentic-senior-core.md +1 -1
- package/.windsurfrules +1 -1
- package/AGENTS.md +1 -1
- package/CLAUDE.md +1 -1
- package/CONTRIBUTING.md +7 -1
- package/GEMINI.md +1 -1
- package/README.md +1 -1
- package/lib/cli/backup.mjs +1 -3
- package/lib/cli/commands/init.mjs +1 -1
- package/lib/cli/constants.mjs +5 -3
- package/lib/cli/rollback.mjs +1 -2
- package/lib/cli/utils/managed-surface.mjs +4 -4
- package/lib/cli/utils.mjs +33 -11
- package/mcp.json +39 -24
- package/package.json +2 -4
- package/scripts/benchmark-evidence-bundle.mjs +8 -16
- package/scripts/benchmark-intelligence.mjs +14 -121
- package/scripts/benchmark-writer-judge-matrix.mjs +2 -6
- package/scripts/bump-version.mjs +3 -3
- package/scripts/clean-local-artifacts.mjs +1 -0
- package/scripts/docs-quality-drift-report.mjs +1 -1
- package/scripts/frontend-usability-audit.mjs +4 -4
- package/scripts/mcp-server/constants.mjs +4 -0
- package/scripts/release-gate/static-checks.mjs +0 -1
- package/scripts/validate/config.mjs +2 -2
- package/scripts/validate.mjs +8 -84
- package/.agent-context/state/benchmark-watchlist.json +0 -19
- package/.agent-context/state/stack-research-snapshot.json +0 -112
- package/.github/ISSUE_TEMPLATE/v1.7-frontend-work-item.yml +0 -54
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ryuenn3123/agentic-senior-core",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.42",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Force your AI Agent to code like a Staff Engineer, not a Junior.",
|
|
6
6
|
"bin": {
|
|
@@ -21,11 +21,9 @@
|
|
|
21
21
|
".agent-context/state/benchmark-comparison-schema.json",
|
|
22
22
|
".agent-context/state/benchmark-reproducibility.json",
|
|
23
23
|
".agent-context/state/benchmark-thresholds.json",
|
|
24
|
-
".agent-context/state/benchmark-watchlist.json",
|
|
25
24
|
".agent-context/state/benchmark-writer-judge-config.json",
|
|
26
25
|
".agent-context/state/memory-adapter-contract.json",
|
|
27
26
|
".agent-context/state/memory-schema-v1.json",
|
|
28
|
-
".agent-context/state/stack-research-snapshot.json",
|
|
29
27
|
".agents/",
|
|
30
28
|
".cursor/",
|
|
31
29
|
".github/",
|
|
@@ -85,6 +83,6 @@
|
|
|
85
83
|
"report:governance-weekly": "node ./scripts/governance-weekly-report.mjs",
|
|
86
84
|
"clean:local": "node ./scripts/clean-local-artifacts.mjs",
|
|
87
85
|
"validate": "node ./scripts/validate.mjs",
|
|
88
|
-
"test": "node --test ./tests/cli-smoke.test.mjs ./tests/mcp-server.test.mjs ./tests/llm-judge.test.mjs ./tests/ui-rubric-calibration.test.mjs ./tests/operations.test.mjs"
|
|
86
|
+
"test": "node --test ./tests/cli-smoke.test.mjs ./tests/mcp-server.test.mjs ./tests/llm-judge.test.mjs ./tests/ui-rubric-calibration.test.mjs ./tests/operations.test.mjs ./tests/knowledge-injection.test.mjs"
|
|
89
87
|
}
|
|
90
88
|
}
|
|
@@ -22,7 +22,6 @@ const isStdoutOnlyMode = ARGUMENT_FLAGS.has('--stdout-only');
|
|
|
22
22
|
const PACKAGE_JSON_PATH = join(REPOSITORY_ROOT, 'package.json');
|
|
23
23
|
const REPRO_PROFILE_PATH = join(REPOSITORY_ROOT, '.agent-context', 'state', 'benchmark-reproducibility.json');
|
|
24
24
|
const BENCHMARK_THRESHOLD_PATH = join(REPOSITORY_ROOT, '.agent-context', 'state', 'benchmark-thresholds.json');
|
|
25
|
-
const BENCHMARK_WATCHLIST_PATH = join(REPOSITORY_ROOT, '.agent-context', 'state', 'benchmark-watchlist.json');
|
|
26
25
|
const MEMORY_SCHEMA_PATH = join(REPOSITORY_ROOT, '.agent-context', 'state', 'memory-schema-v1.json');
|
|
27
26
|
const MEMORY_ADAPTER_CONTRACT_PATH = join(REPOSITORY_ROOT, '.agent-context', 'state', 'memory-adapter-contract.json');
|
|
28
27
|
const OUTPUT_PATH = join(REPOSITORY_ROOT, '.agent-context', 'state', 'benchmark-evidence-bundle.json');
|
|
@@ -233,6 +232,7 @@ function buildRubricSummary(thresholdConfiguration, intelligenceReport, memoryCo
|
|
|
233
232
|
maximumManualCorrectionIncrease: thresholdConfiguration?.maximumManualCorrectionIncrease ?? null,
|
|
234
233
|
},
|
|
235
234
|
intelligenceSlaDays: intelligenceReport?.reviewSlaDays ?? null,
|
|
235
|
+
staticExternalWatchlistRetired: intelligenceReport?.staticExternalWatchlistRetired === true,
|
|
236
236
|
reliabilityThresholds: RELIABILITY_THRESHOLDS,
|
|
237
237
|
continuityThresholds: memoryContinuityReport?.thresholds || null,
|
|
238
238
|
};
|
|
@@ -384,10 +384,6 @@ function buildHistorySnapshot({
|
|
|
384
384
|
reliabilitySignals,
|
|
385
385
|
securityIndicators,
|
|
386
386
|
}) {
|
|
387
|
-
const staleWatchlistCount = Array.isArray(benchmarkIntelligenceReport?.watchlist)
|
|
388
|
-
? benchmarkIntelligenceReport.watchlist.filter((watchlistEntry) => watchlistEntry?.stale === true).length
|
|
389
|
-
: null;
|
|
390
|
-
|
|
391
387
|
return {
|
|
392
388
|
generatedAt,
|
|
393
389
|
releaseVersion,
|
|
@@ -396,7 +392,7 @@ function buildHistorySnapshot({
|
|
|
396
392
|
manualCorrectionRate: toFiniteNumber(detectionBenchmarkReport?.manualCorrectionRate, 0),
|
|
397
393
|
benchmarkGatePassed: benchmarkGateReport?.passed === true,
|
|
398
394
|
intelligencePassed: benchmarkIntelligenceReport?.passed === true,
|
|
399
|
-
|
|
395
|
+
staticExternalWatchlistRetired: benchmarkIntelligenceReport?.staticExternalWatchlistRetired === true,
|
|
400
396
|
reliabilityPassed: reliabilitySignals.passed,
|
|
401
397
|
reliabilityRiskLevel: reliabilitySignals.riskLevel,
|
|
402
398
|
incorrectDetectionRate: reliabilitySignals.metrics.incorrectDetectionRate,
|
|
@@ -419,8 +415,6 @@ function buildReleaseDelta(historyEntries, currentSnapshot) {
|
|
|
419
415
|
|
|
420
416
|
const top1AccuracyDelta = Number((currentSnapshot.top1Accuracy - previousReleaseSnapshot.top1Accuracy).toFixed(4));
|
|
421
417
|
const manualCorrectionDelta = Number((currentSnapshot.manualCorrectionRate - previousReleaseSnapshot.manualCorrectionRate).toFixed(4));
|
|
422
|
-
const staleWatchlistDelta =
|
|
423
|
-
(toFiniteNumber(currentSnapshot.staleWatchlistCount, 0) - toFiniteNumber(previousReleaseSnapshot.staleWatchlistCount, 0));
|
|
424
418
|
const vulnerabilityDelta =
|
|
425
419
|
(toFiniteNumber(currentSnapshot.vulnerabilityTotal, 0) - toFiniteNumber(previousReleaseSnapshot.vulnerabilityTotal, 0));
|
|
426
420
|
|
|
@@ -433,12 +427,10 @@ function buildReleaseDelta(historyEntries, currentSnapshot) {
|
|
|
433
427
|
},
|
|
434
428
|
top1AccuracyDelta,
|
|
435
429
|
manualCorrectionRateDelta: manualCorrectionDelta,
|
|
436
|
-
staleWatchlistCountDelta: staleWatchlistDelta,
|
|
437
430
|
vulnerabilityTotalDelta: vulnerabilityDelta,
|
|
438
431
|
summary: [
|
|
439
432
|
`top1Accuracy: ${top1AccuracyDelta >= 0 ? '+' : ''}${top1AccuracyDelta}`,
|
|
440
433
|
`manualCorrectionRate: ${manualCorrectionDelta >= 0 ? '+' : ''}${manualCorrectionDelta}`,
|
|
441
|
-
`staleWatchlistCount: ${staleWatchlistDelta >= 0 ? '+' : ''}${staleWatchlistDelta}`,
|
|
442
434
|
`vulnerabilityTotal: ${vulnerabilityDelta >= 0 ? '+' : ''}${vulnerabilityDelta}`,
|
|
443
435
|
],
|
|
444
436
|
};
|
|
@@ -453,7 +445,7 @@ function buildTrendTable(historyEntries) {
|
|
|
453
445
|
manualCorrectionRate: historyEntry.manualCorrectionRate,
|
|
454
446
|
incorrectDetectionRate: historyEntry.incorrectDetectionRate,
|
|
455
447
|
lowConfidenceRate: historyEntry.lowConfidenceRate,
|
|
456
|
-
|
|
448
|
+
staticExternalWatchlistRetired: historyEntry.staticExternalWatchlistRetired === true,
|
|
457
449
|
vulnerabilityTotal: historyEntry.vulnerabilityTotal,
|
|
458
450
|
criticalVulnerabilityCount: historyEntry.criticalVulnerabilityCount,
|
|
459
451
|
benchmarkGatePassed: historyEntry.benchmarkGatePassed,
|
|
@@ -470,7 +462,7 @@ function buildChartSeries(historyEntries) {
|
|
|
470
462
|
manualCorrectionRate: historyEntries.map((historyEntry) => historyEntry.manualCorrectionRate),
|
|
471
463
|
incorrectDetectionRate: historyEntries.map((historyEntry) => historyEntry.incorrectDetectionRate),
|
|
472
464
|
lowConfidenceRate: historyEntries.map((historyEntry) => historyEntry.lowConfidenceRate),
|
|
473
|
-
|
|
465
|
+
staticExternalWatchlistRetired: historyEntries.map((historyEntry) => historyEntry.staticExternalWatchlistRetired === true),
|
|
474
466
|
vulnerabilityTotal: historyEntries.map((historyEntry) => historyEntry.vulnerabilityTotal),
|
|
475
467
|
};
|
|
476
468
|
}
|
|
@@ -503,7 +495,6 @@ function convertTrendTableToCsv(trendTable) {
|
|
|
503
495
|
async function runBenchmarkEvidenceBundle() {
|
|
504
496
|
const reproducibilityProfile = readJsonOrNull(REPRO_PROFILE_PATH);
|
|
505
497
|
const thresholdConfiguration = readJsonOrNull(BENCHMARK_THRESHOLD_PATH);
|
|
506
|
-
const watchlistConfiguration = readJsonOrNull(BENCHMARK_WATCHLIST_PATH);
|
|
507
498
|
const memorySchemaConfiguration = readJsonOrNull(MEMORY_SCHEMA_PATH);
|
|
508
499
|
const memoryAdapterContractConfiguration = readJsonOrNull(MEMORY_ADAPTER_CONTRACT_PATH);
|
|
509
500
|
const releaseVersion = readReleaseVersion();
|
|
@@ -611,9 +602,10 @@ async function runBenchmarkEvidenceBundle() {
|
|
|
611
602
|
rawInputs: {
|
|
612
603
|
scenarios: Array.isArray(reproducibilityProfile?.scenarios) ? reproducibilityProfile.scenarios : [],
|
|
613
604
|
benchmarkThresholds: thresholdConfiguration,
|
|
614
|
-
benchmarkWatchlist:
|
|
615
|
-
|
|
616
|
-
:
|
|
605
|
+
benchmarkWatchlist: {
|
|
606
|
+
retired: true,
|
|
607
|
+
reason: 'Static external benchmark watchlists were removed to avoid stale or biasing research inputs.',
|
|
608
|
+
},
|
|
617
609
|
memorySchema: memorySchemaConfiguration,
|
|
618
610
|
memoryAdapterContract: memoryAdapterContractConfiguration,
|
|
619
611
|
},
|
|
@@ -3,133 +3,26 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* benchmark-intelligence.mjs
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* Benchmark intelligence compatibility report.
|
|
7
|
+
* Static external watchlists were retired to avoid stale or biasing research inputs.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
11
|
-
import { dirname, join, resolve } from 'node:path';
|
|
12
|
-
import { fileURLToPath } from 'node:url';
|
|
13
|
-
|
|
14
|
-
const SCRIPT_FILE_PATH = fileURLToPath(import.meta.url);
|
|
15
|
-
const SCRIPT_DIR = dirname(SCRIPT_FILE_PATH);
|
|
16
|
-
const REPOSITORY_ROOT = resolve(SCRIPT_DIR, '..');
|
|
17
|
-
const WATCHLIST_PATH = join(REPOSITORY_ROOT, '.agent-context', 'state', 'benchmark-watchlist.json');
|
|
18
|
-
const REVIEW_SLA_DAYS = 14;
|
|
19
|
-
const REQUIRED_BENCHMARK_REPOSITORIES = new Set([
|
|
20
|
-
'sickn33/antigravity-awesome-skills',
|
|
21
|
-
'github/awesome-copilot',
|
|
22
|
-
'MiniMax-AI/skills',
|
|
23
|
-
]);
|
|
24
|
-
|
|
25
|
-
function parseDateOrNull(rawDateValue) {
|
|
26
|
-
if (typeof rawDateValue !== 'string') {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (!/^\d{4}-\d{2}-\d{2}$/.test(rawDateValue)) {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const parsedDate = new Date(`${rawDateValue}T00:00:00.000Z`);
|
|
35
|
-
return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function calculateAgeInDays(referenceDate, targetDate) {
|
|
39
|
-
const ageInMilliseconds = referenceDate.getTime() - targetDate.getTime();
|
|
40
|
-
return Math.floor(ageInMilliseconds / (1000 * 60 * 60 * 24));
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function loadWatchlistConfiguration() {
|
|
44
|
-
if (!existsSync(WATCHLIST_PATH)) {
|
|
45
|
-
return { repositories: [] };
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return JSON.parse(readFileSync(WATCHLIST_PATH, 'utf8'));
|
|
49
|
-
}
|
|
50
|
-
|
|
51
10
|
function runIntelligenceValidation() {
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const trackedRepositoryNames = new Set();
|
|
60
|
-
for (const watchlistEntry of watchlistEntries) {
|
|
61
|
-
trackedRepositoryNames.add(watchlistEntry.repository);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
for (const requiredRepositoryName of REQUIRED_BENCHMARK_REPOSITORIES) {
|
|
65
|
-
const hasRequiredRepository = trackedRepositoryNames.has(requiredRepositoryName);
|
|
66
|
-
validationResults.push({
|
|
67
|
-
checkName: 'required-benchmark-repository',
|
|
68
|
-
repository: requiredRepositoryName,
|
|
69
|
-
passed: hasRequiredRepository,
|
|
70
|
-
details: hasRequiredRepository
|
|
71
|
-
? `${requiredRepositoryName} is present in watchlist`
|
|
72
|
-
: `${requiredRepositoryName} is missing from watchlist`,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const watchlistReport = watchlistEntries.map((watchlistEntry) => {
|
|
77
|
-
const repositoryName = watchlistEntry.repository;
|
|
78
|
-
const repositoryOwner = watchlistEntry.owner;
|
|
79
|
-
const lastReviewedDate = parseDateOrNull(watchlistEntry.lastReviewedAt);
|
|
80
|
-
|
|
81
|
-
const hasOwner = typeof repositoryOwner === 'string' && repositoryOwner.trim().length > 0;
|
|
82
|
-
validationResults.push({
|
|
83
|
-
checkName: 'watchlist-owner-defined',
|
|
84
|
-
repository: repositoryName,
|
|
85
|
-
passed: hasOwner,
|
|
86
|
-
details: hasOwner ? `Owner ${repositoryOwner} is defined` : 'Owner is missing',
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
if (!lastReviewedDate) {
|
|
90
|
-
validationResults.push({
|
|
91
|
-
checkName: 'review-date-format',
|
|
92
|
-
repository: repositoryName,
|
|
93
|
-
passed: false,
|
|
94
|
-
details: `Invalid or missing lastReviewedAt: ${String(watchlistEntry.lastReviewedAt)}`,
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
return {
|
|
98
|
-
repository: repositoryName,
|
|
99
|
-
owner: repositoryOwner,
|
|
100
|
-
lastReviewedAt: watchlistEntry.lastReviewedAt,
|
|
101
|
-
ageInDays: null,
|
|
102
|
-
stale: true,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const reviewAgeInDays = calculateAgeInDays(currentDate, lastReviewedDate);
|
|
107
|
-
const reviewWithinSla = reviewAgeInDays <= REVIEW_SLA_DAYS;
|
|
108
|
-
|
|
109
|
-
validationResults.push({
|
|
110
|
-
checkName: 'review-sla-compliance',
|
|
111
|
-
repository: repositoryName,
|
|
112
|
-
passed: reviewWithinSla,
|
|
113
|
-
details: `ageInDays=${reviewAgeInDays} slaDays=${REVIEW_SLA_DAYS}`,
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
return {
|
|
117
|
-
repository: repositoryName,
|
|
118
|
-
owner: repositoryOwner,
|
|
119
|
-
lastReviewedAt: watchlistEntry.lastReviewedAt,
|
|
120
|
-
ageInDays: reviewAgeInDays,
|
|
121
|
-
stale: !reviewWithinSla,
|
|
122
|
-
};
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
const failedCheckCount = validationResults.filter((validationResult) => !validationResult.passed).length;
|
|
11
|
+
const validationResults = [
|
|
12
|
+
{
|
|
13
|
+
checkName: 'static-external-watchlist-retired',
|
|
14
|
+
passed: true,
|
|
15
|
+
details: 'Static external benchmark watchlists are retired; use live official docs and repo evidence for current claims.',
|
|
16
|
+
},
|
|
17
|
+
];
|
|
126
18
|
const intelligenceReport = {
|
|
127
19
|
generatedAt: new Date().toISOString(),
|
|
128
20
|
reportName: 'benchmark-intelligence',
|
|
129
|
-
passed:
|
|
130
|
-
failureCount:
|
|
131
|
-
reviewSlaDays:
|
|
132
|
-
|
|
21
|
+
passed: true,
|
|
22
|
+
failureCount: 0,
|
|
23
|
+
reviewSlaDays: null,
|
|
24
|
+
staticExternalWatchlistRetired: true,
|
|
25
|
+
watchlist: [],
|
|
133
26
|
results: validationResults,
|
|
134
27
|
};
|
|
135
28
|
|
|
@@ -152,10 +152,6 @@ function loadScenarios(reproducibilityProfile) {
|
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
function buildBaseSignals(detectionBenchmarkReport, tokenBenchmarkReport, benchmarkGateReport, benchmarkIntelligenceReport, thresholdConfiguration) {
|
|
155
|
-
const staleWatchlistCount = Array.isArray(benchmarkIntelligenceReport?.watchlist)
|
|
156
|
-
? benchmarkIntelligenceReport.watchlist.filter((watchlistEntry) => watchlistEntry?.stale === true).length
|
|
157
|
-
: 0;
|
|
158
|
-
|
|
159
155
|
const top1Accuracy = Number(detectionBenchmarkReport?.top1Accuracy || 0);
|
|
160
156
|
const manualCorrectionRate = Number(detectionBenchmarkReport?.manualCorrectionRate || 1);
|
|
161
157
|
|
|
@@ -166,7 +162,7 @@ function buildBaseSignals(detectionBenchmarkReport, tokenBenchmarkReport, benchm
|
|
|
166
162
|
benchmarkGatePassed: benchmarkGateReport?.passed === true,
|
|
167
163
|
benchmarkGateFailureCount: Number(benchmarkGateReport?.failureCount || 0),
|
|
168
164
|
intelligenceFailureCount: Number(benchmarkIntelligenceReport?.failureCount || 0),
|
|
169
|
-
|
|
165
|
+
staticExternalWatchlistRetired: benchmarkIntelligenceReport?.staticExternalWatchlistRetired === true,
|
|
170
166
|
top1AccuracyMet: top1Accuracy >= Number(thresholdConfiguration?.minimumTop1Accuracy || 0),
|
|
171
167
|
manualCorrectionMet: manualCorrectionRate <= Number(thresholdConfiguration?.maximumManualCorrectionRate || 1),
|
|
172
168
|
};
|
|
@@ -182,7 +178,7 @@ function buildWriterScenarioRun(writerModel, scenario, baseSignals, writerWeight
|
|
|
182
178
|
? clamp(100 + deterministicOffset(`${writerModel.id}:reliability`, 2), 0, 100)
|
|
183
179
|
: clamp(100 - (baseSignals.benchmarkGateFailureCount * 20), 0, 100);
|
|
184
180
|
const freshnessScore = clamp(
|
|
185
|
-
100 - (baseSignals.intelligenceFailureCount * 15)
|
|
181
|
+
100 - (baseSignals.intelligenceFailureCount * 15) + deterministicOffset(`${writerModel.id}:freshness`, 2),
|
|
186
182
|
0,
|
|
187
183
|
100
|
|
188
184
|
);
|
package/scripts/bump-version.mjs
CHANGED
|
@@ -62,13 +62,13 @@ async function bumpVersion() {
|
|
|
62
62
|
console.log('Updated package-lock.json');
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
// 3. Update docs/
|
|
66
|
-
const roadmapPath = path.join(ROOT_DIR, 'docs', '
|
|
65
|
+
// 3. Update docs/deep-analysis-and-roadmap-backlog.md
|
|
66
|
+
const roadmapPath = path.join(ROOT_DIR, 'docs', 'deep-analysis-and-roadmap-backlog.md');
|
|
67
67
|
if (await fileExists(roadmapPath)) {
|
|
68
68
|
let roadmapContent = await readTextFile(roadmapPath);
|
|
69
69
|
roadmapContent = roadmapContent.replace(`Current Version: ${oldVersion}`, `Current Version: ${newVersion}`);
|
|
70
70
|
await writeTextFile(roadmapPath, roadmapContent);
|
|
71
|
-
console.log('Updated docs/
|
|
71
|
+
console.log('Updated docs/deep-analysis-and-roadmap-backlog.md');
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
// 4. Update legacy root adapters that carry release metadata.
|
|
@@ -33,7 +33,7 @@ const MONITORED_STATIC_FILE_PATHS = [
|
|
|
33
33
|
'.gemini/instructions.md',
|
|
34
34
|
'.cursor/rules/agentic-senior-core.mdc',
|
|
35
35
|
'.windsurf/rules/agentic-senior-core.md',
|
|
36
|
-
'docs/
|
|
36
|
+
'docs/deep-analysis-and-roadmap-backlog.md',
|
|
37
37
|
];
|
|
38
38
|
|
|
39
39
|
const MONITORED_DIRECTORY_PATHS = [
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* frontend-usability-audit.mjs
|
|
5
5
|
*
|
|
6
|
-
* Governance-level audit for
|
|
6
|
+
* Governance-level audit for current frontend governance assets.
|
|
7
7
|
* This repository does not host a frontend runtime app, so the audit validates
|
|
8
|
-
* required
|
|
8
|
+
* required quality gates and archived execution evidence.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { existsSync, readFileSync } from 'node:fs';
|
|
@@ -18,8 +18,8 @@ const REPOSITORY_ROOT = resolve(__dirname, '..');
|
|
|
18
18
|
|
|
19
19
|
const REQUIRED_FILES = [
|
|
20
20
|
'docs/roadmap.md',
|
|
21
|
-
'docs/v1.7-issue-breakdown.md',
|
|
22
|
-
'docs/v1.7-execution-playbook.md',
|
|
21
|
+
'docs/archive/v1.7-issue-breakdown.md',
|
|
22
|
+
'docs/archive/v1.7-execution-playbook.md',
|
|
23
23
|
'.instructions.md',
|
|
24
24
|
'.agent-context/prompts/bootstrap-design.md',
|
|
25
25
|
'scripts/ui-design-judge.mjs',
|
|
@@ -15,6 +15,10 @@ export const DEFAULT_TREND_WINDOW_DAYS = 90;
|
|
|
15
15
|
export const MAX_TREND_PACKAGES = 10;
|
|
16
16
|
export const FALLBACK_PACKAGE_VERSION = '0.0.0-local';
|
|
17
17
|
|
|
18
|
+
// IMPORTANT: This version extraction logic is intentionally duplicated from lib/cli/constants.mjs.
|
|
19
|
+
// The MCP server is designed to be copied directly into target user workspaces where
|
|
20
|
+
// the original package.json may not exist in the parent tree. This try/catch fallback
|
|
21
|
+
// ensures the server can still run standalone without crashing if package.json is missing.
|
|
18
22
|
function resolvePackageVersion() {
|
|
19
23
|
try {
|
|
20
24
|
const parsedPackageManifest = JSON.parse(
|
|
@@ -100,7 +100,6 @@ export function runStaticReleaseChecks(results, diagnostics) {
|
|
|
100
100
|
|
|
101
101
|
const requiredOperationsFiles = [
|
|
102
102
|
'.agent-context/review-checklists/architecture-review.md',
|
|
103
|
-
'docs/v1.8-operations-playbook.md',
|
|
104
103
|
'.github/workflows/release-gate.yml',
|
|
105
104
|
'.github/workflows/sbom-compliance.yml',
|
|
106
105
|
'.github/workflows/governance-weekly-report.yml',
|
|
@@ -14,7 +14,7 @@ export const FORMAL_ARTIFACT_PATHS = [
|
|
|
14
14
|
'.instructions.md',
|
|
15
15
|
'README.md',
|
|
16
16
|
'CHANGELOG.md',
|
|
17
|
-
'docs/
|
|
17
|
+
'docs/deep-analysis-and-roadmap-backlog.md',
|
|
18
18
|
'.agent-context/rules/api-docs.md',
|
|
19
19
|
'.agent-context/review-checklists/pr-checklist.md',
|
|
20
20
|
'.agent-context/prompts/review-code.md',
|
|
@@ -49,7 +49,7 @@ export const REQUIRED_HUMAN_WRITING_SNIPPETS = [
|
|
|
49
49
|
],
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
|
-
path: 'docs/
|
|
52
|
+
path: 'docs/deep-analysis-and-roadmap-backlog.md',
|
|
53
53
|
snippets: [
|
|
54
54
|
'## Part 6: Documentation and Explanation Standards (Mandatory)',
|
|
55
55
|
'This applies to documentation, release notes, onboarding text, review summaries, and agent-facing explanations.',
|
package/scripts/validate.mjs
CHANGED
|
@@ -166,14 +166,12 @@ async function validateRequiredFiles() {
|
|
|
166
166
|
'docs/faq.md',
|
|
167
167
|
'docs/deep-dive.md',
|
|
168
168
|
'docs/terminology-mapping.md',
|
|
169
|
-
'docs/v1.7-execution-playbook.md',
|
|
170
|
-
'docs/v1.7-issue-breakdown.md',
|
|
171
|
-
'docs/v1.8-operations-playbook.md',
|
|
172
|
-
'docs/v2-upgrade-playbook.md',
|
|
169
|
+
'docs/archive/v1.7-execution-playbook.md',
|
|
170
|
+
'docs/archive/v1.7-issue-breakdown.md',
|
|
171
|
+
'docs/archive/v1.8-operations-playbook.md',
|
|
172
|
+
'docs/archive/v2-upgrade-playbook.md',
|
|
173
173
|
'.agent-context/state/benchmark-reproducibility.json',
|
|
174
174
|
'.agent-context/state/benchmark-writer-judge-config.json',
|
|
175
|
-
'.agent-context/state/benchmark-watchlist.json',
|
|
176
|
-
'.agent-context/state/stack-research-snapshot.json',
|
|
177
175
|
'.agent-context/state/memory-schema-v1.json',
|
|
178
176
|
'.agent-context/state/memory-adapter-contract.json',
|
|
179
177
|
'.vscode/mcp.json',
|
|
@@ -569,7 +567,7 @@ async function validateDocumentationFlow() {
|
|
|
569
567
|
'npm run validate',
|
|
570
568
|
'docs/faq.md',
|
|
571
569
|
'docs/deep-dive.md',
|
|
572
|
-
'docs/v2-upgrade-playbook.md',
|
|
570
|
+
'docs/archive/v2-upgrade-playbook.md',
|
|
573
571
|
];
|
|
574
572
|
|
|
575
573
|
for (const requiredReadmeSnippet of requiredReadmeSnippets) {
|
|
@@ -581,90 +579,17 @@ async function validateDocumentationFlow() {
|
|
|
581
579
|
}
|
|
582
580
|
}
|
|
583
581
|
|
|
584
|
-
function isNormalizedMetricValue(value) {
|
|
585
|
-
return Number.isFinite(Number(value)) && Number(value) >= 0 && Number(value) <= 1;
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
async function validateStackResearchSnapshotState() {
|
|
589
|
-
console.log('\nChecking deterministic stack research snapshot state...');
|
|
590
|
-
|
|
591
|
-
const snapshotPath = join(ROOT_DIR, '.agent-context', 'state', 'stack-research-snapshot.json');
|
|
592
|
-
if (!(await fileExists(snapshotPath))) {
|
|
593
|
-
fail('Missing deterministic stack research snapshot: .agent-context/state/stack-research-snapshot.json');
|
|
594
|
-
return;
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
let snapshotPayload;
|
|
598
|
-
try {
|
|
599
|
-
snapshotPayload = JSON.parse(await readTextFile(snapshotPath));
|
|
600
|
-
} catch {
|
|
601
|
-
fail('Invalid JSON in .agent-context/state/stack-research-snapshot.json');
|
|
602
|
-
return;
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
if (snapshotPayload?.deterministic === true) {
|
|
606
|
-
pass('stack-research-snapshot.json declares deterministic: true');
|
|
607
|
-
} else {
|
|
608
|
-
fail('stack-research-snapshot.json must declare deterministic: true');
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
const generatedAtValue = String(snapshotPayload?.generatedAt || '');
|
|
612
|
-
if (!Number.isNaN(Date.parse(generatedAtValue))) {
|
|
613
|
-
pass('stack-research-snapshot.json includes valid generatedAt timestamp');
|
|
614
|
-
} else {
|
|
615
|
-
fail('stack-research-snapshot.json must include a valid generatedAt timestamp');
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
if (Array.isArray(snapshotPayload?.trustedRealtimeSources) && snapshotPayload.trustedRealtimeSources.length > 0) {
|
|
619
|
-
pass('stack-research-snapshot.json includes trustedRealtimeSources');
|
|
620
|
-
} else {
|
|
621
|
-
fail('stack-research-snapshot.json must include at least one trustedRealtimeSources entry');
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
if (!Array.isArray(snapshotPayload?.stackSignals) || snapshotPayload.stackSignals.length === 0) {
|
|
625
|
-
fail('stack-research-snapshot.json must include non-empty stackSignals array');
|
|
626
|
-
return;
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
pass(`stack-research-snapshot.json includes ${snapshotPayload.stackSignals.length} stack signal entries`);
|
|
630
|
-
|
|
631
|
-
const invalidSignalEntries = snapshotPayload.stackSignals.filter((signalEntry) => {
|
|
632
|
-
const hasStackName = typeof signalEntry?.stackFileName === 'string' && signalEntry.stackFileName.trim().length > 0;
|
|
633
|
-
const hasMeasuredAt = !Number.isNaN(Date.parse(String(signalEntry?.measuredAt || '')));
|
|
634
|
-
const metrics = signalEntry?.metrics || {};
|
|
635
|
-
const hasValidMetrics = isNormalizedMetricValue(metrics.ecosystemMaturity)
|
|
636
|
-
&& isNormalizedMetricValue(metrics.talentAvailability)
|
|
637
|
-
&& isNormalizedMetricValue(metrics.deliveryVelocity);
|
|
638
|
-
|
|
639
|
-
return !(hasStackName && hasMeasuredAt && hasValidMetrics);
|
|
640
|
-
});
|
|
641
|
-
|
|
642
|
-
if (invalidSignalEntries.length === 0) {
|
|
643
|
-
pass('stack-research-snapshot.json stackSignals keep measurable metrics and timestamps');
|
|
644
|
-
} else {
|
|
645
|
-
fail(`stack-research-snapshot.json has invalid stackSignals entries: ${invalidSignalEntries.length}`);
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
|
|
649
582
|
async function validateMcpConfiguration() {
|
|
650
583
|
console.log('\nChecking MCP configuration...');
|
|
651
584
|
|
|
652
585
|
const mcpConfiguration = JSON.parse(await readTextFile(join(ROOT_DIR, 'mcp.json')));
|
|
653
|
-
const lintServerCommand = mcpConfiguration.servers?.lint?.command;
|
|
654
|
-
const testServerCommand = mcpConfiguration.servers?.test?.command;
|
|
655
586
|
const workspaceMcpConfiguration = JSON.parse(await readTextFile(join(ROOT_DIR, '.vscode', 'mcp.json')));
|
|
656
587
|
const workspaceServerConfig = workspaceMcpConfiguration.servers?.['agentic-senior-core'];
|
|
657
588
|
|
|
658
|
-
if (
|
|
659
|
-
pass('MCP
|
|
660
|
-
} else {
|
|
661
|
-
fail('MCP lint server must use Node');
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
if (testServerCommand === 'node') {
|
|
665
|
-
pass('MCP test server uses Node');
|
|
589
|
+
if (mcpConfiguration.knowledgeLayers?.enabled === true) {
|
|
590
|
+
pass('Root MCP config has knowledgeLayers enabled');
|
|
666
591
|
} else {
|
|
667
|
-
fail('MCP
|
|
592
|
+
fail('Root MCP config must have knowledgeLayers.enabled: true');
|
|
668
593
|
}
|
|
669
594
|
|
|
670
595
|
if (typeof workspaceMcpConfiguration.$schema === 'undefined') {
|
|
@@ -732,7 +657,6 @@ async function main() {
|
|
|
732
657
|
await validateDependencyFreshnessAutomationCoverage(coverageValidationContext);
|
|
733
658
|
await validateDeterministicBoundaryEnforcementCoverage(coverageValidationContext);
|
|
734
659
|
await validateRulesOnlyActiveSurfaceCoverage(coverageValidationContext);
|
|
735
|
-
await validateStackResearchSnapshotState();
|
|
736
660
|
await validateMcpConfiguration();
|
|
737
661
|
await validateHumanWritingGovernance(coverageValidationContext);
|
|
738
662
|
await validateInstructionAdapters(coverageValidationContext);
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"repositories": [
|
|
3
|
-
{
|
|
4
|
-
"repository": "sickn33/antigravity-awesome-skills",
|
|
5
|
-
"owner": "core-architecture",
|
|
6
|
-
"lastReviewedAt": "2026-04-17"
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
"repository": "github/awesome-copilot",
|
|
10
|
-
"owner": "core-architecture",
|
|
11
|
-
"lastReviewedAt": "2026-04-17"
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"repository": "MiniMax-AI/skills",
|
|
15
|
-
"owner": "frontend-governance",
|
|
16
|
-
"lastReviewedAt": "2026-04-17"
|
|
17
|
-
}
|
|
18
|
-
]
|
|
19
|
-
}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": "1.0.0",
|
|
3
|
-
"snapshotId": "ecosystem-signals-2026-04-18",
|
|
4
|
-
"generatedAt": "2026-04-18T00:00:00.000Z",
|
|
5
|
-
"deterministic": true,
|
|
6
|
-
"sourceName": "Agentic-Senior-Core deterministic stack research snapshot",
|
|
7
|
-
"sourceUrl": "state://stack-research-snapshot/2026-04-18",
|
|
8
|
-
"trustedRealtimeSources": [
|
|
9
|
-
{
|
|
10
|
-
"sourceId": "awwwards-trend-feed",
|
|
11
|
-
"sourceName": "Awwwards Trend Feed",
|
|
12
|
-
"sourceUrl": "https://www.awwwards.com"
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"sourceId": "github-ecosystem-signals",
|
|
16
|
-
"sourceName": "GitHub Ecosystem Signals",
|
|
17
|
-
"sourceUrl": "https://github.com"
|
|
18
|
-
}
|
|
19
|
-
],
|
|
20
|
-
"stackSignals": [
|
|
21
|
-
{
|
|
22
|
-
"stackFileName": "typescript.md",
|
|
23
|
-
"measuredAt": "2026-04-18T00:00:00.000Z",
|
|
24
|
-
"metrics": {
|
|
25
|
-
"ecosystemMaturity": 0.91,
|
|
26
|
-
"talentAvailability": 0.9,
|
|
27
|
-
"deliveryVelocity": 0.89
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"stackFileName": "python.md",
|
|
32
|
-
"measuredAt": "2026-04-18T00:00:00.000Z",
|
|
33
|
-
"metrics": {
|
|
34
|
-
"ecosystemMaturity": 0.92,
|
|
35
|
-
"talentAvailability": 0.88,
|
|
36
|
-
"deliveryVelocity": 0.9
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"stackFileName": "java.md",
|
|
41
|
-
"measuredAt": "2026-04-18T00:00:00.000Z",
|
|
42
|
-
"metrics": {
|
|
43
|
-
"ecosystemMaturity": 0.89,
|
|
44
|
-
"talentAvailability": 0.83,
|
|
45
|
-
"deliveryVelocity": 0.8
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"stackFileName": "php.md",
|
|
50
|
-
"measuredAt": "2026-04-18T00:00:00.000Z",
|
|
51
|
-
"metrics": {
|
|
52
|
-
"ecosystemMaturity": 0.79,
|
|
53
|
-
"talentAvailability": 0.75,
|
|
54
|
-
"deliveryVelocity": 0.84
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"stackFileName": "go.md",
|
|
59
|
-
"measuredAt": "2026-04-18T00:00:00.000Z",
|
|
60
|
-
"metrics": {
|
|
61
|
-
"ecosystemMaturity": 0.84,
|
|
62
|
-
"talentAvailability": 0.78,
|
|
63
|
-
"deliveryVelocity": 0.82
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
"stackFileName": "csharp.md",
|
|
68
|
-
"measuredAt": "2026-04-18T00:00:00.000Z",
|
|
69
|
-
"metrics": {
|
|
70
|
-
"ecosystemMaturity": 0.86,
|
|
71
|
-
"talentAvailability": 0.8,
|
|
72
|
-
"deliveryVelocity": 0.79
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"stackFileName": "rust.md",
|
|
77
|
-
"measuredAt": "2026-04-18T00:00:00.000Z",
|
|
78
|
-
"metrics": {
|
|
79
|
-
"ecosystemMaturity": 0.74,
|
|
80
|
-
"talentAvailability": 0.63,
|
|
81
|
-
"deliveryVelocity": 0.67
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
"stackFileName": "ruby.md",
|
|
86
|
-
"measuredAt": "2026-04-18T00:00:00.000Z",
|
|
87
|
-
"metrics": {
|
|
88
|
-
"ecosystemMaturity": 0.7,
|
|
89
|
-
"talentAvailability": 0.62,
|
|
90
|
-
"deliveryVelocity": 0.72
|
|
91
|
-
}
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
"stackFileName": "react-native.md",
|
|
95
|
-
"measuredAt": "2026-04-18T00:00:00.000Z",
|
|
96
|
-
"metrics": {
|
|
97
|
-
"ecosystemMaturity": 0.72,
|
|
98
|
-
"talentAvailability": 0.67,
|
|
99
|
-
"deliveryVelocity": 0.74
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
"stackFileName": "flutter.md",
|
|
104
|
-
"measuredAt": "2026-04-18T00:00:00.000Z",
|
|
105
|
-
"metrics": {
|
|
106
|
-
"ecosystemMaturity": 0.75,
|
|
107
|
-
"talentAvailability": 0.69,
|
|
108
|
-
"deliveryVelocity": 0.76
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
]
|
|
112
|
-
}
|