@t275005746/gse 0.1.2 → 0.2.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.
@@ -56,15 +56,51 @@ function run(command, commandArgs, options = {}) {
56
56
  }
57
57
  }
58
58
 
59
- function parseJson(stdout) {
60
- try {
61
- return JSON.parse(stdout)
62
- } catch {
63
- return null
64
- }
65
- }
66
-
67
- function checkBom() {
59
+ function parseJson(stdout) {
60
+ try {
61
+ return JSON.parse(stdout)
62
+ } catch {
63
+ return null
64
+ }
65
+ }
66
+
67
+ function adoptionSummaryFailures(report) {
68
+ const failures = []
69
+ const allowedClassifications = new Set([
70
+ 'gse-ready',
71
+ 'gse-ready-with-soft-warnings',
72
+ 'target-local-adoption-hygiene',
73
+ 'target-hard-failure',
74
+ ])
75
+ for (const target of report?.targets ?? []) {
76
+ const summary = target.adoptionSummary
77
+ if (!summary || typeof summary !== 'object') {
78
+ failures.push(`${target.id}:missing adoptionSummary`)
79
+ continue
80
+ }
81
+ if (!allowedClassifications.has(summary.classification)) failures.push(`${target.id}:invalid classification`)
82
+ if (typeof summary.gseCoreGap !== 'boolean') failures.push(`${target.id}:gseCoreGap not boolean`)
83
+ if (summary.coreGapAssessment !== 'not-assessed-by-target-drill') failures.push(`${target.id}:missing coreGapAssessment boundary`)
84
+ if (typeof summary.portableContinueUsable !== 'boolean') failures.push(`${target.id}:portableContinueUsable not boolean`)
85
+ if (!['not-proven', 'verified', 'external-required', 'unknown'].includes(summary.hostNativeSlashCommand)) failures.push(`${target.id}:invalid hostNativeSlashCommand`)
86
+ if (!['low', 'risk-dump-needs-compaction', 'unknown'].includes(summary.longPromptRisk)) failures.push(`${target.id}:invalid longPromptRisk`)
87
+ if (!Array.isArray(summary.topLocalIssues)) failures.push(`${target.id}:topLocalIssues not array`)
88
+ if (!summary.repairPlan || typeof summary.repairPlan !== 'object') failures.push(`${target.id}:missing repairPlan`)
89
+ if (summary.repairPlan && typeof summary.repairPlan.repairBlockedByDirtyGse !== 'boolean') failures.push(`${target.id}:repairBlockedByDirtyGse not boolean`)
90
+ if (summary.repairPlan && typeof summary.repairPlan.repairBlockedByDirtyWorktree !== 'boolean') failures.push(`${target.id}:repairBlockedByDirtyWorktree not boolean`)
91
+ if (summary.repairPlan && typeof summary.repairPlan.dirtyTargetWorktree !== 'boolean') failures.push(`${target.id}:dirtyTargetWorktree not boolean`)
92
+ if (summary.repairPlan && !Array.isArray(summary.repairPlan.steps)) failures.push(`${target.id}:repairPlan steps not array`)
93
+ if (!Array.isArray(summary.recommendedNextActions)) failures.push(`${target.id}:recommendedNextActions not array`)
94
+ if (summary.repairPlan?.repairBlockedByDirtyWorktree) {
95
+ const firstAction = String(summary.recommendedNextActions?.[0] ?? '')
96
+ if (!firstAction.includes('worktree ownership')) failures.push(`${target.id}:dirty repair does not prioritize worktree ownership`)
97
+ }
98
+ if (summary.classification === 'target-local-adoption-hygiene' && summary.topLocalIssues.length === 0) failures.push(`${target.id}:local hygiene without issue source`)
99
+ }
100
+ return failures
101
+ }
102
+
103
+ function checkBom() {
68
104
  const roots = ['SKILL.md', 'references', 'assets', '.gse', '.learnings', 'examples', 'agents', 'scripts']
69
105
  const extensions = new Set(['.md', '.yaml', '.yml', '.mjs'])
70
106
  const bad = []
@@ -1165,15 +1201,16 @@ checks.push({
1165
1201
  })
1166
1202
  const targetHardeningDrills = run(process.execPath, [path.join(root, 'scripts', 'audit-target-hardening-drills.mjs'), '--root', root, '--json'])
1167
1203
  const targetHardeningDrillsData = parseJson(targetHardeningDrills.stdout)
1204
+ const targetHardeningAdoptionFailures = adoptionSummaryFailures(targetHardeningDrillsData)
1168
1205
  checks.push({
1169
1206
  id: 'validate-22e',
1170
1207
  label: 'target project hardening drill audit',
1171
- status: targetHardeningDrills.status === 0 ? 'passed' : 'failed',
1208
+ status: targetHardeningDrills.status === 0 && targetHardeningAdoptionFailures.length === 0 ? 'passed' : 'failed',
1172
1209
  command: targetHardeningDrills.command,
1173
1210
  summary: targetHardeningDrillsData
1174
- ? { status: targetHardeningDrillsData.summary?.status, checks: targetHardeningDrillsData.summary ? targetHardeningDrillsData.summary.passed + '/' + targetHardeningDrillsData.summary.total : null, mode: targetHardeningDrillsData.summary?.mode, targetHardeningDrills: targetHardeningDrillsData.workflows?.targetHardeningDrills }
1211
+ ? { status: targetHardeningDrillsData.summary?.status, checks: targetHardeningDrillsData.summary ? targetHardeningDrillsData.summary.passed + '/' + targetHardeningDrillsData.summary.total : null, mode: targetHardeningDrillsData.summary?.mode, targetHardeningDrills: targetHardeningDrillsData.workflows?.targetHardeningDrills, targetAdoptionHygieneSummary: targetHardeningDrillsData.workflows?.targetAdoptionHygieneSummary, adoptionFailures: targetHardeningAdoptionFailures }
1175
1212
  : null,
1176
- stderr: targetHardeningDrills.stderr,
1213
+ stderr: targetHardeningAdoptionFailures.length > 0 ? targetHardeningAdoptionFailures.join('; ') : targetHardeningDrills.stderr,
1177
1214
  })
1178
1215
  const maintenanceCadence = run(process.execPath, [path.join(root, 'scripts', 'audit-maintenance-cadence.mjs'), '--root', root, '--json'])
1179
1216
  const maintenanceCadenceData = parseJson(maintenanceCadence.stdout)