principles-disciple 1.72.0 → 1.74.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.
- package/INSTALL.md +1 -3
- package/openclaw.plugin.json +10 -5
- package/package.json +17 -19
- package/scripts/acceptance-test.mjs +16 -73
- package/scripts/sync-plugin.mjs +382 -77
- package/src/commands/archive-impl.ts +2 -1
- package/src/commands/capabilities.ts +2 -2
- package/src/commands/context.ts +2 -2
- package/src/commands/disable-impl.ts +2 -1
- package/src/commands/evolution-status.ts +16 -16
- package/src/commands/export.ts +12 -67
- package/src/commands/pain.ts +91 -1
- package/src/commands/principle-rollback.ts +2 -1
- package/src/commands/promote-impl.ts +7 -43
- package/src/commands/rollback-impl.ts +2 -1
- package/src/commands/rollback.ts +2 -1
- package/src/commands/samples.ts +2 -1
- package/src/commands/thinking-os.ts +2 -1
- package/src/config/errors.ts +18 -2
- package/src/constants/diagnostician.ts +2 -2
- package/src/constants/tools.ts +2 -1
- package/src/core/__tests__/focus-history.test.ts +210 -0
- package/src/core/config.ts +1 -1
- package/src/core/correction-cue-learner.ts +2 -136
- package/src/core/correction-types.ts +16 -88
- package/src/core/dictionary.ts +19 -20
- package/src/core/empathy-keyword-matcher.ts +17 -289
- package/src/core/empathy-types.ts +18 -229
- package/src/core/event-log.ts +29 -132
- package/src/core/evolution-reducer.ts +21 -2
- package/src/core/evolution-types.ts +76 -464
- package/src/core/file-store.ts +80 -0
- package/src/core/focus-history.ts +228 -955
- package/src/core/local-worker-routing.ts +34 -314
- package/src/core/merge-gate-audit.ts +0 -195
- package/src/core/migration.ts +0 -1
- package/src/core/pain-diagnostic-gate.ts +154 -0
- package/src/core/pain-signal.ts +21 -138
- package/src/core/pain.ts +15 -88
- package/src/core/path-resolver.ts +0 -1
- package/src/core/paths.ts +0 -1
- package/src/core/pd-task-reconciler.ts +26 -115
- package/src/core/pd-task-service.ts +9 -9
- package/src/core/pd-task-types.ts +23 -127
- package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
- package/src/core/principle-compiler/code-validator.ts +15 -42
- package/src/core/principle-compiler/compiler.ts +100 -15
- package/src/core/principle-compiler/index.ts +5 -2
- package/src/core/principle-compiler/template-generator.ts +4 -104
- package/src/core/principle-injection.ts +10 -202
- package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
- package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
- package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
- package/src/core/principle-tree-ledger-adapter.ts +145 -0
- package/src/core/principle-tree-ledger.ts +8 -6
- package/src/core/reflection/reflection-context.ts +14 -109
- package/src/core/replay-engine.ts +8 -500
- package/src/core/rule-host-helpers.ts +5 -35
- package/src/core/rule-host-types.ts +10 -82
- package/src/core/rule-host.ts +6 -63
- package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
- package/src/core/session-tracker.ts +87 -101
- package/src/core/shadow-observation-registry.ts +19 -48
- package/src/core/trajectory.ts +3 -1
- package/src/core/workflow-funnel-loader.ts +62 -68
- package/src/core/workspace-context.ts +46 -0
- package/src/core/workspace-dir-service.ts +1 -1
- package/src/core/workspace-dir-validation.ts +18 -9
- package/src/hooks/AGENTS.md +1 -1
- package/src/hooks/gate-block-helper.ts +71 -64
- package/src/hooks/gate.ts +183 -31
- package/src/hooks/lifecycle.ts +30 -32
- package/src/hooks/llm.ts +60 -32
- package/src/hooks/pain.ts +297 -103
- package/src/hooks/prompt.ts +400 -440
- package/src/hooks/subagent.ts +2 -29
- package/src/i18n/commands.ts +2 -10
- package/src/index.ts +95 -85
- package/src/openclaw-sdk.ts +311 -0
- package/src/service/central-database.ts +8 -4
- package/src/service/evolution-queue-migration.ts +2 -1
- package/src/service/evolution-worker.ts +163 -1786
- package/src/service/internalization-trigger-adapter.ts +302 -0
- package/src/service/keyword-optimization-service.ts +4 -4
- package/src/service/monitoring-query-service.ts +1 -215
- package/src/service/queue-io.ts +60 -331
- package/src/service/runtime-summary-service.ts +59 -16
- package/src/service/subagent-workflow/index.ts +0 -41
- package/src/service/subagent-workflow/types.ts +9 -120
- package/src/service/subagent-workflow/workflow-store.ts +2 -119
- package/src/service/workflow-watchdog.ts +0 -43
- package/src/types/event-payload.ts +16 -74
- package/src/types/event-types.ts +38 -547
- package/src/types/hygiene-types.ts +7 -30
- package/src/types/principle-tree-schema.ts +20 -222
- package/src/types/queue.ts +15 -70
- package/src/types/runtime-summary.ts +5 -49
- package/src/utils/io.ts +8 -20
- package/src/utils/retry.ts +1 -1
- package/src/utils/shadow-fingerprint.ts +2 -2
- package/src/utils/workspace-resolver.ts +50 -0
- package/templates/langs/en/core/AGENTS.md +7 -7
- package/templates/langs/en/core/BOOT.md +1 -1
- package/templates/langs/en/core/HEARTBEAT.md +2 -2
- package/templates/langs/en/principles/THINKING_OS.md +3 -2
- package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
- package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
- package/templates/langs/en/skills/evolve-task/SKILL.md +3 -3
- package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
- package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
- package/templates/langs/en/skills/pd-mentor/SKILL.md +2 -3
- package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
- package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
- package/templates/langs/zh/core/AGENTS.md +7 -7
- package/templates/langs/zh/core/BOOT.md +1 -1
- package/templates/langs/zh/core/HEARTBEAT.md +2 -2
- package/templates/langs/zh/principles/THINKING_OS.md +3 -2
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
- package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
- package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
- package/templates/langs/zh/skills/evolve-task/SKILL.md +4 -4
- package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
- package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
- package/templates/langs/zh/skills/pd-mentor/SKILL.md +2 -3
- package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
- package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
- package/tests/build-artifacts.test.ts +1 -3
- package/tests/commands/evolution-status.test.ts +0 -118
- package/tests/core/bootstrap-rules.test.ts +1 -1
- package/tests/core/config.test.ts +1 -1
- package/tests/core/event-log.test.ts +35 -0
- package/tests/core/evolution-engine.test.ts +610 -0
- package/tests/core/file-store.test.ts +102 -0
- package/tests/core/focus-history.test.ts +203 -11
- package/tests/core/merge-gate-audit.test.ts +2 -169
- package/tests/core/migration.test.ts +7 -7
- package/tests/core/model-deployment-registry.test.ts +7 -1
- package/tests/core/model-training-registry.test.ts +19 -0
- package/tests/core/observability.test.ts +0 -1
- package/tests/core/pain-diagnostic-gate.test.ts +498 -0
- package/tests/core/pain.test.ts +0 -1
- package/tests/core/path-resolver.test.ts +1 -1
- package/tests/core/paths-refactor.test.ts +0 -22
- package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
- package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
- package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
- package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
- package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
- package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
- package/tests/core/reflection-context.test.ts +0 -14
- package/tests/core/replay-engine.test.ts +127 -215
- package/tests/core/rule-host-helpers.test.ts +2 -2
- package/tests/core/rule-implementation-runtime.test.ts +0 -27
- package/tests/core/workflow-funnel-loader.test.ts +162 -0
- package/tests/core/workspace-context.test.ts +2 -2
- package/tests/core/workspace-dir-validation.test.ts +8 -1
- package/tests/core-anti-growth.test.ts +191 -0
- package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
- package/tests/hooks/confirm-first-removal.test.ts +188 -0
- package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
- package/tests/hooks/gate-auto-correct.test.ts +665 -0
- package/tests/hooks/gate-no-path-write-tool.test.ts +172 -0
- package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
- package/tests/hooks/pain.test.ts +269 -12
- package/tests/hooks/prompt-characterization.test.ts +500 -0
- package/tests/hooks/prompt-size-guard.test.ts +32 -17
- package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
- package/tests/index.test.ts +94 -1
- package/tests/integration/auto-entry-gate.test.ts +248 -0
- package/tests/integration/internalization-trigger-guard.test.ts +69 -0
- package/tests/integration/m8-legacy-paths.test.ts +63 -0
- package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
- package/tests/plugin-config-resolution-cutover.test.ts +359 -0
- package/tests/runtime-v2-discovery-guard.test.ts +154 -0
- package/tests/service/central-database.test.ts +457 -0
- package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
- package/tests/service/evolution-worker.timeout.test.ts +11 -129
- package/tests/service/internalization-trigger-adapter.test.ts +251 -0
- package/tests/service/monitoring-query-service.test.ts +1 -47
- package/tests/service/queue-io.test.ts +1 -62
- package/tests/service/runtime-summary-service.test.ts +3 -1
- package/tests/service/workflow-watchdog.test.ts +0 -91
- package/tests/utils/file-lock.test.ts +5 -3
- package/tests/utils/session-key.test.ts +52 -0
- package/tests/utils/subagent-probe.test.ts +48 -1
- package/vitest.config.ts +4 -11
- package/.planning/codebase/ARCHITECTURE.md +0 -157
- package/.planning/codebase/CONCERNS.md +0 -145
- package/.planning/codebase/CONVENTIONS.md +0 -148
- package/.planning/codebase/INTEGRATIONS.md +0 -81
- package/.planning/codebase/STACK.md +0 -87
- package/.planning/codebase/STRUCTURE.md +0 -193
- package/.planning/codebase/TESTING.md +0 -243
- package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
- package/docs/COMMAND_REFERENCE.md +0 -76
- package/docs/COMMAND_REFERENCE_EN.md +0 -79
- package/scripts/build-web.mjs +0 -46
- package/scripts/diagnose-nocturnal.mjs +0 -537
- package/scripts/seed-nocturnal-scenarios.mjs +0 -384
- package/src/commands/nocturnal-review.ts +0 -322
- package/src/commands/nocturnal-rollout.ts +0 -790
- package/src/commands/nocturnal-train.ts +0 -986
- package/src/commands/pd-reflect.ts +0 -88
- package/src/core/adaptive-thresholds.ts +0 -478
- package/src/core/diagnostician-task-store.ts +0 -192
- package/src/core/nocturnal-arbiter.ts +0 -715
- package/src/core/nocturnal-artifact-lineage.ts +0 -116
- package/src/core/nocturnal-artificer.ts +0 -257
- package/src/core/nocturnal-candidate-scoring.ts +0 -530
- package/src/core/nocturnal-compliance.ts +0 -1146
- package/src/core/nocturnal-dataset.ts +0 -763
- package/src/core/nocturnal-executability.ts +0 -428
- package/src/core/nocturnal-export.ts +0 -499
- package/src/core/nocturnal-paths.ts +0 -240
- package/src/core/nocturnal-reasoning-deriver.ts +0 -343
- package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
- package/src/core/nocturnal-snapshot-contract.ts +0 -99
- package/src/core/nocturnal-trajectory-extractor.ts +0 -512
- package/src/core/nocturnal-trinity-types.ts +0 -218
- package/src/core/nocturnal-trinity.ts +0 -2680
- package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
- package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
- package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
- package/src/http/principles-console-route.ts +0 -709
- package/src/service/central-health-service.ts +0 -49
- package/src/service/central-overview-service.ts +0 -138
- package/src/service/control-ui-query-service.ts +0 -900
- package/src/service/cooldown-strategy.ts +0 -97
- package/src/service/evolution-pain-context.ts +0 -79
- package/src/service/evolution-query-service.ts +0 -407
- package/src/service/health-query-service.ts +0 -1038
- package/src/service/nocturnal-config.ts +0 -214
- package/src/service/nocturnal-runtime.ts +0 -734
- package/src/service/nocturnal-service.ts +0 -1605
- package/src/service/nocturnal-target-selector.ts +0 -545
- package/src/service/sleep-cycle.ts +0 -157
- package/src/service/startup-reconciler.ts +0 -112
- package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
- package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
- package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
- package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
- package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
- package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
- package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
- package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
- package/src/tools/write-pain-flag.ts +0 -215
- package/templates/langs/en/skills/plan-script/SKILL.md +0 -32
- package/templates/langs/zh/skills/plan-script/SKILL.md +0 -32
- package/tests/commands/nocturnal-review.test.ts +0 -448
- package/tests/commands/nocturnal-train.test.ts +0 -97
- package/tests/commands/pd-reflect.test.ts +0 -49
- package/tests/core/adaptive-thresholds.test.ts +0 -261
- package/tests/core/nocturnal-arbiter.test.ts +0 -559
- package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
- package/tests/core/nocturnal-artificer.test.ts +0 -241
- package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
- package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
- package/tests/core/nocturnal-compliance.test.ts +0 -646
- package/tests/core/nocturnal-dataset.test.ts +0 -892
- package/tests/core/nocturnal-e2e.test.ts +0 -234
- package/tests/core/nocturnal-executability.test.ts +0 -357
- package/tests/core/nocturnal-export.test.ts +0 -517
- package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
- package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
- package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
- package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
- package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
- package/tests/core/nocturnal-trinity.test.ts +0 -2053
- package/tests/core/pain-auto-repair.test.ts +0 -96
- package/tests/core/pain-integration.test.ts +0 -510
- package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
- package/tests/http/principles-console-route.test.ts +0 -162
- package/tests/integration/chaos-resilience.test.ts +0 -348
- package/tests/integration/empathy-workflow-integration.test.ts +0 -626
- package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
- package/tests/service/control-ui-query-service.test.ts +0 -121
- package/tests/service/cooldown-strategy.test.ts +0 -164
- package/tests/service/data-endpoints-regression.test.ts +0 -834
- package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
- package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
- package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
- package/tests/service/nocturnal-runtime.test.ts +0 -473
- package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
- package/tests/service/nocturnal-target-selector.test.ts +0 -615
- package/tests/service/startup-reconciler.test.ts +0 -148
- package/tests/tools/write-pain-flag.test.ts +0 -358
- package/ui/src/App.tsx +0 -45
- package/ui/src/api.ts +0 -220
- package/ui/src/charts.tsx +0 -955
- package/ui/src/components/ErrorState.tsx +0 -6
- package/ui/src/components/Loading.tsx +0 -13
- package/ui/src/components/ProtectedRoute.tsx +0 -12
- package/ui/src/components/Shell.tsx +0 -91
- package/ui/src/components/WorkspaceConfig.tsx +0 -178
- package/ui/src/components/index.ts +0 -5
- package/ui/src/context/auth.tsx +0 -80
- package/ui/src/context/theme.tsx +0 -66
- package/ui/src/hooks/useAutoRefresh.ts +0 -39
- package/ui/src/i18n/ui.ts +0 -473
- package/ui/src/main.tsx +0 -16
- package/ui/src/pages/EvolutionPage.tsx +0 -333
- package/ui/src/pages/FeedbackPage.tsx +0 -138
- package/ui/src/pages/GateMonitorPage.tsx +0 -136
- package/ui/src/pages/LoginPage.tsx +0 -89
- package/ui/src/pages/OverviewPage.tsx +0 -599
- package/ui/src/pages/SamplesPage.tsx +0 -174
- package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
- package/ui/src/styles.css +0 -2020
- package/ui/src/types.ts +0 -384
- package/ui/src/utils/format.ts +0 -15
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
|
|
5
|
+
// ── PRI-212: Plugin core anti-growth architecture guard ─────────────────────
|
|
6
|
+
//
|
|
7
|
+
// Prevents new unclassified files from being added to packages/openclaw-plugin/src/core/
|
|
8
|
+
// without explicit allowlisting. New pure domain logic MUST go to @principles/core.
|
|
9
|
+
//
|
|
10
|
+
// Baseline from PRI-211 inventory (2026-05-21).
|
|
11
|
+
// Reference: docs/reviews/plugin-core-inventory-2026-05.md
|
|
12
|
+
//
|
|
13
|
+
// How to add a new file:
|
|
14
|
+
// 1. Is it pure domain logic? → add to @principles/core, NOT here
|
|
15
|
+
// 2. Is it a plugin I/O adapter/binding? → add to PLUGIN_IO_FILES
|
|
16
|
+
// with a comment explaining why it belongs in plugin core
|
|
17
|
+
// 3. NEVER add to/from FROZEN_LEGACY (ADR-0005) — those must NOT be modified
|
|
18
|
+
|
|
19
|
+
describe('PRI-212 plugin core anti-growth guard', () => {
|
|
20
|
+
// Category 1: Frozen Legacy (ADR-0005) — deleted in PRI-230
|
|
21
|
+
const FROZEN_LEGACY = [
|
|
22
|
+
] as const;
|
|
23
|
+
|
|
24
|
+
// Category 2: Pure domain logic with zero I/O imports — should migrate to @principles/core
|
|
25
|
+
const ZERO_IMPORT_CANDIDATES = [
|
|
26
|
+
'trajectory-types.ts',
|
|
27
|
+
'profile.ts',
|
|
28
|
+
'pain-signal.ts',
|
|
29
|
+
'pd-task-types.ts',
|
|
30
|
+
'evolution-types.ts',
|
|
31
|
+
'telemetry-event.ts',
|
|
32
|
+
'empathy-types.ts',
|
|
33
|
+
'correction-types.ts',
|
|
34
|
+
'principle-injection.ts',
|
|
35
|
+
'principle-compiler/template-generator.ts',
|
|
36
|
+
] as const;
|
|
37
|
+
|
|
38
|
+
// Categories 3-5: Plugin I/O adapters, Do Not Move, I/O boundary
|
|
39
|
+
const PLUGIN_IO_FILES = [
|
|
40
|
+
// Thin adapter candidates
|
|
41
|
+
'local-worker-routing.ts',
|
|
42
|
+
'principle-tree-migration.ts',
|
|
43
|
+
'principle-internalization/principle-lifecycle-service.ts',
|
|
44
|
+
'principle-tree-ledger-adapter.ts',
|
|
45
|
+
'principle-compiler/ledger-registrar.ts',
|
|
46
|
+
'principle-compiler/code-validator.ts',
|
|
47
|
+
'principle-injector.ts',
|
|
48
|
+
'pd-task-service.ts',
|
|
49
|
+
'principle-internalization/lifecycle-read-model.ts',
|
|
50
|
+
'principle-internalization/filesystem-lifecycle-datasource.ts',
|
|
51
|
+
'config-service.ts',
|
|
52
|
+
'principle-compiler/index.ts',
|
|
53
|
+
'principle-internalization/lifecycle-refresh.ts',
|
|
54
|
+
// Do Not Move
|
|
55
|
+
'event-log.ts',
|
|
56
|
+
'schema/schema-definitions.ts',
|
|
57
|
+
'path-resolver.ts',
|
|
58
|
+
'init.ts',
|
|
59
|
+
'workspace-context.ts',
|
|
60
|
+
'reflection/reflection-context.ts',
|
|
61
|
+
'bootstrap-rules.ts',
|
|
62
|
+
'schema/migration-runner.ts',
|
|
63
|
+
'rule-host.ts',
|
|
64
|
+
'principle-training-state.ts',
|
|
65
|
+
'pain-diagnostic-gate.ts',
|
|
66
|
+
'hygiene/tracker.ts',
|
|
67
|
+
'schema/migrations/002-init-central.ts',
|
|
68
|
+
'workspace-dir-service.ts',
|
|
69
|
+
'paths.ts',
|
|
70
|
+
'schema/migrations/004-add-thinking-and-gfi.ts',
|
|
71
|
+
'evolution-hook.ts',
|
|
72
|
+
'storage-adapter.ts',
|
|
73
|
+
'schema/migrations/003-init-workflow.ts',
|
|
74
|
+
'workspace-dir-validation.ts',
|
|
75
|
+
'pain-signal-adapter.ts',
|
|
76
|
+
'rule-implementation-runtime.ts',
|
|
77
|
+
'detection-service.ts',
|
|
78
|
+
'schema/migrations/index.ts',
|
|
79
|
+
'dictionary-service.ts',
|
|
80
|
+
'schema/index.ts',
|
|
81
|
+
'schema/db-types.ts',
|
|
82
|
+
'rule-host-types.ts',
|
|
83
|
+
'rule-host-helpers.ts',
|
|
84
|
+
'schema/migrations/001-init-trajectory.ts',
|
|
85
|
+
// I/O boundary
|
|
86
|
+
'trajectory.ts',
|
|
87
|
+
'evolution-reducer.ts',
|
|
88
|
+
'promotion-gate.ts',
|
|
89
|
+
'model-training-registry.ts',
|
|
90
|
+
'focus-history.ts',
|
|
91
|
+
'model-deployment-registry.ts',
|
|
92
|
+
'training-program.ts',
|
|
93
|
+
'replay-engine.ts',
|
|
94
|
+
'external-training-contract.ts',
|
|
95
|
+
'merge-gate-audit.ts',
|
|
96
|
+
'shadow-observation-registry.ts',
|
|
97
|
+
'control-ui-db.ts',
|
|
98
|
+
'thinking-models.ts',
|
|
99
|
+
'pd-task-reconciler.ts',
|
|
100
|
+
'correction-cue-learner.ts',
|
|
101
|
+
'principle-compiler/compiler.ts',
|
|
102
|
+
'pain.ts',
|
|
103
|
+
'pain-context-extractor.ts',
|
|
104
|
+
'config.ts',
|
|
105
|
+
'code-implementation-storage.ts',
|
|
106
|
+
'observability.ts',
|
|
107
|
+
'file-storage-adapter.ts',
|
|
108
|
+
'workflow-funnel-loader.ts',
|
|
109
|
+
'dictionary.ts',
|
|
110
|
+
'thinking-os-parser.ts',
|
|
111
|
+
'system-logger.ts',
|
|
112
|
+
'detection-funnel.ts',
|
|
113
|
+
'risk-calculator.ts',
|
|
114
|
+
'migration.ts',
|
|
115
|
+
'file-store.ts',
|
|
116
|
+
'pd-task-store.ts',
|
|
117
|
+
'evolution-migration.ts',
|
|
118
|
+
'empathy-keyword-matcher.ts',
|
|
119
|
+
'pain-lifecycle.ts',
|
|
120
|
+
'session-tracker.ts',
|
|
121
|
+
'principle-tree-ledger.ts',
|
|
122
|
+
'evolution-logger.ts',
|
|
123
|
+
'evolution-engine.ts',
|
|
124
|
+
'runtime-v2-prompt-activation-reader.ts',
|
|
125
|
+
] as const;
|
|
126
|
+
|
|
127
|
+
// Category 6: Test files
|
|
128
|
+
const KNOWN_TEST_FILES = [
|
|
129
|
+
'__tests__/focus-history.test.ts',
|
|
130
|
+
'principle-compiler/__tests__/compiler-replay-gate.test.ts',
|
|
131
|
+
] as const;
|
|
132
|
+
|
|
133
|
+
const ALL_KNOWN = [
|
|
134
|
+
...FROZEN_LEGACY,
|
|
135
|
+
...ZERO_IMPORT_CANDIDATES,
|
|
136
|
+
...PLUGIN_IO_FILES,
|
|
137
|
+
...KNOWN_TEST_FILES,
|
|
138
|
+
];
|
|
139
|
+
|
|
140
|
+
function enumerateFiles(dir: string, prefix = ''): string[] {
|
|
141
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
142
|
+
const files: string[] = [];
|
|
143
|
+
for (const entry of entries) {
|
|
144
|
+
const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
145
|
+
const fullPath = path.resolve(dir, entry.name);
|
|
146
|
+
if (entry.isDirectory()) {
|
|
147
|
+
files.push(...enumerateFiles(fullPath, relPath));
|
|
148
|
+
} else if (entry.name.endsWith('.ts')) {
|
|
149
|
+
files.push(relPath.replace(/\\/g, '/'));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return files;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
it('no new unclassified files in plugin core', () => {
|
|
156
|
+
const coreDir = path.resolve(__dirname, '../src/core');
|
|
157
|
+
const actualFiles = enumerateFiles(coreDir).sort();
|
|
158
|
+
const expectedFiles = [...ALL_KNOWN].sort();
|
|
159
|
+
|
|
160
|
+
const actualSet = new Set(actualFiles);
|
|
161
|
+
const knownSet = new Set(expectedFiles);
|
|
162
|
+
|
|
163
|
+
const unknownFiles = actualFiles.filter((f) => !knownSet.has(f));
|
|
164
|
+
const missingFiles = expectedFiles.filter((f) => !actualSet.has(f));
|
|
165
|
+
|
|
166
|
+
expect(unknownFiles, [
|
|
167
|
+
`\nUnclassified files detected in packages/openclaw-plugin/src/core/:`,
|
|
168
|
+
...unknownFiles.map((f) => ` + ${f}`),
|
|
169
|
+
``,
|
|
170
|
+
`New pure domain logic MUST go to @principles/core (packages/principles-core/).`,
|
|
171
|
+
`Plugin I/O adapter additions must be explicitly allowlisted in`,
|
|
172
|
+
`packages/openclaw-plugin/tests/core-anti-growth.test.ts`,
|
|
173
|
+
`ADR-0005 frozen files must NOT be modified.`,
|
|
174
|
+
`Reference: docs/reviews/plugin-core-inventory-2026-05.md (PRI-211)`,
|
|
175
|
+
].join('\n')).toEqual([]);
|
|
176
|
+
|
|
177
|
+
expect(missingFiles, [
|
|
178
|
+
`\nBaseline files missing from packages/openclaw-plugin/src/core/:`,
|
|
179
|
+
...missingFiles.map((f) => ` - ${f}`),
|
|
180
|
+
``,
|
|
181
|
+
`Missing baseline files may indicate:`,
|
|
182
|
+
` - File was moved or deleted (update inventory if intentional)`,
|
|
183
|
+
` - Stale-main rollback (ERR-012): rebase on latest origin/main`,
|
|
184
|
+
` - File was renamed (update inventory with new name)`,
|
|
185
|
+
].join('\n')).toEqual([]);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('zero-import candidates are tracked for migration awareness', () => {
|
|
189
|
+
expect(ZERO_IMPORT_CANDIDATES.length).toBeGreaterThan(0);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
|
|
5
|
+
const INDEX_TS = fs.readFileSync(
|
|
6
|
+
path.resolve(__dirname, '../src/index.ts'),
|
|
7
|
+
'utf-8',
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
describe('Hook workspace resolution NextAction contract', () => {
|
|
11
|
+
const FORBIDDEN_NEXT_ACTION_PATTERNS = [
|
|
12
|
+
/PD_WORKSPACE_DIR/,
|
|
13
|
+
/principles-disciple\.json/,
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
it('does not claim PD_WORKSPACE_DIR env var as recovery in NextAction', () => {
|
|
17
|
+
const matches = INDEX_TS.match(/NextAction:[^`]*PD_WORKSPACE_DIR/g);
|
|
18
|
+
expect(matches).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('does not claim principles-disciple.json as recovery in NextAction', () => {
|
|
22
|
+
const matches = INDEX_TS.match(/NextAction:[^`]*principles-disciple\.json/g);
|
|
23
|
+
expect(matches).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('all hook failure NextActions reference canonical workspace migration', () => {
|
|
27
|
+
const nextActionLines = INDEX_TS.match(/NextAction: \${HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION}/g);
|
|
28
|
+
expect(nextActionLines).not.toBeNull();
|
|
29
|
+
expect(nextActionLines!.length).toBeGreaterThanOrEqual(7);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION constant exists and does not contain forbidden patterns', () => {
|
|
33
|
+
const constantMatch = INDEX_TS.match(
|
|
34
|
+
/const HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION\s*=\s*'([^']+)'/,
|
|
35
|
+
);
|
|
36
|
+
expect(constantMatch).not.toBeNull();
|
|
37
|
+
const constantValue = constantMatch![1];
|
|
38
|
+
for (const pattern of FORBIDDEN_NEXT_ACTION_PATTERNS) {
|
|
39
|
+
expect(pattern.test(constantValue)).toBe(false);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRI-286: Verify confirm-first gate has been fully removed from live paths.
|
|
3
|
+
*
|
|
4
|
+
* These tests prove that:
|
|
5
|
+
* 1. The confirm-first-gate module no longer exists as an importable live module
|
|
6
|
+
* 2. gate.ts does not call any confirm-first function
|
|
7
|
+
* 3. prompt.ts does not import any confirm-first function
|
|
8
|
+
* 4. gate-block-helper does not output confirm-first specific block messages
|
|
9
|
+
* 5. confirm_first_gate does not appear in DEFAULT_FEATURE_FLAGS
|
|
10
|
+
* 6. Default PD installation does not block mutating tools due to PLAN.md absence
|
|
11
|
+
* 7. PLAN.md is not a canonical PD path (paths.ts, path-resolver.ts, env.ts, migration.ts)
|
|
12
|
+
* 8. confirm-first event types and state store are fully deleted
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { describe, it, expect } from 'vitest';
|
|
16
|
+
import fs from 'fs';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
|
|
19
|
+
// __dirname = packages/openclaw-plugin/tests/hooks → go up 4 to monorepo root
|
|
20
|
+
// (hooks → tests → openclaw-plugin → packages → monorepo-root)
|
|
21
|
+
const ROOT = path.resolve(__dirname, '..', '..', '..', '..');
|
|
22
|
+
|
|
23
|
+
describe('PRI-286: Confirm-first gate removal verification', () => {
|
|
24
|
+
it('confirm-first-gate.ts source file has been deleted', () => {
|
|
25
|
+
const gatePath = path.join(ROOT, 'packages/openclaw-plugin/src/core/confirm-first-gate.ts');
|
|
26
|
+
expect(fs.existsSync(gatePath)).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('gate.ts does not import from confirm-first-gate', async () => {
|
|
30
|
+
const gateSource = fs.readFileSync(
|
|
31
|
+
path.join(ROOT, 'packages/openclaw-plugin/src/hooks/gate.ts'),
|
|
32
|
+
'utf8',
|
|
33
|
+
);
|
|
34
|
+
expect(gateSource).not.toContain('confirm-first-gate');
|
|
35
|
+
expect(gateSource).not.toContain('evaluateConfirmFirstGateSync');
|
|
36
|
+
expect(gateSource).not.toContain('confirm-first');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('prompt.ts does not import from confirm-first-gate', async () => {
|
|
40
|
+
const promptSource = fs.readFileSync(
|
|
41
|
+
path.join(ROOT, 'packages/openclaw-plugin/src/hooks/prompt.ts'),
|
|
42
|
+
'utf8',
|
|
43
|
+
);
|
|
44
|
+
expect(promptSource).not.toContain('confirm-first-gate');
|
|
45
|
+
expect(promptSource).not.toContain('detectApprovalMarker');
|
|
46
|
+
expect(promptSource).not.toContain('setConfirmFirstDirective');
|
|
47
|
+
expect(promptSource).not.toContain('setConfirmFirstApproval');
|
|
48
|
+
expect(promptSource).not.toContain('hydrateFromStore');
|
|
49
|
+
expect(promptSource).not.toContain('pruneStoreStaleRows');
|
|
50
|
+
expect(promptSource).not.toContain('setConfirmFirstStore');
|
|
51
|
+
expect(promptSource).not.toContain('resetConfirmFirst');
|
|
52
|
+
expect(promptSource).not.toContain('setConfirmFirstGateEnabled');
|
|
53
|
+
expect(promptSource).not.toContain('SqliteConfirmFirstStateStore');
|
|
54
|
+
expect(promptSource).not.toContain('confirm_first_gate');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('gate-block-helper does not have confirm-first specific branch', () => {
|
|
58
|
+
const helperSource = fs.readFileSync(
|
|
59
|
+
path.join(ROOT, 'packages/openclaw-plugin/src/hooks/gate-block-helper.ts'),
|
|
60
|
+
'utf8',
|
|
61
|
+
);
|
|
62
|
+
expect(helperSource).not.toContain('confirm-first-gate');
|
|
63
|
+
expect(helperSource).not.toContain('Confirm-First Gate Blocked');
|
|
64
|
+
expect(helperSource).not.toContain('confirm-first behavioral directive');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('confirm_first_gate is not in DEFAULT_FEATURE_FLAGS', async () => {
|
|
68
|
+
const { DEFAULT_FEATURE_FLAGS } = await import('@principles/core/runtime-v2');
|
|
69
|
+
const ids = DEFAULT_FEATURE_FLAGS.map((f: { id: string }) => f.id);
|
|
70
|
+
expect(ids).not.toContain('confirm_first_gate');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('no PLAN.md physical interception language in AGENTS.md templates', () => {
|
|
74
|
+
const templateDirs = [
|
|
75
|
+
path.join(ROOT, 'packages/openclaw-plugin/templates'),
|
|
76
|
+
path.join(ROOT, 'packages/create-principles-disciple/templates'),
|
|
77
|
+
path.join(ROOT, 'packages/create-principles-disciple/plugin/templates'),
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
for (const dir of templateDirs) {
|
|
81
|
+
if (!fs.existsSync(dir)) continue;
|
|
82
|
+
const agentsFiles = findFiles(dir, 'AGENTS.md');
|
|
83
|
+
for (const file of agentsFiles) {
|
|
84
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
85
|
+
// Must NOT contain physical interception language
|
|
86
|
+
expect(content, `${file} should not contain physical interception`).not.toContain('Physical interception');
|
|
87
|
+
expect(content, `${file} should not contain 物理拦截`).not.toContain('物理拦截');
|
|
88
|
+
expect(content, `${file} should not contain Single source of truth.*PLAN`).not.toMatch(/Single source of truth.*PLAN/i);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('no mandatory PLAN.md STATUS:READY in THINKING_OS templates', () => {
|
|
94
|
+
const templateDirs = [
|
|
95
|
+
path.join(ROOT, 'packages/openclaw-plugin/templates'),
|
|
96
|
+
path.join(ROOT, 'packages/create-principles-disciple/templates'),
|
|
97
|
+
path.join(ROOT, 'packages/create-principles-disciple/plugin/templates'),
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
for (const dir of templateDirs) {
|
|
101
|
+
if (!fs.existsSync(dir)) continue;
|
|
102
|
+
const thinkingFiles = findFiles(dir, 'THINKING_OS.md');
|
|
103
|
+
for (const file of thinkingFiles) {
|
|
104
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
105
|
+
expect(content, `${file} should not require PLAN.md status: READY`).not.toContain('PLAN.md` (status: READY)');
|
|
106
|
+
expect(content, `${file} should not require PLAN.md(状态:READY)`).not.toContain('PLAN.md`(状态:READY)');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// ── Round 2: Canonical PLAN.md path removal ──
|
|
112
|
+
|
|
113
|
+
it('paths.ts does not contain PLAN: entry', () => {
|
|
114
|
+
const source = fs.readFileSync(
|
|
115
|
+
path.join(ROOT, 'packages/openclaw-plugin/src/core/paths.ts'),
|
|
116
|
+
'utf8',
|
|
117
|
+
);
|
|
118
|
+
expect(source).not.toMatch(/PLAN:\s*'PLAN\.md'/);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('path-resolver.ts does not contain PLAN key', () => {
|
|
122
|
+
const source = fs.readFileSync(
|
|
123
|
+
path.join(ROOT, 'packages/openclaw-plugin/src/core/path-resolver.ts'),
|
|
124
|
+
'utf8',
|
|
125
|
+
);
|
|
126
|
+
expect(source).not.toContain("'PLAN':");
|
|
127
|
+
expect(source).not.toContain('"PLAN":');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('env.ts CORE_FILES does not contain PLAN.md', () => {
|
|
131
|
+
const source = fs.readFileSync(
|
|
132
|
+
path.join(ROOT, 'packages/create-principles-disciple/src/utils/env.ts'),
|
|
133
|
+
'utf8',
|
|
134
|
+
);
|
|
135
|
+
// Match 'PLAN.md' inside the CORE_FILES array — should not exist
|
|
136
|
+
expect(source).not.toMatch(/CORE_FILES\s*=\s*\[[\s\S]*?'PLAN\.md'/);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('migration.ts does not migrate docs/PLAN.md', () => {
|
|
140
|
+
const source = fs.readFileSync(
|
|
141
|
+
path.join(ROOT, 'packages/openclaw-plugin/src/core/migration.ts'),
|
|
142
|
+
'utf8',
|
|
143
|
+
);
|
|
144
|
+
expect(source).not.toContain("'PLAN.md'");
|
|
145
|
+
expect(source).not.toContain("newKey: 'PLAN'");
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// ── Round 2: Event type and state store full deletion ──
|
|
149
|
+
|
|
150
|
+
it('event-types.ts does not contain runtime_v2_confirm_first_gate', () => {
|
|
151
|
+
const source = fs.readFileSync(
|
|
152
|
+
path.join(ROOT, 'packages/principles-core/src/runtime-v2/types/event-types.ts'),
|
|
153
|
+
'utf8',
|
|
154
|
+
);
|
|
155
|
+
expect(source).not.toContain('runtime_v2_confirm_first_gate');
|
|
156
|
+
expect(source).not.toContain('RuntimeV2ConfirmFirstGate');
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('confirm-first state store source has been deleted', () => {
|
|
160
|
+
const storePath = path.join(
|
|
161
|
+
ROOT, 'packages/principles-core/src/runtime-v2/activation/sqlite-confirm-first-state-store.ts',
|
|
162
|
+
);
|
|
163
|
+
expect(fs.existsSync(storePath)).toBe(false);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('confirm-first state store test has been deleted', () => {
|
|
167
|
+
const testPath = path.join(
|
|
168
|
+
ROOT, 'packages/principles-core/src/runtime-v2/__tests__/sqlite-confirm-first-state-store.test.ts',
|
|
169
|
+
);
|
|
170
|
+
expect(fs.existsSync(testPath)).toBe(false);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
function findFiles(dir: string, filename: string): string[] {
|
|
175
|
+
const results: string[] = [];
|
|
176
|
+
function walk(d: string): void {
|
|
177
|
+
for (const entry of fs.readdirSync(d, { withFileTypes: true })) {
|
|
178
|
+
const full = path.join(d, entry.name);
|
|
179
|
+
if (entry.isDirectory()) {
|
|
180
|
+
walk(full);
|
|
181
|
+
} else if (entry.name === filename) {
|
|
182
|
+
results.push(full);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
walk(dir);
|
|
187
|
+
return results;
|
|
188
|
+
}
|