@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.
- package/package.json +1 -1
- package/skills/vds-skill/runtime/AGENTS.md +10 -10
- package/skills/vds-skill/runtime/AGENTS.vi.md +6 -6
- package/skills/vds-skill/runtime/README.md +3 -3
- package/skills/vds-skill/runtime/bitbucket_orchestrator/BITBUCKET_API_PRACTICES.md +1 -1
- package/skills/vds-skill/runtime/bitbucket_orchestrator/FEATURES.md +75 -75
- package/skills/vds-skill/runtime/bitbucket_orchestrator/README.md +102 -102
- package/skills/vds-skill/runtime/brd_orchestrator/README.md +2 -2
- package/skills/vds-skill/runtime/confluence_orchestrator/README.md +97 -97
- package/skills/vds-skill/runtime/confluence_orchestrator/SYNC_SCRIPTS.md +12 -12
- package/skills/vds-skill/runtime/confluence_orchestrator/SYNC_STANDARDIZATION.md +6 -6
- package/skills/vds-skill/runtime/confluence_orchestrator/src/confluence_orchestrator/config.py +1 -1
- package/skills/vds-skill/runtime/diagram_generator/README.md +5 -5
- package/skills/vds-skill/runtime/docker/ROLLBACK.md +1 -1
- package/skills/vds-skill/runtime/docs/README.md +30 -30
- package/skills/vds-skill/runtime/docs/agents/explanation/runtime-verification-and-gap-reporting.md +4 -4
- package/skills/vds-skill/runtime/docs/agents/how-to/02-using-vds-ai-memory.md +1 -1
- package/skills/vds-skill/runtime/docs/agents/how-to/apply-phase3-migration.md +2 -2
- package/skills/vds-skill/runtime/docs/agents/how-to/first-audit-run.md +1 -1
- package/skills/vds-skill/runtime/docs/agents/how-to/install-and-bootstrap-who-scripts-and-skills.md +14 -14
- package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/analytics-pipeline-workflow.md +9 -9
- package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/code-quality-gate-workflow.md +5 -5
- package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/confluence-bitbucket-sync-workflow.md +9 -9
- package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/document-delivery-workflow.md +3 -3
- package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/memory-progress-workflow.md +9 -9
- package/skills/vds-skill/runtime/docs/agents/how-to/orchestrator-workflows/research-spec-audit-workflow.md +8 -8
- package/skills/vds-skill/runtime/docs/agents/how-to/phase131-all-project-preparation.md +13 -13
- package/skills/vds-skill/runtime/docs/agents/how-to/phase131-bounded-parallel-analysis.md +6 -6
- package/skills/vds-skill/runtime/docs/agents/how-to/phase131-confluence-upload-recovery.md +4 -4
- package/skills/vds-skill/runtime/docs/agents/how-to/run-ecosystem-daily-report.md +8 -8
- package/skills/vds-skill/runtime/docs/agents/reference/audit-triage-playbook.md +10 -10
- package/skills/vds-skill/runtime/docs/agents/reference/cli-commands.md +34 -34
- package/skills/vds-skill/runtime/docs/agents/reference/cli-help-matrix.md +6 -6
- package/skills/vds-skill/runtime/docs/agents/reference/ecosystem-daily-report.md +3 -3
- package/skills/vds-skill/runtime/docs/agents/reference/portable-paths-and-config.md +0 -0
- package/skills/vds-skill/runtime/docs/agents/reference/portable-paths-validation-matrix.md +2 -2
- package/skills/vds-skill/runtime/docs/agents/reference/vds-ai-memory-api.md +1 -1
- package/skills/vds-skill/runtime/docs/agents/tutorials/who-skills-and-scripts-onboarding.md +4 -4
- package/skills/vds-skill/runtime/docs/agents/tutorials/zero-to-productive-developer.md +14 -14
- package/skills/vds-skill/runtime/docs/vi/agents/explanation/runtime-verification-and-gap-reporting.md +4 -4
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/02-using-vds-ai-memory.md +1 -1
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/first-audit-run.md +1 -1
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/install-and-bootstrap-who-scripts-and-skills.md +10 -10
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/analytics-pipeline-workflow.md +9 -9
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/code-quality-gate-workflow.md +5 -5
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/confluence-bitbucket-sync-workflow.md +9 -9
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/document-delivery-workflow.md +3 -3
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/memory-progress-workflow.md +9 -9
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/orchestrator-workflows/research-spec-audit-workflow.md +8 -8
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/phase131-all-project-preparation.md +13 -13
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/phase131-bounded-parallel-analysis.md +6 -6
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/phase131-confluence-upload-recovery.md +4 -4
- package/skills/vds-skill/runtime/docs/vi/agents/how-to/tips-and-tricks.md +1 -1
- package/skills/vds-skill/runtime/docs/vi/agents/reference/audit-triage-playbook.md +10 -10
- package/skills/vds-skill/runtime/docs/vi/agents/reference/cli-commands.md +34 -34
- package/skills/vds-skill/runtime/docs/vi/agents/reference/cli-help-matrix.md +6 -6
- package/skills/vds-skill/runtime/docs/vi/agents/reference/portable-paths-and-config.md +3 -3
- package/skills/vds-skill/runtime/docs/vi/agents/reference/portable-paths-validation-matrix.md +2 -2
- package/skills/vds-skill/runtime/docs/vi/agents/reference/vds-ai-memory-api.md +1 -1
- package/skills/vds-skill/runtime/docs/vi/agents/tutorials/who-skills-and-scripts-onboarding.md +4 -4
- package/skills/vds-skill/runtime/docs/vi/agents/tutorials/zero-to-productive-developer.md +4 -4
- package/skills/vds-skill/runtime/elastic_orchestrator/README.md +31 -31
- package/skills/vds-skill/runtime/elastic_orchestrator/src/vds_elastic_orchestrator/cli.py +2 -2
- package/skills/vds-skill/runtime/excel_orchestrator/README.md +22 -22
- package/skills/vds-skill/runtime/git_orchestrator/README.md +46 -46
- package/skills/vds-skill/runtime/google_sheets_orchestrator/README.md +15 -15
- package/skills/vds-skill/runtime/grafana_orchestrator/README.md +44 -44
- package/skills/vds-skill/runtime/grafana_orchestrator/src/vds_grafana_orchestrator/cli.py +2 -2
- package/skills/vds-skill/runtime/jira_orchestrator/README.md +119 -119
- package/skills/vds-skill/runtime/jira_viettelmoney_orchestrator/README.md +117 -117
- package/skills/vds-skill/runtime/markdown_orchestrator/README.md +9 -9
- package/skills/vds-skill/runtime/pdf_orchestrator/README.md +4 -4
- package/skills/vds-skill/runtime/scripts/README.md +2 -2
- package/skills/vds-skill/runtime/scripts/move_audit_artifact_pages.py +1 -1
- package/skills/vds-skill/runtime/scripts/move_audit_artifact_pages_rest.py +1 -1
- package/skills/vds-skill/runtime/scripts/move_wrong_dept_pages.py +1 -1
- package/skills/vds-skill/runtime/scripts/uv-workspace-alignment-verification-2026-03-25.md +1 -1
- package/skills/vds-skill/runtime/sonarqube_orchestrator/IMPLEMENTATION_AUDIT.md +1 -1
- package/skills/vds-skill/runtime/sonarqube_orchestrator/README.md +11 -11
- package/skills/vds-skill/runtime/sonarqube_orchestrator/src/vds_sonarqube_orchestrator/cli.py +3 -3
- package/skills/vds-skill/runtime/vds_agent_core/docs/embedding.md +3 -3
- package/skills/vds-skill/runtime/vds_cli/README.md +48 -48
- package/skills/vds-skill/runtime/vds_cli/src/vds_cli/cli.py +1 -1
- package/skills/vds-skill/runtime/vds_cli/src/vds_cli/confluence_sync.py +3 -3
- package/skills/vds-skill/runtime/vds_cli/tests/unit/test_confluence_sync.py +1 -1
- package/skills/vds-skill/runtime/vds_cli_common/tests/test_env.py +0 -105
- package/skills/vds-skill/runtime/diagram_generator/ci_validate.sh +0 -16
- package/skills/vds-skill/runtime/pdf_orchestrator/scripts/setup_team.sh +0 -324
- package/skills/vds-skill/runtime/scripts/audit-cli-patterns.sh +0 -135
- package/skills/vds-skill/runtime/scripts/audit-dashboard.sh +0 -525
- package/skills/vds-skill/runtime/scripts/backup.sh +0 -123
- package/skills/vds-skill/runtime/scripts/bootstrap_uv.sh +0 -69
- package/skills/vds-skill/runtime/scripts/ci/assert_no_openspace_commits.sh +0 -37
- package/skills/vds-skill/runtime/scripts/ci/verify_branch_protection.sh +0 -64
- package/skills/vds-skill/runtime/scripts/closure/phase1_check.sh +0 -483
- package/skills/vds-skill/runtime/scripts/closure/phase2_check.sh +0 -500
- package/skills/vds-skill/runtime/scripts/deploy-bootstrap.sh +0 -201
- package/skills/vds-skill/runtime/scripts/deployment/load_docker_images_offline.sh +0 -90
- package/skills/vds-skill/runtime/scripts/dev/cli_smoke.sh +0 -259
- package/skills/vds-skill/runtime/scripts/init-pgbouncer-userlist.sh +0 -154
- package/skills/vds-skill/runtime/scripts/openspace_bootstrap.sh +0 -56
- package/skills/vds-skill/runtime/scripts/openspace_common.sh +0 -75
- package/skills/vds-skill/runtime/scripts/openspace_doctor.sh +0 -61
- package/skills/vds-skill/runtime/scripts/openspace_sync_shadow.sh +0 -65
- package/skills/vds-skill/runtime/scripts/phase7-baseline.sh +0 -77
- package/skills/vds-skill/runtime/scripts/preflight/env_check.sh +0 -102
- package/skills/vds-skill/runtime/scripts/repair_autopay_reports.sh +0 -173
- package/skills/vds-skill/runtime/scripts/rollback_drill.sh +0 -659
- package/skills/vds-skill/runtime/scripts/run-audit-in-tmux.sh +0 -286
- package/skills/vds-skill/runtime/scripts/run-department-audit.sh +0 -495
- package/skills/vds-skill/runtime/scripts/run-project-audit.sh +0 -267
- package/skills/vds-skill/runtime/scripts/smoke-test-deploy.sh +0 -137
- package/skills/vds-skill/runtime/scripts/target-state-automation/confluence_sync_coordinator.sh +0 -27
- package/skills/vds-skill/runtime/scripts/target-state-automation/coordination.sh +0 -114
- package/skills/vds-skill/runtime/scripts/target-state-automation/diagram_coordinator.sh +0 -25
- package/skills/vds-skill/runtime/scripts/target-state-automation/docs_root.sh +0 -22
- package/skills/vds-skill/runtime/scripts/target-state-automation/generate_diagrams.sh +0 -22
- package/skills/vds-skill/runtime/scripts/target-state-automation/markdown_coordinator.sh +0 -25
- package/skills/vds-skill/runtime/scripts/target-state-automation/progress_dashboard.sh +0 -17
- package/skills/vds-skill/runtime/scripts/target-state-automation/schema_coordinator.sh +0 -25
- package/skills/vds-skill/runtime/scripts/target-state-automation/sync_confluence.sh +0 -30
- package/skills/vds-skill/runtime/scripts/target-state-automation/update_dependencies.sh +0 -19
- package/skills/vds-skill/runtime/scripts/target-state-automation/validate_links.sh +0 -86
- package/skills/vds-skill/runtime/scripts/target-state-automation/validate_markdown.sh +0 -52
- package/skills/vds-skill/runtime/scripts/target-state-automation/validate_schemas.sh +0 -26
- package/skills/vds-skill/runtime/scripts/target-state-automation/validate_structure.sh +0 -98
- package/skills/vds-skill/runtime/scripts/validate-cli-standardization.sh +0 -188
- package/skills/vds-skill/runtime/scripts/vds_sh_helpers.sh +0 -180
- package/skills/vds-skill/runtime/scripts/verification/phase2_portable_paths_ubuntu_docker.sh +0 -26
- package/skills/vds-skill/runtime/scripts/verify-memory-cli-e2e.sh +0 -598
- package/skills/vds-skill/runtime/scripts/verify-worktree-features.sh +0 -306
- package/skills/vds-skill/runtime/scripts/worktree-add.sh +0 -128
- package/skills/vds-skill/runtime/scripts/worktree-remove.sh +0 -112
- package/skills/vds-skill/runtime/scripts/worktree_compose.sh +0 -269
- package/skills/vds-skill/runtime/scripts/worktree_uv.sh +0 -77
- 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 "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|