@devflow-tools/cli 0.16.11 → 0.16.12
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/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +54 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/embeddings.d.ts +8 -0
- package/dist/commands/embeddings.d.ts.map +1 -0
- package/dist/commands/embeddings.js +26 -0
- package/dist/commands/embeddings.js.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin-files/dist/hooks/hook-daemon.js +32 -14
- package/dist/plugin-files/dist/hooks/memory-snapshot-cache.js +11 -0
- package/dist/plugin-files/dist/hooks/post-tool-use-failure.js +2 -2
- package/dist/plugin-files/dist/hooks/post-tool-use.js +6 -3
- package/dist/plugin-files/dist/hooks/pre-compact.js +2 -2
- package/dist/plugin-files/dist/hooks/pre-tool-use.js +2 -2
- package/dist/plugin-files/dist/hooks/session-end.js +2 -2
- package/dist/plugin-files/dist/hooks/stop.js +15 -2
- package/dist/plugin-files/dist/hooks/user-prompt-submit.js +14 -4
- package/dist/plugin-files/dist/skills/devflow:react/SKILL.md +8 -0
- package/dist/plugin-files/hooks/session-start +12 -15
- package/dist/plugin-files/skills/react/SKILL.md +8 -0
- package/package.json +27 -27
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DoctorReportV1 } from "@devflow-tools/sdk";
|
|
2
|
+
import type { EmbeddingModelStatus } from "@devflow-tools/memory-engine";
|
|
2
3
|
export type { DoctorMetric, DoctorReportV1, DoctorSection, DoctorSeverity, DoctorStatus, } from "@devflow-tools/sdk";
|
|
3
4
|
export type DoctorResult = DoctorReportV1;
|
|
4
5
|
export interface DoctorOptions {
|
|
@@ -31,6 +32,10 @@ export interface DoctorDependencies {
|
|
|
31
32
|
httpGet?: (url: string) => Promise<{
|
|
32
33
|
status: number;
|
|
33
34
|
}>;
|
|
35
|
+
inspectEmbeddingModel?: (options: {
|
|
36
|
+
homeDir?: string;
|
|
37
|
+
env?: NodeJS.ProcessEnv;
|
|
38
|
+
}) => Promise<EmbeddingModelStatus>;
|
|
34
39
|
}
|
|
35
40
|
export interface DoctorCommandIO {
|
|
36
41
|
stdout(output: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAEV,cAAc,EAIf,MAAM,oBAAoB,CAAC;AAM5B,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,YAAY,GACb,MAAM,oBAAoB,CAAC;AAoC5B,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACrC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,cAAc,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzC;AAED,UAAU,cAAc;IACtB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;IACtC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,CAAC;IAChD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -11,6 +11,7 @@ import { resolveActivePlugin, scanClaudeSkillShadowing } from "../lib/plugin-set
|
|
|
11
11
|
import { serverStatus } from "./server.js";
|
|
12
12
|
import { inspectSkillHealth } from "./skill-health.js";
|
|
13
13
|
import { getGlobalDevFlowDbPath } from "@devflow-tools/database";
|
|
14
|
+
import { inspectEmbeddingModel } from "@devflow-tools/memory-engine";
|
|
14
15
|
function getProjectHash(rootPath) {
|
|
15
16
|
return createHash("sha256").update(rootPath).digest("hex").slice(0, 16);
|
|
16
17
|
}
|
|
@@ -611,7 +612,7 @@ function rate(count, total) {
|
|
|
611
612
|
function coverage(total, vectors) {
|
|
612
613
|
return total === 0 ? 1 : vectors / total;
|
|
613
614
|
}
|
|
614
|
-
function checkVectors(project, dependencies) {
|
|
615
|
+
async function checkVectors(project, dependencies) {
|
|
615
616
|
const metrics = [];
|
|
616
617
|
let codegraphNodes = null;
|
|
617
618
|
let symbolVectors = null;
|
|
@@ -737,11 +738,18 @@ function checkVectors(project, dependencies) {
|
|
|
737
738
|
metrics.push({ key: "observation_vector_schema", value: "observations/embeddings missing", target: "Batch 2 vector schema", ok: false, severity: "warning" });
|
|
738
739
|
}
|
|
739
740
|
else {
|
|
740
|
-
const
|
|
741
|
+
const observationColumns = doctorTableColumns(db, "observations");
|
|
742
|
+
const hasEligibilityColumns = observationColumns.has("quality_status")
|
|
743
|
+
&& observationColumns.has("resolution_state");
|
|
744
|
+
const eligibilityClause = hasEligibilityColumns
|
|
745
|
+
? "WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'"
|
|
746
|
+
: "";
|
|
747
|
+
const observations = doctorCount(db, `SELECT COUNT(*) count FROM observations ${eligibilityClause}`);
|
|
741
748
|
const vectors = doctorCount(db, `
|
|
742
749
|
SELECT COUNT(DISTINCT e.source_id) count
|
|
743
750
|
FROM embeddings e JOIN observations o ON o.id = e.source_id
|
|
744
751
|
WHERE e.source_type = 'observation'
|
|
752
|
+
${hasEligibilityColumns ? "AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'" : ""}
|
|
745
753
|
`);
|
|
746
754
|
const missing = Math.max(0, observations - vectors);
|
|
747
755
|
metrics.push({ key: "observations", value: observations, ok: true, severity: "info" });
|
|
@@ -772,6 +780,49 @@ function checkVectors(project, dependencies) {
|
|
|
772
780
|
}
|
|
773
781
|
}
|
|
774
782
|
metrics.push({ key: "embedder_errors_24h", value: recentErrors, target: 0, ok: recentErrors === 0, severity: "warning" });
|
|
783
|
+
try {
|
|
784
|
+
const model = await (dependencies.inspectEmbeddingModel ?? inspectEmbeddingModel)({
|
|
785
|
+
homeDir: dependencies.homePath,
|
|
786
|
+
env: dependencies.env ?? process.env,
|
|
787
|
+
});
|
|
788
|
+
metrics.push({
|
|
789
|
+
key: "embedding_model_state",
|
|
790
|
+
value: {
|
|
791
|
+
state: model.state,
|
|
792
|
+
modelId: model.modelId,
|
|
793
|
+
revision: model.revision,
|
|
794
|
+
},
|
|
795
|
+
target: { state: "ready" },
|
|
796
|
+
ok: model.ready,
|
|
797
|
+
severity: "warning",
|
|
798
|
+
});
|
|
799
|
+
metrics.push({
|
|
800
|
+
key: "embedding_model_cache_root",
|
|
801
|
+
value: model.cacheRoot,
|
|
802
|
+
target: "stable shared DevFlow cache",
|
|
803
|
+
ok: true,
|
|
804
|
+
severity: "info",
|
|
805
|
+
});
|
|
806
|
+
metrics.push({
|
|
807
|
+
key: "embedding_model_integrity",
|
|
808
|
+
value: {
|
|
809
|
+
missingFiles: model.missingFiles,
|
|
810
|
+
corruptFiles: model.corruptFiles,
|
|
811
|
+
},
|
|
812
|
+
target: { missingFiles: [], corruptFiles: [] },
|
|
813
|
+
ok: model.missingFiles.length === 0 && model.corruptFiles.length === 0,
|
|
814
|
+
severity: "warning",
|
|
815
|
+
});
|
|
816
|
+
}
|
|
817
|
+
catch (error) {
|
|
818
|
+
metrics.push({
|
|
819
|
+
key: "embedding_model_inspection",
|
|
820
|
+
value: error.message,
|
|
821
|
+
target: "readable verified shared model cache",
|
|
822
|
+
ok: false,
|
|
823
|
+
severity: "warning",
|
|
824
|
+
});
|
|
825
|
+
}
|
|
775
826
|
return { name: "Vectors", status: sectionStatus(metrics), metrics };
|
|
776
827
|
}
|
|
777
828
|
function checkTelemetry(project, strict, dependencies) {
|
|
@@ -4567,7 +4618,7 @@ export async function runStructuredDoctor(options = {}, dependencies = {}) {
|
|
|
4567
4618
|
checkIsolation(requestedProject, dependencies),
|
|
4568
4619
|
checkDistill(canonical.path, dependencies),
|
|
4569
4620
|
checkLegacyPaths(canonical.path, dependencies),
|
|
4570
|
-
checkVectors(canonical.path, dependencies),
|
|
4621
|
+
await checkVectors(canonical.path, dependencies),
|
|
4571
4622
|
checkTelemetry(canonical.path, Boolean(options.strict), dependencies),
|
|
4572
4623
|
checkInjection(canonical.path, dependencies),
|
|
4573
4624
|
checkMemoryQuality(canonical.path, dependencies),
|