@skillsmith/core 0.7.2 → 0.8.1
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/CHANGELOG.md +19 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analytics/ROIDashboardService.compute.d.ts +17 -0
- package/dist/src/analytics/ROIDashboardService.compute.d.ts.map +1 -0
- package/dist/src/analytics/ROIDashboardService.compute.js +134 -0
- package/dist/src/analytics/ROIDashboardService.compute.js.map +1 -0
- package/dist/src/analytics/ROIDashboardService.d.ts +0 -8
- package/dist/src/analytics/ROIDashboardService.d.ts.map +1 -1
- package/dist/src/analytics/ROIDashboardService.js +9 -138
- package/dist/src/analytics/ROIDashboardService.js.map +1 -1
- package/dist/src/api/client.types.d.ts +5 -0
- package/dist/src/api/client.types.d.ts.map +1 -1
- package/dist/src/api/index.d.ts +1 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +4 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/schemas.compatibility.test.d.ts +11 -0
- package/dist/src/api/schemas.compatibility.test.d.ts.map +1 -0
- package/dist/src/api/schemas.compatibility.test.js +38 -0
- package/dist/src/api/schemas.compatibility.test.js.map +1 -0
- package/dist/src/api/schemas.d.ts +16 -9
- package/dist/src/api/schemas.d.ts.map +1 -1
- package/dist/src/api/schemas.js +13 -4
- package/dist/src/api/schemas.js.map +1 -1
- package/dist/src/api/schemas.license.test.d.ts +11 -0
- package/dist/src/api/schemas.license.test.d.ts.map +1 -0
- package/dist/src/api/schemas.license.test.js +51 -0
- package/dist/src/api/schemas.license.test.js.map +1 -0
- package/dist/src/api/types.d.ts +18 -3
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +29 -2
- package/dist/src/api/types.js.map +1 -1
- package/dist/src/audit/remote-audit.d.ts +41 -0
- package/dist/src/audit/remote-audit.d.ts.map +1 -1
- package/dist/src/audit/remote-audit.js +71 -28
- package/dist/src/audit/remote-audit.js.map +1 -1
- package/dist/src/audit/remote-audit.test.js +89 -1
- package/dist/src/audit/remote-audit.test.js.map +1 -1
- package/dist/src/compatibility/slugs.d.ts +34 -0
- package/dist/src/compatibility/slugs.d.ts.map +1 -0
- package/dist/src/compatibility/slugs.js +57 -0
- package/dist/src/compatibility/slugs.js.map +1 -0
- package/dist/src/db/schema-sql.d.ts +1 -1
- package/dist/src/db/schema-sql.d.ts.map +1 -1
- package/dist/src/db/schema-sql.js +1 -1
- package/dist/src/embeddings/probe.d.ts +62 -0
- package/dist/src/embeddings/probe.d.ts.map +1 -0
- package/dist/src/embeddings/probe.js +89 -0
- package/dist/src/embeddings/probe.js.map +1 -0
- package/dist/src/exports/types.d.ts +1 -0
- package/dist/src/exports/types.d.ts.map +1 -1
- package/dist/src/exports/types.js +4 -0
- package/dist/src/exports/types.js.map +1 -1
- package/dist/src/index.d.ts +6 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
- package/dist/src/indexer/GitHubIndexer.js +1 -1
- package/dist/src/indexer/GitHubIndexer.js.map +1 -1
- package/dist/src/provenance/SourceRecoveryService.d.ts +48 -0
- package/dist/src/provenance/SourceRecoveryService.d.ts.map +1 -0
- package/dist/src/provenance/SourceRecoveryService.js +182 -0
- package/dist/src/provenance/SourceRecoveryService.js.map +1 -0
- package/dist/src/provenance/backfill.d.ts +47 -0
- package/dist/src/provenance/backfill.d.ts.map +1 -0
- package/dist/src/provenance/backfill.js +206 -0
- package/dist/src/provenance/backfill.js.map +1 -0
- package/dist/src/provenance/git-config.d.ts +22 -0
- package/dist/src/provenance/git-config.d.ts.map +1 -0
- package/dist/src/provenance/git-config.js +117 -0
- package/dist/src/provenance/git-config.js.map +1 -0
- package/dist/src/provenance/index.d.ts +12 -0
- package/dist/src/provenance/index.d.ts.map +1 -0
- package/dist/src/provenance/index.js +12 -0
- package/dist/src/provenance/index.js.map +1 -0
- package/dist/src/provenance/local-skill-scan.d.ts +35 -0
- package/dist/src/provenance/local-skill-scan.d.ts.map +1 -0
- package/dist/src/provenance/local-skill-scan.js +79 -0
- package/dist/src/provenance/local-skill-scan.js.map +1 -0
- package/dist/src/provenance/plugin-manifest.d.ts +16 -0
- package/dist/src/provenance/plugin-manifest.d.ts.map +1 -0
- package/dist/src/provenance/plugin-manifest.js +52 -0
- package/dist/src/provenance/plugin-manifest.js.map +1 -0
- package/dist/src/provenance/types.d.ts +86 -0
- package/dist/src/provenance/types.d.ts.map +1 -0
- package/dist/src/provenance/types.js +21 -0
- package/dist/src/provenance/types.js.map +1 -0
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +3 -1
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +10 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/validation/normalizers.d.ts.map +1 -1
- package/dist/src/scripts/validation/normalizers.js +9 -7
- package/dist/src/scripts/validation/normalizers.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +8 -2
- package/dist/src/scripts/validation/types.d.ts.map +1 -1
- package/dist/src/scripts/validation/types.js +10 -2
- package/dist/src/scripts/validation/types.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +0 -7
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts +56 -0
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.exec.js +255 -0
- package/dist/src/security/scanner/SecurityScanner.exec.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js +17 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +34 -199
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts +22 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.js +213 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +1 -1
- package/dist/src/security/scanner/index.d.ts.map +1 -1
- package/dist/src/security/scanner/index.js +1 -1
- package/dist/src/security/scanner/index.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +21 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +34 -0
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +3 -1
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.js +6 -0
- package/dist/src/security/scanner/weights.js.map +1 -1
- package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
- package/dist/src/services/SearchService.helpers.js +2 -0
- package/dist/src/services/SearchService.helpers.js.map +1 -1
- package/dist/src/services/SearchService.types.d.ts +1 -0
- package/dist/src/services/SearchService.types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.helpers.d.ts +2 -26
- package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
- package/dist/src/services/skill-installation.helpers.js +2 -120
- package/dist/src/services/skill-installation.helpers.js.map +1 -1
- package/dist/src/services/skill-installation.io.d.ts +43 -0
- package/dist/src/services/skill-installation.io.d.ts.map +1 -0
- package/dist/src/services/skill-installation.io.js +176 -0
- package/dist/src/services/skill-installation.io.js.map +1 -0
- package/dist/src/services/skill-installation.service.d.ts.map +1 -1
- package/dist/src/services/skill-installation.service.js +51 -113
- package/dist/src/services/skill-installation.service.js.map +1 -1
- package/dist/src/services/skill-installation.types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.types.js +9 -0
- package/dist/src/services/skill-installation.types.js.map +1 -1
- package/dist/src/services/skill-installation.validate.d.ts +44 -0
- package/dist/src/services/skill-installation.validate.d.ts.map +1 -0
- package/dist/src/services/skill-installation.validate.js +134 -0
- package/dist/src/services/skill-installation.validate.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +4 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +19 -1
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +14 -0
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/wrap.bench.d.ts +13 -0
- package/dist/src/telemetry/wrap.bench.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.bench.js +41 -0
- package/dist/src/telemetry/wrap.bench.js.map +1 -0
- package/dist/src/telemetry/wrap.d.ts +75 -0
- package/dist/src/telemetry/wrap.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.js +124 -0
- package/dist/src/telemetry/wrap.js.map +1 -0
- package/dist/src/telemetry/wrap.test.d.ts +14 -0
- package/dist/src/telemetry/wrap.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.test.js +283 -0
- package/dist/src/telemetry/wrap.test.js.map +1 -0
- package/dist/src/types/skill.d.ts +6 -1
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types/skill.js.map +1 -1
- package/dist/src/types.d.ts +25 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +3 -1
- package/dist/src/types.js.map +1 -1
- package/dist/tests/GitHubIndexer.edge-cases.test.js +2 -2
- package/dist/tests/GitHubIndexer.repository.test.d.ts +10 -0
- package/dist/tests/GitHubIndexer.repository.test.d.ts.map +1 -0
- package/dist/tests/GitHubIndexer.repository.test.js +190 -0
- package/dist/tests/GitHubIndexer.repository.test.js.map +1 -0
- package/dist/tests/GitHubIndexer.test.d.ts +2 -1
- package/dist/tests/GitHubIndexer.test.d.ts.map +1 -1
- package/dist/tests/GitHubIndexer.test.js +5 -183
- package/dist/tests/GitHubIndexer.test.js.map +1 -1
- package/dist/tests/QuarantineRepository.review-state-machine.test.d.ts +14 -0
- package/dist/tests/QuarantineRepository.review-state-machine.test.d.ts.map +1 -0
- package/dist/tests/QuarantineRepository.review-state-machine.test.js +296 -0
- package/dist/tests/QuarantineRepository.review-state-machine.test.js.map +1 -0
- package/dist/tests/RawUrlSourceAdapter.security.test.js +3 -2
- package/dist/tests/RawUrlSourceAdapter.security.test.js.map +1 -1
- package/dist/tests/SecurityScanner.exec.test.d.ts +11 -0
- package/dist/tests/SecurityScanner.exec.test.d.ts.map +1 -0
- package/dist/tests/SecurityScanner.exec.test.js +190 -0
- package/dist/tests/SecurityScanner.exec.test.js.map +1 -0
- package/dist/tests/SwarmIndexer.test.js +2 -2
- package/dist/tests/api/client.validation.test.js +7 -4
- package/dist/tests/api/client.validation.test.js.map +1 -1
- package/dist/tests/embeddings/probe.test.d.ts +13 -0
- package/dist/tests/embeddings/probe.test.d.ts.map +1 -0
- package/dist/tests/embeddings/probe.test.js +154 -0
- package/dist/tests/embeddings/probe.test.js.map +1 -0
- package/dist/tests/fixtures/api-responses/index.js +1 -1
- package/dist/tests/fixtures/api-responses/index.js.map +1 -1
- package/dist/tests/integration/QuarantineService.concurrency.test.d.ts +34 -0
- package/dist/tests/integration/QuarantineService.concurrency.test.d.ts.map +1 -0
- package/dist/tests/integration/QuarantineService.concurrency.test.js +280 -0
- package/dist/tests/integration/QuarantineService.concurrency.test.js.map +1 -0
- package/dist/tests/integration/openapi-contract.test.d.ts +16 -0
- package/dist/tests/integration/openapi-contract.test.d.ts.map +1 -0
- package/dist/tests/integration/openapi-contract.test.js +231 -0
- package/dist/tests/integration/openapi-contract.test.js.map +1 -0
- package/dist/tests/provenance/SourceRecoveryService.test.d.ts +2 -0
- package/dist/tests/provenance/SourceRecoveryService.test.d.ts.map +1 -0
- package/dist/tests/provenance/SourceRecoveryService.test.js +132 -0
- package/dist/tests/provenance/SourceRecoveryService.test.js.map +1 -0
- package/dist/tests/provenance/backfill.test.d.ts +2 -0
- package/dist/tests/provenance/backfill.test.d.ts.map +1 -0
- package/dist/tests/provenance/backfill.test.js +278 -0
- package/dist/tests/provenance/backfill.test.js.map +1 -0
- package/dist/tests/provenance/git-config.test.d.ts +2 -0
- package/dist/tests/provenance/git-config.test.d.ts.map +1 -0
- package/dist/tests/provenance/git-config.test.js +73 -0
- package/dist/tests/provenance/git-config.test.js.map +1 -0
- package/dist/tests/provenance/local-skill-scan.test.d.ts +2 -0
- package/dist/tests/provenance/local-skill-scan.test.d.ts.map +1 -0
- package/dist/tests/provenance/local-skill-scan.test.js +51 -0
- package/dist/tests/provenance/local-skill-scan.test.js.map +1 -0
- package/dist/tests/provenance/plugin-manifest.test.d.ts +2 -0
- package/dist/tests/provenance/plugin-manifest.test.d.ts.map +1 -0
- package/dist/tests/provenance/plugin-manifest.test.js +49 -0
- package/dist/tests/provenance/plugin-manifest.test.js.map +1 -0
- package/dist/tests/scripts/import-to-database.test.js +7 -1
- package/dist/tests/scripts/import-to-database.test.js.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.js +5 -1
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/dist/tests/security.test.js +45 -0
- package/dist/tests/security.test.js.map +1 -1
- package/dist/tests/services/aidefence-feedback.test.js +2 -0
- package/dist/tests/services/aidefence-feedback.test.js.map +1 -1
- package/dist/tests/services/dep-quarantine-check.test.js +1 -1
- package/dist/tests/services/dep-quarantine-check.test.js.map +1 -1
- package/dist/tests/skill-scanner/allowlist.test.js +8 -1
- package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
- package/dist/tests/unit/services/skill-installation.gap1.test.d.ts +12 -0
- package/dist/tests/unit/services/skill-installation.gap1.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.gap1.test.js +96 -0
- package/dist/tests/unit/services/skill-installation.gap1.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.test.d.ts +11 -0
- package/dist/tests/unit/services/skill-installation.io.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.test.js +130 -0
- package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -0
- package/dist/tests/validate-skills.dedup.test.d.ts +5 -0
- package/dist/tests/validate-skills.dedup.test.d.ts.map +1 -0
- package/dist/tests/validate-skills.dedup.test.js +241 -0
- package/dist/tests/validate-skills.dedup.test.js.map +1 -0
- package/dist/tests/validate-skills.normalizers.test.d.ts +5 -0
- package/dist/tests/validate-skills.normalizers.test.d.ts.map +1 -0
- package/dist/tests/validate-skills.normalizers.test.js +109 -0
- package/dist/tests/validate-skills.normalizers.test.js.map +1 -0
- package/dist/tests/validate-skills.test.d.ts +1 -1
- package/dist/tests/validate-skills.test.js +7 -345
- package/dist/tests/validate-skills.test.js.map +1 -1
- package/package.json +29 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubIndexer.js","sourceRoot":"","sources":["../../../src/indexer/GitHubIndexer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"GitHubIndexer.js","sourceRoot":"","sources":["../../../src/indexer/GitHubIndexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tiered source-recovery orchestrator.
|
|
3
|
+
* @module @skillsmith/core/provenance/SourceRecoveryService
|
|
4
|
+
* @see SMI-5407
|
|
5
|
+
*
|
|
6
|
+
* Resolves the canonical GitHub source of each locally-installed skill by
|
|
7
|
+
* trying tiers in confidence order and short-circuiting on the first hit:
|
|
8
|
+
* git remote (exact) -> plugin manifest (high) -> registry name
|
|
9
|
+
* (medium/low, review-only) -> embedding (opt-in) -> hints (opt-in) -> unknown.
|
|
10
|
+
*
|
|
11
|
+
* The git and plugin tiers are local file reads and return BEFORE any injected
|
|
12
|
+
* dependency is invoked, so an offline run never touches the network.
|
|
13
|
+
*/
|
|
14
|
+
import type { RecoveryDeps, RecoveryReport, SkillRecoveryResult } from './types.js';
|
|
15
|
+
/** Options for a full recovery run. */
|
|
16
|
+
export interface RecoverSourcesOptions {
|
|
17
|
+
/** Root to scan. Defaults to `~/.claude/skills`. */
|
|
18
|
+
skillsRoot?: string;
|
|
19
|
+
/** Restrict to these skill directory names. */
|
|
20
|
+
only?: string[];
|
|
21
|
+
/** Enable the embedding tiebreak tier (off by default). */
|
|
22
|
+
enableEmbedding?: boolean;
|
|
23
|
+
/** Enable the catalog / author hint tier (off by default). */
|
|
24
|
+
enableCatalogHint?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** Per-skill resolution options (opt-in tiers). */
|
|
27
|
+
export interface RecoverOneOptions {
|
|
28
|
+
enableEmbedding?: boolean;
|
|
29
|
+
enableCatalogHint?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** Default install root for locally-installed skills. */
|
|
32
|
+
export declare function defaultSkillsRoot(): string;
|
|
33
|
+
export declare class SourceRecoveryService {
|
|
34
|
+
private readonly deps;
|
|
35
|
+
constructor(deps: RecoveryDeps);
|
|
36
|
+
/** Scan `skillsRoot` and resolve every (non-filtered) skill's source. */
|
|
37
|
+
recoverSources(opts?: RecoverSourcesOptions): Promise<RecoveryReport>;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve a single skill directory. Tiers short-circuit on the first hit;
|
|
40
|
+
* the git and plugin tiers return before any dependency call.
|
|
41
|
+
*/
|
|
42
|
+
recoverOne(dir: string, skillName: string, skillMd: string | null, opts?: RecoverOneOptions): Promise<SkillRecoveryResult>;
|
|
43
|
+
/** Tier 4: embedding tiebreak over an ambiguous candidate set (opt-in). */
|
|
44
|
+
private resolveAmbiguous;
|
|
45
|
+
/** Tier 5 helper: catalog repo_url then a speculative frontmatter author. */
|
|
46
|
+
private resolveHint;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=SourceRecoveryService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SourceRecoveryService.d.ts","sourceRoot":"","sources":["../../../src/provenance/SourceRecoveryService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,OAAO,KAAK,EAGV,YAAY,EACZ,cAAc,EAEd,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAEnB,uCAAuC;AACvC,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,mDAAmD;AACnD,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAID,yDAAyD;AACzD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAwED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,YAAY;IAE/C,yEAAyE;IACnE,cAAc,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,cAAc,CAAC;IAwB/E;;;OAGG;IACG,UAAU,CACd,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,mBAAmB,CAAC;IAoC/B,2EAA2E;YAC7D,gBAAgB;IAmC9B,6EAA6E;YAC/D,WAAW;CA4B1B"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tiered source-recovery orchestrator.
|
|
3
|
+
* @module @skillsmith/core/provenance/SourceRecoveryService
|
|
4
|
+
* @see SMI-5407
|
|
5
|
+
*
|
|
6
|
+
* Resolves the canonical GitHub source of each locally-installed skill by
|
|
7
|
+
* trying tiers in confidence order and short-circuiting on the first hit:
|
|
8
|
+
* git remote (exact) -> plugin manifest (high) -> registry name
|
|
9
|
+
* (medium/low, review-only) -> embedding (opt-in) -> hints (opt-in) -> unknown.
|
|
10
|
+
*
|
|
11
|
+
* The git and plugin tiers are local file reads and return BEFORE any injected
|
|
12
|
+
* dependency is invoked, so an offline run never touches the network.
|
|
13
|
+
*/
|
|
14
|
+
import * as os from 'os';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
import { SkillParser } from '../indexer/SkillParser.js';
|
|
17
|
+
import { parseGitConfigRemote, normalizeGitHubRemote } from './git-config.js';
|
|
18
|
+
import { parsePluginManifestRepository } from './plugin-manifest.js';
|
|
19
|
+
import { scanLocalSkills } from './local-skill-scan.js';
|
|
20
|
+
const frontmatterParser = new SkillParser({ requireName: false });
|
|
21
|
+
/** Default install root for locally-installed skills. */
|
|
22
|
+
export function defaultSkillsRoot() {
|
|
23
|
+
return path.join(os.homedir(), '.claude', 'skills');
|
|
24
|
+
}
|
|
25
|
+
function candidateSource(candidate) {
|
|
26
|
+
return { owner: candidate.owner, repo: candidate.repo, url: candidate.url };
|
|
27
|
+
}
|
|
28
|
+
function resolvedResult(skillName, installPath, source, method, confidence, registryId, candidates = []) {
|
|
29
|
+
return {
|
|
30
|
+
skillName,
|
|
31
|
+
installPath,
|
|
32
|
+
recoveredSource: source,
|
|
33
|
+
registryId,
|
|
34
|
+
method,
|
|
35
|
+
confidence,
|
|
36
|
+
candidates,
|
|
37
|
+
status: 'recovered',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function unknownResult(skillName, installPath) {
|
|
41
|
+
return {
|
|
42
|
+
skillName,
|
|
43
|
+
installPath,
|
|
44
|
+
recoveredSource: null,
|
|
45
|
+
registryId: null,
|
|
46
|
+
method: null,
|
|
47
|
+
confidence: 'unknown',
|
|
48
|
+
candidates: [],
|
|
49
|
+
status: 'unknown',
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function backupResult(skillName, installPath) {
|
|
53
|
+
return {
|
|
54
|
+
skillName,
|
|
55
|
+
installPath,
|
|
56
|
+
recoveredSource: null,
|
|
57
|
+
registryId: null,
|
|
58
|
+
method: null,
|
|
59
|
+
confidence: 'unknown',
|
|
60
|
+
candidates: [],
|
|
61
|
+
status: 'skipped_backup',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** GitHub usernames: 1-39 chars, alphanumeric or hyphen, no leading/trailing hyphen. */
|
|
65
|
+
function isPlausibleOwner(value) {
|
|
66
|
+
return /^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$/.test(value);
|
|
67
|
+
}
|
|
68
|
+
function computeSummary(skills) {
|
|
69
|
+
const summary = {
|
|
70
|
+
total: skills.length,
|
|
71
|
+
recovered: 0,
|
|
72
|
+
already_tracked: 0,
|
|
73
|
+
unknown: 0,
|
|
74
|
+
skipped_backup: 0,
|
|
75
|
+
};
|
|
76
|
+
for (const skill of skills) {
|
|
77
|
+
summary[skill.status] += 1;
|
|
78
|
+
}
|
|
79
|
+
return summary;
|
|
80
|
+
}
|
|
81
|
+
export class SourceRecoveryService {
|
|
82
|
+
deps;
|
|
83
|
+
constructor(deps) {
|
|
84
|
+
this.deps = deps;
|
|
85
|
+
}
|
|
86
|
+
/** Scan `skillsRoot` and resolve every (non-filtered) skill's source. */
|
|
87
|
+
async recoverSources(opts = {}) {
|
|
88
|
+
const skillsRoot = opts.skillsRoot ?? defaultSkillsRoot();
|
|
89
|
+
const entries = await scanLocalSkills(skillsRoot);
|
|
90
|
+
const only = opts.only;
|
|
91
|
+
const filtered = only && only.length > 0 ? entries.filter((e) => only.includes(e.skillName)) : entries;
|
|
92
|
+
const skills = [];
|
|
93
|
+
for (const entry of filtered) {
|
|
94
|
+
if (entry.isBackup) {
|
|
95
|
+
skills.push(backupResult(entry.skillName, entry.dir));
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
skills.push(await this.recoverOne(entry.dir, entry.skillName, entry.skillMd, {
|
|
99
|
+
enableEmbedding: opts.enableEmbedding,
|
|
100
|
+
enableCatalogHint: opts.enableCatalogHint,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
return { skills, summary: computeSummary(skills) };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resolve a single skill directory. Tiers short-circuit on the first hit;
|
|
107
|
+
* the git and plugin tiers return before any dependency call.
|
|
108
|
+
*/
|
|
109
|
+
async recoverOne(dir, skillName, skillMd, opts = {}) {
|
|
110
|
+
// Tier 1: git remote (exact) -- offline, returns before any dep call.
|
|
111
|
+
const git = parseGitConfigRemote(dir);
|
|
112
|
+
if (git)
|
|
113
|
+
return resolvedResult(skillName, dir, git, 'git-remote', 'exact', null);
|
|
114
|
+
// Tier 2: plugin manifest (high) -- offline.
|
|
115
|
+
const plugin = parsePluginManifestRepository(dir);
|
|
116
|
+
if (plugin)
|
|
117
|
+
return resolvedResult(skillName, dir, plugin, 'plugin-json', 'high', null);
|
|
118
|
+
// Tier 3: registry name match (medium/low) -- REVIEW ONLY.
|
|
119
|
+
const candidates = await this.deps.findCandidatesByName(skillName);
|
|
120
|
+
if (candidates.length === 1) {
|
|
121
|
+
const candidate = candidates[0];
|
|
122
|
+
return resolvedResult(skillName, dir, candidateSource(candidate), 'registry-name', 'medium', candidate.id);
|
|
123
|
+
}
|
|
124
|
+
if (candidates.length > 1) {
|
|
125
|
+
return this.resolveAmbiguous(dir, skillName, skillMd, candidates, opts);
|
|
126
|
+
}
|
|
127
|
+
// Tier 5: hints (opt-in, low).
|
|
128
|
+
if (opts.enableCatalogHint) {
|
|
129
|
+
const hint = await this.resolveHint(dir, skillName, skillMd);
|
|
130
|
+
if (hint)
|
|
131
|
+
return hint;
|
|
132
|
+
}
|
|
133
|
+
// Tier 6: unknown.
|
|
134
|
+
return unknownResult(skillName, dir);
|
|
135
|
+
}
|
|
136
|
+
/** Tier 4: embedding tiebreak over an ambiguous candidate set (opt-in). */
|
|
137
|
+
async resolveAmbiguous(dir, skillName, skillMd, candidates, opts) {
|
|
138
|
+
if (opts.enableEmbedding && this.deps.rankByEmbedding && skillMd) {
|
|
139
|
+
const ranked = await this.deps.rankByEmbedding(skillName, skillMd, candidates);
|
|
140
|
+
if (ranked.length > 0) {
|
|
141
|
+
const top = ranked[0];
|
|
142
|
+
return resolvedResult(skillName, dir, candidateSource(top), 'registry-embedding', 'low', top.id, ranked);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Ambiguous and unresolved: surface the candidates for review.
|
|
146
|
+
return {
|
|
147
|
+
skillName,
|
|
148
|
+
installPath: dir,
|
|
149
|
+
recoveredSource: null,
|
|
150
|
+
registryId: null,
|
|
151
|
+
method: 'registry-name',
|
|
152
|
+
confidence: 'low',
|
|
153
|
+
candidates,
|
|
154
|
+
status: 'unknown',
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/** Tier 5 helper: catalog repo_url then a speculative frontmatter author. */
|
|
158
|
+
async resolveHint(dir, skillName, skillMd) {
|
|
159
|
+
if (this.deps.lookupCatalogRepoUrl) {
|
|
160
|
+
const url = await this.deps.lookupCatalogRepoUrl(skillName);
|
|
161
|
+
if (url) {
|
|
162
|
+
const source = normalizeGitHubRemote(url);
|
|
163
|
+
if (source)
|
|
164
|
+
return resolvedResult(skillName, dir, source, 'catalog-db', 'low', null);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (skillMd) {
|
|
168
|
+
const fm = frontmatterParser.extractFrontmatter(skillMd);
|
|
169
|
+
const author = typeof fm?.author === 'string' ? fm.author.trim() : '';
|
|
170
|
+
if (author && isPlausibleOwner(author)) {
|
|
171
|
+
const source = {
|
|
172
|
+
owner: author,
|
|
173
|
+
repo: skillName,
|
|
174
|
+
url: `https://github.com/${author}/${skillName}`,
|
|
175
|
+
};
|
|
176
|
+
return resolvedResult(skillName, dir, source, 'author-hint', 'low', null);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=SourceRecoveryService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SourceRecoveryService.js","sourceRoot":"","sources":["../../../src/provenance/SourceRecoveryService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Backfill recovered sources into the skill manifest.
|
|
3
|
+
* @module @skillsmith/core/provenance/backfill
|
|
4
|
+
* @see SMI-5407
|
|
5
|
+
*
|
|
6
|
+
* Plans manifest entries from a {@link RecoveryReport} and (when `apply`)
|
|
7
|
+
* writes them via a single `ManifestManager.updateSafely` merge that ADDs or
|
|
8
|
+
* fills-missing `source`/`id` but NEVER clobbers a healthy existing entry --
|
|
9
|
+
* even when the recovered value differs. Idempotent: a second run is a no-op.
|
|
10
|
+
*
|
|
11
|
+
* Backfill keys (load-bearing, per plan-review):
|
|
12
|
+
* - `id` = registry UUID when a registry tier resolved it, else `owner/skill-name`.
|
|
13
|
+
* - `source` = `https://github.com/<owner>/<repo>` (the form buildRawUrl accepts).
|
|
14
|
+
*/
|
|
15
|
+
import type { SkillManifestEntry } from '../services/skill-installation.types.js';
|
|
16
|
+
import type { RecoveryConfidence, RecoveryReport } from './types.js';
|
|
17
|
+
/** Options controlling a backfill run. */
|
|
18
|
+
export interface BackfillOptions {
|
|
19
|
+
/** Manifest path. Defaults to `~/.skillsmith/manifest.json`. */
|
|
20
|
+
manifestPath?: string;
|
|
21
|
+
/** Minimum confidence to auto-qualify (default `high`). */
|
|
22
|
+
minConfidence?: RecoveryConfidence;
|
|
23
|
+
/** Write changes. When false (default), the run is a dry-run plan only. */
|
|
24
|
+
apply?: boolean;
|
|
25
|
+
/** Opt-in: write `repository:` into non-git skills' SKILL.md frontmatter. */
|
|
26
|
+
writeFrontmatter?: boolean;
|
|
27
|
+
/** Explicit `<dirName> -> 'owner/repo'` overrides (resolved user-specified). */
|
|
28
|
+
setOverrides?: Record<string, string>;
|
|
29
|
+
/** Injected `lastUpdated` ISO timestamp for deterministic tests. */
|
|
30
|
+
now?: string;
|
|
31
|
+
/** Injected content hasher (defaults to the shared `hashContent`). */
|
|
32
|
+
hashContent?: (content: string) => string;
|
|
33
|
+
}
|
|
34
|
+
/** Outcome of a backfill run. */
|
|
35
|
+
export interface BackfillOutcome {
|
|
36
|
+
/** Entries planned for write (all that qualify), regardless of `apply`. */
|
|
37
|
+
planned: SkillManifestEntry[];
|
|
38
|
+
/** Skill names actually written (apply only). */
|
|
39
|
+
written: string[];
|
|
40
|
+
/** Skill names skipped (unqualified, bad override, or healthy/clobber-protected). */
|
|
41
|
+
skipped: string[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Plan and (optionally) apply manifest backfill for recovered sources.
|
|
45
|
+
*/
|
|
46
|
+
export declare function backfillManifest(report: RecoveryReport, opts?: BackfillOptions): Promise<BackfillOutcome>;
|
|
47
|
+
//# sourceMappingURL=backfill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill.d.ts","sourceRoot":"","sources":["../../../src/provenance/backfill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAEjF,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAuB,MAAM,YAAY,CAAA;AAEzF,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,kBAAkB,CAAA;IAClC,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,sEAAsE;IACtE,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;CAC1C;AAED,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,iDAAiD;IACjD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,qFAAqF;IACrF,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAkKD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,eAAe,CAAC,CAmD1B"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Backfill recovered sources into the skill manifest.
|
|
3
|
+
* @module @skillsmith/core/provenance/backfill
|
|
4
|
+
* @see SMI-5407
|
|
5
|
+
*
|
|
6
|
+
* Plans manifest entries from a {@link RecoveryReport} and (when `apply`)
|
|
7
|
+
* writes them via a single `ManifestManager.updateSafely` merge that ADDs or
|
|
8
|
+
* fills-missing `source`/`id` but NEVER clobbers a healthy existing entry --
|
|
9
|
+
* even when the recovered value differs. Idempotent: a second run is a no-op.
|
|
10
|
+
*
|
|
11
|
+
* Backfill keys (load-bearing, per plan-review):
|
|
12
|
+
* - `id` = registry UUID when a registry tier resolved it, else `owner/skill-name`.
|
|
13
|
+
* - `source` = `https://github.com/<owner>/<repo>` (the form buildRawUrl accepts).
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync } from 'fs';
|
|
16
|
+
import * as fs from 'fs/promises';
|
|
17
|
+
import * as os from 'os';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import { ManifestManager } from '../services/skill-manifest.js';
|
|
20
|
+
import { hashContent as defaultHashContent } from '../services/skill-installation.helpers.js';
|
|
21
|
+
const CONFIDENCE_RANK = {
|
|
22
|
+
unknown: 0,
|
|
23
|
+
low: 1,
|
|
24
|
+
medium: 2,
|
|
25
|
+
high: 3,
|
|
26
|
+
exact: 4,
|
|
27
|
+
'user-specified': 5,
|
|
28
|
+
};
|
|
29
|
+
function defaultManifestPath() {
|
|
30
|
+
return path.join(os.homedir(), '.skillsmith', 'manifest.json');
|
|
31
|
+
}
|
|
32
|
+
function nonEmpty(value) {
|
|
33
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
34
|
+
}
|
|
35
|
+
/** A manifest entry is "healthy" once it carries both a non-empty source and id. */
|
|
36
|
+
function isHealthy(entry) {
|
|
37
|
+
return nonEmpty(entry.source) && nonEmpty(entry.id);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Does a result qualify for backfill? The `minConfidence` floor IS the gate
|
|
41
|
+
* (default `high` -> only exact/high auto-write). Lowering it to `medium`
|
|
42
|
+
* admits a single registry-name match (which carries the registry UUID, so
|
|
43
|
+
* `skill_outdated` can resolve it); ambiguous multi-candidate results never
|
|
44
|
+
* qualify because their `recoveredSource` is null (planResult drops them).
|
|
45
|
+
* `unknown` never qualifies. SMI-5407.
|
|
46
|
+
*/
|
|
47
|
+
function qualifies(confidence, minConfidence) {
|
|
48
|
+
if (confidence === 'unknown')
|
|
49
|
+
return false;
|
|
50
|
+
return CONFIDENCE_RANK[confidence] >= CONFIDENCE_RANK[minConfidence];
|
|
51
|
+
}
|
|
52
|
+
/** Parse an `owner/repo` override spec. */
|
|
53
|
+
function parseOwnerRepo(spec) {
|
|
54
|
+
const parts = spec.split('/').filter(Boolean);
|
|
55
|
+
if (parts.length !== 2)
|
|
56
|
+
return null;
|
|
57
|
+
return { owner: parts[0], repo: parts[1] };
|
|
58
|
+
}
|
|
59
|
+
/** Build a complete manifest entry, deriving installedAt/hash from SKILL.md. */
|
|
60
|
+
async function buildEntry(params) {
|
|
61
|
+
const { installPath, skillName, owner, sourceUrl, registryId, now, hash } = params;
|
|
62
|
+
const skillMdPath = path.join(installPath, 'SKILL.md');
|
|
63
|
+
let installedAt = now;
|
|
64
|
+
let originalContentHash;
|
|
65
|
+
try {
|
|
66
|
+
const stat = await fs.stat(skillMdPath);
|
|
67
|
+
installedAt = stat.mtime.toISOString();
|
|
68
|
+
const content = await fs.readFile(skillMdPath, 'utf-8');
|
|
69
|
+
originalContentHash = hash(content);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// SKILL.md unreadable -- fall back to `now` and leave hash undefined.
|
|
73
|
+
}
|
|
74
|
+
const id = nonEmpty(registryId ?? undefined) ? registryId : `${owner}/${skillName}`;
|
|
75
|
+
return {
|
|
76
|
+
id,
|
|
77
|
+
name: skillName,
|
|
78
|
+
version: '1.0.0',
|
|
79
|
+
source: sourceUrl,
|
|
80
|
+
installPath,
|
|
81
|
+
installedAt,
|
|
82
|
+
lastUpdated: now,
|
|
83
|
+
originalContentHash,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** Plan one entry from a result; returns null when it does not qualify. */
|
|
87
|
+
async function planResult(result, overrides, minConfidence, now, hash) {
|
|
88
|
+
const override = overrides[result.skillName];
|
|
89
|
+
if (override) {
|
|
90
|
+
const ownerRepo = parseOwnerRepo(override);
|
|
91
|
+
if (!ownerRepo)
|
|
92
|
+
return null;
|
|
93
|
+
return buildEntry({
|
|
94
|
+
installPath: result.installPath,
|
|
95
|
+
skillName: result.skillName,
|
|
96
|
+
owner: ownerRepo.owner,
|
|
97
|
+
sourceUrl: `https://github.com/${ownerRepo.owner}/${ownerRepo.repo}`,
|
|
98
|
+
registryId: null,
|
|
99
|
+
now,
|
|
100
|
+
hash,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (!qualifies(result.confidence, minConfidence) || !result.recoveredSource)
|
|
104
|
+
return null;
|
|
105
|
+
return buildEntry({
|
|
106
|
+
installPath: result.installPath,
|
|
107
|
+
skillName: result.skillName,
|
|
108
|
+
owner: result.recoveredSource.owner,
|
|
109
|
+
sourceUrl: result.recoveredSource.url,
|
|
110
|
+
registryId: result.registryId,
|
|
111
|
+
now,
|
|
112
|
+
hash,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/** Fill missing fields from `planned` onto an unhealthy `existing` entry. */
|
|
116
|
+
function mergeEntry(existing, planned) {
|
|
117
|
+
return {
|
|
118
|
+
...existing,
|
|
119
|
+
id: nonEmpty(existing.id) ? existing.id : planned.id,
|
|
120
|
+
name: nonEmpty(existing.name) ? existing.name : planned.name,
|
|
121
|
+
version: nonEmpty(existing.version) ? existing.version : planned.version,
|
|
122
|
+
source: planned.source, // existing is unhealthy (no source) -- fill it
|
|
123
|
+
installPath: nonEmpty(existing.installPath) ? existing.installPath : planned.installPath,
|
|
124
|
+
installedAt: nonEmpty(existing.installedAt) ? existing.installedAt : planned.installedAt,
|
|
125
|
+
lastUpdated: planned.lastUpdated,
|
|
126
|
+
originalContentHash: existing.originalContentHash ?? planned.originalContentHash,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Write `repository: <url>` into a non-git skill's SKILL.md frontmatter.
|
|
131
|
+
* Skips git checkouts and skills that already declare a `repository:`.
|
|
132
|
+
*/
|
|
133
|
+
async function maybeWriteFrontmatter(dir, sourceUrl) {
|
|
134
|
+
if (existsSync(path.join(dir, '.git', 'config')))
|
|
135
|
+
return false;
|
|
136
|
+
const skillMdPath = path.join(dir, 'SKILL.md');
|
|
137
|
+
let content;
|
|
138
|
+
try {
|
|
139
|
+
content = await fs.readFile(skillMdPath, 'utf-8');
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
if (!content.startsWith('---'))
|
|
145
|
+
return false;
|
|
146
|
+
const endIndex = content.indexOf('\n---', 3);
|
|
147
|
+
if (endIndex === -1)
|
|
148
|
+
return false;
|
|
149
|
+
const block = content.slice(0, endIndex);
|
|
150
|
+
if (/^repository\s*:/m.test(block))
|
|
151
|
+
return false;
|
|
152
|
+
const updated = block + `\nrepository: ${sourceUrl}` + content.slice(endIndex);
|
|
153
|
+
await fs.writeFile(skillMdPath, updated, 'utf-8');
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Plan and (optionally) apply manifest backfill for recovered sources.
|
|
158
|
+
*/
|
|
159
|
+
export async function backfillManifest(report, opts = {}) {
|
|
160
|
+
const manifestPath = opts.manifestPath ?? defaultManifestPath();
|
|
161
|
+
const minConfidence = opts.minConfidence ?? 'high';
|
|
162
|
+
const apply = opts.apply ?? false;
|
|
163
|
+
const now = opts.now ?? new Date().toISOString();
|
|
164
|
+
const hash = opts.hashContent ?? defaultHashContent;
|
|
165
|
+
const overrides = opts.setOverrides ?? {};
|
|
166
|
+
const planned = [];
|
|
167
|
+
const plannedByName = new Map();
|
|
168
|
+
const skipped = [];
|
|
169
|
+
for (const result of report.skills) {
|
|
170
|
+
const entry = await planResult(result, overrides, minConfidence, now, hash);
|
|
171
|
+
if (!entry) {
|
|
172
|
+
skipped.push(result.skillName);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
planned.push(entry);
|
|
176
|
+
plannedByName.set(result.skillName, entry);
|
|
177
|
+
}
|
|
178
|
+
// Dry-run, or nothing qualified: never touch the manifest.
|
|
179
|
+
if (!apply || plannedByName.size === 0) {
|
|
180
|
+
return { planned, written: [], skipped };
|
|
181
|
+
}
|
|
182
|
+
const written = [];
|
|
183
|
+
const manager = new ManifestManager(manifestPath);
|
|
184
|
+
await manager.updateSafely((manifest) => {
|
|
185
|
+
const installed = { ...manifest.installedSkills };
|
|
186
|
+
for (const [name, entry] of plannedByName) {
|
|
187
|
+
const existing = installed[name];
|
|
188
|
+
if (existing && isHealthy(existing)) {
|
|
189
|
+
skipped.push(name); // never clobber a healthy entry
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
installed[name] = existing ? mergeEntry(existing, entry) : entry;
|
|
193
|
+
written.push(name);
|
|
194
|
+
}
|
|
195
|
+
return { ...manifest, installedSkills: installed };
|
|
196
|
+
});
|
|
197
|
+
if (opts.writeFrontmatter) {
|
|
198
|
+
for (const name of written) {
|
|
199
|
+
const entry = plannedByName.get(name);
|
|
200
|
+
if (entry)
|
|
201
|
+
await maybeWriteFrontmatter(entry.installPath, entry.source);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return { planned, written, skipped };
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=backfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../../src/provenance/backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Recover a skill's GitHub source from its `.git/config` origin.
|
|
3
|
+
* @module @skillsmith/core/provenance/git-config
|
|
4
|
+
* @see SMI-5407
|
|
5
|
+
*
|
|
6
|
+
* Offline only. No git binary, no network: we parse the INI-style config file
|
|
7
|
+
* directly. Normalizes both scp-like (`git@github.com:owner/repo.git`) and URL
|
|
8
|
+
* (`https://github.com/owner/repo.git`) remotes. Non-github hosts return null.
|
|
9
|
+
*/
|
|
10
|
+
import type { RecoveredSource } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Normalize a raw git remote URL into a canonical {@link RecoveredSource}.
|
|
13
|
+
* Returns null for non-github hosts or unparseable shapes.
|
|
14
|
+
*/
|
|
15
|
+
export declare function normalizeGitHubRemote(rawUrl: string): RecoveredSource | null;
|
|
16
|
+
/**
|
|
17
|
+
* Read `<skillDir>/.git/config` and recover the origin remote's GitHub source.
|
|
18
|
+
* Returns null when the file is missing, has no origin url, or the remote is
|
|
19
|
+
* not a github.com repository.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseGitConfigRemote(skillDir: string): RecoveredSource | null;
|
|
22
|
+
//# sourceMappingURL=git-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-config.d.ts","sourceRoot":"","sources":["../../../src/provenance/git-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AA6BjD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAgC5E;AAoBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAW7E"}
|