@ryuenn3123/agentic-senior-core 2.0.4 → 2.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/.agent-context/blueprints/mobile-app.md +82 -12
- package/.agent-context/skills/cli/README.md +6 -0
- package/.agent-context/skills/cli/safety-telemetry.md +39 -0
- package/.agent-context/skills/cli.md +3 -0
- package/.agent-context/skills/distribution/.evidence/compatibility-manifest.json +9 -0
- package/.agent-context/skills/distribution/.evidence/sbom-excerpt.json +6 -0
- package/.agent-context/skills/distribution/.evidence/test-report.json +8 -0
- package/.agent-context/skills/distribution/CHANGELOG.md +7 -0
- package/.agent-context/skills/distribution/README.md +9 -1
- package/.agent-context/skills/distribution/package.json +5 -0
- package/.agent-context/skills/distribution/provenance-attestation.md +47 -0
- package/.agent-context/skills/distribution/tests/.gitkeep +1 -0
- package/.agent-context/skills/distribution.md +3 -0
- package/.agent-context/skills/frontend/.evidence/compatibility-manifest.json +9 -0
- package/.agent-context/skills/frontend/.evidence/sbom-excerpt.json +6 -0
- package/.agent-context/skills/frontend/.evidence/test-report.json +8 -0
- package/.agent-context/skills/frontend/CHANGELOG.md +7 -0
- package/.agent-context/skills/frontend/README.md +14 -1
- package/.agent-context/skills/frontend/conversion-clarity.md +51 -0
- package/.agent-context/skills/frontend/package.json +5 -0
- package/.agent-context/skills/frontend/responsive-delivery.md +41 -0
- package/.agent-context/skills/frontend/tests/.gitkeep +1 -0
- package/.agent-context/skills/frontend.md +6 -0
- package/.agent-context/skills/fullstack/.evidence/compatibility-manifest.json +9 -0
- package/.agent-context/skills/fullstack/.evidence/sbom-excerpt.json +6 -0
- package/.agent-context/skills/fullstack/.evidence/test-report.json +8 -0
- package/.agent-context/skills/fullstack/CHANGELOG.md +7 -0
- package/.agent-context/skills/fullstack/README.md +9 -1
- package/.agent-context/skills/fullstack/package.json +5 -0
- package/.agent-context/skills/fullstack/release-coordination.md +51 -0
- package/.agent-context/skills/fullstack/tests/.gitkeep +1 -0
- package/.agent-context/skills/fullstack.md +3 -0
- package/.agent-context/skills/review-quality/.evidence/compatibility-manifest.json +9 -0
- package/.agent-context/skills/review-quality/.evidence/sbom-excerpt.json +6 -0
- package/.agent-context/skills/review-quality/.evidence/test-report.json +8 -0
- package/.agent-context/skills/review-quality/CHANGELOG.md +7 -0
- package/.agent-context/skills/review-quality/README.md +9 -1
- package/.agent-context/skills/review-quality/package.json +5 -0
- package/.agent-context/skills/review-quality/release-decision.md +49 -0
- package/.agent-context/skills/review-quality/tests/.gitkeep +1 -0
- package/.agent-context/skills/review-quality.md +3 -0
- package/.agent-context/state/quality-trend-report.json +89 -0
- package/.agent-context/state/weekly-governance-report.json +126 -0
- package/.cursorrules +1 -1
- package/.gemini/instructions.md +15 -91
- package/.github/copilot-instructions.md +15 -160
- package/.github/workflows/governance-weekly-report.yml +43 -0
- package/.windsurfrules +1 -1
- package/AGENTS.md +21 -174
- package/README.md +15 -0
- package/lib/cli/constants.mjs +35 -0
- package/lib/cli/utils.mjs +4 -1
- package/package.json +3 -1
- package/scripts/governance-weekly-report.mjs +293 -0
- package/scripts/quality-trend-report.mjs +289 -0
- package/scripts/release-gate.mjs +57 -0
- package/scripts/validate.mjs +85 -22
package/scripts/validate.mjs
CHANGED
|
@@ -16,12 +16,14 @@
|
|
|
16
16
|
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
17
17
|
import { dirname, join, relative, resolve } from 'node:path';
|
|
18
18
|
import { fileURLToPath } from 'node:url';
|
|
19
|
+
import { createHash } from 'node:crypto';
|
|
19
20
|
import { validateSkillTopicContent } from './skill-tier-policy.mjs';
|
|
20
21
|
import { calculateTrustScore } from './trust-scorer.mjs';
|
|
21
22
|
|
|
22
23
|
const SCRIPT_FILE_PATH = fileURLToPath(import.meta.url);
|
|
23
24
|
const ROOT_DIR = resolve(dirname(SCRIPT_FILE_PATH), '..');
|
|
24
25
|
const AGENT_CONTEXT_DIR = join(ROOT_DIR, '.agent-context');
|
|
26
|
+
const CANONICAL_INSTRUCTION_PATH = join(ROOT_DIR, '.instructions.md');
|
|
25
27
|
const PACKAGE_JSON_PATH = join(ROOT_DIR, 'package.json');
|
|
26
28
|
const CHANGELOG_PATH = join(ROOT_DIR, 'CHANGELOG.md');
|
|
27
29
|
const README_PATH = join(ROOT_DIR, 'README.md');
|
|
@@ -32,6 +34,11 @@ const GENERATED_RULE_FILES = ['.cursorrules', '.windsurfrules'];
|
|
|
32
34
|
const ALLOWED_SEVERITIES = new Set(['critical', 'high', 'medium', 'low']);
|
|
33
35
|
const OVERRIDE_WARNING_WINDOW_DAYS = 30;
|
|
34
36
|
const SUPPORTED_COMPATIBILITY_PLATFORMS = new Set(['windows', 'linux', 'macos']);
|
|
37
|
+
const THIN_ADAPTER_PATHS = [
|
|
38
|
+
'AGENTS.md',
|
|
39
|
+
'.github/copilot-instructions.md',
|
|
40
|
+
'.gemini/instructions.md',
|
|
41
|
+
];
|
|
35
42
|
|
|
36
43
|
const validationResult = {
|
|
37
44
|
passed: 0,
|
|
@@ -102,6 +109,10 @@ function warn(message) {
|
|
|
102
109
|
console.log(` WARN ${message}`);
|
|
103
110
|
}
|
|
104
111
|
|
|
112
|
+
function normalizeLineEndings(content) {
|
|
113
|
+
return content.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
114
|
+
}
|
|
115
|
+
|
|
105
116
|
async function validateRequiredFiles() {
|
|
106
117
|
console.log('\nChecking required files...');
|
|
107
118
|
|
|
@@ -112,6 +123,7 @@ async function validateRequiredFiles() {
|
|
|
112
123
|
'scripts/detection-benchmark.mjs',
|
|
113
124
|
'scripts/benchmark-gate.mjs',
|
|
114
125
|
'scripts/benchmark-intelligence.mjs',
|
|
126
|
+
'scripts/governance-weekly-report.mjs',
|
|
115
127
|
'scripts/frontend-usability-audit.mjs',
|
|
116
128
|
'scripts/release-gate.mjs',
|
|
117
129
|
'scripts/generate-sbom.mjs',
|
|
@@ -139,6 +151,7 @@ async function validateRequiredFiles() {
|
|
|
139
151
|
'.github/workflows/release-gate.yml',
|
|
140
152
|
'.github/workflows/sbom-compliance.yml',
|
|
141
153
|
'.github/workflows/benchmark-intelligence.yml',
|
|
154
|
+
'.github/workflows/governance-weekly-report.yml',
|
|
142
155
|
'tests/cli-smoke.test.mjs',
|
|
143
156
|
'tests/llm-judge.test.mjs',
|
|
144
157
|
'tests/enterprise-ops.test.mjs',
|
|
@@ -674,6 +687,52 @@ async function validateMcpConfiguration() {
|
|
|
674
687
|
}
|
|
675
688
|
}
|
|
676
689
|
|
|
690
|
+
async function validateInstructionAdapters() {
|
|
691
|
+
console.log('\nChecking instruction adapter consolidation...');
|
|
692
|
+
|
|
693
|
+
const canonicalInstructionContent = normalizeLineEndings(await readTextFile(CANONICAL_INSTRUCTION_PATH));
|
|
694
|
+
const canonicalSnapshotHash = createHash('sha256').update(canonicalInstructionContent).digest('hex');
|
|
695
|
+
|
|
696
|
+
for (const thinAdapterPath of THIN_ADAPTER_PATHS) {
|
|
697
|
+
const absoluteAdapterPath = join(ROOT_DIR, thinAdapterPath);
|
|
698
|
+
|
|
699
|
+
if (!(await fileExists(absoluteAdapterPath))) {
|
|
700
|
+
fail(`Missing thin adapter file: ${thinAdapterPath}`);
|
|
701
|
+
continue;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
const thinAdapterContent = await readTextFile(absoluteAdapterPath);
|
|
705
|
+
|
|
706
|
+
if (
|
|
707
|
+
thinAdapterContent.includes('Adapter Mode: thin')
|
|
708
|
+
&& thinAdapterContent.includes('Adapter Source: .instructions.md')
|
|
709
|
+
) {
|
|
710
|
+
pass(`${thinAdapterPath} declares thin adapter metadata`);
|
|
711
|
+
} else {
|
|
712
|
+
fail(`${thinAdapterPath} must declare Adapter Mode: thin and Adapter Source: .instructions.md`);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
const hashMatch = thinAdapterContent.match(/Canonical Snapshot SHA256:\s*([a-f0-9]{64})/);
|
|
716
|
+
if (!hashMatch) {
|
|
717
|
+
fail(`${thinAdapterPath} must declare Canonical Snapshot SHA256`);
|
|
718
|
+
continue;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
if (hashMatch[1] === canonicalSnapshotHash) {
|
|
722
|
+
pass(`${thinAdapterPath} canonical hash matches .instructions.md`);
|
|
723
|
+
} else {
|
|
724
|
+
fail(`${thinAdapterPath} canonical hash drift detected (expected ${canonicalSnapshotHash})`);
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
const thinAdapterLineCount = thinAdapterContent.split(/\r?\n/u).length;
|
|
728
|
+
if (thinAdapterLineCount <= 80) {
|
|
729
|
+
pass(`${thinAdapterPath} remains thin (${thinAdapterLineCount} lines)`);
|
|
730
|
+
} else {
|
|
731
|
+
fail(`${thinAdapterPath} is too large for thin-adapter mode (${thinAdapterLineCount} lines)`);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
|
|
677
736
|
async function validateTrustTierSchema() {
|
|
678
737
|
console.log('\nChecking marketplace trust tier schema...');
|
|
679
738
|
|
|
@@ -741,29 +800,32 @@ async function validateEvidenceBundles() {
|
|
|
741
800
|
.filter(dirent => dirent.isDirectory())
|
|
742
801
|
.map(dirent => dirent.name);
|
|
743
802
|
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
803
|
+
const requiredVerifiedSkillNames = new Set([
|
|
804
|
+
'cli',
|
|
805
|
+
'frontend',
|
|
806
|
+
'fullstack',
|
|
807
|
+
'distribution',
|
|
808
|
+
'review-quality',
|
|
809
|
+
]);
|
|
810
|
+
|
|
747
811
|
for (const skillName of skillDirs) {
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
fail(`Skill "${skillName}" scorer crashed: ${err.message}`);
|
|
766
|
-
}
|
|
812
|
+
try {
|
|
813
|
+
const result = await calculateTrustScore(join(skillsDir, skillName));
|
|
814
|
+
|
|
815
|
+
if (requiredVerifiedSkillNames.has(skillName)) {
|
|
816
|
+
if (result.tier === 'verified') {
|
|
817
|
+
pass(`Skill "${skillName}" achieved Verified trust tier (Score: ${result.score})`);
|
|
818
|
+
} else {
|
|
819
|
+
fail(`Skill "${skillName}" failed to reach Verified tier. Got ${result.tier} (Score: ${result.score})`);
|
|
820
|
+
continue;
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
continue;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
pass(`Skill "${skillName}" parses successfully as ${result.tier} tier`);
|
|
827
|
+
} catch (err) {
|
|
828
|
+
fail(`Skill "${skillName}" scorer crashed: ${err.message}`);
|
|
767
829
|
}
|
|
768
830
|
}
|
|
769
831
|
}
|
|
@@ -786,6 +848,7 @@ async function main() {
|
|
|
786
848
|
await validateVersionConsistency();
|
|
787
849
|
await validateDocumentationFlow();
|
|
788
850
|
await validateMcpConfiguration();
|
|
851
|
+
await validateInstructionAdapters();
|
|
789
852
|
await validateTrustTierSchema();
|
|
790
853
|
await validateEvidenceBundles();
|
|
791
854
|
|