@ngocsangairvds/vsaf 5.1.6 → 5.1.8
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/package.json +4 -1
- package/packages/cli/dist/adapters/antigravity.d.ts.map +1 -1
- package/packages/cli/dist/adapters/antigravity.js +9 -30
- package/packages/cli/dist/adapters/antigravity.js.map +1 -1
- package/packages/cli/dist/adapters/claude.d.ts.map +1 -1
- package/packages/cli/dist/adapters/claude.js +8 -10
- package/packages/cli/dist/adapters/claude.js.map +1 -1
- package/packages/cli/dist/adapters/codex.d.ts.map +1 -1
- package/packages/cli/dist/adapters/codex.js +6 -9
- package/packages/cli/dist/adapters/codex.js.map +1 -1
- package/packages/cli/dist/adapters/cursor.d.ts.map +1 -1
- package/packages/cli/dist/adapters/cursor.js +22 -24
- package/packages/cli/dist/adapters/cursor.js.map +1 -1
- package/packages/cli/dist/commands/init.d.ts.map +1 -1
- package/packages/cli/dist/commands/init.js +7 -19
- package/packages/cli/dist/commands/init.js.map +1 -1
- package/packages/cli/dist/commands/install.d.ts +3 -6
- package/packages/cli/dist/commands/install.d.ts.map +1 -1
- package/packages/cli/dist/commands/install.js +6 -9
- package/packages/cli/dist/commands/install.js.map +1 -1
- package/packages/cli/dist/commands/skill.d.ts.map +1 -1
- package/packages/cli/dist/commands/skill.js +35 -14
- package/packages/cli/dist/commands/skill.js.map +1 -1
- package/packages/cli/dist/index.js +2 -2
- package/packages/cli/dist/index.js.map +1 -1
- package/packages/cli/dist/install/orchestrator.d.ts +0 -8
- package/packages/cli/dist/install/orchestrator.d.ts.map +1 -1
- package/packages/cli/dist/install/orchestrator.js +3 -54
- package/packages/cli/dist/install/orchestrator.js.map +1 -1
- package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
- package/packages/cli/dist/server/routes/runs.js +81 -3
- package/packages/cli/dist/server/routes/runs.js.map +1 -1
- package/packages/cli/dist/server/routes/workflows.d.ts.map +1 -1
- package/packages/cli/dist/server/routes/workflows.js +76 -17
- package/packages/cli/dist/server/routes/workflows.js.map +1 -1
- package/packages/cli/dist/server/services/execution-manager.d.ts +11 -1
- package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
- package/packages/cli/dist/server/services/execution-manager.js +88 -17
- package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
- package/packages/cli/dist/server/static.d.ts.map +1 -1
- package/packages/cli/dist/server/static.js +4 -1
- package/packages/cli/dist/server/static.js.map +1 -1
- package/packages/cli/dist/server/workflow-path.d.ts +3 -0
- package/packages/cli/dist/server/workflow-path.d.ts.map +1 -0
- package/packages/cli/dist/server/workflow-path.js +25 -0
- package/packages/cli/dist/server/workflow-path.js.map +1 -0
- package/packages/core/dist/isolation/workspace-manager.js +1 -1
- package/packages/core/dist/isolation/workspace-manager.js.map +1 -1
- package/packages/core/dist/store/recovery.d.ts.map +1 -1
- package/packages/core/dist/store/recovery.js +12 -1
- package/packages/core/dist/store/recovery.js.map +1 -1
- package/packages/core/dist/store/run-store.d.ts +3 -0
- package/packages/core/dist/store/run-store.d.ts.map +1 -1
- package/packages/core/dist/store/run-store.js +33 -0
- package/packages/core/dist/store/run-store.js.map +1 -1
- package/packages/core/dist/store/types.d.ts +2 -2
- package/packages/core/dist/store/types.d.ts.map +1 -1
- package/packages/core/dist/store/types.js.map +1 -1
- package/packages/core/dist/store/wal.js +1 -1
- package/packages/core/dist/store/wal.js.map +1 -1
- package/packages/web/dist/web/3rdpartylicenses.txt +26 -26
- package/packages/web/dist/web/browser/chunk-4YPNNQ2T.js +4 -0
- package/packages/web/dist/web/browser/chunk-E227ZHPJ.js +1 -0
- package/packages/web/dist/web/browser/chunk-JFBK3MNW.js +1 -0
- package/packages/web/dist/web/browser/chunk-L2VOQBBI.js +1 -0
- package/packages/web/dist/web/browser/chunk-OJJM5VOH.js +1 -0
- package/packages/web/dist/web/browser/chunk-U2H3QYAG.js +5 -0
- package/packages/web/dist/web/browser/chunk-VA7KFQOR.js +1 -0
- package/packages/web/dist/web/browser/chunk-WV3C6DNH.js +1 -0
- package/packages/web/dist/web/browser/index.html +2 -2
- package/packages/web/dist/web/browser/main-THGFWXYL.js +1 -0
- package/packages/web/dist/web/browser/{styles-JBPZVY54.css → styles-PWTTI45T.css} +1 -1
- package/scripts/win-vm-prereqs.ps1 +40 -0
- package/skills/vds-skill/runtime/.claude/phase7-CLOSURE.md +100 -0
- package/skills/vds-skill/runtime/AGENTS.md +250 -0
- package/packages/web/dist/web/browser/chunk-IPMFXW6N.js +0 -1
- package/packages/web/dist/web/browser/chunk-IX2QWMX2.js +0 -1
- package/packages/web/dist/web/browser/chunk-QMAH5NZC.js +0 -1
- package/packages/web/dist/web/browser/chunk-RGFLNLPM.js +0 -1
- package/packages/web/dist/web/browser/chunk-RKWDHBN3.js +0 -5
- package/packages/web/dist/web/browser/chunk-XGYEZIV4.js +0 -1
- package/packages/web/dist/web/browser/main-IIUZVPMI.js +0 -1
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# AGENTS.md — VDS Scripts Workspace
|
|
2
|
+
|
|
3
|
+
> Python automation workspace for VDS orchestrators and routed CLI commands.
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
- Repository: `WHO-project/vds-scripts`
|
|
8
|
+
- Primary responsibilities:
|
|
9
|
+
- `vds-cli` routed command surface
|
|
10
|
+
- audit/spec/task/progress/research/evolution orchestrators
|
|
11
|
+
- shared runtime and environment contracts
|
|
12
|
+
- This file is Tier-0 operator contract (keep concise). Deep command catalogs and phase details live in docs references.
|
|
13
|
+
|
|
14
|
+
## Repo Boundary
|
|
15
|
+
|
|
16
|
+
This repo holds **runtime Python only** — CLI entry points, orchestrators, MCP
|
|
17
|
+
servers, platform abstractions, agent-core libraries, evolution loops.
|
|
18
|
+
Claude-Code-facing artifacts (skills, hook plugins, sync machinery, governance
|
|
19
|
+
docs) live in `WHO-project/vds-skills/`.
|
|
20
|
+
|
|
21
|
+
Canonical rules: `who-ecosystem-alignment` Phase 4 FR-8 (Repo purpose) and FR-9
|
|
22
|
+
(Direction of dependency: skills may reference vds-scripts entry points;
|
|
23
|
+
vds-scripts must build, test, and run with **zero** vds-skills artifacts
|
|
24
|
+
present). FR-11 forbids `.claude/skills/<name>/` directories here. FR-12
|
|
25
|
+
forbids new hook packages here (canonical hook surface is
|
|
26
|
+
`vds-skills/plugins/vds-hooks-*/`).
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
cd WHO-project/vds-scripts
|
|
32
|
+
|
|
33
|
+
# CLI router — unified entry point for all operations
|
|
34
|
+
uv run --directory ~/.claude/vds-scripts --package vds_cli vds-cli --help
|
|
35
|
+
uv run --directory ~/.claude/vds-scripts --package vds_cli vds-cli env status
|
|
36
|
+
uv run --directory ~/.claude/vds-scripts --package vds_cli vds-cli status
|
|
37
|
+
uv run --directory ~/.claude/vds-scripts --package vds_cli vds-cli doctor
|
|
38
|
+
|
|
39
|
+
# Specialist services (all route through vds-cli)
|
|
40
|
+
uv run --directory ~/.claude/vds-scripts --package vds_cli vds-cli audit --help
|
|
41
|
+
uv run --directory ~/.claude/vds-scripts --package vds_cli vds-cli spec --help
|
|
42
|
+
uv run --directory ~/.claude/vds-scripts --package vds_cli vds-cli evolution --help
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Unified Routing Contract
|
|
46
|
+
|
|
47
|
+
**`vds-cli` is the single canonical entry point** for all user-facing orchestrator operations.
|
|
48
|
+
|
|
49
|
+
- All commands route through `uv run --directory ~/.claude/vds-scripts --package vds_cli vds-cli <service> <command> [args]`.
|
|
50
|
+
- `pyproject.toml [project.scripts]` are router implementation detail — not user-facing contracts.
|
|
51
|
+
- Internal scripts (e.g., `vds-evolution`) are backend mechanisms invoked by the router, not directly by users.
|
|
52
|
+
|
|
53
|
+
## Rules
|
|
54
|
+
|
|
55
|
+
- Use `uv run --directory ~/.claude/vds-scripts --package vds_cli vds-cli ...` for worktree-safe Python execution.
|
|
56
|
+
- Runtime is Postgres-first. Do not add filesystem fallback for audit state or evidence.
|
|
57
|
+
- Use VDS SDK surfaces for Confluence/Bitbucket operations.
|
|
58
|
+
- Keep phase history and long command narratives out of AGENTS.md.
|
|
59
|
+
|
|
60
|
+
### Testing Rules
|
|
61
|
+
|
|
62
|
+
- Tests must mock all external services (Confluence, Bitbucket, LLM providers, HTTP endpoints).
|
|
63
|
+
- Control env vars with `monkeypatch.setenv` / `delenv`; do not read real local credentials.
|
|
64
|
+
- Prefer focused tests for changed modules during development; run broad suites at merge gates.
|
|
65
|
+
|
|
66
|
+
### Phase Numbering & Branch Naming
|
|
67
|
+
|
|
68
|
+
Phase numbers are **per-spec local** structural labels, not monorepo-global tags. The same number can mean different things in different specs (e.g., `## Phase 219` in `vds-ai-memory` ≠ `## Phase 219` in `ecosystem-scheduling`). To prevent silent branch-namespace collisions when sessions run in parallel, new phase branches MUST use the prefix `<spec-prefix>-phase<N>`:
|
|
69
|
+
|
|
70
|
+
- `vai-phase219` — vds-ai-memory (`vai`)
|
|
71
|
+
- `eco-phase5` — ecosystem-infrastructure-evolution (`eco`)
|
|
72
|
+
- `audit-phase6` — audit-orchestrator (`audit`)
|
|
73
|
+
- `core-phase172` — vds-agent-core-alignment (`core`)
|
|
74
|
+
|
|
75
|
+
Commit messages retain the narrative `phase<N>` form for readability. Existing un-prefixed branches (e.g., `phase218`, `phase219/...`) are grandfathered; the prefix rule applies prospectively. When starting a new phase, check the spec's `requirements.md` for the next free phase number within that spec, then `git branch -a | grep <spec-prefix>-phase<N>` before creating the branch — collision is now diagnosable by name.
|
|
76
|
+
|
|
77
|
+
### Active Spec Sync
|
|
78
|
+
|
|
79
|
+
vds-ai-memory: **1547 tests**, spec v20.22.0 (Phase 228/229/230/231 Finalized, Phase 232 Blocked — dedup never ran, max_groups=10, embed degraded)
|
|
80
|
+
|
|
81
|
+
### Containerization Policy
|
|
82
|
+
|
|
83
|
+
| Command Category | Runtime | Examples |
|
|
84
|
+
| ------------------------------- | ------------------------------- | ------------------------------------------------------------------------------ |
|
|
85
|
+
| **Host-only** (never in Docker) | Host filesystem | `vds-cli skills sync`, `git commit/rebase`, `vds-cli spec create` |
|
|
86
|
+
| **Host-only** | Host credentials/env | `vds-cli memory store/search`, `uv run --directory ~/.claude/vds-scripts` |
|
|
87
|
+
| **Container-eligible** | Docker | `vds-cli audit workflow`, `vds-cli research search`, `vds-cli confluence sync` |
|
|
88
|
+
| **Hybrid** | Container (read) + Host (write) | `vds-cli progress report` (read DB, write reports), `vds-cli pdf convert` |
|
|
89
|
+
|
|
90
|
+
`vds-skills` remains container-free. Skill sync must run on host.
|
|
91
|
+
|
|
92
|
+
### Scheduler Architecture (Single-Scheduler Operator Note, post-2026-04-24)
|
|
93
|
+
|
|
94
|
+
The VDS ecosystem now has **one** periodic-task scheduler: **`scheduler_orchestrator`** (DBOS-backed, in `scheduler_orchestrator/`). Celery Beat was retired by ADR-14 on 2026-04-24 (commit `a0ba4179`); audit trail at `scheduler_orchestrator/CLOSURE-v2.0.18.md` (Phase 0 of `.gpt-5.4/specs/vds-scheduler/`).
|
|
95
|
+
|
|
96
|
+
| Concern | Owner | Notes |
|
|
97
|
+
| ---------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
98
|
+
| All periodic schedules (cron + interval) | `scheduler_orchestrator` (DBOS) | Includes the 6 ex-Celery-Beat memory-evolution tasks (`memory.evolution.{dispatch,sweep,replay-dlq}`, `mem0.{resolve-pending-ids,repush-stalled,repush-local-only}`) plus audit drift scans, chain triggers, event-bus dispatch, and scheduled agent-step workflows |
|
|
99
|
+
| Ad-hoc Celery task dispatch | Celery worker in `memory_orchestrator/` (worker only — beat retired) | The worker plumbing (`memory_evolution/celery_app.py` + `celery_entrypoint.py`) is intentionally retained per `scheduler_orchestrator/CLOSURE-v2.0.18.md` §Scope Clarification, for explicit `.delay()` / `.send_task()` dispatch from production code. Not a scheduler. |
|
|
100
|
+
| Kill switch | `VDS_SCHEDULER_ENABLED=false` (default) | Disables `scheduler_orchestrator` completely. Celery worker dispatch is unaffected. |
|
|
101
|
+
|
|
102
|
+
**Kill-switch rule**: `VDS_SCHEDULER_ENABLED=false` (the default in `~/.vds/.env`) keeps `scheduler_orchestrator` dormant. Set `VDS_SCHEDULER_ENABLED=true` only when the scheduler service is intentionally started; this activates 7+ DBOS schedules (6 ex-Celery memory-evolution + `evolution.auto-promote` + the autoscaler tick).
|
|
103
|
+
|
|
104
|
+
- **Ecosystem Daily Report** (`ecosystem.daily.report`): Runs at 06:00 UTC daily on `ops-default` queue. Collects git activity, scheduler health, event bus metrics, queue depths. Writes Markdown to `reports/ecosystem/`, persists to `sched.ecosystem_report_runs`, publishes `ecosystem.daily.completed`/`.failed` events. Config: `VDS_ECOSYSTEM_DAILY__*` env vars. Spec: `.gpt-5.4/specs/ecosystem-daily-report/`.
|
|
105
|
+
|
|
106
|
+
**What is NOT a scheduler anymore**: Celery Beat (container removed from the legacy mem0-deploy stack; the unified `docker/docker-compose.services.yml` is beat-free by design; `beat_schedule` is empty `{}`). Tests asserting Celery Beat schedule registrations were updated in v2.0.10 to assert post-retirement empty state. The legacy compose files were retired to `docker/legacy/` in P3 + P4 WP-4.0; that directory was removed in spec v2.15.12 per the no-legacy directive — recover via git history if rollback is ever needed.
|
|
107
|
+
|
|
108
|
+
## Entry Points
|
|
109
|
+
|
|
110
|
+
All services route through a single entry:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
vds-cli <service> <command> [args]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Core service families** (non-exhaustive):
|
|
117
|
+
|
|
118
|
+
- `vds-cli audit ...` — Audit operations (repo, project, multi-project)
|
|
119
|
+
- `vds-cli spec ...` — Spec lifecycle (create, validate, consolidate)
|
|
120
|
+
- `vds-cli tasks ...` — Task orchestrator
|
|
121
|
+
- `vds-cli progress ...` — Progress reports
|
|
122
|
+
- `vds-cli research ...` — Research orchestrator
|
|
123
|
+
- `vds-cli memory ...` — Memory operations
|
|
124
|
+
- `vds-cli evolution ...` — Evolution loop
|
|
125
|
+
- `vds-cli confluence ...` — Confluence operations
|
|
126
|
+
- `vds-cli bitbucket ...` — Bitbucket operations
|
|
127
|
+
- `vds-cli git ...` — Git orchestrator
|
|
128
|
+
- `vds-cli jira ...` — JIRA operations
|
|
129
|
+
- `vds-cli db-query ...` — Database queries
|
|
130
|
+
- `vds-cli grafana ...` — Grafana operations
|
|
131
|
+
- `vds-cli sonarqube ...` — SonarQube operations
|
|
132
|
+
- `vds-cli lsp ...` — LSP operations
|
|
133
|
+
- `vds-cli elastic ...` — Elasticsearch operations
|
|
134
|
+
- `vds-cli pdf ...` — PDF generation
|
|
135
|
+
- `vds-cli diagrams ...` — Diagram generation
|
|
136
|
+
- `vds-cli schema ...` — Schema conversion
|
|
137
|
+
- `vds-cli excel ...` — Excel operations
|
|
138
|
+
- `vds-cli google-sheets ...` — Google Sheets operations
|
|
139
|
+
- `vds-cli circular-dependency ...` — Circular dependency analysis
|
|
140
|
+
- `vds-cli openapi ...` — OpenAPI operations
|
|
141
|
+
- `vds-cli links ...` — Link validation
|
|
142
|
+
- `vds-cli structure ...` — Structure validation
|
|
143
|
+
- `vds-cli brd ...` — BRD coverage
|
|
144
|
+
- `vds-cli intellij ...` — IntelliJ operations
|
|
145
|
+
- `vds-cli metabase ...` — Metabase operations
|
|
146
|
+
- `vds-cli hexagonal ...` — Hexagonal compliance
|
|
147
|
+
- `vds-cli markdown ...` — Markdown operations
|
|
148
|
+
- `vds-cli mcp ...` — MCP server operations
|
|
149
|
+
- `vds-cli multi-agent ...` — Multi-agent operations
|
|
150
|
+
- `vds-cli public-interface ...` — Public interface boundary
|
|
151
|
+
- `vds-cli scheduler ...` — Ecosystem scheduler (schedule/event/chain ops); requires `VDS_SCHEDULER_ENABLED=true`
|
|
152
|
+
- `vds-cli telegram ...` — Telegram bridge ops (DISABLED 2026-04-30 — aiogram pydantic conflict; restore when aiogram >=3.28.0). Bridge code present at `telegram_bridge/`, 102 tests pass offline.
|
|
153
|
+
|
|
154
|
+
## Search & Navigation
|
|
155
|
+
|
|
156
|
+
- Start with `rg` for exact symbols and strings.
|
|
157
|
+
- Use `sg` / structural search for pattern-level code exploration.
|
|
158
|
+
- For large-scope understanding, prefer graphify/gitnexus before broad file scans.
|
|
159
|
+
- Phase truth and runtime baselines are maintained in docs references (below), not inline here.
|
|
160
|
+
|
|
161
|
+
## Code
|
|
162
|
+
|
|
163
|
+
### Critical Path Symbols
|
|
164
|
+
|
|
165
|
+
Before changing a symbol, run impact analysis:
|
|
166
|
+
|
|
167
|
+
- `gitnexus_impact({target: "SymbolName", direction: "upstream"})`
|
|
168
|
+
|
|
169
|
+
Before committing, run scope detection:
|
|
170
|
+
|
|
171
|
+
- `gitnexus_detect_changes({scope: "staged"})`
|
|
172
|
+
|
|
173
|
+
For unknown flows, start with:
|
|
174
|
+
|
|
175
|
+
- `gitnexus_query({query: "concept"})`
|
|
176
|
+
- `gitnexus_context({name: "symbol"})`
|
|
177
|
+
|
|
178
|
+
### GitNexus Guardrails
|
|
179
|
+
|
|
180
|
+
- Treat HIGH/CRITICAL impact results as explicit risk gates and surface them before continuing edits.
|
|
181
|
+
- Never perform symbol renames via plain find/replace; use graph-aware rename workflows.
|
|
182
|
+
- Re-index intentionally after significant code changes:
|
|
183
|
+
- `npx gitnexus analyze`
|
|
184
|
+
- `npx gitnexus analyze --embeddings` (when embeddings are in use)
|
|
185
|
+
|
|
186
|
+
## Validation Gates (last verified: 2026-05-04 (Phase 14 post-merge))
|
|
187
|
+
|
|
188
|
+
| Package | Passed | Failed | Skipped | Gate |
|
|
189
|
+
| -------------------------------------------- | ---------- | ------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
190
|
+
| spec_orchestrator | 14 | 0 | 0 | GREEN |
|
|
191
|
+
| scheduler_orchestrator | 1,454 | 0 | 3 | GREEN (+2 from FR-14.2 cache fix) |
|
|
192
|
+
| vds_agent_core | 932 | 0 | 0 | GREEN (+6 from FR-14.1 + FR-14.5 forward-ref fixes) |
|
|
193
|
+
| memory_orchestrator (Phase 225 surface) | 8 | 0 | 0 | GREEN |
|
|
194
|
+
| multi_agent_orchestrator (Phase 225 surface) | 49 | 0 | 0 | GREEN |
|
|
195
|
+
| audit_orchestrator (profile-focused subset) | 121 | 15 | 24 | DEGRADED — pre-existing Python 3.14 forward-ref + config_hooks bugs (FR-14.1/14.5 reduced GAP cascade, full audit suite 8,290 PASS still DEGRADED) |
|
|
196
|
+
| progress_report_orchestrator | 452 | 1 | 0 | DEGRADED — pre-existing alembic env_py schema-name assertion |
|
|
197
|
+
| telegram_bridge | 102+ | 0 | 0 | GREEN |
|
|
198
|
+
| vds_cli (ecosystem) | 286 | 0 | 5 | GREEN |
|
|
199
|
+
| **Phase 14 surface total** | **1,477+** | **0** | **8** | GREEN (+8 from Phase 14 fixes) |
|
|
200
|
+
|
|
201
|
+
- Scheduler Alembic: `a1b2c3d4e5f8` (Phase 2 golden-signals columns live)
|
|
202
|
+
- Memory/Progress/Audit Alembic: AT_HEAD
|
|
203
|
+
- Docker: 10/10 containers healthy; worker + API same image digest
|
|
204
|
+
- Live CLI smoke: 6/6 pass (spec validate, scheduler help, trigger-now, db-query, onboarding-funnel, freshness)
|
|
205
|
+
- Phase 231 deploy: vds-memory:1.0.0 image **10.4 GB** (62% reduction from 27.6 GB pre-Phase-225); all 7 health layers healthy; doctor embedding fallback OLLAMA_BASE_URL → BASE_URL deployed; VDS_MEMORY_TIMEOUT_SECONDS=300 set; entrypoint.sh alembic upgrade head verified
|
|
206
|
+
|
|
207
|
+
## Docs
|
|
208
|
+
|
|
209
|
+
- CLI command reference: `docs/agents/reference/cli-commands.md`
|
|
210
|
+
- Ecosystem report: `docs/agents/reference/ecosystem-daily-report.md`
|
|
211
|
+
- Skills commands: `docs/agents/reference/skills-commands.md`
|
|
212
|
+
- Infrastructure v2.15: `docs/agents/reference/infrastructure-v2.15.md`
|
|
213
|
+
- CI workflows: `docs/agents/reference/ci-workflows.md`
|
|
214
|
+
- Ecosystem index: `ECOSYSTEM-DOCS.md`
|
|
215
|
+
- Ecosystem changelog: `ECOSYSTEM-CHANGELOG.md`
|
|
216
|
+
- Environment git-helper: `docs/agents/reference/env-git-helper.md`
|
|
217
|
+
- Phase archive: `docs/phases/CHANGELOG.md`
|
|
218
|
+
- Script authoring contract: `scripts/README.md`
|
|
219
|
+
- Worktree wrapper contract (Phase 220.V): `scripts/README.md` §Worktree Wrapper Scripts (`worktree-add.sh` / `worktree-remove.sh` are canonical for vds-scripts; bare `git worktree` is fallback only)
|
|
220
|
+
- Telegram Bridge reference: `telegram_bridge/skill_content/references/README.md`
|
|
221
|
+
- Root router: `../AGENTS.md`
|
|
222
|
+
- Ecosystem alignment: `ECOSYSTEM_ALIGNMENT.md` (openspace hook analysis)
|
|
223
|
+
- Canonical spec: `.gpt-5.4/specs/ARCHIVE/who-project-documentation-enhancement/` (ARCHIVED — Phases 177→179 + post-merge updates merged)
|
|
224
|
+
|
|
225
|
+
### Comprehensive Docs (Phase 180)
|
|
226
|
+
|
|
227
|
+
- Introduction: `docs/agents/explanation/who-ecosystem-introduction.md`
|
|
228
|
+
- Quick Start: `docs/agents/tutorials/quick-start.md`
|
|
229
|
+
- Configuration: `docs/agents/reference/configuration-reference.md`
|
|
230
|
+
- Troubleshooting: `docs/agents/how-to/troubleshooting-guide.md`
|
|
231
|
+
- Architecture: `docs/agents/explanation/system-architecture.md`
|
|
232
|
+
- Tips & Tricks: `docs/agents/how-to/tips-and-tricks.md`
|
|
233
|
+
- See all: `ECOSYSTEM-DOCS.md`
|
|
234
|
+
|
|
235
|
+
### Symlink Handling
|
|
236
|
+
|
|
237
|
+
- `CLAUDE.md` in this repo is a symlink → `AGENTS.md`.
|
|
238
|
+
- On filesystems where `core.symlinks=false`, the validator reports:
|
|
239
|
+
`CLAUDE.md is not a symlink to AGENTS.md (ERROR)`.
|
|
240
|
+
- Fix: enable Git symlinks (`git config --global core.symlinks true`) or re-clone.
|
|
241
|
+
|
|
242
|
+
## Ngôn ngữ / Language
|
|
243
|
+
|
|
244
|
+
- [English](./AGENTS.md)
|
|
245
|
+
- [Tiếng Việt](./AGENTS.vi.md)
|
|
246
|
+
|
|
247
|
+
## Confluence Documentation
|
|
248
|
+
|
|
249
|
+
- [WHO-Project Ecosystem Documentation](http://confluence.digital.vn/display/TTCN24/WHO-Project+Ecosystem+Documentation)
|
|
250
|
+
ecosystem: **41 tests**, spec v2.16.0 (Phase 0/8 Finalized; v2.16.0 deploy-portability extension applied)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as I}from"./chunk-XGYEZIV4.js";import{a as E}from"./chunk-RGFLNLPM.js";import{C as _,D as g,E as b,F as k,G as x,H as n,I as t,K as v,L as f,M as d,O as i,P as l,S as C,ea as h,ga as y,ka as D,l as p,m as c,ma as S,n as u,u as r,x as w}from"./chunk-RKWDHBN3.js";var T=(a,o)=>o.id;function N(a,o){if(a&1&&(n(0,"div",9)(1,"span",11),i(2),t(),n(3,"span")(4,"span",12),i(5),t()(),n(6,"span",13),i(7),t(),n(8,"span",14),i(9),t()()),a&2){let e=o.$implicit,s=d(2);r(2),l(e.id),r(2),x("ngClass",s.typeBadge(e.type)),r(),l(e.type),r(2),l(e.dependsOn.length?e.dependsOn.join(", "):"\u2014"),r(2),l(e.when||"\u2014")}}function V(a,o){if(a&1){let e=v();n(0,"div",0)(1,"div",1)(2,"div")(3,"h1",2),i(4),t(),n(5,"p",3),i(6),t(),n(7,"p",4),i(8),t()(),n(9,"button",5),f("click",function(){c(e);let m=d();return u(m.showRunDialog=!0)}),i(10,"Run Workflow \u25B6"),t()(),n(11,"div",6)(12,"h3",7),i(13,"DAG Nodes"),t(),n(14,"div",8)(15,"span"),i(16,"Node"),t(),n(17,"span"),i(18,"Type"),t(),n(19,"span"),i(20,"Depends On"),t(),n(21,"span"),i(22,"Condition"),t()(),b(23,N,10,5,"div",9,T),t()(),n(25,"app-run-dialog",10),f("run",function(m){c(e);let W=d();return u(W.onStartRun(m))})("closed",function(){c(e);let m=d();return u(m.showRunDialog=!1)}),t()}if(a&2){let e=d();r(4),l(e.workflow.name),r(2),C(" ",e.workflow.nodeCount," nodes \u2022 provider: ",e.workflow.defaultProvider," \u2022 model: ",e.workflow.defaultModel," "),r(2),l(e.workflow.description),r(15),k(e.workflow.nodes),r(2),x("visible",e.showRunDialog)("workflowName",e.workflow.name)}}var R=class a{route=p(D);api=p(E);router=p(S);workflow;showRunDialog=!1;ngOnInit(){let o=this.route.snapshot.paramMap.get("name");this.api.getWorkflow(o).subscribe(e=>this.workflow=e)}onStartRun(o){this.showRunDialog=!1,this.api.startRun(this.workflow.name,o).subscribe(e=>{this.router.navigate(["/runs",e.runId])})}typeBadge(o){switch(o){case"prompt":return"bg-purple-500/10 text-purple-400";case"bash":return"bg-amber-500/10 text-amber-400";case"command":return"bg-cyan-500/10 text-cyan-400";default:return"bg-slate-700 text-slate-400"}}static \u0275fac=function(e){return new(e||a)};static \u0275cmp=w({type:a,selectors:[["app-workflow-detail"]],decls:1,vars:1,consts:[[1,"max-w-4xl","mx-auto"],[1,"flex","items-start","mb-6"],[1,"text-2xl","font-bold","text-slate-100"],[1,"text-sm","text-slate-500","mt-1"],[1,"text-sm","text-slate-400","mt-2"],[1,"ml-auto","bg-blue-600","text-white","px-5","py-2","rounded-lg","hover:bg-blue-500","text-sm",3,"click"],[1,"bg-slate-800","rounded-lg","border","border-slate-700","p-4"],[1,"text-xs","font-semibold","text-slate-500","uppercase","tracking-wider","mb-3"],[1,"grid","grid-cols-[1.5fr_0.8fr_2fr_1.5fr]","text-xs","text-slate-500","pb-2","border-b","border-slate-700"],[1,"grid","grid-cols-[1.5fr_0.8fr_2fr_1.5fr]","py-2","text-sm","border-b","border-slate-800/50","items-center"],[3,"run","closed","visible","workflowName"],[1,"text-slate-100"],[1,"text-xs","px-1.5","py-0.5","rounded",3,"ngClass"],[1,"font-mono","text-xs","text-slate-400"],[1,"font-mono","text-xs","text-amber-400"]],template:function(e,s){e&1&&_(0,V,26,7),e&2&&g(s.workflow?0:-1)},dependencies:[y,h,I],encapsulation:2})};export{R as WorkflowDetailComponent};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as M}from"./chunk-RGFLNLPM.js";import{C as u,D as l,E,F as w,G as p,H as r,I as i,J as N,M as m,O as o,P as d,Q as _,R,c as y,ea as v,ga as b,i as S,ka as D,l as c,na as k,p as I,u as s,x as g}from"./chunk-RKWDHBN3.js";var C=class a{zone=c(I);connect(t){return new y(e=>{let n=new EventSource(`/api/runs/${t}/events`),x=["node:start","node:complete","node:skip","node:fail","run:complete","run:state"];for(let f of x)n.addEventListener(f,A=>{this.zone.run(()=>{e.next({type:f,data:JSON.parse(A.data)})})});return n.onerror=()=>{this.zone.run(()=>{e.complete()}),n.close()},()=>{n.close()}})}static \u0275fac=function(e){return new(e||a)};static \u0275prov=S({token:a,factory:a.\u0275fac,providedIn:"root"})};function $(a,t){if(a&1&&(r(0,"span",3),o(1),i()),a&2){let e=m();p("ngClass",e.typeBadgeClass),s(),d(e.type)}}function j(a,t){if(a&1&&(r(0,"span",4),o(1),i()),a&2){let e=m();s(),_("",(e.durationMs/1e3).toFixed(1),"s")}}function z(a,t){a&1&&(r(0,"span",5),o(1,"running..."),i())}function B(a,t){a&1&&(r(0,"span",6),o(1,"skipped"),i())}function P(a,t){a&1&&(r(0,"span",7),o(1,"FAILED"),i())}var h=class a{nodeId="";status="pending";type;durationMs;get statusIcon(){switch(this.status){case"completed":return"\u2713";case"running":return"\u25CF";case"failed":return"\u2717";case"skipped":return"\u2298";default:return"\u25CB"}}get statusIconClass(){switch(this.status){case"completed":return"text-green-400";case"running":return"text-blue-400 animate-pulse";case"failed":return"text-red-400";case"skipped":return"text-slate-500";default:return"text-slate-600"}}get statusTextClass(){switch(this.status){case"pending":return"text-slate-500";case"skipped":return"text-slate-500";default:return"text-slate-100"}}get typeBadgeClass(){switch(this.type){case"prompt":return"bg-purple-500/10 text-purple-400";case"bash":return"bg-amber-500/10 text-amber-400";case"command":return"bg-cyan-500/10 text-cyan-400";default:return"bg-slate-700 text-slate-400"}}static \u0275fac=function(e){return new(e||a)};static \u0275cmp=g({type:a,selectors:[["app-node-status-row"]],inputs:{nodeId:"nodeId",status:"status",type:"type",durationMs:"durationMs"},decls:10,vars:9,consts:[[1,"flex","items-center","py-2.5","border-b","border-slate-800"],[1,"mr-3","text-sm",3,"ngClass"],[1,"flex-1",3,"ngClass"],[1,"text-xs","px-1.5","py-0.5","rounded","mr-2",3,"ngClass"],[1,"font-mono","text-xs","text-slate-400"],[1,"font-mono","text-xs","text-blue-400","animate-pulse"],[1,"text-xs","text-slate-500"],[1,"text-xs","text-red-400"]],template:function(e,n){e&1&&(r(0,"div",0)(1,"span",1),o(2),i(),r(3,"span",2),o(4),i(),u(5,$,2,2,"span",3),u(6,j,2,1,"span",4),u(7,z,2,0,"span",5),u(8,B,2,0,"span",6),u(9,P,2,0,"span",7),i()),e&2&&(s(),p("ngClass",n.statusIconClass),s(),d(n.statusIcon),s(),p("ngClass",n.statusTextClass),s(),d(n.nodeId),s(),l(n.type?5:-1),s(),l(n.status==="completed"&&n.durationMs!==void 0?6:-1),s(),l(n.status==="running"?7:-1),s(),l(n.status==="skipped"?8:-1),s(),l(n.status==="failed"?9:-1))},dependencies:[b,v],encapsulation:2})};var J=(a,t)=>t.id;function Z(a,t){if(a&1&&(r(0,"span",6),o(1),i()),a&2){let e=m();p("ngClass",e.statusClass(e.run.status)),s(),R(" ",e.statusIcon(e.run.status)," ",e.run.status," ")}}function q(a,t){if(a&1&&N(0,"app-node-status-row",8),a&2){let e=t.$implicit;p("nodeId",e.id)("status",e.status)("durationMs",e.durationMs)}}function G(a,t){if(a&1&&(r(0,"div",9)(1,"span",10),o(2,"Elapsed: "),r(3,"span",11),o(4),i()(),r(5,"span",12),o(6,"Nodes: "),r(7,"span",13),o(8),i(),o(9,"/"),r(10,"span",14),o(11),i(),o(12," completed "),i()()),a&2){let e=m();s(4),d(e.elapsedDisplay),s(4),d(e.completedCount),s(3),d(e.nodes.length)}}var O=class a{route=c(D);api=c(M);sse=c(C);run;nodes=[];sseSub;timerInterval;startTime=Date.now();ngOnInit(){let t=this.route.snapshot.paramMap.get("runId");this.api.getRun(t).subscribe(e=>{this.run=e,this.startTime=new Date(e.startedAt).getTime(),this.rebuildNodeList()}),this.sseSub=this.sse.connect(t).subscribe(e=>{this.handleSseEvent(e)}),this.timerInterval=setInterval(()=>{},1e3)}ngOnDestroy(){this.sseSub?.unsubscribe(),this.timerInterval&&clearInterval(this.timerInterval)}handleSseEvent(t){let e=t.data,n=e.nodeId;switch(t.type){case"run:state":this.run=e,this.startTime=new Date(this.run.startedAt).getTime(),this.rebuildNodeList();break;case"node:start":this.updateNodeStatus(n,"running");break;case"node:complete":this.updateNodeStatus(n,"completed",e.durationMs);break;case"node:skip":this.updateNodeStatus(n,"skipped");break;case"node:fail":this.updateNodeStatus(n,"failed");break;case"run:complete":this.run&&(this.run.status=e.success?"completed":"failed");break}}rebuildNodeList(){this.run&&(this.nodes=Object.entries(this.run.nodes).map(([t,e])=>({id:t,status:e.status,durationMs:e.durationMs})))}updateNodeStatus(t,e,n){let x=this.nodes.find(f=>f.id===t);x?(x.status=e,n!==void 0&&(x.durationMs=n)):this.nodes.push({id:t,status:e,durationMs:n})}get completedCount(){return this.nodes.filter(t=>t.status==="completed").length}get elapsedDisplay(){let t=Math.floor((Date.now()-this.startTime)/1e3),e=Math.floor(t/60),n=t%60;return e>0?`${e}m ${n}s`:`${n}s`}statusClass(t){switch(t){case"completed":return"bg-green-500/10 text-green-400";case"failed":return"bg-red-500/10 text-red-400";case"running":return"bg-blue-500/10 text-blue-400";default:return"bg-slate-700 text-slate-400"}}statusIcon(t){switch(t){case"completed":return"\u2713";case"failed":return"\u2717";case"running":return"\u25CF";default:return"\u25CB"}}static \u0275fac=function(e){return new(e||a)};static \u0275cmp=g({type:a,selectors:[["app-run-execution"]],decls:17,vars:4,consts:[[1,"max-w-3xl","mx-auto"],[1,"flex","items-center","mb-6","gap-2","text-sm"],["routerLink","/",1,"text-slate-500","hover:text-slate-300"],[1,"text-slate-600"],[1,"text-slate-300"],[1,"font-mono","text-slate-100"],[1,"text-xs","px-2","py-0.5","rounded","ml-2",3,"ngClass"],[1,"mb-6"],[3,"nodeId","status","durationMs"],[1,"bg-slate-800","rounded-lg","px-4","py-3","flex","items-center","text-sm"],[1,"text-slate-400"],[1,"text-slate-100","font-mono"],[1,"ml-6","text-slate-400"],[1,"text-green-400"],[1,"text-slate-100"]],template:function(e,n){e&1&&(r(0,"div",0)(1,"div",1)(2,"a",2),o(3,"Dashboard"),i(),r(4,"span",3),o(5,"\u203A"),i(),r(6,"span",4),o(7),i(),r(8,"span",3),o(9,"\u203A"),i(),r(10,"span",5),o(11),i(),u(12,Z,2,3,"span",6),i(),r(13,"div",7),E(14,q,1,3,"app-node-status-row",8,J),i(),u(16,G,13,3,"div",9),i()),e&2&&(s(7),d(n.run==null?null:n.run.workflow),s(4),d(n.run==null?null:n.run.runId),s(),l(n.run?12:-1),s(2),w(n.nodes),s(2),l(n.run?16:-1))},dependencies:[b,v,k,h],encapsulation:2})};export{O as RunExecutionComponent};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as N}from"./chunk-XGYEZIV4.js";import{a as F}from"./chunk-RGFLNLPM.js";import{E as c,F as x,G as d,H as r,I as n,J as h,K as k,L as f,M as b,O as i,P as l,Q as y,R as S,X as g,Y as C,Z as D,ea as E,fa as R,ga as I,l as p,m as _,ma as T,n as v,na as W,u as o,x as w}from"./chunk-RKWDHBN3.js";var $=a=>["/workflows",a],V=a=>["/runs",a],B=(a,e)=>e.name,M=(a,e)=>e.runId;function O(a,e){if(a&1){let t=k();r(0,"div",3)(1,"a",9)(2,"div",10),i(3),n(),r(4,"div",11),i(5),n()(),r(6,"div",12)(7,"span",13),i(8),n(),r(9,"button",14),f("click",function(){let m=_(t).$implicit,u=b();return v(u.openRunDialog(m.name))}),i(10,"Run \u25B6"),n()()()}if(a&2){let t=e.$implicit;o(),d("routerLink",g(4,$,t.name)),o(2),l(t.name),o(2),l(t.description),o(3),y("",t.nodeCount," nodes")}}function A(a,e){if(a&1&&(r(0,"div",6)(1,"span",15),i(2),n(),r(3,"span",16),i(4),n(),r(5,"span")(6,"span",17),i(7),n()(),r(8,"span",13),i(9),C(10,"date"),n(),r(11,"a",18),i(12,"View \u2192"),n()()),a&2){let t=e.$implicit,s=b();o(2),l(t.runId),o(2),l(t.workflow),o(2),d("ngClass",s.statusClass(t.status)),o(),S(" ",s.statusIcon(t.status)," ",t.status," "),o(2),l(D(10,7,t.startedAt,"short")),o(2),d("routerLink",g(10,V,t.runId))}}function P(a,e){a&1&&(r(0,"div",7),i(1,'No runs yet. Click "Run \u25B6" on a workflow to start.'),n())}var L=class a{api=p(F);router=p(T);workflows=[];runs=[];showRunDialog=!1;selectedWorkflow="";ngOnInit(){this.api.getWorkflows().subscribe(e=>this.workflows=e),this.api.getRuns().subscribe(e=>this.runs=e.reverse())}openRunDialog(e){this.selectedWorkflow=e,this.showRunDialog=!0}onStartRun(e){this.showRunDialog=!1,this.api.startRun(this.selectedWorkflow,e).subscribe(t=>{this.router.navigate(["/runs",t.runId])})}statusClass(e){switch(e){case"completed":return"bg-green-500/10 text-green-400";case"failed":return"bg-red-500/10 text-red-400";case"running":return"bg-blue-500/10 text-blue-400";default:return"bg-slate-700 text-slate-400"}}statusIcon(e){switch(e){case"completed":return"\u2713";case"failed":return"\u2717";case"running":return"\u25CF";default:return"\u25CB"}}static \u0275fac=function(t){return new(t||a)};static \u0275cmp=w({type:a,selectors:[["app-dashboard"]],decls:23,vars:3,consts:[[1,"max-w-6xl","mx-auto"],[1,"text-xs","font-semibold","text-slate-400","uppercase","tracking-wider","mb-3"],[1,"grid","grid-cols-1","md:grid-cols-2","lg:grid-cols-3","gap-3","mb-8"],[1,"bg-slate-800","rounded-lg","p-4","border","border-slate-700","hover:border-slate-600","transition-colors"],[1,"bg-slate-800","rounded-lg","border","border-slate-700","overflow-hidden"],[1,"grid","grid-cols-[1fr_1.5fr_1fr_1fr_0.5fr]","px-4","py-2","text-xs","text-slate-500","uppercase","border-b","border-slate-700"],[1,"grid","grid-cols-[1fr_1.5fr_1fr_1fr_0.5fr]","px-4","py-2.5","text-sm","border-b","border-slate-800","items-center"],[1,"px-4","py-6","text-center","text-sm","text-slate-500"],[3,"run","closed","visible","workflowName"],[1,"block",3,"routerLink"],[1,"font-semibold","text-slate-100","mb-1"],[1,"text-xs","text-slate-500","mb-3","line-clamp-2"],[1,"flex","items-center"],[1,"text-xs","text-slate-400"],[1,"ml-auto","bg-blue-600","text-white","text-xs","px-3","py-1","rounded","hover:bg-blue-500",3,"click"],[1,"font-mono","text-slate-400","text-xs"],[1,"text-slate-100"],[1,"text-xs","px-2","py-0.5","rounded",3,"ngClass"],[1,"text-xs","text-blue-400","hover:text-blue-300",3,"routerLink"]],template:function(t,s){t&1&&(r(0,"div",0)(1,"h2",1),i(2,"Workflows"),n(),r(3,"div",2),c(4,O,11,6,"div",3,B),n(),r(6,"h2",1),i(7,"Recent Runs"),n(),r(8,"div",4)(9,"div",5)(10,"span"),i(11,"Run ID"),n(),r(12,"span"),i(13,"Workflow"),n(),r(14,"span"),i(15,"Status"),n(),r(16,"span"),i(17,"Started"),n(),h(18,"span"),n(),c(19,A,13,12,"div",6,M,!1,P,2,0,"div",7),n()(),r(22,"app-run-dialog",8),f("run",function(u){return s.onStartRun(u)})("closed",function(){return s.showRunDialog=!1}),n()),t&2&&(o(4),x(s.workflows),o(15),x(s.runs),o(3),d("visible",s.showRunDialog)("workflowName",s.selectedWorkflow))},dependencies:[I,E,W,N,R],encapsulation:2})};export{L as DashboardComponent};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{i as n,ia as i,l as s}from"./chunk-RKWDHBN3.js";var o=class r{http=s(i);getWorkflows(){return this.http.get("/api/workflows")}getWorkflow(t){return this.http.get(`/api/workflows/${t}`)}getRuns(){return this.http.get("/api/runs")}getRun(t){return this.http.get(`/api/runs/${t}`)}startRun(t,e){return this.http.post("/api/runs",{workflow:t,args:e})}static \u0275fac=function(e){return new(e||r)};static \u0275prov=n({token:r,factory:r.\u0275fac,providedIn:"root"})};export{o as a};
|