@ngocsangairvds/vsaf 4.1.14 → 4.1.16

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.
Files changed (136) hide show
  1. package/package.json +1 -1
  2. package/skills/vds-skill/runtime/AGENTS.md +10 -10
  3. package/skills/vds-skill/runtime/AGENTS.vi.md +6 -6
  4. package/skills/vds-skill/runtime/README.md +3 -3
  5. package/skills/vds-skill/runtime/bitbucket_orchestrator/BITBUCKET_API_PRACTICES.md +1 -1
  6. package/skills/vds-skill/runtime/bitbucket_orchestrator/FEATURES.md +75 -75
  7. package/skills/vds-skill/runtime/bitbucket_orchestrator/README.md +102 -102
  8. package/skills/vds-skill/runtime/brd_orchestrator/README.md +2 -2
  9. package/skills/vds-skill/runtime/confluence_orchestrator/README.md +97 -97
  10. package/skills/vds-skill/runtime/confluence_orchestrator/SYNC_SCRIPTS.md +12 -12
  11. package/skills/vds-skill/runtime/confluence_orchestrator/SYNC_STANDARDIZATION.md +6 -6
  12. package/skills/vds-skill/runtime/confluence_orchestrator/src/confluence_orchestrator/config.py +1 -1
  13. package/skills/vds-skill/runtime/diagram_generator/README.md +5 -5
  14. package/skills/vds-skill/runtime/docker/ROLLBACK.md +1 -1
  15. package/skills/vds-skill/runtime/docs/README.md +30 -30
  16. package/skills/vds-skill/runtime/docs/agents/explanation/runtime-verification-and-gap-reporting.md +4 -4
  17. package/skills/vds-skill/runtime/docs/agents/how-to/02-using-vds-ai-memory.md +1 -1
  18. package/skills/vds-skill/runtime/docs/agents/how-to/apply-phase3-migration.md +2 -2
  19. package/skills/vds-skill/runtime/docs/agents/how-to/first-audit-run.md +1 -1
  20. package/skills/vds-skill/runtime/docs/agents/how-to/install-and-bootstrap-who-scripts-and-skills.md +14 -14
  21. package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/analytics-pipeline-workflow.md +9 -9
  22. package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/code-quality-gate-workflow.md +5 -5
  23. package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/confluence-bitbucket-sync-workflow.md +9 -9
  24. package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/document-delivery-workflow.md +3 -3
  25. package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/memory-progress-workflow.md +9 -9
  26. package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/research-spec-audit-workflow.md +8 -8
  27. package/skills/vds-skill/runtime/docs/agents/how-to/phase131-all-project-preparation.md +13 -13
  28. package/skills/vds-skill/runtime/docs/agents/how-to/phase131-bounded-parallel-analysis.md +6 -6
  29. package/skills/vds-skill/runtime/docs/agents/how-to/phase131-confluence-upload-recovery.md +4 -4
  30. package/skills/vds-skill/runtime/docs/agents/how-to/run-ecosystem-daily-report.md +8 -8
  31. package/skills/vds-skill/runtime/docs/agents/reference/audit-triage-playbook.md +10 -10
  32. package/skills/vds-skill/runtime/docs/agents/reference/cli-commands.md +34 -34
  33. package/skills/vds-skill/runtime/docs/agents/reference/cli-help-matrix.md +6 -6
  34. package/skills/vds-skill/runtime/docs/agents/reference/ecosystem-daily-report.md +3 -3
  35. package/skills/vds-skill/runtime/docs/agents/reference/portable-paths-and-config.md +0 -0
  36. package/skills/vds-skill/runtime/docs/agents/reference/portable-paths-validation-matrix.md +2 -2
  37. package/skills/vds-skill/runtime/docs/agents/reference/vds-ai-memory-api.md +1 -1
  38. package/skills/vds-skill/runtime/docs/agents/tutorials/who-skills-and-scripts-onboarding.md +4 -4
  39. package/skills/vds-skill/runtime/docs/agents/tutorials/zero-to-productive-developer.md +14 -14
  40. package/skills/vds-skill/runtime/docs/vi/agents/explanation/runtime-verification-and-gap-reporting.md +4 -4
  41. package/skills/vds-skill/runtime/docs/vi/agents/how-to/02-using-vds-ai-memory.md +1 -1
  42. package/skills/vds-skill/runtime/docs/vi/agents/how-to/first-audit-run.md +1 -1
  43. package/skills/vds-skill/runtime/docs/vi/agents/how-to/install-and-bootstrap-who-scripts-and-skills.md +10 -10
  44. package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/analytics-pipeline-workflow.md +9 -9
  45. package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/code-quality-gate-workflow.md +5 -5
  46. package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/confluence-bitbucket-sync-workflow.md +9 -9
  47. package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/document-delivery-workflow.md +3 -3
  48. package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/memory-progress-workflow.md +9 -9
  49. package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/research-spec-audit-workflow.md +8 -8
  50. package/skills/vds-skill/runtime/docs/vi/agents/how-to/phase131-all-project-preparation.md +13 -13
  51. package/skills/vds-skill/runtime/docs/vi/agents/how-to/phase131-bounded-parallel-analysis.md +6 -6
  52. package/skills/vds-skill/runtime/docs/vi/agents/how-to/phase131-confluence-upload-recovery.md +4 -4
  53. package/skills/vds-skill/runtime/docs/vi/agents/how-to/tips-and-tricks.md +1 -1
  54. package/skills/vds-skill/runtime/docs/vi/agents/reference/audit-triage-playbook.md +10 -10
  55. package/skills/vds-skill/runtime/docs/vi/agents/reference/cli-commands.md +34 -34
  56. package/skills/vds-skill/runtime/docs/vi/agents/reference/cli-help-matrix.md +6 -6
  57. package/skills/vds-skill/runtime/docs/vi/agents/reference/portable-paths-and-config.md +3 -3
  58. package/skills/vds-skill/runtime/docs/vi/agents/reference/portable-paths-validation-matrix.md +2 -2
  59. package/skills/vds-skill/runtime/docs/vi/agents/reference/vds-ai-memory-api.md +1 -1
  60. package/skills/vds-skill/runtime/docs/vi/agents/tutorials/who-skills-and-scripts-onboarding.md +4 -4
  61. package/skills/vds-skill/runtime/docs/vi/agents/tutorials/zero-to-productive-developer.md +4 -4
  62. package/skills/vds-skill/runtime/elastic_orchestrator/README.md +31 -31
  63. package/skills/vds-skill/runtime/elastic_orchestrator/src/vds_elastic_orchestrator/cli.py +2 -2
  64. package/skills/vds-skill/runtime/excel_orchestrator/README.md +22 -22
  65. package/skills/vds-skill/runtime/git_orchestrator/README.md +46 -46
  66. package/skills/vds-skill/runtime/google_sheets_orchestrator/README.md +15 -15
  67. package/skills/vds-skill/runtime/grafana_orchestrator/README.md +44 -44
  68. package/skills/vds-skill/runtime/grafana_orchestrator/src/vds_grafana_orchestrator/cli.py +2 -2
  69. package/skills/vds-skill/runtime/jira_orchestrator/README.md +119 -119
  70. package/skills/vds-skill/runtime/jira_viettelmoney_orchestrator/README.md +117 -117
  71. package/skills/vds-skill/runtime/markdown_orchestrator/README.md +9 -9
  72. package/skills/vds-skill/runtime/pdf_orchestrator/README.md +4 -4
  73. package/skills/vds-skill/runtime/scripts/README.md +2 -2
  74. package/skills/vds-skill/runtime/scripts/move_audit_artifact_pages.py +1 -1
  75. package/skills/vds-skill/runtime/scripts/move_audit_artifact_pages_rest.py +1 -1
  76. package/skills/vds-skill/runtime/scripts/move_wrong_dept_pages.py +1 -1
  77. package/skills/vds-skill/runtime/scripts/uv-workspace-alignment-verification-2026-03-25.md +1 -1
  78. package/skills/vds-skill/runtime/sonarqube_orchestrator/IMPLEMENTATION_AUDIT.md +1 -1
  79. package/skills/vds-skill/runtime/sonarqube_orchestrator/README.md +11 -11
  80. package/skills/vds-skill/runtime/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/cli.py +3 -3
  81. package/skills/vds-skill/runtime/vds_agent_core/docs/embedding.md +3 -3
  82. package/skills/vds-skill/runtime/vds_cli/README.md +48 -48
  83. package/skills/vds-skill/runtime/vds_cli/src/vds_cli/cli.py +1 -1
  84. package/skills/vds-skill/runtime/vds_cli/src/vds_cli/confluence_sync.py +3 -3
  85. package/skills/vds-skill/runtime/vds_cli/tests/unit/test_confluence_sync.py +1 -1
  86. package/skills/vds-skill/runtime/vds_cli_common/tests/test_env.py +0 -105
  87. package/skills/vds-skill/runtime/diagram_generator/ci_validate.sh +0 -16
  88. package/skills/vds-skill/runtime/pdf_orchestrator/scripts/setup_team.sh +0 -324
  89. package/skills/vds-skill/runtime/scripts/audit-cli-patterns.sh +0 -135
  90. package/skills/vds-skill/runtime/scripts/audit-dashboard.sh +0 -525
  91. package/skills/vds-skill/runtime/scripts/backup.sh +0 -123
  92. package/skills/vds-skill/runtime/scripts/bootstrap_uv.sh +0 -69
  93. package/skills/vds-skill/runtime/scripts/ci/assert_no_openspace_commits.sh +0 -37
  94. package/skills/vds-skill/runtime/scripts/ci/verify_branch_protection.sh +0 -64
  95. package/skills/vds-skill/runtime/scripts/closure/phase1_check.sh +0 -483
  96. package/skills/vds-skill/runtime/scripts/closure/phase2_check.sh +0 -500
  97. package/skills/vds-skill/runtime/scripts/deploy-bootstrap.sh +0 -201
  98. package/skills/vds-skill/runtime/scripts/deployment/load_docker_images_offline.sh +0 -90
  99. package/skills/vds-skill/runtime/scripts/dev/cli_smoke.sh +0 -259
  100. package/skills/vds-skill/runtime/scripts/init-pgbouncer-userlist.sh +0 -154
  101. package/skills/vds-skill/runtime/scripts/openspace_bootstrap.sh +0 -56
  102. package/skills/vds-skill/runtime/scripts/openspace_common.sh +0 -75
  103. package/skills/vds-skill/runtime/scripts/openspace_doctor.sh +0 -61
  104. package/skills/vds-skill/runtime/scripts/openspace_sync_shadow.sh +0 -65
  105. package/skills/vds-skill/runtime/scripts/phase7-baseline.sh +0 -77
  106. package/skills/vds-skill/runtime/scripts/preflight/env_check.sh +0 -102
  107. package/skills/vds-skill/runtime/scripts/repair_autopay_reports.sh +0 -173
  108. package/skills/vds-skill/runtime/scripts/rollback_drill.sh +0 -659
  109. package/skills/vds-skill/runtime/scripts/run-audit-in-tmux.sh +0 -286
  110. package/skills/vds-skill/runtime/scripts/run-department-audit.sh +0 -495
  111. package/skills/vds-skill/runtime/scripts/run-project-audit.sh +0 -267
  112. package/skills/vds-skill/runtime/scripts/smoke-test-deploy.sh +0 -137
  113. package/skills/vds-skill/runtime/scripts/target-state-automation/confluence_sync_coordinator.sh +0 -27
  114. package/skills/vds-skill/runtime/scripts/target-state-automation/coordination.sh +0 -114
  115. package/skills/vds-skill/runtime/scripts/target-state-automation/diagram_coordinator.sh +0 -25
  116. package/skills/vds-skill/runtime/scripts/target-state-automation/docs_root.sh +0 -22
  117. package/skills/vds-skill/runtime/scripts/target-state-automation/generate_diagrams.sh +0 -22
  118. package/skills/vds-skill/runtime/scripts/target-state-automation/markdown_coordinator.sh +0 -25
  119. package/skills/vds-skill/runtime/scripts/target-state-automation/progress_dashboard.sh +0 -17
  120. package/skills/vds-skill/runtime/scripts/target-state-automation/schema_coordinator.sh +0 -25
  121. package/skills/vds-skill/runtime/scripts/target-state-automation/sync_confluence.sh +0 -30
  122. package/skills/vds-skill/runtime/scripts/target-state-automation/update_dependencies.sh +0 -19
  123. package/skills/vds-skill/runtime/scripts/target-state-automation/validate_links.sh +0 -86
  124. package/skills/vds-skill/runtime/scripts/target-state-automation/validate_markdown.sh +0 -52
  125. package/skills/vds-skill/runtime/scripts/target-state-automation/validate_schemas.sh +0 -26
  126. package/skills/vds-skill/runtime/scripts/target-state-automation/validate_structure.sh +0 -98
  127. package/skills/vds-skill/runtime/scripts/validate-cli-standardization.sh +0 -188
  128. package/skills/vds-skill/runtime/scripts/vds_sh_helpers.sh +0 -180
  129. package/skills/vds-skill/runtime/scripts/verification/phase2_portable_paths_ubuntu_docker.sh +0 -26
  130. package/skills/vds-skill/runtime/scripts/verify-memory-cli-e2e.sh +0 -598
  131. package/skills/vds-skill/runtime/scripts/verify-worktree-features.sh +0 -306
  132. package/skills/vds-skill/runtime/scripts/worktree-add.sh +0 -128
  133. package/skills/vds-skill/runtime/scripts/worktree-remove.sh +0 -112
  134. package/skills/vds-skill/runtime/scripts/worktree_compose.sh +0 -269
  135. package/skills/vds-skill/runtime/scripts/worktree_uv.sh +0 -77
  136. package/skills/vds-skill/runtime/sonarqube_orchestrator/scripts/ensure_symlink.sh +0 -38
@@ -1,495 +0,0 @@
1
- #!/usr/bin/env bash
2
- # run-department-audit.sh — Department-wide audit launcher
3
- #
4
- # Discovers all projects in a department via vds-cli audit state, resolves
5
- # checklist page IDs, and delegates to run-audit-in-tmux.sh with a single
6
- # parent tmux session running workflow-projects.
7
- #
8
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
9
- # Usage:
10
- # ./scripts/run-department-audit.sh [options] <department-selector>
11
- #
12
- # The department selector can be a name, Confluence page ID, or storage key.
13
- #
14
- # Options:
15
- # --checklist-page-id ID Override checklist for all projects
16
- # --repos FILTER Restrict repos within each project
17
- # --profiles LIST Restrict LLM profiles
18
- # --max-concurrent N Child-level concurrency (default: 16)
19
- # --max-projects-concurrent N Parent-level project concurrency (default: 3)
20
- # --project-filter KEYS Comma-separated project keys to include
21
- # --project-exclude KEYS Comma-separated project keys to exclude
22
- # --stagger-seconds N Delay between project launches (default: 5)
23
- # --log-dir DIR Log directory (default: /tmp)
24
- # --dry-run Print command without executing
25
- # --prepare-materials Enable material preparation (default)
26
- # --skip-materials Skip material preparation
27
- # --upload-to-confluence Enable Confluence upload
28
- # --incremental-upload Enable incremental upload
29
- #
30
- # Management:
31
- # --list List active department audit sessions
32
- # --kill DEPT Kill session matching dept-<DEPT>
33
- #
34
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
35
- # Examples:
36
- #
37
- # # Launch audit for a department by name
38
- # ./scripts/run-department-audit.sh "3.2.4 Nền tảng thanh toán"
39
- #
40
- # # Launch by page ID, override checklist, limit concurrency
41
- # ./scripts/run-department-audit.sh 88716700 \
42
- # --checklist-page-id 88722450 --max-projects-concurrent 2
43
- #
44
- # # Dry run with project filter
45
- # ./scripts/run-department-audit.sh 88716700 \
46
- # --project-filter 88718943,88718977 --dry-run
47
- #
48
- # # List active department sessions
49
- # ./scripts/run-department-audit.sh --list
50
- #
51
- # # Kill a department session
52
- # ./scripts/run-department-audit.sh --kill 88716700
53
- #
54
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
55
-
56
- set -euo pipefail
57
-
58
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
59
- # shellcheck source=./vds_sh_helpers.sh
60
- source "$SCRIPT_DIR/vds_sh_helpers.sh"
61
-
62
- ROOT="$(vds_resolve_scripts_root)"
63
-
64
- # ── Defaults ─────────────────────────────────────────────────────────
65
-
66
- LOG_DIR="/tmp"
67
- DRY_RUN=false
68
- CHECKLIST_PAGE_ID=""
69
- REPOS_FILTER=""
70
- PROFILES=""
71
- MAX_CONCURRENT=16
72
- MAX_PROJECTS_CONCURRENT=3
73
- PROJECT_FILTER=""
74
- PROJECT_EXCLUDE=""
75
- STAGGER_SECONDS=5
76
- PREPARE_MATERIALS=true
77
- UPLOAD_TO_CONFLUENCE=false
78
- INCREMENTAL_UPLOAD=false
79
- DEPARTMENT_SELECTOR=""
80
-
81
- # ── Slugify ──────────────────────────────────────────────────────────
82
- # slugify — Convert a department name to a tmux-safe session slug.
83
- #
84
- # Lowercase, replace non-alphanumeric with hyphens, collapse multiples,
85
- # strip leading/trailing hyphens.
86
- # "3.2.4 Nền tảng thanh toán" → "3-2-4-n-n-t-ng-thanh-to-n"
87
- # "88716700" → "88716700"
88
- slugify() {
89
- local input="$1"
90
- printf '%s' "$input" \
91
- | tr '[:upper:]' '[:lower:]' \
92
- | sed 's/[^a-z0-9]/-/g' \
93
- | sed 's/--*/-/g' \
94
- | sed 's/^-//; s/-$//'
95
- }
96
-
97
- # ── Management subcommands ───────────────────────────────────────────
98
-
99
- _list_dept_sessions() {
100
- echo "Active department audit sessions:"
101
- local found=false
102
- while IFS= read -r name; do
103
- case "$name" in dept-*)
104
- local log=""
105
- for candidate in "${LOG_DIR}/audit-${name}.log" "/tmp/audit-${name}.log"; do
106
- [ -f "$candidate" ] && log="$candidate" && break
107
- done
108
- local info=""
109
- if [ -n "$log" ]; then
110
- local lines
111
- lines=$(wc -l < "$log" 2>/dev/null)
112
- info=" (log: ${lines} lines)"
113
- fi
114
- echo " $name$info"
115
- found=true
116
- ;;
117
- esac
118
- done < <(tmux list-sessions -F '#{session_name}' 2>/dev/null || true)
119
- if [ "$found" = false ]; then
120
- echo " (no department audit sessions found)"
121
- fi
122
- }
123
-
124
- _kill_dept_session() {
125
- local dept="$1"
126
- local session="dept-${dept}"
127
- if tmux has-session -t "$session" 2>/dev/null; then
128
- tmux kill-session -t "$session"
129
- echo "Killed session: $session"
130
- else
131
- echo "No session named: $session"
132
- fi
133
- }
134
-
135
- # ── Option parsing ───────────────────────────────────────────────────
136
-
137
- while [[ $# -gt 0 ]]; do
138
- case "$1" in
139
- --checklist-page-id)
140
- CHECKLIST_PAGE_ID="$2"; shift 2 ;;
141
- --repos)
142
- REPOS_FILTER="$2"; shift 2 ;;
143
- --profiles)
144
- PROFILES="$2"; shift 2 ;;
145
- --max-concurrent)
146
- MAX_CONCURRENT="$2"; shift 2 ;;
147
- --max-projects-concurrent)
148
- MAX_PROJECTS_CONCURRENT="$2"; shift 2 ;;
149
- --project-filter)
150
- PROJECT_FILTER="$2"; shift 2 ;;
151
- --project-exclude)
152
- PROJECT_EXCLUDE="$2"; shift 2 ;;
153
- --stagger-seconds)
154
- STAGGER_SECONDS="$2"; shift 2 ;;
155
- --log-dir)
156
- LOG_DIR="$2"; shift 2 ;;
157
- --dry-run)
158
- DRY_RUN=true; shift ;;
159
- --prepare-materials)
160
- PREPARE_MATERIALS=true; shift ;;
161
- --skip-materials)
162
- PREPARE_MATERIALS=false; shift ;;
163
- --upload-to-confluence)
164
- UPLOAD_TO_CONFLUENCE=true; shift ;;
165
- --incremental-upload)
166
- INCREMENTAL_UPLOAD=true; shift ;;
167
- --list)
168
- _list_dept_sessions; exit 0 ;;
169
- --kill)
170
- _kill_dept_session "${2:?--kill requires department slug or ID}"
171
- exit 0 ;;
172
- -*)
173
- echo "Unknown option: $1" >&2; exit 1 ;;
174
- *)
175
- if [ -z "$DEPARTMENT_SELECTOR" ]; then
176
- DEPARTMENT_SELECTOR="$1"; shift
177
- else
178
- echo "Error: unexpected argument: $1" >&2; exit 1
179
- fi
180
- ;;
181
- esac
182
- done
183
-
184
- if [ -z "$DEPARTMENT_SELECTOR" ]; then
185
- echo "Error: department selector is required" >&2
186
- echo "Usage: $0 [options] <department-name|page-id|storage-key>" >&2
187
- exit 1
188
- fi
189
-
190
- # ── Project discovery (TSK-165.9) ────────────────────────────────────
191
-
192
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
193
- echo " Discovering projects for department: $DEPARTMENT_SELECTOR"
194
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
195
-
196
- # Query ALL projects (no --department filter) because the SQL filter only
197
- # matches the full Vietnamese department name. We filter client-side below
198
- # against department, department_page_id, and department_storage_key.
199
- QUERY_OUTPUT="$(vds_uv_run_package audit_orchestrator \
200
- vds-cli audit --json-only state query-projects)"
201
-
202
- # Parse project list and metadata from JSON output.
203
- # The API returns {"result": [...], "status": "ok", ...}.
204
- # Client-side filter: match DEPARTMENT_SELECTOR against department,
205
- # department_page_id, or department_storage_key (case-insensitive, partial
206
- # match for the department name field).
207
- # Checklist resolution order:
208
- # 1. metadata.checklist_page_id (if non-null)
209
- # 2. metadata.checklist_profiles[0].page_ids[0] (if available)
210
- PARSED="$(python3 -c "
211
- import json, sys
212
-
213
- selector = sys.argv[1]
214
- sel_lower = selector.lower()
215
-
216
- data = json.loads(sys.stdin.read())
217
- projects = data.get('result', [])
218
- if not isinstance(projects, list):
219
- projects = []
220
-
221
- dept_name = ''
222
- dept_storage_key = ''
223
-
224
- for p in projects:
225
- # Match against three fields
226
- p_dept = str(p.get('department', ''))
227
- p_dept_page_id = str(p.get('department_page_id', ''))
228
- p_dept_skey = str(p.get('department_storage_key', ''))
229
-
230
- matched = False
231
- if sel_lower == p_dept_page_id.lower():
232
- matched = True
233
- elif sel_lower == p_dept_skey.lower():
234
- matched = True
235
- elif sel_lower in p_dept.lower():
236
- matched = True
237
-
238
- if not matched:
239
- continue
240
-
241
- # Capture department name / storage key from first match
242
- if not dept_name:
243
- dept_name = p_dept
244
- if not dept_storage_key:
245
- dept_storage_key = p_dept_skey
246
-
247
- key = str(p.get('project_storage_key', p.get('storage_key', p.get('key', ''))))
248
- name = p.get('project_name', p.get('name', ''))
249
- meta = p.get('metadata') or {}
250
-
251
- # Resolve checklist page ID
252
- cl_id = ''
253
- raw = meta.get('checklist_page_id')
254
- if raw:
255
- cl_id = str(raw)
256
- else:
257
- profiles = meta.get('checklist_profiles') or []
258
- if profiles:
259
- page_ids = profiles[0].get('page_ids') or []
260
- if page_ids:
261
- cl_id = str(page_ids[0])
262
-
263
- print(f'PROJECT={key}|{name}|{cl_id}')
264
-
265
- # Emit department metadata for slug / display
266
- print('DEPT_NAME=' + dept_name)
267
- print('DEPT_STORAGE_KEY=' + dept_storage_key)
268
- " "$DEPARTMENT_SELECTOR" <<< "$QUERY_OUTPUT")"
269
-
270
- # Extract department name and storage key for slug
271
- DEPT_NAME="$(echo "$PARSED" | grep '^DEPT_NAME=' | head -1 | sed 's/^DEPT_NAME=//')"
272
- DEPT_STORAGE_KEY="$(echo "$PARSED" | grep '^DEPT_STORAGE_KEY=' | head -1 | sed 's/^DEPT_STORAGE_KEY=//')"
273
- if [ -z "$DEPT_NAME" ]; then
274
- DEPT_NAME="$DEPARTMENT_SELECTOR"
275
- fi
276
-
277
- # Prefer the storage key for the slug (already ASCII-safe)
278
- if [ -n "$DEPT_STORAGE_KEY" ]; then
279
- DEPT_SLUG="$DEPT_STORAGE_KEY"
280
- else
281
- DEPT_SLUG="$(slugify "$DEPT_NAME")"
282
- fi
283
- SESSION_NAME="dept-${DEPT_SLUG}"
284
-
285
- # Build arrays of discovered projects
286
- declare -a PROJECT_KEYS=()
287
- declare -a PROJECT_NAMES=()
288
- declare -a PROJECT_CHECKLISTS=()
289
-
290
- while IFS= read -r line; do
291
- [[ "$line" != PROJECT=* ]] && continue
292
- line="${line#PROJECT=}"
293
- IFS='|' read -r key name cl_id <<< "$line"
294
- PROJECT_KEYS+=("$key")
295
- PROJECT_NAMES+=("$name")
296
- PROJECT_CHECKLISTS+=("$cl_id")
297
- done <<< "$PARSED"
298
-
299
- if [ ${#PROJECT_KEYS[@]} -eq 0 ]; then
300
- echo "Error: no projects found for department: $DEPARTMENT_SELECTOR" >&2
301
- exit 1
302
- fi
303
-
304
- echo " Found ${#PROJECT_KEYS[@]} project(s)"
305
-
306
- # ── Apply project filters ────────────────────────────────────────────
307
-
308
- declare -a FILTERED_KEYS=()
309
- declare -a FILTERED_NAMES=()
310
- declare -a FILTERED_CHECKLISTS=()
311
-
312
- for i in "${!PROJECT_KEYS[@]}"; do
313
- key="${PROJECT_KEYS[$i]}"
314
-
315
- # --project-filter: include only matching keys
316
- if [ -n "$PROJECT_FILTER" ]; then
317
- if ! echo ",$PROJECT_FILTER," | grep -q ",$key,"; then
318
- continue
319
- fi
320
- fi
321
-
322
- # --project-exclude: skip matching keys
323
- if [ -n "$PROJECT_EXCLUDE" ]; then
324
- if echo ",$PROJECT_EXCLUDE," | grep -q ",$key,"; then
325
- continue
326
- fi
327
- fi
328
-
329
- FILTERED_KEYS+=("$key")
330
- FILTERED_NAMES+=("${PROJECT_NAMES[$i]}")
331
- FILTERED_CHECKLISTS+=("${PROJECT_CHECKLISTS[$i]}")
332
- done
333
-
334
- if [ ${#FILTERED_KEYS[@]} -eq 0 ]; then
335
- echo "Error: all projects excluded by filters" >&2
336
- echo " --project-filter: ${PROJECT_FILTER:-<none>}" >&2
337
- echo " --project-exclude: ${PROJECT_EXCLUDE:-<none>}" >&2
338
- exit 1
339
- fi
340
-
341
- echo " After filters: ${#FILTERED_KEYS[@]} project(s)"
342
-
343
- # ── Resolve checklist page IDs ───────────────────────────────────────
344
-
345
- declare -a RESOLVED_CHECKLISTS=()
346
- declare -a MISSING_CHECKLIST_PROJECTS=()
347
-
348
- for i in "${!FILTERED_KEYS[@]}"; do
349
- if [ -n "$CHECKLIST_PAGE_ID" ]; then
350
- # Global override applies to all projects
351
- RESOLVED_CHECKLISTS+=("$CHECKLIST_PAGE_ID")
352
- elif [ -n "${FILTERED_CHECKLISTS[$i]}" ]; then
353
- # Per-project checklist from state metadata
354
- RESOLVED_CHECKLISTS+=("${FILTERED_CHECKLISTS[$i]}")
355
- else
356
- RESOLVED_CHECKLISTS+=("")
357
- MISSING_CHECKLIST_PROJECTS+=("${FILTERED_KEYS[$i]} (${FILTERED_NAMES[$i]})")
358
- fi
359
- done
360
-
361
- if [ ${#MISSING_CHECKLIST_PROJECTS[@]} -gt 0 ]; then
362
- echo "" >&2
363
- echo "Error: the following projects have no resolvable checklist page ID:" >&2
364
- for entry in "${MISSING_CHECKLIST_PROJECTS[@]}"; do
365
- echo " - $entry" >&2
366
- done
367
- echo "" >&2
368
- echo "Provide --checklist-page-id to override, or ensure state metadata" >&2
369
- echo "contains either checklist_page_id or checklist_profiles[0].page_ids[0] for each project." >&2
370
- exit 1
371
- fi
372
-
373
- # ── Build CSV of project storage keys ────────────────────────────────
374
-
375
- PROJECT_KEYS_CSV=""
376
- for i in "${!FILTERED_KEYS[@]}"; do
377
- if [ -n "$PROJECT_KEYS_CSV" ]; then
378
- PROJECT_KEYS_CSV="${PROJECT_KEYS_CSV},${FILTERED_KEYS[$i]}"
379
- else
380
- PROJECT_KEYS_CSV="${FILTERED_KEYS[$i]}"
381
- fi
382
- done
383
-
384
- # Resolve a single checklist ID if all projects share the same one
385
- COMMON_CHECKLIST=""
386
- if [ -n "$CHECKLIST_PAGE_ID" ]; then
387
- COMMON_CHECKLIST="$CHECKLIST_PAGE_ID"
388
- else
389
- # Check if all resolved checklists are the same
390
- all_same=true
391
- first="${RESOLVED_CHECKLISTS[0]}"
392
- for cl in "${RESOLVED_CHECKLISTS[@]}"; do
393
- if [ "$cl" != "$first" ]; then
394
- all_same=false
395
- break
396
- fi
397
- done
398
- if [ "$all_same" = true ] && [ -n "$first" ]; then
399
- COMMON_CHECKLIST="$first"
400
- fi
401
- fi
402
-
403
- # ── Parent launch (TSK-165.10) ───────────────────────────────────────
404
-
405
- LOG_FILE="${LOG_DIR}/audit-${SESSION_NAME}.log"
406
-
407
- # Build argument list for run-audit-in-tmux.sh
408
- declare -a TMUX_ARGS=()
409
- TMUX_ARGS+=("--log-dir" "$LOG_DIR")
410
- if [ "$DRY_RUN" = true ]; then
411
- TMUX_ARGS+=("--dry-run")
412
- fi
413
- TMUX_ARGS+=("$SESSION_NAME")
414
- TMUX_ARGS+=("workflow-projects")
415
- TMUX_ARGS+=("--project-storage-keys" "$PROJECT_KEYS_CSV")
416
-
417
- if [ -n "$COMMON_CHECKLIST" ]; then
418
- TMUX_ARGS+=("--checklist-page-id" "$COMMON_CHECKLIST")
419
- fi
420
-
421
- TMUX_ARGS+=("--max-projects-concurrent" "$MAX_PROJECTS_CONCURRENT")
422
- TMUX_ARGS+=("--max-concurrent" "$MAX_CONCURRENT")
423
-
424
- if [ -n "$PROFILES" ]; then
425
- TMUX_ARGS+=("--profiles" "$PROFILES")
426
- fi
427
-
428
- if [ -n "$REPOS_FILTER" ]; then
429
- TMUX_ARGS+=("--repos" "$REPOS_FILTER")
430
- fi
431
-
432
- if [ -n "$PROJECT_FILTER" ]; then
433
- TMUX_ARGS+=("--project-filter" "$PROJECT_FILTER")
434
- fi
435
-
436
- if [ -n "$PROJECT_EXCLUDE" ]; then
437
- TMUX_ARGS+=("--project-exclude" "$PROJECT_EXCLUDE")
438
- fi
439
-
440
- if [ "$PREPARE_MATERIALS" = true ]; then
441
- TMUX_ARGS+=("--prepare-materials")
442
- else
443
- TMUX_ARGS+=("--skip-materials")
444
- fi
445
-
446
- if [ "$UPLOAD_TO_CONFLUENCE" = true ]; then
447
- TMUX_ARGS+=("--upload-to-confluence")
448
- fi
449
-
450
- if [ "$INCREMENTAL_UPLOAD" = true ]; then
451
- TMUX_ARGS+=("--incremental-upload")
452
- fi
453
-
454
- # ── Delegate to run-audit-in-tmux.sh ─────────────────────────────────
455
-
456
- "$SCRIPT_DIR/run-audit-in-tmux.sh" "${TMUX_ARGS[@]}"
457
-
458
- # ── Post-launch summary (TSK-165.20 partial) ─────────────────────────
459
-
460
- if [ "$DRY_RUN" = true ]; then
461
- exit 0
462
- fi
463
-
464
- echo ""
465
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
466
- echo " Department audit: $DEPT_NAME"
467
- echo " Session: $SESSION_NAME"
468
- echo " Log: $LOG_FILE"
469
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
470
- echo ""
471
- echo " Selected projects (${#FILTERED_KEYS[@]}):"
472
- for i in "${!FILTERED_KEYS[@]}"; do
473
- cl_info=""
474
- if [ -n "${RESOLVED_CHECKLISTS[$i]}" ]; then
475
- cl_info=" checklist=${RESOLVED_CHECKLISTS[$i]}"
476
- fi
477
- echo " ${FILTERED_KEYS[$i]} ${FILTERED_NAMES[$i]}${cl_info}"
478
- done
479
- echo ""
480
- echo " Monitor:"
481
- echo " $0 --list"
482
- echo " $SCRIPT_DIR/run-audit-in-tmux.sh --status $SESSION_NAME"
483
- echo " tail -f $LOG_FILE"
484
- echo " tmux attach -t $SESSION_NAME"
485
- echo ""
486
- echo " Control:"
487
- echo " $0 --kill $DEPT_SLUG"
488
- echo " $SCRIPT_DIR/run-audit-in-tmux.sh --kill $SESSION_NAME"
489
- echo ""
490
- echo " # Resume interrupted run:"
491
- echo " # ./scripts/worktree_uv.sh run --project vds_cli vds-cli audit workflow-projects --resume --report-dir ~/.vds/cache/audit_runs/workflow-projects/<thread_id>"
492
- echo ""
493
- echo " # Publish-only (if parent run completed but upload was skipped):"
494
- echo " # vds-cli audit publish-project-run --resume-run <thread_id> --upload-to-confluence"
495
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"