@indigoai-us/hq-cli 5.77.13 → 5.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/assets/scaffold/core/scripts/archive-old-threads.sh +86 -0
- package/assets/scaffold/core/scripts/backfill-company-skill-mirrors.sh +73 -0
- package/assets/scaffold/core/scripts/backfill-workspace-mirror.sh +51 -0
- package/assets/scaffold/core/scripts/codex-skill-bridge.sh +550 -0
- package/assets/scaffold/core/scripts/detect-stale-core-policy-mirror.sh +185 -0
- package/assets/scaffold/core/scripts/hq-status-summary.sh +187 -0
- package/assets/scaffold/core/scripts/ontology-readme-drift.sh +264 -0
- package/assets/scaffold/core/scripts/qmd-reindex-after-sync.sh +93 -0
- package/assets/scaffold/core/scripts/rebuild-all-indexes.sh +69 -0
- package/assets/scaffold/core/scripts/rebuild-companies-index.sh +206 -0
- package/assets/scaffold/core/scripts/rebuild-company-knowledge-index.sh +127 -0
- package/assets/scaffold/core/scripts/rebuild-orchestrator-index.sh +86 -0
- package/assets/scaffold/core/scripts/rebuild-projects-index.sh +105 -0
- package/assets/scaffold/core/scripts/rebuild-public-knowledge-index.sh +83 -0
- package/assets/scaffold/core/scripts/rebuild-reports-index.sh +114 -0
- package/assets/scaffold/core/scripts/rebuild-social-drafts-index.sh +135 -0
- package/assets/scaffold/core/scripts/rebuild-threads-index.sh +82 -0
- package/assets/scaffold/core/scripts/rebuild-workers-index.sh +97 -0
- package/assets/scaffold/core/scripts/resize-screenshot.sh +47 -0
- package/assets/scaffold/core/scripts/token-usage-report.sh +254 -0
- package/assets/scaffold/core/scripts/worktree.sh +136 -0
- package/dist/commands/agents.js +28 -12
- package/dist/commands/api-keys.js +100 -20
- package/dist/commands/core.d.ts +90 -0
- package/dist/commands/core.js +279 -0
- package/dist/commands/files-browse.d.ts +21 -0
- package/dist/commands/files-browse.js +145 -24
- package/dist/commands/files.js +33 -7
- package/dist/commands/members.js +16 -5
- package/dist/commands/pack-install.d.ts +14 -0
- package/dist/commands/pack-install.js +51 -2
- package/dist/commands/pkg-install.js +43 -0
- package/dist/commands/run.js +8 -0
- package/dist/commands/secrets.js +125 -65
- package/dist/main.js +6 -0
- package/dist/utils/api-key-command-gate.d.ts +45 -0
- package/dist/utils/api-key-command-gate.js +51 -0
- package/dist/utils/hq-roots.d.ts +91 -0
- package/dist/utils/hq-roots.js +212 -0
- package/dist/utils/resolve-vault-credential.d.ts +63 -3
- package/dist/utils/resolve-vault-credential.js +152 -6
- package/dist/utils/run-bundled-script.d.ts +66 -0
- package/dist/utils/run-bundled-script.js +80 -0
- package/dist/utils/vault-api.d.ts +21 -0
- package/dist/utils/vault-api.js +74 -3
- package/package.json +7 -1
- package/.claude/policies/hq-cli-interactive-reads-use-sts-vend.md +0 -49
- package/.github/workflows/ci.yml +0 -46
- package/.github/workflows/publish.yml +0 -36
- package/.github/workflows/scripts/smoke-test-pkg.sh +0 -97
- package/e2e/cli.test.ts +0 -128
- package/eslint.config.js +0 -37
- package/pnpm-workspace.yaml +0 -4
- package/scripts/chmod-bins.mjs +0 -49
- package/scripts/generate-dsn.mjs +0 -26
- package/scripts/generate-scan-packages-table.mjs +0 -113
- package/scripts/smoke-sources-signals.sh +0 -103
- package/src/bin/hq-auth-refresh.ts +0 -43
- package/src/cli-version.ts +0 -13
- package/src/commands/__fixtures__/make-tar.ts +0 -126
- package/src/commands/_patterns.ts +0 -10
- package/src/commands/add.ts +0 -75
- package/src/commands/agents.test.ts +0 -527
- package/src/commands/agents.ts +0 -923
- package/src/commands/api-keys.test.ts +0 -291
- package/src/commands/api-keys.ts +0 -382
- package/src/commands/artifact-verify.test.ts +0 -177
- package/src/commands/auth.test.ts +0 -82
- package/src/commands/auth.ts +0 -213
- package/src/commands/billing.test.ts +0 -158
- package/src/commands/billing.ts +0 -146
- package/src/commands/channels.test.ts +0 -74
- package/src/commands/channels.ts +0 -91
- package/src/commands/cloud-demote.test.ts +0 -401
- package/src/commands/cloud-demote.ts +0 -278
- package/src/commands/cloud-provision.test.ts +0 -1117
- package/src/commands/cloud-provision.ts +0 -942
- package/src/commands/cloud.pull-all.test.ts +0 -711
- package/src/commands/cloud.pull-per-company.test.ts +0 -188
- package/src/commands/cloud.push-all.test.ts +0 -485
- package/src/commands/cloud.scope-excluded-warning.test.ts +0 -22
- package/src/commands/cloud.selectors.test.ts +0 -208
- package/src/commands/cloud.status.test.ts +0 -160
- package/src/commands/cloud.test.ts +0 -41
- package/src/commands/cloud.ts +0 -2130
- package/src/commands/company.test.ts +0 -202
- package/src/commands/company.ts +0 -148
- package/src/commands/creators.test.ts +0 -60
- package/src/commands/creators.ts +0 -117
- package/src/commands/crm.test.ts +0 -179
- package/src/commands/crm.ts +0 -236
- package/src/commands/db-migrate.ts +0 -55
- package/src/commands/db-provision.ts +0 -114
- package/src/commands/db-sql.ts +0 -124
- package/src/commands/db-status.ts +0 -108
- package/src/commands/db.ts +0 -26
- package/src/commands/dm.test.ts +0 -748
- package/src/commands/dm.ts +0 -1226
- package/src/commands/feedback.test.ts +0 -413
- package/src/commands/feedback.ts +0 -169
- package/src/commands/files-browse.test.ts +0 -1249
- package/src/commands/files-browse.ts +0 -1506
- package/src/commands/files-delete.test.ts +0 -484
- package/src/commands/files-recovery.test.ts +0 -370
- package/src/commands/files.test.ts +0 -722
- package/src/commands/files.ts +0 -1446
- package/src/commands/group-grants.test.ts +0 -330
- package/src/commands/group-grants.ts +0 -455
- package/src/commands/groups.test.ts +0 -44
- package/src/commands/groups.ts +0 -368
- package/src/commands/integrations.test.ts +0 -633
- package/src/commands/integrations.ts +0 -507
- package/src/commands/list.ts +0 -85
- package/src/commands/login.ts +0 -52
- package/src/commands/logout.ts +0 -30
- package/src/commands/marketplace-install.test.ts +0 -543
- package/src/commands/marketplace-security.test.ts +0 -646
- package/src/commands/mcp-registration.test.ts +0 -2787
- package/src/commands/mcp-registration.ts +0 -2612
- package/src/commands/mcp-status.test.ts +0 -483
- package/src/commands/mcp-status.ts +0 -575
- package/src/commands/mcp-status.us011.test.ts +0 -243
- package/src/commands/meetings.test.ts +0 -522
- package/src/commands/meetings.ts +0 -789
- package/src/commands/members.test.ts +0 -1474
- package/src/commands/members.ts +0 -1181
- package/src/commands/onboard-identity-guard.test.ts +0 -99
- package/src/commands/onboard-identity-guard.ts +0 -103
- package/src/commands/onboard-join.test.ts +0 -96
- package/src/commands/onboard-join.ts +0 -101
- package/src/commands/onboard-warning.test.ts +0 -26
- package/src/commands/onboard-warning.ts +0 -12
- package/src/commands/onboard.ts +0 -267
- package/src/commands/outposts-heartbeat.test.ts +0 -299
- package/src/commands/outposts-heartbeat.ts +0 -310
- package/src/commands/outposts-replica-sync.test.ts +0 -272
- package/src/commands/outposts-self-deploy.test.ts +0 -243
- package/src/commands/outposts.test.ts +0 -1039
- package/src/commands/outposts.ts +0 -1935
- package/src/commands/pack-install-secret-authorization.test.ts +0 -115
- package/src/commands/pack-install.test.ts +0 -1469
- package/src/commands/pack-install.ts +0 -2247
- package/src/commands/pack-update-cache.test.ts +0 -149
- package/src/commands/packs.test.ts +0 -88
- package/src/commands/packs.ts +0 -622
- package/src/commands/people.test.ts +0 -807
- package/src/commands/people.ts +0 -422
- package/src/commands/pkg-install.dispatch.test.ts +0 -71
- package/src/commands/pkg-install.ts +0 -215
- package/src/commands/pkg-list.test.ts +0 -79
- package/src/commands/pkg-list.ts +0 -13
- package/src/commands/pkg-remove.ts +0 -71
- package/src/commands/pkg-update.ts +0 -189
- package/src/commands/publish.test.ts +0 -650
- package/src/commands/publish.ts +0 -580
- package/src/commands/reindex.test.ts +0 -259
- package/src/commands/reindex.ts +0 -274
- package/src/commands/rescue.test.ts +0 -39
- package/src/commands/rescue.ts +0 -210
- package/src/commands/run.env-local.test.ts +0 -88
- package/src/commands/run.test.ts +0 -45
- package/src/commands/run.ts +0 -184
- package/src/commands/safe-extract.test.ts +0 -459
- package/src/commands/safe-extract.ts +0 -444
- package/src/commands/secrets-scope.test.ts +0 -56
- package/src/commands/secrets-scope.ts +0 -32
- package/src/commands/secrets.parse-destination.test.ts +0 -38
- package/src/commands/secrets.test.ts +0 -2037
- package/src/commands/secrets.ts +0 -2240
- package/src/commands/signals.ts +0 -351
- package/src/commands/skill.test.ts +0 -770
- package/src/commands/skill.ts +0 -796
- package/src/commands/sources.ts +0 -362
- package/src/commands/sync-mode.test.ts +0 -366
- package/src/commands/sync-mode.ts +0 -387
- package/src/commands/sync-narrow.test.ts +0 -633
- package/src/commands/sync-narrow.ts +0 -555
- package/src/commands/sync.ts +0 -165
- package/src/commands/team-sync.ts +0 -628
- package/src/commands/update.ts +0 -71
- package/src/commands/whoami.ts +0 -83
- package/src/commands/workers.test.ts +0 -158
- package/src/commands/workers.ts +0 -301
- package/src/index.test.ts +0 -32
- package/src/index.ts +0 -20
- package/src/lib/db/control-plane.test.ts +0 -59
- package/src/lib/db/control-plane.ts +0 -113
- package/src/lib/db/local.test.ts +0 -81
- package/src/lib/db/local.ts +0 -148
- package/src/lib/db/migrate.test.ts +0 -133
- package/src/lib/db/migrate.ts +0 -137
- package/src/lib/db/paths.test.ts +0 -112
- package/src/lib/db/paths.ts +0 -128
- package/src/lib/db/remote-engine.test.ts +0 -44
- package/src/lib/db/remote-engine.ts +0 -148
- package/src/lib/db/remote-sql.test.ts +0 -32
- package/src/lib/db/remote-sql.ts +0 -62
- package/src/lib/db/sql.test.ts +0 -106
- package/src/lib/db/sql.ts +0 -192
- package/src/lib/hq-cloud-dep.smoke.test.ts +0 -75
- package/src/lib/local-tree-diff.test.ts +0 -301
- package/src/lib/local-tree-diff.ts +0 -362
- package/src/lib/narrow-hint-banner.test.ts +0 -235
- package/src/lib/narrow-hint-banner.ts +0 -212
- package/src/lib/plan-limit-nag.test.ts +0 -317
- package/src/lib/plan-limit-nag.ts +0 -264
- package/src/main.ts +0 -371
- package/src/node-preflight.test.ts +0 -60
- package/src/node-preflight.ts +0 -67
- package/src/outpost/session-heartbeat-bounds.test.ts +0 -195
- package/src/outpost/session-heartbeat-guard.test.ts +0 -105
- package/src/outpost/session-heartbeat-publisher.test.ts +0 -178
- package/src/outpost/session-heartbeat-publisher.ts +0 -186
- package/src/outpost/session-heartbeat-retain-guard.test.ts +0 -126
- package/src/outpost/session-heartbeat.test.ts +0 -459
- package/src/outpost/session-heartbeat.ts +0 -877
- package/src/packaging.test.ts +0 -109
- package/src/run/__fixtures__/discover-schemas/example.env.schema +0 -4
- package/src/run/discover-schemas.test.ts +0 -153
- package/src/run/discover-schemas.ts +0 -79
- package/src/run/hq-plugin.test.ts +0 -371
- package/src/run/hq-plugin.ts +0 -277
- package/src/run/varlock-shape.test.ts +0 -57
- package/src/schemas/hq-package.schema.json +0 -155
- package/src/sentry-before-send.test.ts +0 -359
- package/src/sentry-before-send.ts +0 -221
- package/src/sentry-epipe.test.ts +0 -37
- package/src/sentry-release.test.ts +0 -54
- package/src/sentry.test.ts +0 -24
- package/src/sentry.ts +0 -54
- package/src/strategies/link.ts +0 -62
- package/src/strategies/merge.ts +0 -142
- package/src/types.ts +0 -146
- package/src/utils/__fixtures__/scan-packages.generated-block.sh +0 -23
- package/src/utils/auth-error.test.ts +0 -40
- package/src/utils/auth-error.ts +0 -42
- package/src/utils/billing-gate.test.ts +0 -95
- package/src/utils/billing-gate.ts +0 -228
- package/src/utils/breadcrumb-buffer.ts +0 -18
- package/src/utils/cli-telemetry.test.ts +0 -153
- package/src/utils/cli-telemetry.ts +0 -61
- package/src/utils/cognito-session.machine.test.ts +0 -109
- package/src/utils/cognito-session.refresh.test.ts +0 -84
- package/src/utils/cognito-session.test.ts +0 -328
- package/src/utils/cognito-session.ts +0 -448
- package/src/utils/company-selection-error.test.ts +0 -42
- package/src/utils/company-selection-error.ts +0 -45
- package/src/utils/contribution-table.ts +0 -83
- package/src/utils/environmental-error.test.ts +0 -45
- package/src/utils/environmental-error.ts +0 -39
- package/src/utils/epipe.test.ts +0 -28
- package/src/utils/epipe.ts +0 -29
- package/src/utils/expected-cli-error.test.ts +0 -28
- package/src/utils/expected-cli-error.ts +0 -39
- package/src/utils/feedback-diagnostics.test.ts +0 -183
- package/src/utils/feedback-diagnostics.ts +0 -123
- package/src/utils/feedback-screenshots.test.ts +0 -134
- package/src/utils/feedback-screenshots.ts +0 -124
- package/src/utils/feedback-versions.test.ts +0 -98
- package/src/utils/feedback-versions.ts +0 -68
- package/src/utils/git.ts +0 -74
- package/src/utils/integrity.ts +0 -59
- package/src/utils/intercepted-process-exit.test.ts +0 -37
- package/src/utils/intercepted-process-exit.ts +0 -36
- package/src/utils/login-provider.test.ts +0 -42
- package/src/utils/login-provider.ts +0 -30
- package/src/utils/manifest.test.ts +0 -167
- package/src/utils/manifest.ts +0 -131
- package/src/utils/pack-contributions.test.ts +0 -603
- package/src/utils/pack-contributions.ts +0 -450
- package/src/utils/people.ts +0 -215
- package/src/utils/registry-client.ts +0 -204
- package/src/utils/registry.ts +0 -90
- package/src/utils/resolve-vault-credential.test.ts +0 -69
- package/src/utils/resolve-vault-credential.ts +0 -60
- package/src/utils/sandbox-runner-client.test.ts +0 -279
- package/src/utils/sandbox-runner-client.ts +0 -260
- package/src/utils/secrets-cache.ts +0 -183
- package/src/utils/sentry-identity.ts +0 -45
- package/src/utils/settle-with-timeout.test.ts +0 -21
- package/src/utils/settle-with-timeout.ts +0 -22
- package/src/utils/user-yaml-error.test.ts +0 -24
- package/src/utils/user-yaml-error.ts +0 -30
- package/src/utils/vault-api.test.ts +0 -536
- package/src/utils/vault-api.ts +0 -382
- package/src/utils/version-check.test.ts +0 -176
- package/src/utils/version-check.ts +0 -155
- package/src/utils/version-gate.test.ts +0 -1024
- package/src/utils/version-gate.ts +0 -702
- package/test/commands/db-tenant-isolation.test.ts +0 -94
- package/test/commands/db.test.ts +0 -85
- package/test/commands/signals.test.ts +0 -207
- package/test/commands/sources.test.ts +0 -231
- package/test/e2e/smoke-install-mcp.sh +0 -113
- package/test/fixtures/hq-pack-smoke-mcp/mcp/smoke-http.json +0 -1
- package/test/fixtures/hq-pack-smoke-mcp/package.yaml +0 -11
- package/test/fixtures/signals/action_item/sample.md +0 -16
- package/test/fixtures/signals/summary/sample.md +0 -12
- package/test/fixtures/sources/meetings/sample.md +0 -25
- package/test/helpers/cli-runner.ts +0 -150
- package/test/helpers/s3-list-mock.ts +0 -79
- package/test/helpers/vault-service-mock.ts +0 -295
- package/test/sources-signals/smoke.test.ts +0 -228
- package/tsconfig.json +0 -20
- package/vitest.config.ts +0 -11
- package/vitest.e2e.config.ts +0 -7
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# rebuild-public-knowledge-index.sh — regenerate core/knowledge/public/INDEX.md.
|
|
3
|
+
#
|
|
4
|
+
# Pure bash + jq. Lists each public-knowledge subdir with a file count.
|
|
5
|
+
# Description: prefer the subdir's README.md first heading, else first
|
|
6
|
+
# alphabetical .md file's first heading, else "{N} file(s)".
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
HQ_ROOT="${HQ_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
|
|
11
|
+
cd "$HQ_ROOT"
|
|
12
|
+
|
|
13
|
+
KNOWLEDGE_DIR="core/knowledge/public"
|
|
14
|
+
OUT="${KNOWLEDGE_DIR}/INDEX.md"
|
|
15
|
+
DATE=$(date -u +%Y-%m-%d)
|
|
16
|
+
|
|
17
|
+
[[ -d "$KNOWLEDGE_DIR" ]] || { echo "rebuild-public-knowledge-index: ${KNOWLEDGE_DIR}/ missing, skipping" >&2; exit 0; }
|
|
18
|
+
|
|
19
|
+
sanitize_cell() {
|
|
20
|
+
printf '%s' "$1" | tr '\n' ' ' | sed -e 's/|/\\|/g' -e 's/ */ /g' -e 's/^ *//' -e 's/ *$//'
|
|
21
|
+
}
|
|
22
|
+
trunc() {
|
|
23
|
+
local s="$1" n="$2"
|
|
24
|
+
if [[ ${#s} -le $n ]]; then printf '%s' "$s"; else printf '%s…' "${s:0:$((n-1))}"; fi
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
heading_of() {
|
|
28
|
+
awk '/^# / { sub(/^# +/, ""); print; exit }' "$1" 2>/dev/null || true
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
describe_subdir() {
|
|
32
|
+
local d="$1"
|
|
33
|
+
local n
|
|
34
|
+
n=$(find "$d" -mindepth 1 -maxdepth 1 -name '*.md' ! -name 'INDEX.md' 2>/dev/null | wc -l | tr -d ' ')
|
|
35
|
+
local readme="${d}/README.md"
|
|
36
|
+
local h=""
|
|
37
|
+
if [[ -f "$readme" ]]; then
|
|
38
|
+
h=$(heading_of "$readme")
|
|
39
|
+
fi
|
|
40
|
+
if [[ -z "$h" ]]; then
|
|
41
|
+
# First alphabetical .md file (excluding INDEX.md, README.md).
|
|
42
|
+
local first
|
|
43
|
+
first=$(find "$d" -mindepth 1 -maxdepth 1 -name '*.md' ! -name 'INDEX.md' ! -name 'README.md' 2>/dev/null | sort | head -1)
|
|
44
|
+
[[ -n "$first" ]] && h=$(heading_of "$first")
|
|
45
|
+
fi
|
|
46
|
+
if [[ -n "$h" ]]; then
|
|
47
|
+
echo "${h} (${n} file(s))"
|
|
48
|
+
else
|
|
49
|
+
echo "${n} file(s)"
|
|
50
|
+
fi
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
{
|
|
54
|
+
echo "# Public Knowledge"
|
|
55
|
+
echo ""
|
|
56
|
+
echo "> Auto-generated. Updated: ${DATE}"
|
|
57
|
+
echo ""
|
|
58
|
+
echo "| Name | Description |"
|
|
59
|
+
echo "|------|-------------|"
|
|
60
|
+
while IFS= read -r d; do
|
|
61
|
+
name=$(basename "$d")
|
|
62
|
+
[[ "$name" == .* ]] && continue
|
|
63
|
+
desc=$(describe_subdir "$d")
|
|
64
|
+
desc=$(sanitize_cell "$desc")
|
|
65
|
+
desc=$(trunc "$desc" 100)
|
|
66
|
+
printf '| `%s/` | %s |\n' "$name" "$desc"
|
|
67
|
+
done < <(find "$KNOWLEDGE_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
|
|
68
|
+
|
|
69
|
+
# Loose top-level .md files
|
|
70
|
+
while IFS= read -r f; do
|
|
71
|
+
name=$(basename "$f")
|
|
72
|
+
[[ "$name" == "INDEX.md" ]] && continue
|
|
73
|
+
[[ "$name" == .* ]] && continue
|
|
74
|
+
desc=$(heading_of "$f")
|
|
75
|
+
[[ -z "$desc" ]] && desc="$name"
|
|
76
|
+
desc=$(sanitize_cell "$desc")
|
|
77
|
+
desc=$(trunc "$desc" 100)
|
|
78
|
+
printf '| `%s` | %s |\n' "$name" "$desc"
|
|
79
|
+
done < <(find "$KNOWLEDGE_DIR" -mindepth 1 -maxdepth 1 -type f -name '*.md' 2>/dev/null | sort)
|
|
80
|
+
} > "$OUT"
|
|
81
|
+
|
|
82
|
+
n=$(find "$KNOWLEDGE_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l | tr -d ' ')
|
|
83
|
+
echo "rebuild-public-knowledge-index: wrote ${OUT} (${n} subdir(s))" >&2
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# rebuild-reports-index.sh — regenerate workspace/reports/INDEX.md.
|
|
3
|
+
#
|
|
4
|
+
# Pure bash. Lists subdirs + individual report files. Skips the curated
|
|
5
|
+
# "Report Series" section — that's manually maintained by the gardener.
|
|
6
|
+
# Description: prefer first `#` heading for .md, <title> for .html.
|
|
7
|
+
# Date: parse YYYY-MM-DD or YYYY-Www prefix from filename, else "—".
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
HQ_ROOT="${HQ_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
|
|
12
|
+
cd "$HQ_ROOT"
|
|
13
|
+
|
|
14
|
+
OUT="workspace/reports/INDEX.md"
|
|
15
|
+
DATE=$(date -u +%Y-%m-%d)
|
|
16
|
+
|
|
17
|
+
[[ -d workspace/reports ]] || { echo "rebuild-reports-index: workspace/reports/ missing, skipping" >&2; exit 0; }
|
|
18
|
+
|
|
19
|
+
sanitize_cell() {
|
|
20
|
+
printf '%s' "$1" | tr '\n' ' ' | sed -e 's/|/\\|/g' -e 's/ */ /g' -e 's/^ *//' -e 's/ *$//'
|
|
21
|
+
}
|
|
22
|
+
trunc() {
|
|
23
|
+
local s="$1" n="$2"
|
|
24
|
+
if [[ ${#s} -le $n ]]; then printf '%s' "$s"; else printf '%s…' "${s:0:$((n-1))}"; fi
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
heading_md() {
|
|
28
|
+
awk '/^# / { sub(/^# +/, ""); print; exit }' "$1" 2>/dev/null || true
|
|
29
|
+
}
|
|
30
|
+
title_html() {
|
|
31
|
+
awk 'BEGIN{IGNORECASE=1} /<title>/ { sub(/.*<title>/, ""); sub(/<\/title>.*/, ""); print; exit }' "$1" 2>/dev/null || true
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
extract_date() {
|
|
35
|
+
local name="$1"
|
|
36
|
+
if [[ "$name" =~ ^([0-9]{4}-[0-9]{2}-[0-9]{2}) ]]; then
|
|
37
|
+
echo "${BASH_REMATCH[1]}"
|
|
38
|
+
elif [[ "$name" =~ ^([0-9]{4}-W[0-9]{2}) ]]; then
|
|
39
|
+
echo "${BASH_REMATCH[1]}"
|
|
40
|
+
else
|
|
41
|
+
echo "—"
|
|
42
|
+
fi
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
describe_file() {
|
|
46
|
+
local f="$1"
|
|
47
|
+
local name
|
|
48
|
+
name=$(basename "$f")
|
|
49
|
+
case "$name" in
|
|
50
|
+
*.md)
|
|
51
|
+
local h
|
|
52
|
+
h=$(heading_md "$f")
|
|
53
|
+
[[ -z "$h" ]] && h="${name%.md}"
|
|
54
|
+
echo "$h"
|
|
55
|
+
;;
|
|
56
|
+
*.html|*.htm)
|
|
57
|
+
local t
|
|
58
|
+
t=$(title_html "$f")
|
|
59
|
+
[[ -z "$t" ]] && t="${name%.*}"
|
|
60
|
+
echo "$t"
|
|
61
|
+
;;
|
|
62
|
+
*)
|
|
63
|
+
echo "${name}"
|
|
64
|
+
;;
|
|
65
|
+
esac
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
describe_subdir() {
|
|
69
|
+
local d="$1"
|
|
70
|
+
local n
|
|
71
|
+
n=$(find "$d" -mindepth 1 -maxdepth 1 ! -name '.*' 2>/dev/null | wc -l | tr -d ' ')
|
|
72
|
+
echo "${n} item(s)"
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
{
|
|
76
|
+
echo "# Reports"
|
|
77
|
+
echo ""
|
|
78
|
+
echo "> Auto-generated. Updated: ${DATE}"
|
|
79
|
+
echo ""
|
|
80
|
+
echo "Personal/HQ reports only. Company reports moved to \`companies/{co}/data/reports/\`."
|
|
81
|
+
echo ""
|
|
82
|
+
echo "## Directories"
|
|
83
|
+
echo ""
|
|
84
|
+
echo "| Name | Description |"
|
|
85
|
+
echo "|------|-------------|"
|
|
86
|
+
while IFS= read -r d; do
|
|
87
|
+
name=$(basename "$d")
|
|
88
|
+
[[ "$name" == .* ]] && continue
|
|
89
|
+
desc=$(describe_subdir "$d")
|
|
90
|
+
desc=$(sanitize_cell "$desc")
|
|
91
|
+
desc=$(trunc "$desc" 100)
|
|
92
|
+
printf '| `%s/` | %s |\n' "$name" "$desc"
|
|
93
|
+
done < <(find workspace/reports -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
|
|
94
|
+
|
|
95
|
+
echo ""
|
|
96
|
+
echo "## Individual Reports"
|
|
97
|
+
echo ""
|
|
98
|
+
echo "| Name | Date | Description |"
|
|
99
|
+
echo "|------|------|-------------|"
|
|
100
|
+
while IFS= read -r f; do
|
|
101
|
+
name=$(basename "$f")
|
|
102
|
+
[[ "$name" == "INDEX.md" ]] && continue
|
|
103
|
+
[[ "$name" == .* ]] && continue
|
|
104
|
+
d=$(extract_date "$name")
|
|
105
|
+
desc=$(describe_file "$f")
|
|
106
|
+
desc=$(sanitize_cell "$desc")
|
|
107
|
+
desc=$(trunc "$desc" 100)
|
|
108
|
+
[[ -z "$desc" ]] && desc="—"
|
|
109
|
+
printf '| `%s` | %s | %s |\n' "$name" "$d" "$desc"
|
|
110
|
+
done < <(find workspace/reports -mindepth 1 -maxdepth 1 -type f 2>/dev/null | sort)
|
|
111
|
+
} > "$OUT"
|
|
112
|
+
|
|
113
|
+
n=$(find workspace/reports -mindepth 1 -maxdepth 1 -type f ! -name 'INDEX.md' 2>/dev/null | wc -l | tr -d ' ')
|
|
114
|
+
echo "rebuild-reports-index: wrote ${OUT} (${n} individual report(s))" >&2
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# rebuild-social-drafts-index.sh — regenerate workspace/social-drafts/INDEX.md.
|
|
3
|
+
#
|
|
4
|
+
# Pure bash. Lists:
|
|
5
|
+
# - "Recent Drafts": 20 most-recently-modified .md files under date-channel
|
|
6
|
+
# subdirs (x/, linkedin/, blog/, tiktok/). Description = first `#` heading.
|
|
7
|
+
# - "Directories": top-level subdirs + loose files with description.
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
HQ_ROOT="${HQ_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
|
|
12
|
+
# shellcheck source=core/scripts/lib/portable.sh
|
|
13
|
+
. "$HQ_ROOT/core/scripts/lib/portable.sh"
|
|
14
|
+
cd "$HQ_ROOT"
|
|
15
|
+
|
|
16
|
+
OUT="workspace/social-drafts/INDEX.md"
|
|
17
|
+
DATE=$(date -u +%Y-%m-%d)
|
|
18
|
+
|
|
19
|
+
[[ -d workspace/social-drafts ]] || { echo "rebuild-social-drafts-index: workspace/social-drafts/ missing, skipping" >&2; exit 0; }
|
|
20
|
+
|
|
21
|
+
sanitize_cell() {
|
|
22
|
+
printf '%s' "$1" | tr '\n' ' ' | sed -e 's/|/\\|/g' -e 's/ */ /g' -e 's/^ *//' -e 's/ *$//'
|
|
23
|
+
}
|
|
24
|
+
trunc() {
|
|
25
|
+
local s="$1" n="$2"
|
|
26
|
+
if [[ ${#s} -le $n ]]; then printf '%s' "$s"; else printf '%s…' "${s:0:$((n-1))}"; fi
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
heading_md() {
|
|
30
|
+
awk '/^# / { sub(/^# +/, ""); print; exit }' "$1" 2>/dev/null || true
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
describe_subdir() {
|
|
34
|
+
local d="$1"
|
|
35
|
+
local name
|
|
36
|
+
name=$(basename "$d")
|
|
37
|
+
local n_files n_dirs
|
|
38
|
+
n_files=$(find "$d" -mindepth 1 -maxdepth 1 -type f ! -name '.*' 2>/dev/null | wc -l | tr -d ' ')
|
|
39
|
+
n_dirs=$(find "$d" -mindepth 1 -maxdepth 1 -type d ! -name '.*' 2>/dev/null | wc -l | tr -d ' ')
|
|
40
|
+
case "$name" in
|
|
41
|
+
x) echo "X/Twitter post drafts (${n_files} files)" ;;
|
|
42
|
+
linkedin) echo "LinkedIn post drafts (${n_files} files)" ;;
|
|
43
|
+
blog) echo "Blog post drafts (${n_files} files)" ;;
|
|
44
|
+
tiktok) echo "TikTok scripts/drafts (${n_files} files)" ;;
|
|
45
|
+
images) echo "Infographics and post images (${n_dirs} dirs)" ;;
|
|
46
|
+
*)
|
|
47
|
+
if [[ "$n_dirs" -gt 0 ]]; then
|
|
48
|
+
echo "${n_dirs} subdir(s), ${n_files} file(s)"
|
|
49
|
+
else
|
|
50
|
+
echo "${n_files} file(s)"
|
|
51
|
+
fi
|
|
52
|
+
;;
|
|
53
|
+
esac
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
describe_file() {
|
|
57
|
+
local f="$1"
|
|
58
|
+
local name
|
|
59
|
+
name=$(basename "$f")
|
|
60
|
+
case "$name" in
|
|
61
|
+
*.md)
|
|
62
|
+
local h
|
|
63
|
+
h=$(heading_md "$f")
|
|
64
|
+
[[ -z "$h" ]] && h="${name%.md}"
|
|
65
|
+
echo "$h"
|
|
66
|
+
;;
|
|
67
|
+
*.json)
|
|
68
|
+
echo "${name%.json} data"
|
|
69
|
+
;;
|
|
70
|
+
*.py|*.sh)
|
|
71
|
+
echo "Script: ${name}"
|
|
72
|
+
;;
|
|
73
|
+
*)
|
|
74
|
+
echo "${name}"
|
|
75
|
+
;;
|
|
76
|
+
esac
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
{
|
|
80
|
+
echo "# Social Drafts"
|
|
81
|
+
echo ""
|
|
82
|
+
echo "> Auto-generated. Updated: ${DATE}"
|
|
83
|
+
echo ""
|
|
84
|
+
echo "## Recent Drafts"
|
|
85
|
+
echo ""
|
|
86
|
+
# 20 most-recently-modified .md files in date-channel subdirs
|
|
87
|
+
# (use find -printf if GNU; macOS find lacks -printf — fall back to stat)
|
|
88
|
+
while IFS= read -r f; do
|
|
89
|
+
rel="${f#workspace/social-drafts/}"
|
|
90
|
+
desc=$(heading_md "$f")
|
|
91
|
+
[[ -z "$desc" ]] && desc=$(basename "$f" .md)
|
|
92
|
+
desc=$(sanitize_cell "$desc")
|
|
93
|
+
desc=$(trunc "$desc" 100)
|
|
94
|
+
printf -- '- `%s` - %s\n' "$rel" "$desc"
|
|
95
|
+
done < <(
|
|
96
|
+
{
|
|
97
|
+
for chan in x linkedin blog tiktok; do
|
|
98
|
+
[[ -d "workspace/social-drafts/${chan}" ]] || continue
|
|
99
|
+
find "workspace/social-drafts/${chan}" -mindepth 1 -maxdepth 1 -type f -name '*.md' 2>/dev/null
|
|
100
|
+
done
|
|
101
|
+
} | while IFS= read -r f; do
|
|
102
|
+
# Sortable timestamp (portable BSD/GNU stat)
|
|
103
|
+
ts=$(portable_stat_mtime "$f" 2>/dev/null || echo 0)
|
|
104
|
+
printf '%s\t%s\n' "$ts" "$f"
|
|
105
|
+
done | sort -rn | head -20 | cut -f2
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
echo ""
|
|
109
|
+
echo "## Directories"
|
|
110
|
+
echo ""
|
|
111
|
+
echo "| Name | Description |"
|
|
112
|
+
echo "|------|-------------|"
|
|
113
|
+
while IFS= read -r d; do
|
|
114
|
+
name=$(basename "$d")
|
|
115
|
+
[[ "$name" == .* ]] && continue
|
|
116
|
+
desc=$(describe_subdir "$d")
|
|
117
|
+
desc=$(sanitize_cell "$desc")
|
|
118
|
+
desc=$(trunc "$desc" 100)
|
|
119
|
+
printf '| `%s/` | %s |\n' "$name" "$desc"
|
|
120
|
+
done < <(find workspace/social-drafts -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
|
|
121
|
+
|
|
122
|
+
# Loose top-level files
|
|
123
|
+
while IFS= read -r f; do
|
|
124
|
+
name=$(basename "$f")
|
|
125
|
+
[[ "$name" == "INDEX.md" ]] && continue
|
|
126
|
+
[[ "$name" == .* ]] && continue
|
|
127
|
+
desc=$(describe_file "$f")
|
|
128
|
+
desc=$(sanitize_cell "$desc")
|
|
129
|
+
desc=$(trunc "$desc" 100)
|
|
130
|
+
printf '| `%s` | %s |\n' "$name" "$desc"
|
|
131
|
+
done < <(find workspace/social-drafts -mindepth 1 -maxdepth 1 -type f 2>/dev/null | sort)
|
|
132
|
+
} > "$OUT"
|
|
133
|
+
|
|
134
|
+
n=$(find workspace/social-drafts -mindepth 2 -type f -name '*.md' 2>/dev/null | wc -l | tr -d ' ')
|
|
135
|
+
echo "rebuild-social-drafts-index: wrote ${OUT} (${n} draft file(s))" >&2
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# rebuild-threads-index.sh — regenerate workspace/threads/INDEX.md from thread JSON files.
|
|
3
|
+
#
|
|
4
|
+
# Pure bash + jq. Zero Claude context. Reads active thread JSONs (not archive/),
|
|
5
|
+
# batches metadata through a single jq invocation (vs 1 subprocess per file).
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# core/scripts/rebuild-threads-index.sh # regen INDEX.md
|
|
9
|
+
# core/scripts/rebuild-threads-index.sh --recent # regen recent.md only (last 15)
|
|
10
|
+
# core/scripts/rebuild-threads-index.sh --both # regen both
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
HQ_ROOT="${HQ_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
|
|
15
|
+
cd "$HQ_ROOT"
|
|
16
|
+
|
|
17
|
+
MODE="${1:---index}"
|
|
18
|
+
|
|
19
|
+
THREADS_DIR="workspace/threads"
|
|
20
|
+
INDEX_PATH="${THREADS_DIR}/INDEX.md"
|
|
21
|
+
RECENT_PATH="${THREADS_DIR}/recent.md"
|
|
22
|
+
TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
23
|
+
|
|
24
|
+
mkdir -p "$THREADS_DIR"
|
|
25
|
+
|
|
26
|
+
# Gather active thread files (exclude archive/), newest first by mtime.
|
|
27
|
+
# Portable (bash 3.x compatible) — avoid mapfile.
|
|
28
|
+
THREAD_FILES=()
|
|
29
|
+
while IFS= read -r line; do
|
|
30
|
+
# Each primary thread record can have a changeset sidecar. The T-*.json
|
|
31
|
+
# glob also matches that sidecar, but it is not a thread record.
|
|
32
|
+
[[ "$line" == *.changeset.json ]] && continue
|
|
33
|
+
THREAD_FILES+=("$line")
|
|
34
|
+
done < <(ls -t "$THREADS_DIR"/T-*.json 2>/dev/null || true)
|
|
35
|
+
COUNT=${#THREAD_FILES[@]}
|
|
36
|
+
|
|
37
|
+
extract_metadata() {
|
|
38
|
+
[[ $# -eq 0 ]] && return 0
|
|
39
|
+
jq -rs '
|
|
40
|
+
.[] | [
|
|
41
|
+
(.thread_id // "-"),
|
|
42
|
+
(.type // "-"),
|
|
43
|
+
(.updated_at // "-"),
|
|
44
|
+
((.metadata.title // "-") | gsub("\\|"; "/") | gsub("\n"; " "))
|
|
45
|
+
] | @tsv
|
|
46
|
+
' "$@" 2>/dev/null || true
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
write_table() {
|
|
50
|
+
local out="$1"; shift
|
|
51
|
+
local title="$1"; shift
|
|
52
|
+
local limit="$1"; shift
|
|
53
|
+
# remaining args are files
|
|
54
|
+
|
|
55
|
+
{
|
|
56
|
+
echo "# ${title}"
|
|
57
|
+
echo ""
|
|
58
|
+
echo "Generated: ${TS}"
|
|
59
|
+
echo "Active threads: ${COUNT} (archive/ excluded)"
|
|
60
|
+
echo ""
|
|
61
|
+
echo "| Thread | Type | Updated | Title |"
|
|
62
|
+
echo "|--------|------|---------|-------|"
|
|
63
|
+
if [[ $# -gt 0 ]]; then
|
|
64
|
+
local rows
|
|
65
|
+
rows=$(extract_metadata "$@")
|
|
66
|
+
if [[ "$limit" -gt 0 ]]; then
|
|
67
|
+
rows=$(printf "%s\n" "$rows" | awk -v n="$limit" 'NR <= n')
|
|
68
|
+
fi
|
|
69
|
+
printf "%s\n" "$rows" | awk -F'\t' 'NF>=4 { printf "| %s | %s | %s | %s |\n", $1, $2, $3, $4 }'
|
|
70
|
+
fi
|
|
71
|
+
} > "$out"
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if [[ "$MODE" == "--index" || "$MODE" == "--both" ]]; then
|
|
75
|
+
write_table "$INDEX_PATH" "Threads INDEX" 0 "${THREAD_FILES[@]+"${THREAD_FILES[@]}"}"
|
|
76
|
+
echo "rebuild-threads-index: wrote ${INDEX_PATH} (${COUNT} threads)" >&2
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
if [[ "$MODE" == "--recent" || "$MODE" == "--both" ]]; then
|
|
80
|
+
write_table "$RECENT_PATH" "Recent Threads" 15 "${THREAD_FILES[@]+"${THREAD_FILES[@]}"}"
|
|
81
|
+
echo "rebuild-threads-index: wrote ${RECENT_PATH} (last 15)" >&2
|
|
82
|
+
fi
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# rebuild-workers-index.sh — regenerate core/workers/public/INDEX.md (and
|
|
3
|
+
# core/workers/INDEX.md at the top level if it exists).
|
|
4
|
+
#
|
|
5
|
+
# Pure bash + yq. Each worker subdir has worker.yaml — extract .worker.description
|
|
6
|
+
# for the table row.
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
HQ_ROOT="${HQ_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
|
|
11
|
+
cd "$HQ_ROOT"
|
|
12
|
+
|
|
13
|
+
DATE=$(date -u +%Y-%m-%d)
|
|
14
|
+
|
|
15
|
+
sanitize_cell() {
|
|
16
|
+
printf '%s' "$1" | tr '\n' ' ' | sed -e 's/|/\\|/g' -e 's/ */ /g' -e 's/^ *//' -e 's/ *$//'
|
|
17
|
+
}
|
|
18
|
+
trunc() {
|
|
19
|
+
local s="$1" n="$2"
|
|
20
|
+
if [[ ${#s} -le $n ]]; then printf '%s' "$s"; else printf '%s…' "${s:0:$((n-1))}"; fi
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
worker_desc() {
|
|
24
|
+
local yaml="$1"
|
|
25
|
+
[[ -f "$yaml" ]] || { echo ""; return; }
|
|
26
|
+
if command -v yq >/dev/null 2>&1; then
|
|
27
|
+
yq -r '.worker.description // .worker.bio.role // ""' "$yaml" 2>/dev/null || echo ""
|
|
28
|
+
else
|
|
29
|
+
# Fallback: first-line description grep
|
|
30
|
+
awk -F: '/^[[:space:]]+description:/ { sub(/^[^:]+: */, ""); gsub(/^["\x27]|["\x27]$/, ""); print; exit }' "$yaml" 2>/dev/null || echo ""
|
|
31
|
+
fi
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
write_workers_subindex() {
|
|
35
|
+
local subdir="$1"
|
|
36
|
+
local label="$2"
|
|
37
|
+
local out="${subdir}/INDEX.md"
|
|
38
|
+
[[ -d "$subdir" ]] || return 0
|
|
39
|
+
{
|
|
40
|
+
echo "# ${label}"
|
|
41
|
+
echo ""
|
|
42
|
+
echo "> Auto-generated. Updated: ${DATE}"
|
|
43
|
+
echo ""
|
|
44
|
+
echo "| Name | Description |"
|
|
45
|
+
echo "|------|-------------|"
|
|
46
|
+
while IFS= read -r d; do
|
|
47
|
+
name=$(basename "$d")
|
|
48
|
+
[[ "$name" == .* ]] && continue
|
|
49
|
+
desc=$(worker_desc "${d}/worker.yaml")
|
|
50
|
+
desc=$(sanitize_cell "$desc")
|
|
51
|
+
desc=$(trunc "$desc" 100)
|
|
52
|
+
[[ -z "$desc" ]] && desc="—"
|
|
53
|
+
printf '| `%s/` | %s |\n' "$name" "$desc"
|
|
54
|
+
done < <(find "$subdir" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
|
|
55
|
+
} > "$out"
|
|
56
|
+
echo "rebuild-workers-index: wrote ${out}" >&2
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
write_workers_root() {
|
|
60
|
+
local root="core/workers"
|
|
61
|
+
local out="${root}/INDEX.md"
|
|
62
|
+
[[ -d "$root" ]] || return 0
|
|
63
|
+
{
|
|
64
|
+
echo "# Workers"
|
|
65
|
+
echo ""
|
|
66
|
+
echo "> Auto-generated. Updated: ${DATE}"
|
|
67
|
+
echo ""
|
|
68
|
+
echo "Shared workers live under \`public/\`. Private/local workers live under \`personal/workers/\`. \`registry.yaml\` is the auto-generated index (regenerated by core/scripts/generate-workers-registry.sh)."
|
|
69
|
+
echo ""
|
|
70
|
+
echo "| Name | Description |"
|
|
71
|
+
echo "|------|-------------|"
|
|
72
|
+
while IFS= read -r d; do
|
|
73
|
+
name=$(basename "$d")
|
|
74
|
+
[[ "$name" == .* ]] && continue
|
|
75
|
+
[[ "$name" == "public" ]] && { printf '| `public/` | Shared public workers (see public/INDEX.md) |\n'; continue; }
|
|
76
|
+
desc=$(worker_desc "${d}/worker.yaml")
|
|
77
|
+
desc=$(sanitize_cell "$desc")
|
|
78
|
+
desc=$(trunc "$desc" 100)
|
|
79
|
+
[[ -z "$desc" ]] && desc="—"
|
|
80
|
+
printf '| `%s/` | %s |\n' "$name" "$desc"
|
|
81
|
+
done < <(find "$root" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
|
|
82
|
+
} > "$out"
|
|
83
|
+
echo "rebuild-workers-index: wrote ${out}" >&2
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# Public workers (always present)
|
|
87
|
+
write_workers_subindex "core/workers/public" "Public Workers"
|
|
88
|
+
|
|
89
|
+
# Personal workers (only if dir exists)
|
|
90
|
+
if [[ -d "personal/workers" ]]; then
|
|
91
|
+
write_workers_subindex "personal/workers" "Personal Workers"
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# Root workers INDEX (covers top-level pr-* workers + public/ pointer)
|
|
95
|
+
write_workers_root
|
|
96
|
+
|
|
97
|
+
echo "rebuild-workers-index: done" >&2
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# resize-screenshot.sh — Resize screenshot to max 1800px (longest dimension), in-place.
|
|
3
|
+
# Uses sips (macOS native). Falls back to magick if sips unavailable.
|
|
4
|
+
# Usage: resize-screenshot.sh <path-to-image>
|
|
5
|
+
#
|
|
6
|
+
# 1800px chosen to stay under the 2000px API limit with margin.
|
|
7
|
+
# JPEG at q=85 is visually lossless for audit work.
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
MAX_DIM=1800
|
|
12
|
+
FILE="${1:-}"
|
|
13
|
+
|
|
14
|
+
[[ -n "$FILE" && -f "$FILE" ]] || { echo "resize-screenshot: file not found: $FILE" >&2; exit 1; }
|
|
15
|
+
|
|
16
|
+
# Get current dimensions via sips
|
|
17
|
+
W=$(sips -g pixelWidth "$FILE" 2>/dev/null | awk '/pixelWidth/{print $2}')
|
|
18
|
+
H=$(sips -g pixelHeight "$FILE" 2>/dev/null | awk '/pixelHeight/{print $2}')
|
|
19
|
+
|
|
20
|
+
[[ -n "$W" && -n "$H" ]] || { echo "resize-screenshot: cannot read dimensions" >&2; exit 2; }
|
|
21
|
+
|
|
22
|
+
if [[ "$W" -le "$MAX_DIM" && "$H" -le "$MAX_DIM" ]]; then
|
|
23
|
+
echo "resize-screenshot: ${W}x${H} — within bounds, skipping"
|
|
24
|
+
exit 0
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# Determine new size (preserve aspect ratio, shrink longest dimension to MAX_DIM)
|
|
28
|
+
if [[ "$W" -ge "$H" ]]; then
|
|
29
|
+
NEW_W=$MAX_DIM
|
|
30
|
+
NEW_H=$(( H * MAX_DIM / W ))
|
|
31
|
+
else
|
|
32
|
+
NEW_H=$MAX_DIM
|
|
33
|
+
NEW_W=$(( W * MAX_DIM / H ))
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
echo "resize-screenshot: ${W}x${H} → ${NEW_W}x${NEW_H} ($FILE)"
|
|
37
|
+
|
|
38
|
+
if command -v sips &>/dev/null; then
|
|
39
|
+
sips --resampleHeightWidth "$NEW_H" "$NEW_W" "$FILE" --out "$FILE" >/dev/null 2>&1
|
|
40
|
+
elif command -v magick &>/dev/null; then
|
|
41
|
+
magick "$FILE" -resize "${MAX_DIM}x${MAX_DIM}>" "$FILE"
|
|
42
|
+
else
|
|
43
|
+
echo "resize-screenshot: no image tool available (sips/magick)" >&2
|
|
44
|
+
exit 2
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
echo "resize-screenshot: done"
|