@shrkcrft/inspector 0.1.0-alpha.23 → 0.1.0-alpha.24
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/coverage-report.d.ts.map +1 -1
- package/dist/coverage-report.js +31 -8
- package/dist/git-helpers.d.ts.map +1 -1
- package/dist/git-helpers.js +10 -1
- package/dist/pack-quality-score.d.ts.map +1 -1
- package/dist/pack-quality-score.js +11 -5
- package/dist/resolve-project-config.d.ts.map +1 -1
- package/dist/resolve-project-config.js +10 -2
- package/package.json +17 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage-report.d.ts","sourceRoot":"","sources":["../src/coverage-report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"coverage-report.d.ts","sourceRoot":"","sources":["../src/coverage-report.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAOD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,qBAAqB,GAAG,eAAe,CA2NtF"}
|
package/dist/coverage-report.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { hasActionHints } from '@shrkcrft/knowledge';
|
|
1
|
+
import { hasActionHints, hasMeaningfulActionHints, KNOWLEDGE_TYPES_NO_ACTION, } from '@shrkcrft/knowledge';
|
|
2
2
|
import { resolvePreset, resolvePresetReferences } from '@shrkcrft/presets';
|
|
3
3
|
import { inspectionReferenceLookup } from "./reference-lookup.js";
|
|
4
4
|
function pct(covered, total) {
|
|
@@ -57,24 +57,47 @@ export function buildCoverageReport(inspection) {
|
|
|
57
57
|
missing,
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
|
-
// 3. Critical/high knowledge entries
|
|
60
|
+
// 3. Critical/high knowledge entries carry a MEANINGFUL action hint.
|
|
61
|
+
// Quality, not mere presence: a hollow/templated hint (a `<command>`
|
|
62
|
+
// placeholder, a lone requiresHumanReview, an empty object) does NOT count,
|
|
63
|
+
// so an agent can't clear the gate with uniform low-value metadata. Entries
|
|
64
|
+
// with no actionable next step are exempt from the denominator — a per-entry
|
|
65
|
+
// author `noAction: true` (the precise lever) OR a purely-descriptive type
|
|
66
|
+
// (business/decision — the conservative floor) — so the target isn't
|
|
67
|
+
// artificially 100% and nobody is pushed to bolt a hollow hint on.
|
|
61
68
|
{
|
|
62
69
|
const eligible = inspection.knowledgeEntries.filter((e) => {
|
|
63
70
|
const p = String(e.priority);
|
|
64
71
|
return p === 'critical' || p === 'high';
|
|
65
72
|
});
|
|
66
|
-
const
|
|
73
|
+
const actionable = eligible.filter((e) => e.noAction !== true && !KNOWLEDGE_TYPES_NO_ACTION.has(e.type));
|
|
74
|
+
const total = actionable.length;
|
|
75
|
+
const knowledgeIds = new Set(inspection.knowledgeEntries.map((x) => x.id));
|
|
76
|
+
const templateIds = new Set(inspection.templates.map((t) => t.id));
|
|
67
77
|
const missing = [];
|
|
68
78
|
let covered = 0;
|
|
69
|
-
for (const e of
|
|
70
|
-
if (
|
|
79
|
+
for (const e of actionable) {
|
|
80
|
+
if (hasMeaningfulActionHints(e)) {
|
|
71
81
|
covered += 1;
|
|
72
|
-
|
|
73
|
-
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// Reward RESOLVED cross-references: a hint whose related ids actually
|
|
85
|
+
// point at real entries/templates is substantive even without a command.
|
|
86
|
+
const a = e.actionHints;
|
|
87
|
+
const resolvedXref = !!a &&
|
|
88
|
+
((a.relatedKnowledge?.some((id) => knowledgeIds.has(id)) ?? false) ||
|
|
89
|
+
(a.relatedTemplates?.some((id) => templateIds.has(id)) ?? false));
|
|
90
|
+
if (resolvedXref) {
|
|
91
|
+
covered += 1;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
missing.push(hasActionHints(e)
|
|
95
|
+
? `${e.id} — actionHints present but low-value (templated/empty/unresolved cross-refs)`
|
|
96
|
+
: `${e.id} — no actionHints`);
|
|
74
97
|
}
|
|
75
98
|
categories.push({
|
|
76
99
|
id: 'hint-coverage',
|
|
77
|
-
title: 'Critical/high entries carry
|
|
100
|
+
title: 'Critical/high entries carry a meaningful actionHint',
|
|
78
101
|
total,
|
|
79
102
|
covered,
|
|
80
103
|
score: pct(covered, total),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-helpers.d.ts","sourceRoot":"","sources":["../src/git-helpers.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"git-helpers.d.ts","sourceRoot":"","sources":["../src/git-helpers.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAqBD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAI9C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKrD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKvD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,MAAM,EAAE,CAwBpF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAyC/D;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,EAAE,CA6BrF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKjD"}
|
package/dist/git-helpers.js
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import * as nodePath from 'node:path';
|
|
4
|
+
// 512 MB — the same generous ceiling @shrkcrft/shared's runGitLines uses. A
|
|
5
|
+
// `diff`/`log --name-only` listing on a large changeset overflows Node's 1 MB
|
|
6
|
+
// default `maxBuffer` and dies with ENOBUFS; a name listing never approaches
|
|
7
|
+
// 512 MB, so this is effectively unbounded while still capping a runaway.
|
|
8
|
+
const GIT_MAX_BUFFER = 512 * 1024 * 1024;
|
|
4
9
|
function runGit(cwd, args) {
|
|
5
|
-
const res = spawnSync('git', args, {
|
|
10
|
+
const res = spawnSync('git', args, {
|
|
11
|
+
cwd,
|
|
12
|
+
encoding: 'utf8',
|
|
13
|
+
maxBuffer: GIT_MAX_BUFFER,
|
|
14
|
+
});
|
|
6
15
|
return {
|
|
7
16
|
ok: res.status === 0,
|
|
8
17
|
stdout: (res.stdout ?? '').toString(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack-quality-score.d.ts","sourceRoot":"","sources":["../src/pack-quality-score.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pack-quality-score.d.ts","sourceRoot":"","sources":["../src/pack-quality-score.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAIvE,eAAO,MAAM,mBAAmB,qCAAqC,CAAC;AACtE,eAAO,MAAM,wBAAwB,oCAAoC,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,wBAAwB,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9F,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,GAC1B,gBAAgB,CA2BlB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,mBAAmB,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC7C,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAMD,wBAAgB,SAAS,CACvB,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,eAAe,GACpB,iBAAiB,CAyInB;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,qBAAqB,GAAG,iBAAiB,EAAE,CAEpF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CONTRIBUTION_FILE_KEYS } from '@shrkcrft/plugin-api';
|
|
2
|
+
import { hasMeaningfulActionHints, KNOWLEDGE_TYPES_NO_ACTION, } from '@shrkcrft/knowledge';
|
|
2
3
|
import { lintTemplates } from "./template-lint.js";
|
|
3
4
|
import { lintPipelines } from "./pipeline-lint.js";
|
|
4
5
|
export const PACK_QUALITY_SCHEMA = 'sharkcraft.pack-quality-score/v1';
|
|
@@ -117,15 +118,20 @@ export function scorePack(inspection, pack) {
|
|
|
117
118
|
weight: 0.7,
|
|
118
119
|
notes: pipFromPack.length === 0 ? ['No pipelines contributed'] : [],
|
|
119
120
|
});
|
|
120
|
-
// Action hints presence
|
|
121
|
+
// Action hints QUALITY (not mere presence): score only entries that carry a
|
|
122
|
+
// substantive, non-templated hint, and exempt purely-descriptive types
|
|
123
|
+
// (business/decision) from the denominator so a pack can't game the gate with
|
|
124
|
+
// hollow metadata on context-only entries.
|
|
121
125
|
const packEntries = inspection.knowledgeEntries.filter((e) => inspection.entrySources.get(e.id)?.packageName === pack.packageName);
|
|
122
|
-
const
|
|
126
|
+
const actionable = packEntries.filter((e) => e.noAction !== true && !KNOWLEDGE_TYPES_NO_ACTION.has(e.type));
|
|
127
|
+
const entriesWithMeaningfulHints = actionable.filter((e) => hasMeaningfulActionHints(e)).length;
|
|
128
|
+
const hollow = actionable.length - entriesWithMeaningfulHints;
|
|
123
129
|
dims.push({
|
|
124
130
|
id: 'action-hints',
|
|
125
|
-
label: 'Action hints',
|
|
126
|
-
score:
|
|
131
|
+
label: 'Action hints quality',
|
|
132
|
+
score: actionable.length === 0 ? 70 : Math.round((entriesWithMeaningfulHints / actionable.length) * 100),
|
|
127
133
|
weight: 0.6,
|
|
128
|
-
notes: [],
|
|
134
|
+
notes: hollow > 0 ? [`${hollow} entry(ies) lack a meaningful (non-templated) actionHint`] : [],
|
|
129
135
|
});
|
|
130
136
|
// Duplicate ids guard.
|
|
131
137
|
dims.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-project-config.d.ts","sourceRoot":"","sources":["../src/resolve-project-config.ts"],"names":[],"mappings":"AAuBA,OAAO,EAGL,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"resolve-project-config.d.ts","sourceRoot":"","sources":["../src/resolve-project-config.ts"],"names":[],"mappings":"AAuBA,OAAO,EAGL,KAAK,QAAQ,EAMb,KAAK,MAAM,EACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAG1B;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,YAAY;IAC1D;;;;;;OAMG;IACH,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAoHD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC,CAoEnD"}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
import { existsSync } from 'node:fs';
|
|
23
23
|
import * as nodePath from 'node:path';
|
|
24
24
|
import { importModuleViaLoader, ok, } from '@shrkcrft/core';
|
|
25
|
-
import { loadProjectConfig, PolicyRuleSchema, RegistryDeclarationSchema, ReusePrimitiveSchema, WiringRuleSchema, } from '@shrkcrft/config';
|
|
25
|
+
import { loadProjectConfig, PolicyRuleSchema, RegistrationIdiomSchema, RegistryDeclarationSchema, ReusePrimitiveSchema, WiringRuleSchema, } from '@shrkcrft/config';
|
|
26
26
|
import { discoverPacks } from '@shrkcrft/packs';
|
|
27
27
|
/**
|
|
28
28
|
* Generic per-plane load + validate + merge. Seeds the merged map from the
|
|
@@ -118,11 +118,19 @@ export async function resolveProjectConfig(cwd) {
|
|
|
118
118
|
}
|
|
119
119
|
const wiringRules = await mergePlane(base.config.wiringRules ?? [], gatherPackContribs(validPacks, 'wiringRuleFiles'), WiringRuleSchema, (r) => r.id, 'wiringRule', diagnostics);
|
|
120
120
|
const registries = await mergePlane(base.config.registries ?? [], gatherPackContribs(validPacks, 'registryFiles'), RegistryDeclarationSchema, (r) => r.name, 'registry', diagnostics);
|
|
121
|
+
const registrationGraph = await mergePlane(base.config.registrationGraph ?? [], gatherPackContribs(validPacks, 'registrationGraphFiles'), RegistrationIdiomSchema, (r) => r.name, 'registrationIdiom', diagnostics);
|
|
121
122
|
const policyRules = await mergePlane(base.config.policyRules ?? [], gatherPackContribs(validPacks, 'policyRuleFiles'), PolicyRuleSchema, (r) => r.id, 'policyRule', diagnostics);
|
|
122
123
|
const reusePrimitives = await mergePlane(base.config.reusePrimitives ?? [], gatherPackContribs(validPacks, 'reusePrimitiveFiles'), ReusePrimitiveSchema, (r) => r.symbol, 'reusePrimitive', diagnostics);
|
|
123
124
|
return ok({
|
|
124
125
|
...base,
|
|
125
|
-
config: {
|
|
126
|
+
config: {
|
|
127
|
+
...base.config,
|
|
128
|
+
wiringRules,
|
|
129
|
+
registries,
|
|
130
|
+
registrationGraph,
|
|
131
|
+
policyRules,
|
|
132
|
+
reusePrimitives,
|
|
133
|
+
},
|
|
126
134
|
planeDiagnostics: diagnostics,
|
|
127
135
|
});
|
|
128
136
|
}
|
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.24",
|
|
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.24",
|
|
46
|
+
"@shrkcrft/config": "^0.1.0-alpha.24",
|
|
47
|
+
"@shrkcrft/workspace": "^0.1.0-alpha.24",
|
|
48
|
+
"@shrkcrft/knowledge": "^0.1.0-alpha.24",
|
|
49
|
+
"@shrkcrft/rules": "^0.1.0-alpha.24",
|
|
50
|
+
"@shrkcrft/paths": "^0.1.0-alpha.24",
|
|
51
|
+
"@shrkcrft/templates": "^0.1.0-alpha.24",
|
|
52
|
+
"@shrkcrft/context": "^0.1.0-alpha.24",
|
|
53
|
+
"@shrkcrft/pipelines": "^0.1.0-alpha.24",
|
|
54
|
+
"@shrkcrft/packs": "^0.1.0-alpha.24",
|
|
55
|
+
"@shrkcrft/presets": "^0.1.0-alpha.24",
|
|
56
|
+
"@shrkcrft/boundaries": "^0.1.0-alpha.24",
|
|
57
|
+
"@shrkcrft/generator": "^0.1.0-alpha.24",
|
|
58
|
+
"@shrkcrft/importer": "^0.1.0-alpha.24",
|
|
59
|
+
"@shrkcrft/plugin-api": "^0.1.0-alpha.24",
|
|
60
|
+
"@shrkcrft/dashboard-api": "^0.1.0-alpha.24",
|
|
61
61
|
"typescript": "^5.6.0"
|
|
62
62
|
},
|
|
63
63
|
"publishConfig": {
|