@tea-agent/loop-agent 0.35.1-beta.0 → 0.35.1-beta.2
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/AGENTS.md +110 -108
- package/CHANGELOG.md +24 -26
- package/README.md +165 -165
- package/bin/agent-worker.js +0 -0
- package/bin/loop-agent.js +57 -21
- package/dist/application/task-lifecycle/advance.js +0 -1
- package/dist/build-stamp.json +6 -0
- package/dist/cli/program.js +2 -2
- package/dist/commands/cursor-prompt.js +6 -6
- package/dist/commands/init-upgrade.js +19 -351
- package/dist/commands/init.js +67 -14
- package/dist/commands/loop-benchmark.js +11 -11
- package/dist/commands/pi-reuse-benchmark.js +16 -16
- package/dist/commands/run-dag-progress.js +0 -14
- package/dist/commands/task-advance.js +3 -33
- package/dist/executors/dag-pi-executor.js +44 -0
- package/dist/shared/operator/capabilities.js +1 -38
- package/dist/shared/package-metadata.js +42 -0
- package/dist/sidecars/cursor-prompt/executor.js +1 -1
- package/dist/worker/console/chat/pi-runtime.js +25 -41
- package/dist/worker/console/chat/routes.js +4 -27
- package/dist/worker/console/operation-runner.js +0 -24
- package/dist/worker/console/operator-actions.js +0 -58
- package/dist/worker/console/static/assets/index-CvsQgALl.js +56 -0
- package/dist/worker/console/static/assets/{index-Dups4sSM.css → index-hJqCPs_g.css} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/app/useRecoveryConsole.js +5 -0
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +2 -13
- package/dist/worker/console/static-src/operator-chat/useComposer.js +7 -30
- package/dist/worker/loop-agent/loop-agent-client.js +17 -3
- package/dist/worker/observability/read-model.js +20 -0
- package/dist/worker/observe/static/copy.js +67 -67
- package/dist/worker/observe/static/dag-layout.d.ts +36 -36
- package/dist/worker/observe/static/dom.js +220 -220
- package/dist/worker/observe/static/relations.js +133 -133
- package/dist/worker/observe/static/run-processing.js +148 -148
- package/dist/worker/observe/static/views/batch.js +227 -227
- package/dist/worker/observe/static/views/failures.js +143 -143
- package/dist/worker/observe/static/views/feature.js +492 -492
- package/dist/worker/observe/static/views/run.js +453 -453
- package/dist/worker/observe/static/views/shell.js +7 -7
- package/dist/worker/observe/static/views/timeline.js +163 -163
- package/dist/worker/preflight.js +2 -1
- package/dist/workflows/dag/backend-test-scenario-param.js +33 -23
- package/dist/workflows/dag/canvas-observer.js +275 -275
- package/dist/workflows/dag/contract-output-registry.js +14 -0
- package/dist/workflows/dag/contract-validator-registrations.js +8 -0
- package/dist/workflows/dag/dynamic-runtime/shared.js +9 -1
- package/dist/workflows/dag/frontend-implementation-contract.js +233 -39
- package/dist/workflows/dag/frontend-prewrite-gate.js +364 -61
- package/dist/workflows/dag/frontend-recovery-plan.js +73 -0
- package/dist/workflows/dag/frontend-recovery-root-manifest.js +123 -0
- package/dist/workflows/dag/frontend-recovery-run.js +539 -0
- package/dist/workflows/dag/frontend-repair.js +219 -18
- package/dist/workflows/dag/frontend-verification-trace.js +47 -32
- package/dist/workflows/dag/frontend-writer-recovery.js +106 -0
- package/dist/workflows/dag/frontend-writer-rollback.js +821 -0
- package/dist/workflows/dag/init-hybrid.js +41 -24
- package/dist/workflows/dag/node-execution.js +89 -0
- package/dist/workflows/dag/recovery-recommendation.js +58 -0
- package/dist/workflows/dag/runner.js +245 -11
- package/dist/workflows/dag/scheduler.js +257 -3
- package/dist/workflows/dag/types.js +130 -2
- package/docs/architecture/evolution.md +73 -73
- package/docs/architecture/system-overview.md +100 -100
- package/docs/architecture/worker-and-feature.md +122 -122
- package/docs/skills/README.md +7 -7
- package/docs/templates/adr.md +60 -60
- package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
- package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
- package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
- package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
- package/docs/templates/agent-dag-report.schema.json +473 -473
- package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
- package/docs/templates/backend-test-result.schema.json +99 -99
- package/docs/templates/evaluation/agents-map-slim-v1.md +87 -87
- package/docs/templates/evaluation/agents-map-verbose-v0.md +153 -153
- package/docs/templates/feature-spec.md +53 -53
- package/docs/templates/frontend-design-contract.md +42 -42
- package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -17
- package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -16
- package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -16
- package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -16
- package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -16
- package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -16
- package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -21
- package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -29
- package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -28
- package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -28
- package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -29
- package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -27
- package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -28
- package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -28
- package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -27
- package/docs/templates/frontend-eval/metrics.md +138 -138
- package/docs/templates/frontend-eval/smoke-targets.md +53 -53
- package/docs/templates/frontend-task-constraints.md +35 -35
- package/docs/templates/frontend-task-requirement.md +70 -70
- package/docs/templates/init-evolution-review.md +35 -35
- package/docs/templates/init-managed-agents.md +154 -156
- package/docs/templates/interactive-ui-round2-experiment.md +66 -66
- package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -118
- package/docs/templates/knowledge-sync-dag.json +178 -178
- package/docs/templates/knowledge-sync-draft.schema.json +71 -71
- package/docs/templates/product-line/closeout.yaml +9 -9
- package/docs/templates/product-line/design.md +13 -13
- package/docs/templates/product-line/links.md +10 -10
- package/docs/templates/product-line/requirement.md +17 -17
- package/docs/templates/product-line/test-plan.md +7 -7
- package/docs/templates/project-start-checklist.md +9 -9
- package/docs/templates/qa-report.md +48 -48
- package/docs/templates/sprint-contract.md +29 -29
- package/docs/templates/worker-dogfood-evidence.md +80 -80
- package/docs/templates/worker-dogfood-setup.md +68 -68
- package/harness.json +2 -5
- package/package.json +2 -2
- package/scripts/kb-bootstrap-init-skeleton.sh +0 -0
- package/scripts/kb-graph-incremental-prepare.mjs +0 -0
- package/scripts/kb-graph-materialize.mjs +105 -105
- package/scripts/kb-graph-promote.mjs +164 -164
- package/scripts/kb-query.mjs +554 -554
- package/skills/agent-worker/SKILL.md +48 -48
- package/skills/agent-worker/references/agent-worker-operator.md +159 -159
- package/skills/ai-engineering-context/SKILL.md +48 -48
- package/skills/analyze-product-dependencies/scripts/test-validators.mjs +0 -0
- package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +0 -0
- package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +0 -0
- package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +0 -0
- package/skills/analyze-product-requirements/scripts/compute-source-identity.mjs +0 -0
- package/skills/analyze-product-requirements/scripts/test-validators.mjs +0 -0
- package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +0 -0
- package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +0 -0
- package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +0 -0
- package/skills/browser-tools/browser-content.js +103 -103
- package/skills/browser-tools/browser-cookies.js +35 -35
- package/skills/browser-tools/browser-eval.js +53 -53
- package/skills/browser-tools/browser-hn-scraper.js +108 -108
- package/skills/browser-tools/browser-nav.js +44 -44
- package/skills/browser-tools/browser-pick.js +162 -162
- package/skills/browser-tools/browser-screenshot.js +34 -34
- package/skills/browser-tools/browser-start.js +86 -86
- package/skills/browser-tools/package-lock.json +2556 -2556
- package/skills/browser-tools/package.json +19 -19
- package/skills/code-review-core/SKILL.md +20 -20
- package/skills/codebase-scout/SKILL.md +19 -19
- package/skills/grill-me/SKILL.md +10 -10
- package/skills/local-jacoco-coverage/scripts/run-coverage-analysis.sh +0 -0
- package/skills/local-jacoco-coverage/scripts/start-jacoco-agent.sh +0 -0
- package/skills/loop-agent/SKILL.md +0 -1
- package/skills/loop-agent/references/command-reference.md +639 -641
- package/skills/loop-agent/references/docs-converge.md +126 -126
- package/skills/loop-agent/references/learned/README.md +21 -21
- package/skills/loop-agent/references/pi-prompt.md +23 -23
- package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
- package/skills/playwright-cli/references/element-attributes.md +23 -23
- package/skills/playwright-cli/references/playwright-tests.md +39 -39
- package/skills/playwright-cli/references/request-mocking.md +87 -87
- package/skills/playwright-cli/references/running-code.md +241 -241
- package/skills/playwright-cli/references/session-management.md +225 -225
- package/skills/playwright-cli/references/storage-state.md +275 -275
- package/skills/playwright-cli/references/test-generation.md +433 -433
- package/skills/requesting-code-review/SKILL.md +101 -101
- package/skills/requesting-code-review/code-reviewer.md +168 -168
- package/skills/systematic-debugging/CREATION-LOG.md +119 -119
- package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/skills/systematic-debugging/condition-based-waiting.md +115 -115
- package/skills/systematic-debugging/defense-in-depth.md +122 -122
- package/skills/systematic-debugging/find-polluter.sh +63 -63
- package/skills/systematic-debugging/root-cause-tracing.md +169 -169
- package/skills/systematic-debugging/test-academic.md +14 -14
- package/skills/systematic-debugging/test-pressure-1.md +58 -58
- package/skills/systematic-debugging/test-pressure-2.md +68 -68
- package/skills/systematic-debugging/test-pressure-3.md +69 -69
- package/skills/using-git-worktrees/SKILL.md +215 -215
- package/skills/verification-before-completion/SKILL.md +154 -154
- package/skills/webapp-testing/SKILL.md +19 -19
- package/dist/worker/console/operation-wait.js +0 -241
- package/dist/worker/console/static/assets/index-SjjjZnV3.js +0 -56
- package/dist/worker/console/static-src/operator-chat/slash-palette-nav.js +0 -141
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
# Worker Dogfood Setup Template
|
|
2
|
-
|
|
3
|
-
Use this template to create a disposable target repository for a real `agent-worker` sample. It is deliberately a target-repo recipe, not a substitute for product requirements.
|
|
4
|
-
|
|
5
|
-
## Preconditions
|
|
6
|
-
|
|
7
|
-
- Install one published controller version and record it:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm install -g @tea-agent/loop-agent@<version>
|
|
11
|
-
npm list -g @tea-agent/loop-agent --depth=0
|
|
12
|
-
loop-agent --version
|
|
13
|
-
agent-worker --version
|
|
14
|
-
agent-worker --help
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
- Before any write-capable Worker command, resolve one controller identity for the batch. Record its package version, absolute launch entry, binary SHA-256, and portable package fingerprint. If the run is part of a release or self-hosting train, carry the expected version/fingerprint as explicit CLI gates.
|
|
18
|
-
- Create a clean, disposable target repository. Do not use `npm link`, `npm run dev`, or a workspace controller for a real-evidence run.
|
|
19
|
-
- Put requirement, acceptance, design, test plan, and QA case matrix next to the TaskSpec. `agent-worker` materializes immutable copies into the harness task source before DAG generation.
|
|
20
|
-
|
|
21
|
-
## Setup checklist
|
|
22
|
-
|
|
23
|
-
- [ ] Target has a committed baseline and a passing `loop-agent init --profile full --merge` preflight.
|
|
24
|
-
- [ ] Existing test demonstrates the desired behavior is missing or unimplemented.
|
|
25
|
-
- [ ] TaskSpec has narrow `allowed_paths` and explicit `forbidden_paths`.
|
|
26
|
-
- [ ] Task Pool dependencies are either backed by real prior runs or intentionally recorded as pre-existing evidence.
|
|
27
|
-
- [ ] The chosen model/provider and `--pi-model` smoke override, if any, are recorded.
|
|
28
|
-
- [ ] `--loop-agent-bin` resolves to the intended published package, and expected controller version/fingerprint are recorded before target writes.
|
|
29
|
-
- [ ] If this is a self-hosting run, published N remains fixed for the whole batch; candidate N+1 is installed and verified in a separate slot.
|
|
30
|
-
|
|
31
|
-
## Execute
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
agent-worker batch run-ready \
|
|
35
|
-
--feature-dir <feature-dir> \
|
|
36
|
-
--repo <target-repo> \
|
|
37
|
-
--loop-agent-bin <published-loop-agent-entry> \
|
|
38
|
-
--expected-controller-version <version> \
|
|
39
|
-
--expected-controller-fingerprint <sha256:value> \
|
|
40
|
-
--limit 1 \
|
|
41
|
-
--check-repo \
|
|
42
|
-
[--pi-model <model>]
|
|
43
|
-
|
|
44
|
-
agent-worker observe snapshot --repo <target-repo> > <evidence-dir>/observe-snapshot.json
|
|
45
|
-
agent-worker report morning --repo <target-repo> --output <evidence-dir>/morning-report.md
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
For a failed task, do not delete state or alter JSONL evidence. Fix the external/root cause, then make the retry explicit:
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
agent-worker task retry <task-id> --repo <target-repo> --reason "<root cause corrected>"
|
|
52
|
-
agent-worker batch run-ready --feature-dir <feature-dir> --repo <target-repo> --limit 1 --check-repo
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
The retry run must have a distinct `workerRunId` and retain `retryOfWorkerRunId` in its Task Pool evidence.
|
|
56
|
-
|
|
57
|
-
## Versioned self-hosting takeover
|
|
58
|
-
|
|
59
|
-
From a source checkout, use the repo-maintainer deterministic canary after building or packing candidate N+1:
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
npm run self-host:canary -- \
|
|
63
|
-
--deterministic \
|
|
64
|
-
--tarball <candidate.tgz> \
|
|
65
|
-
--output <candidate-canary-evidence.json>
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
The deterministic canary must prove isolated-slot containment, both candidate bin identities, package fingerprint, full init/governance checks, a zero-execution Feature dry-run, static/shell-only observed DAG executors, and no PATH controller fallback. It does not claim to trap every possible Pi SDK/absolute path and does not replace a separately authorized live Pi run or the DAG skill-snapshot tests.
|
|
1
|
+
# Worker Dogfood Setup Template
|
|
2
|
+
|
|
3
|
+
Use this template to create a disposable target repository for a real `agent-worker` sample. It is deliberately a target-repo recipe, not a substitute for product requirements.
|
|
4
|
+
|
|
5
|
+
## Preconditions
|
|
6
|
+
|
|
7
|
+
- Install one published controller version and record it:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g @tea-agent/loop-agent@<version>
|
|
11
|
+
npm list -g @tea-agent/loop-agent --depth=0
|
|
12
|
+
loop-agent --version
|
|
13
|
+
agent-worker --version
|
|
14
|
+
agent-worker --help
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- Before any write-capable Worker command, resolve one controller identity for the batch. Record its package version, absolute launch entry, binary SHA-256, and portable package fingerprint. If the run is part of a release or self-hosting train, carry the expected version/fingerprint as explicit CLI gates.
|
|
18
|
+
- Create a clean, disposable target repository. Do not use `npm link`, `npm run dev`, or a workspace controller for a real-evidence run.
|
|
19
|
+
- Put requirement, acceptance, design, test plan, and QA case matrix next to the TaskSpec. `agent-worker` materializes immutable copies into the harness task source before DAG generation.
|
|
20
|
+
|
|
21
|
+
## Setup checklist
|
|
22
|
+
|
|
23
|
+
- [ ] Target has a committed baseline and a passing `loop-agent init --profile full --merge` preflight.
|
|
24
|
+
- [ ] Existing test demonstrates the desired behavior is missing or unimplemented.
|
|
25
|
+
- [ ] TaskSpec has narrow `allowed_paths` and explicit `forbidden_paths`.
|
|
26
|
+
- [ ] Task Pool dependencies are either backed by real prior runs or intentionally recorded as pre-existing evidence.
|
|
27
|
+
- [ ] The chosen model/provider and `--pi-model` smoke override, if any, are recorded.
|
|
28
|
+
- [ ] `--loop-agent-bin` resolves to the intended published package, and expected controller version/fingerprint are recorded before target writes.
|
|
29
|
+
- [ ] If this is a self-hosting run, published N remains fixed for the whole batch; candidate N+1 is installed and verified in a separate slot.
|
|
30
|
+
|
|
31
|
+
## Execute
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
agent-worker batch run-ready \
|
|
35
|
+
--feature-dir <feature-dir> \
|
|
36
|
+
--repo <target-repo> \
|
|
37
|
+
--loop-agent-bin <published-loop-agent-entry> \
|
|
38
|
+
--expected-controller-version <version> \
|
|
39
|
+
--expected-controller-fingerprint <sha256:value> \
|
|
40
|
+
--limit 1 \
|
|
41
|
+
--check-repo \
|
|
42
|
+
[--pi-model <model>]
|
|
43
|
+
|
|
44
|
+
agent-worker observe snapshot --repo <target-repo> > <evidence-dir>/observe-snapshot.json
|
|
45
|
+
agent-worker report morning --repo <target-repo> --output <evidence-dir>/morning-report.md
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
For a failed task, do not delete state or alter JSONL evidence. Fix the external/root cause, then make the retry explicit:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
agent-worker task retry <task-id> --repo <target-repo> --reason "<root cause corrected>"
|
|
52
|
+
agent-worker batch run-ready --feature-dir <feature-dir> --repo <target-repo> --limit 1 --check-repo
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The retry run must have a distinct `workerRunId` and retain `retryOfWorkerRunId` in its Task Pool evidence.
|
|
56
|
+
|
|
57
|
+
## Versioned self-hosting takeover
|
|
58
|
+
|
|
59
|
+
From a source checkout, use the repo-maintainer deterministic canary after building or packing candidate N+1:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm run self-host:canary -- \
|
|
63
|
+
--deterministic \
|
|
64
|
+
--tarball <candidate.tgz> \
|
|
65
|
+
--output <candidate-canary-evidence.json>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The deterministic canary must prove isolated-slot containment, both candidate bin identities, package fingerprint, full init/governance checks, a zero-execution Feature dry-run, static/shell-only observed DAG executors, and no PATH controller fallback. It does not claim to trap every possible Pi SDK/absolute path and does not replace a separately authorized live Pi run or the DAG skill-snapshot tests.
|
package/harness.json
CHANGED
|
@@ -79,12 +79,9 @@
|
|
|
79
79
|
},
|
|
80
80
|
"executors": {
|
|
81
81
|
"pi": {
|
|
82
|
-
"description": "Pi 负责规划、评审、诊断;当 DAG toolProfile=write
|
|
82
|
+
"description": "Pi 负责规划、评审、诊断;当 DAG toolProfile=write 时也可做有界写入。模型按复杂度三档配置,格式为 provider/model 字符串(例:wizard-local/grok-4.5);斜杠前为 Pi provider,后为 modelId,勿只写裸 modelId。",
|
|
83
83
|
"LOW": "wizard-local/minimax-m3",
|
|
84
|
-
"MED":
|
|
85
|
-
"model": "wizard-local/deepseek-v4-flash",
|
|
86
|
-
"thinking": "max"
|
|
87
|
-
},
|
|
84
|
+
"MED": "wizard-local/grok-4.5",
|
|
88
85
|
"HIGH": "wizard-local/gpt-5.6-sol"
|
|
89
86
|
}
|
|
90
87
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tea-agent/loop-agent",
|
|
3
|
-
"version": "0.35.1-beta.
|
|
3
|
+
"version": "0.35.1-beta.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"loop-agent": "bin/loop-agent.js",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"pi-prompt": "node --import tsx/esm src/cli.ts pi-prompt",
|
|
46
46
|
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
47
47
|
"brand:sync": "node scripts/sync-brand-assets.mjs",
|
|
48
|
-
"build": "npm run brand:sync && npm run clean && tsc -p tsconfig.build.json && node -e \"const fs=require('node:fs');const p='dist/worker/observe/static';fs.mkdirSync(p,{recursive:true});fs.cpSync('src/worker/observe/static',p,{recursive:true});\" && npm run console:build",
|
|
48
|
+
"build": "npm run brand:sync && npm run clean && tsc -p tsconfig.build.json && node -e \"const fs=require('node:fs');const p='dist/worker/observe/static';fs.mkdirSync(p,{recursive:true});fs.cpSync('src/worker/observe/static',p,{recursive:true});\" && npm run console:build && node scripts/write-build-stamp.mjs",
|
|
49
49
|
"console:typecheck": "tsc -p src/worker/console/tsconfig.json",
|
|
50
50
|
"console:build": "npm run console:typecheck && vite build --config src/worker/console/vite.config.ts",
|
|
51
51
|
"prepack": "npm run build",
|
|
File without changes
|
|
File without changes
|
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Standalone B6-ish materialize: rebuild knowledge/graph/entities-index.yaml
|
|
4
|
-
* and edges.yaml from formal trees + edges.manual.yaml.
|
|
5
|
-
*/
|
|
6
|
-
import fs from "node:fs";
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import process from "node:process";
|
|
9
|
-
|
|
10
|
-
function parseArgs(argv) {
|
|
11
|
-
let root = process.cwd();
|
|
12
|
-
for (let i = 0; i < argv.length; i++) {
|
|
13
|
-
if (argv[i] === "--root") root = path.resolve(argv[++i]);
|
|
14
|
-
else if (argv[i] === "-h" || argv[i] === "--help") {
|
|
15
|
-
console.log("Usage: node scripts/kb-graph-materialize.mjs [--root <dir>]");
|
|
16
|
-
process.exit(0);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return { root };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function walk(dir, acc = []) {
|
|
23
|
-
if (!fs.existsSync(dir)) return acc;
|
|
24
|
-
for (const ent of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
25
|
-
const p = path.join(dir, ent.name);
|
|
26
|
-
if (ent.isDirectory()) walk(p, acc);
|
|
27
|
-
else acc.push(p);
|
|
28
|
-
}
|
|
29
|
-
return acc;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function main() {
|
|
33
|
-
const { root } = parseArgs(process.argv.slice(2));
|
|
34
|
-
const entities = [];
|
|
35
|
-
for (const base of ["knowledge/domains", "knowledge/services", "knowledge/modules"]) {
|
|
36
|
-
for (const f of walk(path.join(root, base))) {
|
|
37
|
-
if (!f.endsWith("meta.yaml") && !f.endsWith("meta.yml")) continue;
|
|
38
|
-
const rel = path.relative(root, f).split(path.sep).join("/");
|
|
39
|
-
const text = fs.readFileSync(f, "utf8");
|
|
40
|
-
const id = (text.match(/^id:\s*(\S+)/m) || [])[1];
|
|
41
|
-
const kind = (text.match(/^kind:\s*(\S+)/m) || [])[1] || "unknown";
|
|
42
|
-
if (id) entities.push({ kind, id, path: rel });
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
const featRoot = path.join(root, "features");
|
|
46
|
-
if (fs.existsSync(featRoot)) {
|
|
47
|
-
for (const name of fs.readdirSync(featRoot)) {
|
|
48
|
-
if (!/^F-/.test(name)) continue;
|
|
49
|
-
const dir = path.join(featRoot, name);
|
|
50
|
-
if (!fs.statSync(dir).isDirectory()) continue;
|
|
51
|
-
entities.push({ kind: "feature", id: name, path: `features/${name}/` });
|
|
52
|
-
const links = path.join(dir, "knowledge-links.yaml");
|
|
53
|
-
if (fs.existsSync(links)) {
|
|
54
|
-
entities.push({
|
|
55
|
-
kind: "knowledge-links",
|
|
56
|
-
id: `${name}:links`,
|
|
57
|
-
path: `features/${name}/knowledge-links.yaml`,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const graphDir = path.join(root, "knowledge/graph");
|
|
64
|
-
fs.mkdirSync(graphDir, { recursive: true });
|
|
65
|
-
const generatedAt = new Date().toISOString();
|
|
66
|
-
const indexBody = [
|
|
67
|
-
"# generated by kb-graph-materialize",
|
|
68
|
-
"schema_version: 1",
|
|
69
|
-
`generated_at: ${generatedAt}`,
|
|
70
|
-
"entities:",
|
|
71
|
-
...entities.flatMap((e) => [
|
|
72
|
-
` - kind: ${e.kind}`,
|
|
73
|
-
` id: ${e.id}`,
|
|
74
|
-
` path: ${e.path}`,
|
|
75
|
-
]),
|
|
76
|
-
"",
|
|
77
|
-
].join("\n");
|
|
78
|
-
fs.writeFileSync(path.join(graphDir, "entities-index.yaml"), indexBody);
|
|
79
|
-
|
|
80
|
-
const manual = path.join(graphDir, "edges.manual.yaml");
|
|
81
|
-
const edgesOut = path.join(graphDir, "edges.yaml");
|
|
82
|
-
if (fs.existsSync(manual)) {
|
|
83
|
-
fs.copyFileSync(manual, edgesOut);
|
|
84
|
-
} else if (!fs.existsSync(edgesOut)) {
|
|
85
|
-
fs.writeFileSync(
|
|
86
|
-
edgesOut,
|
|
87
|
-
`schema_version: 1\nupdated_at: ${generatedAt}\nedges: []\n`,
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
console.log(
|
|
92
|
-
JSON.stringify(
|
|
93
|
-
{
|
|
94
|
-
ok: true,
|
|
95
|
-
entities: entities.length,
|
|
96
|
-
entities_index: "knowledge/graph/entities-index.yaml",
|
|
97
|
-
edges: "knowledge/graph/edges.yaml",
|
|
98
|
-
},
|
|
99
|
-
null,
|
|
100
|
-
2,
|
|
101
|
-
),
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
main();
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Standalone B6-ish materialize: rebuild knowledge/graph/entities-index.yaml
|
|
4
|
+
* and edges.yaml from formal trees + edges.manual.yaml.
|
|
5
|
+
*/
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import process from "node:process";
|
|
9
|
+
|
|
10
|
+
function parseArgs(argv) {
|
|
11
|
+
let root = process.cwd();
|
|
12
|
+
for (let i = 0; i < argv.length; i++) {
|
|
13
|
+
if (argv[i] === "--root") root = path.resolve(argv[++i]);
|
|
14
|
+
else if (argv[i] === "-h" || argv[i] === "--help") {
|
|
15
|
+
console.log("Usage: node scripts/kb-graph-materialize.mjs [--root <dir>]");
|
|
16
|
+
process.exit(0);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return { root };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function walk(dir, acc = []) {
|
|
23
|
+
if (!fs.existsSync(dir)) return acc;
|
|
24
|
+
for (const ent of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
25
|
+
const p = path.join(dir, ent.name);
|
|
26
|
+
if (ent.isDirectory()) walk(p, acc);
|
|
27
|
+
else acc.push(p);
|
|
28
|
+
}
|
|
29
|
+
return acc;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function main() {
|
|
33
|
+
const { root } = parseArgs(process.argv.slice(2));
|
|
34
|
+
const entities = [];
|
|
35
|
+
for (const base of ["knowledge/domains", "knowledge/services", "knowledge/modules"]) {
|
|
36
|
+
for (const f of walk(path.join(root, base))) {
|
|
37
|
+
if (!f.endsWith("meta.yaml") && !f.endsWith("meta.yml")) continue;
|
|
38
|
+
const rel = path.relative(root, f).split(path.sep).join("/");
|
|
39
|
+
const text = fs.readFileSync(f, "utf8");
|
|
40
|
+
const id = (text.match(/^id:\s*(\S+)/m) || [])[1];
|
|
41
|
+
const kind = (text.match(/^kind:\s*(\S+)/m) || [])[1] || "unknown";
|
|
42
|
+
if (id) entities.push({ kind, id, path: rel });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const featRoot = path.join(root, "features");
|
|
46
|
+
if (fs.existsSync(featRoot)) {
|
|
47
|
+
for (const name of fs.readdirSync(featRoot)) {
|
|
48
|
+
if (!/^F-/.test(name)) continue;
|
|
49
|
+
const dir = path.join(featRoot, name);
|
|
50
|
+
if (!fs.statSync(dir).isDirectory()) continue;
|
|
51
|
+
entities.push({ kind: "feature", id: name, path: `features/${name}/` });
|
|
52
|
+
const links = path.join(dir, "knowledge-links.yaml");
|
|
53
|
+
if (fs.existsSync(links)) {
|
|
54
|
+
entities.push({
|
|
55
|
+
kind: "knowledge-links",
|
|
56
|
+
id: `${name}:links`,
|
|
57
|
+
path: `features/${name}/knowledge-links.yaml`,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const graphDir = path.join(root, "knowledge/graph");
|
|
64
|
+
fs.mkdirSync(graphDir, { recursive: true });
|
|
65
|
+
const generatedAt = new Date().toISOString();
|
|
66
|
+
const indexBody = [
|
|
67
|
+
"# generated by kb-graph-materialize",
|
|
68
|
+
"schema_version: 1",
|
|
69
|
+
`generated_at: ${generatedAt}`,
|
|
70
|
+
"entities:",
|
|
71
|
+
...entities.flatMap((e) => [
|
|
72
|
+
` - kind: ${e.kind}`,
|
|
73
|
+
` id: ${e.id}`,
|
|
74
|
+
` path: ${e.path}`,
|
|
75
|
+
]),
|
|
76
|
+
"",
|
|
77
|
+
].join("\n");
|
|
78
|
+
fs.writeFileSync(path.join(graphDir, "entities-index.yaml"), indexBody);
|
|
79
|
+
|
|
80
|
+
const manual = path.join(graphDir, "edges.manual.yaml");
|
|
81
|
+
const edgesOut = path.join(graphDir, "edges.yaml");
|
|
82
|
+
if (fs.existsSync(manual)) {
|
|
83
|
+
fs.copyFileSync(manual, edgesOut);
|
|
84
|
+
} else if (!fs.existsSync(edgesOut)) {
|
|
85
|
+
fs.writeFileSync(
|
|
86
|
+
edgesOut,
|
|
87
|
+
`schema_version: 1\nupdated_at: ${generatedAt}\nedges: []\n`,
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
console.log(
|
|
92
|
+
JSON.stringify(
|
|
93
|
+
{
|
|
94
|
+
ok: true,
|
|
95
|
+
entities: entities.length,
|
|
96
|
+
entities_index: "knowledge/graph/entities-index.yaml",
|
|
97
|
+
edges: "knowledge/graph/edges.yaml",
|
|
98
|
+
},
|
|
99
|
+
null,
|
|
100
|
+
2,
|
|
101
|
+
),
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
main();
|