@jenga-ai/agent 1.3.0 → 3.0.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/README.md +93 -256
- package/agents/developer.md +9 -8
- package/agents/scrum-master.md +57 -23
- package/agents/tester.md +51 -5
- package/hooks/on_session_end.sh +13 -1
- package/lib/generate-agent-context.js +18 -1
- package/lib/generate-copilot-instructions.js +18 -1
- package/lib/generate-skill-allow-list.js +197 -0
- package/lib/skill-allow-list.json +42 -0
- package/package.json +17 -13
- package/scripts/apply-j-prefix.sh +243 -0
- package/scripts/consume-context-digest.sh +103 -0
- package/scripts/generate-j-alias.sh +333 -0
- package/scripts/postinstall.js +25 -0
- package/scripts/sweep-stale-context-digests.sh +132 -0
- package/scripts/validate-board.sh +5 -0
- package/scripts/write-context-digest.sh +230 -0
- package/skills/{brainstorm → j-brainstorm}/SKILL.md +9 -2
- package/skills/{btw → j-btw}/SKILL.md +9 -2
- package/skills/{clearify → j-clearify}/SKILL.md +9 -2
- package/skills/{close-story → j-close-story}/SKILL.md +92 -13
- package/skills/j-close-story/scripts/check-privatized.sh +345 -0
- package/skills/{close-story → j-close-story}/scripts/check-story-closeable.sh +1 -1
- package/skills/{close-story → j-close-story}/scripts/extract-task-diff-stats.sh +1 -1
- package/skills/{commit → j-commit}/SKILL.md +9 -2
- package/skills/j-continue/SKILL.md +36 -0
- package/skills/{deep-dive → j-deep-dive}/SKILL.md +9 -8
- package/skills/{dev-done → j-dev-done}/SKILL.md +11 -4
- package/skills/{dev-done → j-dev-done}/scripts/classify-commit-outcome.sh +4 -4
- package/skills/{distribute → j-distribute}/SKILL.md +17 -10
- package/skills/{distribute → j-distribute}/scripts/distribute-changes.sh +1 -1
- package/skills/{do → j-do}/SKILL.md +111 -14
- package/skills/j-doc/README.md +155 -0
- package/skills/{doc → j-doc}/SKILL.md +55 -18
- package/skills/j-doc/authoring-notes.md +72 -0
- package/skills/j-doc/scripts/resolve_last_update.py +149 -0
- package/skills/{doc-sync → j-doc-sync}/SKILL.md +9 -2
- package/skills/{dooo → j-dooo}/SKILL.md +9 -2
- package/skills/j-error/SKILL.md +36 -0
- package/skills/{evaluate → j-evaluate}/SKILL.md +9 -2
- package/skills/j-examplify/SKILL.md +49 -0
- package/skills/{help → j-help}/SKILL.md +9 -2
- package/skills/{idea → j-idea}/SKILL.md +10 -3
- package/skills/{idea → j-idea}/assets/idea_handoff_template.md +1 -1
- package/skills/{improve → j-improve}/SKILL.md +9 -2
- package/skills/{init → j-init}/SKILL.md +21 -8
- package/skills/j-init/assets/scope-thresholds_template.json +7 -0
- package/skills/j-jbp/SKILL.md +32 -0
- package/skills/j-lgtm/SKILL.md +28 -0
- package/skills/{pi-plan → j-pi-plan}/SKILL.md +10 -3
- package/skills/{proceed → j-proceed}/SKILL.md +9 -2
- package/skills/{publish → j-publish}/SKILL.md +47 -40
- package/skills/{publish → j-publish}/adapters/droplet.md +1 -1
- package/skills/{publish → j-publish}/adapters/mobile-ios.md +3 -3
- package/skills/{publish → j-publish}/adapters/npm-ci.md +29 -7
- package/skills/{publish → j-publish}/adapters/npm.md +8 -8
- package/skills/{publish → j-publish}/assets/ci-contract.md +2 -2
- package/skills/{publish → j-publish}/schemas/publish.schema.json +1 -1
- package/skills/{publish → j-publish}/scripts/npm_ci_pipeline.sh +21 -1
- package/skills/{publish → j-publish}/scripts/npm_stage_inspect.sh +34 -1
- package/skills/{publish → j-publish}/scripts/npm_stage_pipeline.sh +9 -4
- package/skills/{publish → j-publish}/scripts/publish_deploy.sh +4 -4
- package/skills/{publish → j-publish}/scripts/validate_npm_stage_env.sh +1 -1
- package/skills/{publish → j-publish}/wizards/droplet.md +1 -1
- package/skills/{publish → j-publish}/wizards/mobile-ios.md +1 -1
- package/skills/{publish → j-publish}/wizards/npm-ci.md +1 -1
- package/skills/{publish → j-publish}/wizards/npm.md +1 -1
- package/skills/{reconcile → j-reconcile}/SKILL.md +12 -5
- package/skills/{reconcile → j-reconcile}/scripts/detect-unlinked-code.sh +2 -2
- package/skills/{reconcile → j-reconcile}/scripts/resolve-reconcile-scope.sh +3 -3
- package/skills/{reconcile-origin → j-reconcile-origin}/SKILL.md +13 -6
- package/skills/{redo → j-redo}/SKILL.md +9 -2
- package/skills/{skillify → j-skillify}/SKILL.md +10 -3
- package/skills/{spinoff → j-spinoff}/SKILL.md +9 -2
- package/skills/{status → j-status}/SKILL.md +9 -2
- package/skills/j-todo/SKILL.md +92 -0
- package/skills/{todo → j-todo}/assets/todo_handoff_template.md +1 -1
- package/skills/j-todo/scripts/add_trivial_task.sh +216 -0
- package/skills/j-todo/scripts/update_story_tasks.py +87 -0
- package/skills/{uncharted → j-uncharted}/SKILL.md +35 -28
- package/skills/{uncharted → j-uncharted}/assets/UNDERSTANDING_DOC_TEMPLATE.md +2 -2
- package/skills/{uncharted → j-uncharted}/scripts/detect-dependencies.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/detect-tests.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/directory-triage.sh +3 -3
- package/skills/{uncharted → j-uncharted}/scripts/elicitation-state.sh +3 -3
- package/skills/{uncharted → j-uncharted}/scripts/enumerate-target.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/import-source.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/inspect-provenance.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/resolve-segment-target.sh +5 -5
- package/skills/{uncharted → j-uncharted}/scripts/run-engine.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/validate-proposed-items.sh +2 -2
- package/skills/{uncharted → j-uncharted}/scripts/write-backfilled-epics.sh +1 -1
- package/skills/j-wtf/SKILL.md +27 -0
- package/skills/jenga/SKILL.md +1 -1
- package/skills/jenga/scripts/render-confirmation.sh +55 -18
- package/skills/jenga-permission-level/SKILL.md +1 -1
- package/templates/SCRUM_BOARD_SCHEMA.md +33 -2
- package/templates/agent-context.md.tpl +32 -9
- package/templates/copilot-instructions.md.tpl +66 -11
- package/skills/continue/SKILL.md +0 -29
- package/skills/error/SKILL.md +0 -29
- package/skills/examplify/SKILL.md +0 -42
- package/skills/init/assets/scope-thresholds_template.json +0 -7
- package/skills/jbp/SKILL.md +0 -25
- package/skills/lgtm/SKILL.md +0 -21
- package/skills/todo/SKILL.md +0 -48
- package/skills/wtf/SKILL.md +0 -20
- /package/skills/{close-story → j-close-story}/scripts/compute-scope-divergence.sh +0 -0
- /package/skills/{close-story → j-close-story}/scripts/extract-diff-stats.sh +0 -0
- /package/skills/{close-story → j-close-story}/scripts/update-task-frontmatter.sh +0 -0
- /package/skills/{commit → j-commit}/assets/user_instructions_template.md +0 -0
- /package/skills/{distribute → j-distribute}/CONFIG_SCHEMA.md +0 -0
- /package/skills/{distribute → j-distribute}/scripts/check-version.sh +0 -0
- /package/skills/{distribute → j-distribute}/scripts/commit-version-bump.sh +0 -0
- /package/skills/{do → j-do}/assets/intent-vs-diff-prompt.md +0 -0
- /package/skills/{do → j-do}/assets/sender_template.json +0 -0
- /package/skills/{doc → j-doc}/assets/path-objectives.yaml +0 -0
- /package/skills/{doc-sync → j-doc-sync}/assets/default_excludes.txt +0 -0
- /package/skills/{doc-sync → j-doc-sync}/assets/doc_targets.md +0 -0
- /package/skills/{evaluate → j-evaluate}/assets/evaluation_invokation_template.yml +0 -0
- /package/skills/{evaluate → j-evaluate}/assets/evaluation_rapport_template.md +0 -0
- /package/skills/{idea → j-idea}/assets/idea_template.md +0 -0
- /package/skills/{init → j-init}/assets/.gitignore_template +0 -0
- /package/skills/{init → j-init}/assets/PROJECT_SUMMARY_template.md +0 -0
- /package/skills/{init → j-init}/assets/directory_structure.txt +0 -0
- /package/skills/{init → j-init}/assets/strategy_stub_template.md +0 -0
- /package/skills/{init → j-init}/assets/test-config_template.json +0 -0
- /package/skills/{init → j-init}/assets/workflow_template.json +0 -0
- /package/skills/{init → j-init}/scripts/apply-project-visibility.sh +0 -0
- /package/skills/{init → j-init}/scripts/detect-existing-codebase.sh +0 -0
- /package/skills/{init → j-init}/scripts/init.sh +0 -0
- /package/skills/{pi-plan → j-pi-plan}/assets/epic.json +0 -0
- /package/skills/{pi-plan → j-pi-plan}/assets/story_template.md +0 -0
- /package/skills/{publish → j-publish}/assets/ExportOptions.plist.template +0 -0
- /package/skills/{publish → j-publish}/assets/ownership-matrix.md +0 -0
- /package/skills/{publish → j-publish}/assets/publish.example.json +0 -0
- /package/skills/{publish → j-publish}/assets/publish.example.npm-ci.json +0 -0
- /package/skills/{publish → j-publish}/assets/publish.example.npm.json +0 -0
- /package/skills/{publish → j-publish}/assets/secrets-guide.md +0 -0
- /package/skills/{publish → j-publish}/schemas/fixtures/npm-ci-minimal.json +0 -0
- /package/skills/{publish → j-publish}/schemas/fixtures/npm-ci-with-empty-secrets.json +0 -0
- /package/skills/{publish → j-publish}/schemas/fixtures/npm-ci-with-workflow-path.json +0 -0
- /package/skills/{publish → j-publish}/scripts/check_target_config.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/droplet_pipeline.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/finalize_changelog.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/generate_release_notes.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/ios_pipeline.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/npm_pipeline.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/publish_common.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/reconcile_tags.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/run_gates.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/setup_wizard.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/show_history.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/suggest_semver_bump.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/validate_config.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/validate_droplet_env.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/validate_ios_env.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/validate_npm_ci_env.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/validate_npm_env.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/write_ledger_entry.sh +0 -0
- /package/skills/{reconcile → j-reconcile}/assets/report_format.md +0 -0
- /package/skills/{reconcile-origin → j-reconcile-origin}/scripts/reconcile-origin.sh +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/SKILL.md +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/assets/.gitignore_template +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/assets/PROJECT_SUMMARY_template.md +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/assets/directory_structure.txt +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/assets/test-config_template.json +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/assets/workflow_template.json +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/scripts/init.sh +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-old/SKILL.md +0 -0
- /package/skills/{status → j-status}/assets/output_format.md +0 -0
- /package/skills/{todo → j-todo}/assets/todo_template.md +0 -0
- /package/skills/{uncharted → j-uncharted}/assets/SEGMENT_PROPOSAL_TEMPLATE.md +0 -0
- /package/skills/{uncharted → j-uncharted}/scripts/apply-subsystem-cap.sh +0 -0
- /package/skills/{uncharted → j-uncharted}/scripts/discover-subsystems.sh +0 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ---------------------------------------------------------------------------
|
|
3
|
+
# skills/j-close-story/scripts/check-privatized.sh
|
|
4
|
+
#
|
|
5
|
+
# Static (run-independent) `.publicignore` membership check for a single
|
|
6
|
+
# board ticket, invoked by /close-story at both task granularity (Step 2's
|
|
7
|
+
# per-task loop) and story granularity (Step 4's finalization), per
|
|
8
|
+
# E51_S03_T03. Unlike `Merged` (skills/self-sync/scripts/mark-merged.sh) and
|
|
9
|
+
# `Publicized` (skills/mirror-public/scripts/mark-publicized.sh, E51_S03_T02),
|
|
10
|
+
# which both react to a specific run's file diff, `Privatized` has NO
|
|
11
|
+
# dependency on any run ever having occurred -- it is a pure blocklist
|
|
12
|
+
# membership test against the ticket's own derived touched-file list, per
|
|
13
|
+
# templates/SCRUM_BOARD_SCHEMA.md's "Static vs. Reactive Status Setting"
|
|
14
|
+
# section.
|
|
15
|
+
#
|
|
16
|
+
# Usage: check-privatized.sh <id> <board-file-path>
|
|
17
|
+
#
|
|
18
|
+
# <id> EST ticket id -- a task id (E##_S##_T##) or a story id
|
|
19
|
+
# (E##_S##). The anchored-grep commit matching (below)
|
|
20
|
+
# is what keeps a story id from over-matching its own
|
|
21
|
+
# children's commits, so the same script handles both
|
|
22
|
+
# granularities with no separate code path.
|
|
23
|
+
# <board-file-path> Path to the ticket's own board markdown file (task or
|
|
24
|
+
# story), used to read its current `status:` and as the
|
|
25
|
+
# write target.
|
|
26
|
+
#
|
|
27
|
+
# Touched-file derivation -- IDENTICAL technique to
|
|
28
|
+
# skills/self-sync/scripts/mark-merged.sh (reused, not reinvented, per this
|
|
29
|
+
# task's own description):
|
|
30
|
+
# 1. git log --all --no-merges --extended-regexp \
|
|
31
|
+
# --grep="<id>([^0-9_]|$)" --pretty=format:'%H'
|
|
32
|
+
# The anchored pattern (not a plain substring grep) is required so a
|
|
33
|
+
# story id like "E51_S03" does not over-match every one of its own
|
|
34
|
+
# child tasks' commits -- the character immediately following a story
|
|
35
|
+
# id in a child task's commit message is "_", which the anchor
|
|
36
|
+
# excludes.
|
|
37
|
+
# 2. Per matched commit: `git diff --name-only <sha>~1..<sha>`, falling
|
|
38
|
+
# back to `git diff-tree --no-commit-id --name-only -r <sha>` for a
|
|
39
|
+
# root commit with no parent.
|
|
40
|
+
# 3. Union (dedup) the file paths across all matched commits.
|
|
41
|
+
# 4. Zero matched commits -> nothing to check -> UNCHANGED (not an error).
|
|
42
|
+
#
|
|
43
|
+
# .publicignore matching -- ported (not sourced) from
|
|
44
|
+
# skills/mirror-public/scripts/mirror.sh's `_publicignore_rule_for` helper:
|
|
45
|
+
# directory-prefix match for trailing-"/" lines, glob match against the full
|
|
46
|
+
# relative path and the basename for everything else, skipping comments,
|
|
47
|
+
# blank lines, and "+"-prefixed include lines (which never block anything).
|
|
48
|
+
# This is a deliberate, flagged duplication of matching logic -- not a
|
|
49
|
+
# `source` of mirror.sh, which unconditionally loads config.json and
|
|
50
|
+
# requires rsync near the top of its execution, neither of which this
|
|
51
|
+
# lighter, dependency-free check needs. Same tradeoff mark-merged.sh's own
|
|
52
|
+
# header comment already documents and accepts for its COPY_SET extraction.
|
|
53
|
+
#
|
|
54
|
+
# A ticket is "fully blocklisted" iff EVERY file in its derived touched-file
|
|
55
|
+
# list matches SOME .publicignore pattern. Partial coverage leaves the
|
|
56
|
+
# ticket unchanged, no error (mirrors AC5's "no files fully covered"
|
|
57
|
+
# language, applied to the blocklist side).
|
|
58
|
+
#
|
|
59
|
+
# Precedence / mismatch logging (AC4, this script's half of it): a ticket
|
|
60
|
+
# already at `status: Publicized` that is found fully blocklisted still gets
|
|
61
|
+
# overwritten to `Privatized` (Privatized wins -- the static, always-knowable
|
|
62
|
+
# check takes precedence per the story's AC4 and
|
|
63
|
+
# templates/SCRUM_BOARD_SCHEMA.md's "Publicized / Privatized / Deployed
|
|
64
|
+
# Lifecycle Relationship" section), but the contradiction is logged to
|
|
65
|
+
# project/logs/events.json as `event: publicized_privatized_mismatch` (same
|
|
66
|
+
# array-of-objects convention already used by session_start/etc., and the
|
|
67
|
+
# same event name E51_S03_T02's own task description documents for the
|
|
68
|
+
# reverse-direction mismatch) so it's flagged for investigation rather than
|
|
69
|
+
# silently resolved. The read-modify-write against events.json is wrapped in
|
|
70
|
+
# scripts/with-lock.sh since multiple sessions may be writing to it
|
|
71
|
+
# concurrently.
|
|
72
|
+
#
|
|
73
|
+
# A ticket already at `status: Privatized` is skipped without error
|
|
74
|
+
# (idempotency) -- same defensive-skip convention mark-merged.sh uses for
|
|
75
|
+
# its own terminal status.
|
|
76
|
+
#
|
|
77
|
+
# Output contract (stdout, single line) -- consumed by /close-story's prose
|
|
78
|
+
# steps to decide whether to report a Privatized ticket:
|
|
79
|
+
# PRIVATIZED status was written (or already Privatized -- treated the
|
|
80
|
+
# same by the caller: either way the ticket ends this call at
|
|
81
|
+
# status Privatized)
|
|
82
|
+
# UNCHANGED ticket left as-is (zero matched commits, partial coverage,
|
|
83
|
+
# or already Privatized with nothing further to do)
|
|
84
|
+
#
|
|
85
|
+
# Exit codes:
|
|
86
|
+
# 0 success (covers both PRIVATIZED and UNCHANGED outcomes)
|
|
87
|
+
# 1 error (bad usage, missing file, or a status-write failure)
|
|
88
|
+
# ---------------------------------------------------------------------------
|
|
89
|
+
|
|
90
|
+
set -euo pipefail
|
|
91
|
+
IFS=$'\n\t'
|
|
92
|
+
|
|
93
|
+
die() {
|
|
94
|
+
printf 'check-privatized.sh: error: %s\n' "$*" >&2
|
|
95
|
+
exit 1
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
log() {
|
|
99
|
+
printf 'check-privatized.sh: %s\n' "$*" >&2
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
usage() {
|
|
103
|
+
cat <<'EOF'
|
|
104
|
+
Usage: check-privatized.sh <id> <board-file-path>
|
|
105
|
+
|
|
106
|
+
Static .publicignore membership check for a single ticket (task or story).
|
|
107
|
+
Prints PRIVATIZED or UNCHANGED to stdout. See script header for full
|
|
108
|
+
semantics.
|
|
109
|
+
EOF
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if [ $# -ne 2 ]; then
|
|
113
|
+
usage >&2
|
|
114
|
+
die "expected exactly 2 arguments, got $#"
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
ID="$1"
|
|
118
|
+
BOARD_FILE="$2"
|
|
119
|
+
|
|
120
|
+
[ -f "$BOARD_FILE" ] || die "board file not found: $BOARD_FILE"
|
|
121
|
+
|
|
122
|
+
# -----------------------------------------------------------------------------
|
|
123
|
+
# Locate script + repo root (same symlink-resolution + repo-root derivation
|
|
124
|
+
# pattern as mark-merged.sh, so this script behaves identically whether
|
|
125
|
+
# invoked directly or via a symlink).
|
|
126
|
+
# -----------------------------------------------------------------------------
|
|
127
|
+
|
|
128
|
+
SCRIPT_PATH="${BASH_SOURCE[0]}"
|
|
129
|
+
while [ -h "$SCRIPT_PATH" ]; do
|
|
130
|
+
LINK_TARGET="$(readlink "$SCRIPT_PATH")"
|
|
131
|
+
case "$LINK_TARGET" in
|
|
132
|
+
/*) SCRIPT_PATH="$LINK_TARGET" ;;
|
|
133
|
+
*) SCRIPT_PATH="$(cd "$(dirname "$SCRIPT_PATH")" && pwd)/$LINK_TARGET" ;;
|
|
134
|
+
esac
|
|
135
|
+
done
|
|
136
|
+
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_PATH")" && pwd)"
|
|
137
|
+
|
|
138
|
+
REPO_ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || true)"
|
|
139
|
+
[ -n "$REPO_ROOT" ] || die "could not locate repo root (git rev-parse failed from $SCRIPT_DIR)"
|
|
140
|
+
|
|
141
|
+
PUBLICIGNORE="$REPO_ROOT/.publicignore"
|
|
142
|
+
[ -f "$PUBLICIGNORE" ] || die ".publicignore not found at $PUBLICIGNORE"
|
|
143
|
+
|
|
144
|
+
WITH_LOCK_SCRIPT="$REPO_ROOT/scripts/with-lock.sh"
|
|
145
|
+
UPDATE_FRONTMATTER_SCRIPT="$REPO_ROOT/skills/j-close-story/scripts/update-task-frontmatter.sh"
|
|
146
|
+
EVENTS_FILE="$REPO_ROOT/project/logs/events.json"
|
|
147
|
+
|
|
148
|
+
[ -f "$WITH_LOCK_SCRIPT" ] || die "expected script not found: $WITH_LOCK_SCRIPT"
|
|
149
|
+
[ -f "$UPDATE_FRONTMATTER_SCRIPT" ] || die "expected script not found: $UPDATE_FRONTMATTER_SCRIPT"
|
|
150
|
+
|
|
151
|
+
# -----------------------------------------------------------------------------
|
|
152
|
+
# Frontmatter field reader -- same "line == ---" boundary-detection style
|
|
153
|
+
# already used by update-task-frontmatter.sh / mark-merged.sh.
|
|
154
|
+
# -----------------------------------------------------------------------------
|
|
155
|
+
|
|
156
|
+
read_frontmatter_field() {
|
|
157
|
+
local file="$1" key="$2"
|
|
158
|
+
awk -v key="$key" '
|
|
159
|
+
NR==1 && $0=="---" { infm=1; next }
|
|
160
|
+
infm && $0=="---" { exit }
|
|
161
|
+
infm && $0 ~ ("^" key ":") {
|
|
162
|
+
sub("^" key ":[ \t]*", "", $0)
|
|
163
|
+
print $0
|
|
164
|
+
exit
|
|
165
|
+
}
|
|
166
|
+
' "$file"
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
trim() {
|
|
170
|
+
local s="$1"
|
|
171
|
+
s="${s#"${s%%[![:space:]]*}"}"
|
|
172
|
+
s="${s%"${s##*[![:space:]]}"}"
|
|
173
|
+
s="${s%\"}"; s="${s#\"}"
|
|
174
|
+
s="${s%\'}"; s="${s#\'}"
|
|
175
|
+
printf '%s' "$s"
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
CURRENT_STATUS="$(trim "$(read_frontmatter_field "$BOARD_FILE" "status")")"
|
|
179
|
+
|
|
180
|
+
if [ "$CURRENT_STATUS" = "Privatized" ]; then
|
|
181
|
+
log "$ID: already Privatized -- skip (idempotent no-op)"
|
|
182
|
+
echo "UNCHANGED"
|
|
183
|
+
exit 0
|
|
184
|
+
fi
|
|
185
|
+
|
|
186
|
+
# -----------------------------------------------------------------------------
|
|
187
|
+
# Touched-file derivation -- identical technique to mark-merged.sh.
|
|
188
|
+
# -----------------------------------------------------------------------------
|
|
189
|
+
|
|
190
|
+
commits_for_ticket() {
|
|
191
|
+
local id="$1"
|
|
192
|
+
git -C "$REPO_ROOT" log --all --no-merges --extended-regexp \
|
|
193
|
+
--grep="${id}([^0-9_]|\$)" --pretty=format:'%H' 2>/dev/null || true
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
commit_files() {
|
|
197
|
+
local sha="$1"
|
|
198
|
+
if git -C "$REPO_ROOT" rev-parse --verify -q "${sha}~1" >/dev/null 2>&1; then
|
|
199
|
+
git -C "$REPO_ROOT" diff --name-only "${sha}~1..${sha}" 2>/dev/null || true
|
|
200
|
+
else
|
|
201
|
+
git -C "$REPO_ROOT" diff-tree --no-commit-id --name-only -r "$sha" 2>/dev/null || true
|
|
202
|
+
fi
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
collect_touched_files() {
|
|
206
|
+
local id="$1"
|
|
207
|
+
local shas sha
|
|
208
|
+
shas="$(commits_for_ticket "$id")"
|
|
209
|
+
[ -n "$shas" ] || return 0
|
|
210
|
+
while IFS= read -r sha; do
|
|
211
|
+
[ -n "$sha" ] || continue
|
|
212
|
+
commit_files "$sha"
|
|
213
|
+
done <<< "$shas" | sort -u
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
TOUCHED="$(collect_touched_files "$ID")"
|
|
217
|
+
|
|
218
|
+
if [ -z "$TOUCHED" ]; then
|
|
219
|
+
log "$ID: zero matched EST-tagged commits -- left unchanged"
|
|
220
|
+
echo "UNCHANGED"
|
|
221
|
+
exit 0
|
|
222
|
+
fi
|
|
223
|
+
|
|
224
|
+
# -----------------------------------------------------------------------------
|
|
225
|
+
# .publicignore matching -- ported from mirror.sh's _publicignore_rule_for.
|
|
226
|
+
#
|
|
227
|
+
# Prints the matching .publicignore line and returns 0 on a match; returns 1
|
|
228
|
+
# with no output if nothing matched. Directory-prefix match for trailing-"/"
|
|
229
|
+
# lines, glob match against the full relative path and the basename for
|
|
230
|
+
# everything else, skipping comments/blank lines/"+"-prefixed include lines.
|
|
231
|
+
# -----------------------------------------------------------------------------
|
|
232
|
+
|
|
233
|
+
_publicignore_rule_for() {
|
|
234
|
+
local rel_path="$1" line pattern base dirpat
|
|
235
|
+
base="$(basename "$rel_path")"
|
|
236
|
+
while IFS= read -r line || [ -n "$line" ]; do
|
|
237
|
+
case "$line" in
|
|
238
|
+
''|'#'*|'+'*) continue ;;
|
|
239
|
+
esac
|
|
240
|
+
pattern="$line"
|
|
241
|
+
case "$pattern" in
|
|
242
|
+
'- '*) pattern="${pattern#- }" ;;
|
|
243
|
+
esac
|
|
244
|
+
[ -n "$pattern" ] || continue
|
|
245
|
+
case "$pattern" in
|
|
246
|
+
*/)
|
|
247
|
+
dirpat="${pattern%/}"
|
|
248
|
+
case "$rel_path" in
|
|
249
|
+
"$dirpat"/*)
|
|
250
|
+
printf '%s\n' "$line"
|
|
251
|
+
return 0
|
|
252
|
+
;;
|
|
253
|
+
esac
|
|
254
|
+
;;
|
|
255
|
+
*)
|
|
256
|
+
case "$rel_path" in
|
|
257
|
+
$pattern)
|
|
258
|
+
printf '%s\n' "$line"
|
|
259
|
+
return 0
|
|
260
|
+
;;
|
|
261
|
+
esac
|
|
262
|
+
case "$base" in
|
|
263
|
+
$pattern)
|
|
264
|
+
printf '%s\n' "$line"
|
|
265
|
+
return 0
|
|
266
|
+
;;
|
|
267
|
+
esac
|
|
268
|
+
;;
|
|
269
|
+
esac
|
|
270
|
+
done < "$PUBLICIGNORE"
|
|
271
|
+
return 1
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
# True (0) iff every line of $1 (touched files, newline-separated) matches
|
|
275
|
+
# some .publicignore pattern.
|
|
276
|
+
is_fully_blocklisted() {
|
|
277
|
+
local touched="$1"
|
|
278
|
+
local line
|
|
279
|
+
while IFS= read -r line; do
|
|
280
|
+
[ -n "$line" ] || continue
|
|
281
|
+
_publicignore_rule_for "$line" >/dev/null || return 1
|
|
282
|
+
done <<< "$touched"
|
|
283
|
+
return 0
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if ! is_fully_blocklisted "$TOUCHED"; then
|
|
287
|
+
log "$ID: not fully covered by .publicignore -- left unchanged"
|
|
288
|
+
echo "UNCHANGED"
|
|
289
|
+
exit 0
|
|
290
|
+
fi
|
|
291
|
+
|
|
292
|
+
# -----------------------------------------------------------------------------
|
|
293
|
+
# Fully blocklisted. Precedence check against a contradictory Publicized
|
|
294
|
+
# status (AC4) before writing.
|
|
295
|
+
# -----------------------------------------------------------------------------
|
|
296
|
+
|
|
297
|
+
if [ "$CURRENT_STATUS" = "Publicized" ]; then
|
|
298
|
+
log "$ID: WARNING -- ticket is status: Publicized but every touched file matches .publicignore; Privatized takes precedence (overwriting), logging mismatch"
|
|
299
|
+
|
|
300
|
+
TOUCHED_JSON_LIST="$(printf '%s\n' "$TOUCHED" | awk '
|
|
301
|
+
BEGIN { printf "[" ; first=1 }
|
|
302
|
+
{ if (!first) printf ","; printf "\"%s\"", $0; first=0 }
|
|
303
|
+
END { printf "]" }
|
|
304
|
+
')"
|
|
305
|
+
[ -n "$TOUCHED_JSON_LIST" ] || TOUCHED_JSON_LIST="[]"
|
|
306
|
+
|
|
307
|
+
MISMATCH_EVENT=$(printf '{"event": "publicized_privatized_mismatch", "agent": "developer", "id": "%s", "file": "%s", "touched_files": %s, "date": "%s"}' \
|
|
308
|
+
"$ID" "$BOARD_FILE" "$TOUCHED_JSON_LIST" "$(date -u +%Y-%m-%dT%H:%M:%SZ)")
|
|
309
|
+
|
|
310
|
+
if [ -f "$EVENTS_FILE" ]; then
|
|
311
|
+
"$WITH_LOCK_SCRIPT" "$EVENTS_FILE" -- bash -c '
|
|
312
|
+
set -euo pipefail
|
|
313
|
+
events_file="$1"
|
|
314
|
+
new_event="$2"
|
|
315
|
+
tmp="$(mktemp)"
|
|
316
|
+
if command -v python3 >/dev/null 2>&1; then
|
|
317
|
+
python3 -c "
|
|
318
|
+
import json, sys
|
|
319
|
+
path = sys.argv[1]
|
|
320
|
+
new_event = json.loads(sys.argv[2])
|
|
321
|
+
with open(path) as f:
|
|
322
|
+
data = json.load(f)
|
|
323
|
+
data.append(new_event)
|
|
324
|
+
with open(path, \"w\") as f:
|
|
325
|
+
json.dump(data, f, indent=2)
|
|
326
|
+
f.write(\"\n\")
|
|
327
|
+
" "$events_file" "$new_event"
|
|
328
|
+
else
|
|
329
|
+
echo "check-privatized.sh: python3 not available -- could not append mismatch event" >&2
|
|
330
|
+
rm -f "$tmp"
|
|
331
|
+
exit 1
|
|
332
|
+
fi
|
|
333
|
+
' _ "$EVENTS_FILE" "$MISMATCH_EVENT" || log "WARNING: failed to log publicized_privatized_mismatch event for $ID (continuing with status overwrite)"
|
|
334
|
+
else
|
|
335
|
+
log "WARNING: $EVENTS_FILE not found -- could not log publicized_privatized_mismatch event"
|
|
336
|
+
fi
|
|
337
|
+
fi
|
|
338
|
+
|
|
339
|
+
log "$ID: fully covered by .publicignore -- writing status: Privatized ($BOARD_FILE)"
|
|
340
|
+
if ! "$WITH_LOCK_SCRIPT" "$BOARD_FILE" -- bash "$UPDATE_FRONTMATTER_SCRIPT" "$BOARD_FILE" status Privatized; then
|
|
341
|
+
die "failed to write status: Privatized for $ID ($BOARD_FILE)"
|
|
342
|
+
fi
|
|
343
|
+
|
|
344
|
+
echo "PRIVATIZED"
|
|
345
|
+
exit 0
|
|
@@ -22,7 +22,7 @@ usage() {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
# Locate the project root relative to this script's location.
|
|
25
|
-
# Script lives at: skills/close-story/scripts/check-story-closeable.sh
|
|
25
|
+
# Script lives at: skills/j-close-story/scripts/check-story-closeable.sh
|
|
26
26
|
# Project root is three levels up (skills/ → repo root).
|
|
27
27
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
28
28
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
#
|
|
13
13
|
# For bundle tasks (a single commit covers multiple task IDs), each task that
|
|
14
14
|
# matches the commit receives the full bundle stats — this is the "full credit"
|
|
15
|
-
# attribution model. See skills/close-story/SKILL.md for the rationale.
|
|
15
|
+
# attribution model. See skills/j-close-story/SKILL.md for the rationale.
|
|
16
16
|
#
|
|
17
17
|
# Exit codes:
|
|
18
18
|
# 0 — success (even when no commits are found; outputs 0 values)
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: commit
|
|
3
|
-
description: Commit implemented epic, story, or task work using the EST naming convention. Also handles user-action prerequisites and new-epic boundaries. Use after completing any EST work item.
|
|
2
|
+
name: j.commit
|
|
3
|
+
description: Polyfill alias of the commit skill under a collision-safe directory name. Identical behavior to /commit — Commit implemented epic, story, or task work using the EST naming convention. Also handles user-action prerequisites and new-epic boundaries. Use after completing any EST work item. Use when the bare /commit form is shadowed by another tool's own built-in command of the same name.
|
|
4
4
|
keywords:
|
|
5
5
|
- commit
|
|
6
6
|
- save
|
|
7
7
|
- git commit
|
|
8
8
|
- done
|
|
9
9
|
- push
|
|
10
|
+
- j-commit
|
|
11
|
+
- polyfill
|
|
10
12
|
examples:
|
|
11
13
|
- "commit this work"
|
|
12
14
|
- "save my changes"
|
|
15
|
+
- "j-commit"
|
|
13
16
|
---
|
|
14
17
|
|
|
15
18
|
# Commit — Commit Completed Work
|
|
16
19
|
|
|
20
|
+
This skill is a literal-directory-name duplicate of `skills/commit/`. It exists so that `/j-commit` (and `j.j-commit`) give a guaranteed-unshadowed way to reach the same flow as `/commit`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/commit` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
21
|
+
|
|
22
|
+
This file is generated/synced by `scripts/generate-j-alias.sh commit` from `skills/commit/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
|
|
23
|
+
|
|
17
24
|
## Inline Mode (called by /do for inline-scoped tasks)
|
|
18
25
|
|
|
19
26
|
When invoked with the `--inline` flag OR when the environment variable `JENGA_COMMIT_INLINE=1` is set, execute inline mode:
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: j.continue
|
|
3
|
+
description: Polyfill alias of the continue skill under a collision-safe directory name. Identical behavior to /continue — Check project status across PROJECT_SUMMARY.md, epics, and stories to determine what should be done next. Reports "All done!" if everything is complete. Use when the bare /continue form is shadowed by another tool's own built-in command of the same name.
|
|
4
|
+
keywords:
|
|
5
|
+
- continue
|
|
6
|
+
- next
|
|
7
|
+
- proceed
|
|
8
|
+
- what's next
|
|
9
|
+
- status
|
|
10
|
+
- j-continue
|
|
11
|
+
- polyfill
|
|
12
|
+
examples:
|
|
13
|
+
- "what should I do next?"
|
|
14
|
+
- "continue with the project"
|
|
15
|
+
- "j-continue"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Continue — Pick Up the Next Work Item
|
|
19
|
+
|
|
20
|
+
This skill is a literal-directory-name duplicate of `skills/continue/`. It exists so that `/j-continue` (and `j.j-continue`) give a guaranteed-unshadowed way to reach the same flow as `/continue`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/continue` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
21
|
+
|
|
22
|
+
This file is generated/synced by `scripts/generate-j-alias.sh continue` from `skills/continue/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
|
|
23
|
+
|
|
24
|
+
## Instructions
|
|
25
|
+
|
|
26
|
+
1. **Check `project/PROJECT_SUMMARY.md`** — Determine if there is outstanding work at the project level.
|
|
27
|
+
|
|
28
|
+
2. **Check `project/epics/`** — If the project summary is done, check if any epics have remaining work.
|
|
29
|
+
|
|
30
|
+
3. **Check `project/stories/`** — If epics are done, check if any stories have remaining work.
|
|
31
|
+
|
|
32
|
+
**Important:** Always check story status within an epic even if the epic itself is marked as done.
|
|
33
|
+
|
|
34
|
+
4. **If everything is complete** — Respond with: "All done! 🎉"
|
|
35
|
+
|
|
36
|
+
5. **Otherwise** — Begin work on the next incomplete item.
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: deep-dive
|
|
3
|
-
description:
|
|
4
|
-
Multi-phase investigation workflow. The scrum-master orchestrates information
|
|
5
|
-
gathering, interactive brainstorming, critical scrutiny, and solution assessment
|
|
6
|
-
to produce a refined, well-considered output document. Use when a request needs
|
|
7
|
-
thorough analysis before committing to a plan. Triggers on phrases like
|
|
8
|
-
"deep dive", "investigate thoroughly", "think this through properly",
|
|
9
|
-
"analyze this in depth", or "I want a thorough analysis of".
|
|
2
|
+
name: j.deep-dive
|
|
3
|
+
description: Polyfill alias of the deep-dive skill under a collision-safe directory name. Identical behavior to /deep-dive — >. Use when the bare /deep-dive form is shadowed by another tool's own built-in command of the same name.
|
|
10
4
|
metadata:
|
|
11
5
|
prefered_agent: scrum_master
|
|
12
6
|
keywords:
|
|
@@ -14,15 +8,22 @@ keywords:
|
|
|
14
8
|
- "investigate"
|
|
15
9
|
- "analyze thoroughly"
|
|
16
10
|
- "think through"
|
|
11
|
+
- j-deep-dive
|
|
12
|
+
- polyfill
|
|
17
13
|
examples:
|
|
18
14
|
- "deep dive on this idea"
|
|
19
15
|
- "let's think through this properly"
|
|
20
16
|
- "I want a thorough analysis of this feature"
|
|
21
17
|
- "investigate this proposal in depth"
|
|
18
|
+
- "j-deep-dive"
|
|
22
19
|
---
|
|
23
20
|
|
|
24
21
|
# /deep-dive — Deep Investigation Workflow
|
|
25
22
|
|
|
23
|
+
This skill is a literal-directory-name duplicate of `skills/deep-dive/`. It exists so that `/j-deep-dive` (and `j.j-deep-dive`) give a guaranteed-unshadowed way to reach the same flow as `/deep-dive`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/deep-dive` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
24
|
+
|
|
25
|
+
This file is generated/synced by `scripts/generate-j-alias.sh deep-dive` from `skills/deep-dive/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
|
|
26
|
+
|
|
26
27
|
## Overview
|
|
27
28
|
|
|
28
29
|
A multi-phase workflow that takes a user's request through structured investigation,
|
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: dev-done
|
|
3
|
-
description: Commit the current work and immediately sync it into the .claude/ and .agents/ mirrors. Shortcut that chains /commit followed by /self-sync.
|
|
2
|
+
name: j.dev-done
|
|
3
|
+
description: Polyfill alias of the dev-done skill under a collision-safe directory name. Identical behavior to /dev-done — Commit the current work and immediately sync it into the .claude/ and .agents/ mirrors. Shortcut that chains /commit followed by /self-sync. Use when the bare /dev-done form is shadowed by another tool's own built-in command of the same name.
|
|
4
4
|
keywords:
|
|
5
5
|
- dev done
|
|
6
6
|
- commit and sync
|
|
7
7
|
- commit and mirror
|
|
8
8
|
- done syncing
|
|
9
|
+
- j-dev-done
|
|
10
|
+
- polyfill
|
|
9
11
|
examples:
|
|
10
12
|
- "dev-done E42_S04_T01"
|
|
11
13
|
- "commit this and sync the mirrors"
|
|
14
|
+
- "j-dev-done"
|
|
12
15
|
---
|
|
13
16
|
|
|
14
17
|
# Dev-Done — Commit, then Sync the Mirrors
|
|
15
18
|
|
|
19
|
+
This skill is a literal-directory-name duplicate of `skills/dev-done/`. It exists so that `/j-dev-done` (and `j.j-dev-done`) give a guaranteed-unshadowed way to reach the same flow as `/dev-done`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/dev-done` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
20
|
+
|
|
21
|
+
This file is generated/synced by `scripts/generate-j-alias.sh dev-done` from `skills/dev-done/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
|
|
22
|
+
|
|
16
23
|
Chains `/commit <scope-id>` and `/self-sync`, the same "convenience shortcut" pattern `skills/lgtm/SKILL.md`
|
|
17
24
|
uses for `/commit` + `/continue` — applied here to the commit -> mirror-sync sequence instead of the
|
|
18
25
|
commit -> next-task sequence. Useful right after implementing a root-level framework change
|
|
@@ -20,7 +27,7 @@ commit -> next-task sequence. Useful right after implementing a root-level frame
|
|
|
20
27
|
`.agents/` mirrors never sit stale waiting on a manual `/self-sync` call.
|
|
21
28
|
|
|
22
29
|
The deterministic decision of whether `/commit` halted early (nothing to commit) or completed
|
|
23
|
-
normally lives in `skills/dev-done/scripts/classify-commit-outcome.sh`, not inline here — see that
|
|
30
|
+
normally lives in `skills/j-dev-done/scripts/classify-commit-outcome.sh`, not inline here — see that
|
|
24
31
|
script's header for the exact contract.
|
|
25
32
|
|
|
26
33
|
## Instructions
|
|
@@ -32,7 +39,7 @@ script's header for the exact contract.
|
|
|
32
39
|
|
|
33
40
|
2. Pass the captured output to the classifier script:
|
|
34
41
|
```
|
|
35
|
-
skills/dev-done/scripts/classify-commit-outcome.sh <<< "$COMMIT_OUTPUT"
|
|
42
|
+
skills/j-dev-done/scripts/classify-commit-outcome.sh <<< "$COMMIT_OUTPUT"
|
|
36
43
|
```
|
|
37
44
|
|
|
38
45
|
3. If the script exits `1` (HALT): print its stdout — the exact message `No implementation to
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# ---------------------------------------------------------------------------
|
|
3
|
-
# skills/dev-done/scripts/classify-commit-outcome.sh
|
|
3
|
+
# skills/j-dev-done/scripts/classify-commit-outcome.sh
|
|
4
4
|
#
|
|
5
5
|
# Deterministic classifier backing `/dev-done` (story E42_S04, task
|
|
6
6
|
# E42_S04_T01). `/dev-done` chains `/commit <scope-id>` then `/self-sync`,
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# there was nothing to commit. Per CLAUDE.md's "Skill Implementation
|
|
9
9
|
# Principle — Scripts Over Inline Logic", that halt-vs-proceed check is a
|
|
10
10
|
# deterministic, repeatable text match — it does not belong as inline
|
|
11
|
-
# conditional logic in `skills/dev-done/SKILL.md`, so it lives here instead,
|
|
11
|
+
# conditional logic in `skills/j-dev-done/SKILL.md`, so it lives here instead,
|
|
12
12
|
# the same way `skills/self-sync/SKILL.md` delegates its own filesystem work
|
|
13
13
|
# to `skills/self-sync/scripts/run.js` rather than inlining it.
|
|
14
14
|
#
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
# The text `/commit` produced is passed either as the single argument, or
|
|
40
40
|
# (when no argument is given) read from stdin in full, e.g.:
|
|
41
41
|
#
|
|
42
|
-
# skills/dev-done/scripts/classify-commit-outcome.sh <<< "$COMMIT_OUTPUT"
|
|
43
|
-
# printf '%s' "$COMMIT_OUTPUT" | skills/dev-done/scripts/classify-commit-outcome.sh
|
|
42
|
+
# skills/j-dev-done/scripts/classify-commit-outcome.sh <<< "$COMMIT_OUTPUT"
|
|
43
|
+
# printf '%s' "$COMMIT_OUTPUT" | skills/j-dev-done/scripts/classify-commit-outcome.sh
|
|
44
44
|
#
|
|
45
45
|
# ---------------------------------------------------------------------------
|
|
46
46
|
# OUTPUT CONTRACT (stdout, single line, nothing else)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: distribute
|
|
3
|
-
description: Distribute Jenga AI framework files from this private monorepo to one or more consuming projects via the local filesystem. Manages release type selection, version bumping, dry-run preview, per-target file copy, and a post-distribution git commit.
|
|
2
|
+
name: j.distribute
|
|
3
|
+
description: Polyfill alias of the distribute skill under a collision-safe directory name. Identical behavior to /distribute — Distribute Jenga AI framework files from this private monorepo to one or more consuming projects via the local filesystem. Manages release type selection, version bumping, dry-run preview, per-target file copy, and a post-distribution git commit. Use when the bare /distribute form is shadowed by another tool's own built-in command of the same name.
|
|
4
4
|
keywords:
|
|
5
5
|
- distribute
|
|
6
6
|
- private distribution
|
|
@@ -8,14 +8,21 @@ keywords:
|
|
|
8
8
|
- framework update
|
|
9
9
|
- version bump
|
|
10
10
|
- distribute to projects
|
|
11
|
+
- j-distribute
|
|
12
|
+
- polyfill
|
|
11
13
|
examples:
|
|
12
14
|
- "/distribute"
|
|
13
15
|
- "/distribute /path/to/consuming-project"
|
|
14
16
|
- "/distribute --dry-run"
|
|
17
|
+
- "j-distribute"
|
|
15
18
|
---
|
|
16
19
|
|
|
17
20
|
# Distribute
|
|
18
21
|
|
|
22
|
+
This skill is a literal-directory-name duplicate of `skills/distribute/`. It exists so that `/j-distribute` (and `j.j-distribute`) give a guaranteed-unshadowed way to reach the same flow as `/distribute`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/distribute` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
23
|
+
|
|
24
|
+
This file is generated/synced by `scripts/generate-j-alias.sh distribute` from `skills/distribute/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
|
|
25
|
+
|
|
19
26
|
Copies Jenga AI framework files from this monorepo to all active consuming projects registered in `distribute.config.json`. Manages the full version lifecycle: release type selection, `package.json` version bump, dry-run preview, per-target file copy, and a final git commit of the version bump.
|
|
20
27
|
|
|
21
28
|
Distinct from `/self-sync` (which mirrors root → in-repo `.claude/.agents/`) and `/mirror-public` (which syncs to the public GitHub repo). Do not call either of those skills from within this flow.
|
|
@@ -60,7 +67,7 @@ Read `distribute.config.json`.
|
|
|
60
67
|
For each entry in `targets`:
|
|
61
68
|
- If `active` is `false`: print `Skipping <name> — inactive.` Do not include it in the distribution run.
|
|
62
69
|
- If the `path` does not exist on disk: print `Skipping <name> — path not found: <path>.` Do not include it in the distribution run.
|
|
63
|
-
- If release type is `amend`: run `bash skills/distribute/scripts/check-version.sh <path>`.
|
|
70
|
+
- If release type is `amend`: run `bash skills/j-distribute/scripts/check-version.sh <path>`.
|
|
64
71
|
- Exit 0 → include the target.
|
|
65
72
|
- Exit 1 → print `Skipping <name> — already up to date.` Do not include it in the distribution run (record it in the final report as "already up to date").
|
|
66
73
|
- Exit 2 → print `Skipping <name> — invalid path or config.` Do not include it.
|
|
@@ -87,7 +94,7 @@ On success, read the new version from `package.json` and print: `Version bumped
|
|
|
87
94
|
For each eligible target (from Step 3), run:
|
|
88
95
|
|
|
89
96
|
```bash
|
|
90
|
-
bash skills/distribute/scripts/distribute-changes.sh <project_path> --dry-run
|
|
97
|
+
bash skills/j-distribute/scripts/distribute-changes.sh <project_path> --dry-run
|
|
91
98
|
```
|
|
92
99
|
|
|
93
100
|
Display the full output for each target. Then ask the user:
|
|
@@ -101,7 +108,7 @@ Wait for confirmation. If the user does not confirm, halt without making any cha
|
|
|
101
108
|
For each eligible target in sequence:
|
|
102
109
|
|
|
103
110
|
```bash
|
|
104
|
-
bash skills/distribute/scripts/distribute-changes.sh <project_path>
|
|
111
|
+
bash skills/j-distribute/scripts/distribute-changes.sh <project_path>
|
|
105
112
|
```
|
|
106
113
|
|
|
107
114
|
Record the exit code and any output. If a target fails (non-zero exit), record the failure and continue to the next target. Do not abort the run on partial failure.
|
|
@@ -129,7 +136,7 @@ Skip this step for `amend`. Skip this step if no targets succeeded in Step 6.
|
|
|
129
136
|
Call:
|
|
130
137
|
|
|
131
138
|
```bash
|
|
132
|
-
bash skills/distribute/scripts/commit-version-bump.sh
|
|
139
|
+
bash skills/j-distribute/scripts/commit-version-bump.sh
|
|
133
140
|
```
|
|
134
141
|
|
|
135
142
|
Report the resulting commit SHA to the user.
|
|
@@ -144,15 +151,15 @@ Do not invoke `/self-sync` or `/mirror-public` at any point in this flow. They a
|
|
|
144
151
|
|
|
145
152
|
| Script | Purpose |
|
|
146
153
|
|--------|---------|
|
|
147
|
-
| `skills/distribute/scripts/distribute-changes.sh <path> [--dry-run]` | Copy framework files to a single consuming project |
|
|
148
|
-
| `skills/distribute/scripts/commit-version-bump.sh` | Commit the `package.json` version bump |
|
|
149
|
-
| `skills/distribute/scripts/check-version.sh <path>` | Amend mode: exits 0 if target needs update, 1 if up to date, 2 if invalid |
|
|
154
|
+
| `skills/j-distribute/scripts/distribute-changes.sh <path> [--dry-run]` | Copy framework files to a single consuming project |
|
|
155
|
+
| `skills/j-distribute/scripts/commit-version-bump.sh` | Commit the `package.json` version bump |
|
|
156
|
+
| `skills/j-distribute/scripts/check-version.sh <path>` | Amend mode: exits 0 if target needs update, 1 if up to date, 2 if invalid |
|
|
150
157
|
|
|
151
158
|
## Config
|
|
152
159
|
|
|
153
160
|
`distribute.config.json` at the repo root is the registry of consuming projects.
|
|
154
161
|
|
|
155
|
-
Schema reference: `skills/distribute/CONFIG_SCHEMA.md`
|
|
162
|
+
Schema reference: `skills/j-distribute/CONFIG_SCHEMA.md`
|
|
156
163
|
|
|
157
164
|
Each target entry:
|
|
158
165
|
|
|
@@ -45,7 +45,7 @@ dry_run() { echo "[DRY RUN] $*"; }
|
|
|
45
45
|
|
|
46
46
|
# ---------------------------------------------------------------------------
|
|
47
47
|
# Resolve monorepo root from this script's location.
|
|
48
|
-
# Script lives at: skills/distribute/scripts/distribute-changes.sh
|
|
48
|
+
# Script lives at: skills/j-distribute/scripts/distribute-changes.sh
|
|
49
49
|
# Repo root is three levels up.
|
|
50
50
|
# ---------------------------------------------------------------------------
|
|
51
51
|
|