@shrkcrft/inspector 0.1.0-alpha.12 → 0.1.0-alpha.14
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/dist/pack-contributions-inventory.d.ts.map +1 -1
- package/dist/pack-contributions-inventory.js +11 -5
- package/dist/sharkcraft-inspector.d.ts +14 -0
- package/dist/sharkcraft-inspector.d.ts.map +1 -1
- package/dist/sharkcraft-inspector.js +87 -1
- package/dist/template-drift.d.ts +7 -0
- package/dist/template-drift.d.ts.map +1 -1
- package/dist/template-drift.js +14 -6
- package/package.json +17 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack-contributions-inventory.d.ts","sourceRoot":"","sources":["../src/pack-contributions-inventory.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pack-contributions-inventory.d.ts","sourceRoot":"","sources":["../src/pack-contributions-inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -562,7 +562,15 @@ function buildPackContributionsInventorySync(inspection, structural) {
|
|
|
562
562
|
const allRegexFallback = arr.every((e) => e.extractionMode === 'regex-fallback');
|
|
563
563
|
const sourceFiles = new Set(arr.map((e) => e.sourceFile).filter((s) => Boolean(s)));
|
|
564
564
|
const singleSourceFile = sourceFiles.size === 1;
|
|
565
|
-
|
|
565
|
+
// Self-acknowledged false positive: when ALL participating entries come
|
|
566
|
+
// from a SINGLE source file via regex fallback, the "duplicate" is
|
|
567
|
+
// almost certainly nested `id:` fields (playbook.steps[].id /
|
|
568
|
+
// pipeline.steps[].id) the regex grabbed, not real top-level duplicate
|
|
569
|
+
// contribution ids. Don't emit noise for it — a genuine duplicate would
|
|
570
|
+
// span multiple files or include a non-regex-fallback entry and still
|
|
571
|
+
// surface as an error below.
|
|
572
|
+
if (allRegexFallback && singleSourceFile)
|
|
573
|
+
continue;
|
|
566
574
|
conflicts.push({
|
|
567
575
|
kind: conflictKind,
|
|
568
576
|
contributionKind: kind,
|
|
@@ -577,10 +585,8 @@ function buildPackContributionsInventorySync(inspection, structural) {
|
|
|
577
585
|
src.sourceFile = e.sourceFile;
|
|
578
586
|
return src;
|
|
579
587
|
}),
|
|
580
|
-
severity:
|
|
581
|
-
message:
|
|
582
|
-
? `${arr.length} "${kind}" entries with id "${id}" extracted from a single source file via regex fallback — likely nested step.id fields, not real top-level duplicates.`
|
|
583
|
-
: `Duplicate "${kind}" id "${id}" loaded from ${arr.length} sources.`,
|
|
588
|
+
severity: 'error',
|
|
589
|
+
message: `Duplicate "${kind}" id "${id}" loaded from ${arr.length} sources.`,
|
|
584
590
|
nextCommand: `shrk packs contributions --json | jq '.entries[] | select(.id=="${id}" and .kind=="${kind}")'`,
|
|
585
591
|
});
|
|
586
592
|
}
|
|
@@ -10,6 +10,20 @@ import { PresetRegistry } from '@shrkcrft/presets';
|
|
|
10
10
|
import { BoundaryRegistry } from '@shrkcrft/boundaries';
|
|
11
11
|
import { type IDoctorResult } from './doctor-result.js';
|
|
12
12
|
import { type ILoaderDiagnostic } from './loader-diagnostics.js';
|
|
13
|
+
/**
|
|
14
|
+
* Find SharkCraft packs that live IN the repo but are not discovered (i.e.
|
|
15
|
+
* not linked into node_modules). Discovery scans node_modules; an unlinked
|
|
16
|
+
* in-repo pack is invisible to it, which silently disables every pack
|
|
17
|
+
* contribution. We do a bounded one-level scan of the conventional pack
|
|
18
|
+
* homes rather than a full recursive walk, so this stays cheap on large
|
|
19
|
+
* monorepos. A "pack dir" is one that has a `sharkcraft.plugin.*` manifest
|
|
20
|
+
* (at its root or under `src/`) or a `package.json` with a `sharkcraft`
|
|
21
|
+
* field. Returns only packs whose package name is NOT already discovered.
|
|
22
|
+
*/
|
|
23
|
+
export declare function findUnlinkedInRepoPacks(projectRoot: string, discoveredPackNames: ReadonlySet<string>): Array<{
|
|
24
|
+
packageName: string;
|
|
25
|
+
relPath: string;
|
|
26
|
+
}>;
|
|
13
27
|
export interface ISharkcraftInspection {
|
|
14
28
|
projectRoot: string;
|
|
15
29
|
workspace: IWorkspaceSummary;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharkcraft-inspector.d.ts","sourceRoot":"","sources":["../src/sharkcraft-inspector.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sharkcraft-inspector.d.ts","sourceRoot":"","sources":["../src/sharkcraft-inspector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, statSync } from 'node:fs';
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
2
2
|
import * as nodePath from 'node:path';
|
|
3
3
|
import { createImportContext, DEFAULT_SAFE_IMPORT_TIMEOUT_MS, } from '@shrkcrft/core';
|
|
4
4
|
import { inspectWorkspace } from '@shrkcrft/workspace';
|
|
@@ -17,6 +17,70 @@ import { buildCodeIntelligenceChecks } from "./code-intelligence-doctor.js";
|
|
|
17
17
|
import { computeFileFingerprint, createInspectorCache, } from "./inspector-cache.js";
|
|
18
18
|
import { DEFAULT_SLOW_LOADER_THRESHOLD_MS, LARGE_FILE_THRESHOLD_BYTES, } from "./loader-diagnostics.js";
|
|
19
19
|
import { suggestSurfaceProfile } from "./surface-profile-detect.js";
|
|
20
|
+
/**
|
|
21
|
+
* Find SharkCraft packs that live IN the repo but are not discovered (i.e.
|
|
22
|
+
* not linked into node_modules). Discovery scans node_modules; an unlinked
|
|
23
|
+
* in-repo pack is invisible to it, which silently disables every pack
|
|
24
|
+
* contribution. We do a bounded one-level scan of the conventional pack
|
|
25
|
+
* homes rather than a full recursive walk, so this stays cheap on large
|
|
26
|
+
* monorepos. A "pack dir" is one that has a `sharkcraft.plugin.*` manifest
|
|
27
|
+
* (at its root or under `src/`) or a `package.json` with a `sharkcraft`
|
|
28
|
+
* field. Returns only packs whose package name is NOT already discovered.
|
|
29
|
+
*/
|
|
30
|
+
export function findUnlinkedInRepoPacks(projectRoot, discoveredPackNames) {
|
|
31
|
+
const out = [];
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const manifestRelCandidates = [
|
|
34
|
+
'sharkcraft.plugin.ts',
|
|
35
|
+
'sharkcraft.plugin.mjs',
|
|
36
|
+
'sharkcraft.plugin.js',
|
|
37
|
+
nodePath.join('src', 'sharkcraft.plugin.ts'),
|
|
38
|
+
nodePath.join('src', 'sharkcraft.plugin.mjs'),
|
|
39
|
+
nodePath.join('src', 'sharkcraft.plugin.js'),
|
|
40
|
+
];
|
|
41
|
+
for (const parent of ['tools', 'packages', 'libs', '.']) {
|
|
42
|
+
const parentAbs = nodePath.resolve(projectRoot, parent);
|
|
43
|
+
let dirs;
|
|
44
|
+
try {
|
|
45
|
+
dirs = readdirSync(parentAbs, { withFileTypes: true })
|
|
46
|
+
.filter((d) => d.isDirectory() && d.name !== 'node_modules')
|
|
47
|
+
.map((d) => d.name);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
for (const dir of dirs) {
|
|
53
|
+
const packRoot = nodePath.join(parentAbs, dir);
|
|
54
|
+
const hasManifestFile = manifestRelCandidates.some((c) => existsSync(nodePath.join(packRoot, c)));
|
|
55
|
+
let packageName;
|
|
56
|
+
let hasSharkcraftField = false;
|
|
57
|
+
const pkgJsonPath = nodePath.join(packRoot, 'package.json');
|
|
58
|
+
if (existsSync(pkgJsonPath)) {
|
|
59
|
+
try {
|
|
60
|
+
const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
|
|
61
|
+
if (typeof pkg.name === 'string')
|
|
62
|
+
packageName = pkg.name;
|
|
63
|
+
hasSharkcraftField = pkg.sharkcraft != null;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
/* unreadable package.json — ignore */
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!hasManifestFile && !hasSharkcraftField)
|
|
70
|
+
continue;
|
|
71
|
+
if (!packageName || seen.has(packageName))
|
|
72
|
+
continue;
|
|
73
|
+
seen.add(packageName);
|
|
74
|
+
if (!discoveredPackNames.has(packageName)) {
|
|
75
|
+
out.push({
|
|
76
|
+
packageName,
|
|
77
|
+
relPath: nodePath.relative(projectRoot, packRoot) || '.',
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
20
84
|
function suggestNextCommand(kind, packName) {
|
|
21
85
|
if (packName)
|
|
22
86
|
return 'shrk packs doctor --release';
|
|
@@ -616,6 +680,28 @@ export function runDoctor(inspection) {
|
|
|
616
680
|
: `${v} valid, ${i} invalid pack(s). See \`shrk packs doctor\`.`,
|
|
617
681
|
});
|
|
618
682
|
}
|
|
683
|
+
else {
|
|
684
|
+
// Zero packs discovered. The costly silent-failure case: the repo SHIPS
|
|
685
|
+
// a pack (e.g. tools/sharkcraft-pack) but it is not linked into
|
|
686
|
+
// node_modules, where discovery scans. When that happens every
|
|
687
|
+
// contribution — templates, boundaries, knowledge — goes dark and doctor
|
|
688
|
+
// otherwise collapses to "No templates registered / no boundary rules"
|
|
689
|
+
// with no hint about the real cause. Detect it and make it actionable.
|
|
690
|
+
const discoveredNames = new Set(inspection.packs.discoveredPacks.map((p) => p.packageName));
|
|
691
|
+
const unlinked = findUnlinkedInRepoPacks(inspection.projectRoot, discoveredNames);
|
|
692
|
+
const first = unlinked[0];
|
|
693
|
+
if (first) {
|
|
694
|
+
const list = unlinked.map((u) => `${u.packageName} (${u.relPath})`).join(', ');
|
|
695
|
+
const up = first.packageName.startsWith('@') ? '../../' : '../';
|
|
696
|
+
checks.push({
|
|
697
|
+
id: 'packs',
|
|
698
|
+
title: 'packs',
|
|
699
|
+
severity: DoctorSeverity.Warning,
|
|
700
|
+
message: `In-repo pack(s) present but NOT discovered: ${list}. shrk discovers packs by scanning node_modules, so an unlinked in-repo pack loads nothing — templates, boundary rules, and knowledge all go dark even though the assets exist on disk.`,
|
|
701
|
+
fix: `Link it into node_modules so discovery sees it: \`mkdir -p node_modules/$(dirname ${first.packageName}) && ln -sfn ${up}${first.relPath} node_modules/${first.packageName}\` — or add a \`"${first.packageName}": "file:${first.relPath}"\` dependency. Then re-run \`shrk packs list\`.`,
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
}
|
|
619
705
|
if (inspection.pipelines.length === 0) {
|
|
620
706
|
checks.push({
|
|
621
707
|
id: 'pipelines',
|
package/dist/template-drift.d.ts
CHANGED
|
@@ -35,5 +35,12 @@ export interface ITemplateDriftCheckOptions {
|
|
|
35
35
|
/** Sample variable values for templates with required vars (key→string). */
|
|
36
36
|
sampleVars?: Readonly<Record<string, string>>;
|
|
37
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* A rendered sample path "matches" a path convention when it IS the
|
|
40
|
+
* convention's canonical target, or lives directly under it. The trailing
|
|
41
|
+
* slash guard stops `libs/nge/core` from spuriously matching
|
|
42
|
+
* `libs/nge/core-extra`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function samplePathMatchesConvention(samplePath: string, conventionPath: string): boolean;
|
|
38
45
|
export declare function buildTemplateDriftReport(inspection: ISharkcraftInspection, options?: ITemplateDriftCheckOptions): ITemplateDriftReport;
|
|
39
46
|
//# sourceMappingURL=template-drift.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-drift.d.ts","sourceRoot":"","sources":["../src/template-drift.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AAEpE,oBAAY,mBAAmB;IAC7B,IAAI,SAAS;IACb,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,qBAAqB,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B;IACzC,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;
|
|
1
|
+
{"version":3,"file":"template-drift.d.ts","sourceRoot":"","sources":["../src/template-drift.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AAEpE,oBAAY,mBAAmB;IAC7B,IAAI,SAAS;IACb,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,qBAAqB,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B;IACzC,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAoFD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAET;AAoND,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE,0BAA+B,GACvC,oBAAoB,CA8DtB"}
|
package/dist/template-drift.js
CHANGED
|
@@ -99,6 +99,15 @@ function safeRender(template, values) {
|
|
|
99
99
|
}
|
|
100
100
|
return { paths, warnings, ops };
|
|
101
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* A rendered sample path "matches" a path convention when it IS the
|
|
104
|
+
* convention's canonical target, or lives directly under it. The trailing
|
|
105
|
+
* slash guard stops `libs/nge/core` from spuriously matching
|
|
106
|
+
* `libs/nge/core-extra`.
|
|
107
|
+
*/
|
|
108
|
+
export function samplePathMatchesConvention(samplePath, conventionPath) {
|
|
109
|
+
return samplePath === conventionPath || samplePath.startsWith(`${conventionPath}/`);
|
|
110
|
+
}
|
|
102
111
|
function checkPathConventions(inspection, paths) {
|
|
103
112
|
const issues = [];
|
|
104
113
|
// Path conventions are name patterns; we only flag a path that obviously
|
|
@@ -111,12 +120,11 @@ function checkPathConventions(inspection, paths) {
|
|
|
111
120
|
for (const p of paths) {
|
|
112
121
|
let matched = false;
|
|
113
122
|
for (const c of conventions) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (cleaned.length > 4 && p.includes(cleaned)) {
|
|
123
|
+
// Path conventions carry their canonical path in `metadata.path`
|
|
124
|
+
// (IPathConvention), NOT a `pattern` field. A sample path matches a
|
|
125
|
+
// convention when it IS that target or lives under it.
|
|
126
|
+
const target = c.metadata?.path;
|
|
127
|
+
if (target && samplePathMatchesConvention(p, target)) {
|
|
120
128
|
matched = true;
|
|
121
129
|
break;
|
|
122
130
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shrkcrft/inspector",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.14",
|
|
4
4
|
"description": "SharkCraft inspector: project overview, doctor checks, AI-agent instructions.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "SharkCraft contributors",
|
|
@@ -42,22 +42,22 @@
|
|
|
42
42
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@shrkcrft/core": "^0.1.0-alpha.
|
|
46
|
-
"@shrkcrft/config": "^0.1.0-alpha.
|
|
47
|
-
"@shrkcrft/workspace": "^0.1.0-alpha.
|
|
48
|
-
"@shrkcrft/knowledge": "^0.1.0-alpha.
|
|
49
|
-
"@shrkcrft/rules": "^0.1.0-alpha.
|
|
50
|
-
"@shrkcrft/paths": "^0.1.0-alpha.
|
|
51
|
-
"@shrkcrft/templates": "^0.1.0-alpha.
|
|
52
|
-
"@shrkcrft/context": "^0.1.0-alpha.
|
|
53
|
-
"@shrkcrft/pipelines": "^0.1.0-alpha.
|
|
54
|
-
"@shrkcrft/packs": "^0.1.0-alpha.
|
|
55
|
-
"@shrkcrft/presets": "^0.1.0-alpha.
|
|
56
|
-
"@shrkcrft/boundaries": "^0.1.0-alpha.
|
|
57
|
-
"@shrkcrft/generator": "^0.1.0-alpha.
|
|
58
|
-
"@shrkcrft/importer": "^0.1.0-alpha.
|
|
59
|
-
"@shrkcrft/plugin-api": "^0.1.0-alpha.
|
|
60
|
-
"@shrkcrft/dashboard-api": "^0.1.0-alpha.
|
|
45
|
+
"@shrkcrft/core": "^0.1.0-alpha.14",
|
|
46
|
+
"@shrkcrft/config": "^0.1.0-alpha.14",
|
|
47
|
+
"@shrkcrft/workspace": "^0.1.0-alpha.14",
|
|
48
|
+
"@shrkcrft/knowledge": "^0.1.0-alpha.14",
|
|
49
|
+
"@shrkcrft/rules": "^0.1.0-alpha.14",
|
|
50
|
+
"@shrkcrft/paths": "^0.1.0-alpha.14",
|
|
51
|
+
"@shrkcrft/templates": "^0.1.0-alpha.14",
|
|
52
|
+
"@shrkcrft/context": "^0.1.0-alpha.14",
|
|
53
|
+
"@shrkcrft/pipelines": "^0.1.0-alpha.14",
|
|
54
|
+
"@shrkcrft/packs": "^0.1.0-alpha.14",
|
|
55
|
+
"@shrkcrft/presets": "^0.1.0-alpha.14",
|
|
56
|
+
"@shrkcrft/boundaries": "^0.1.0-alpha.14",
|
|
57
|
+
"@shrkcrft/generator": "^0.1.0-alpha.14",
|
|
58
|
+
"@shrkcrft/importer": "^0.1.0-alpha.14",
|
|
59
|
+
"@shrkcrft/plugin-api": "^0.1.0-alpha.14",
|
|
60
|
+
"@shrkcrft/dashboard-api": "^0.1.0-alpha.14",
|
|
61
61
|
"typescript": "^5.6.0"
|
|
62
62
|
},
|
|
63
63
|
"publishConfig": {
|