@jenga-ai/agent 3.5.0 → 4.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 +85 -78
- package/agents/developer.md +1 -1
- package/agents/scrum-master.md +20 -2
- package/agents/tester.md +3 -3
- package/hooks/on_session_end.sh +5 -5
- package/lib/generate-agent-context.js +2 -2
- package/lib/generate-copilot-hooks.js +1 -1
- package/lib/generate-skill-allow-list.js +79 -8
- package/lib/mirror.js +1 -1
- package/lib/postinstall-manifest.js +1 -1
- package/lib/skill-allow-list.json +2 -2
- package/mcp/help/index.js +8 -17
- package/mcp/help/scan.js +73 -0
- package/package.json +5 -1
- package/project/app/api/lib/resolve-project-root.js +1 -1
- package/project/app/api/parsers/knowledge-graph.js +100 -9
- package/project/app/api/routes/health.js +36 -0
- package/project/app/api/scripts/capture-snapshot.js +9 -6
- package/project/app/package.json +4 -0
- package/project/app/ui/dist/assets/index-BADc5mmH.css +1 -0
- package/project/app/ui/dist/assets/index-C3oiuli_.js +104 -0
- package/project/app/ui/dist/index.html +2 -2
- package/project/app/ui/package.json +4 -0
- package/project/app/ui/scripts/build-snapshot-html.cjs +63 -2
- package/scripts/acquire-concurrency-slot.sh +35 -5
- package/scripts/apply-j-prefix.sh +46 -5
- package/scripts/build-pages-site.sh +1 -1
- package/scripts/check-public-playbook-steps.sh +158 -52
- package/scripts/check-publicignore-match.sh +2 -2
- package/scripts/compute-deploy-reconcile.sh +5 -5
- package/scripts/delete-bare-skill-dirs.sh +329 -0
- package/scripts/generate-legacy-shipped-paths.js +2 -2
- package/scripts/idea_manager.sh +273 -3
- package/scripts/mark-deployed.sh +2 -2
- package/scripts/populate-knowledge-graph.entity-resolution.test.js +254 -0
- package/scripts/populate-knowledge-graph.js +213 -5
- package/scripts/populate-knowledge-graph.staleness.test.js +130 -0
- package/scripts/postinstall.js +1 -1
- package/scripts/release-concurrency-slot.sh +34 -4
- package/scripts/render-ranked-list.sh +270 -0
- package/scripts/repoint-dead-bare-path-prose.py +81 -0
- package/scripts/repoint-skill-refs.sh +539 -0
- package/scripts/rewrite-stale-skill-preambles.py +188 -0
- package/scripts/strip-polyfill-frontmatter.py +166 -0
- package/scripts/todo_manager.sh +16 -1
- package/scripts/validate-typed-object.sh +750 -0
- package/scripts/verify-legacy-seed-reconcile.sh +10 -10
- package/scripts/verify-postinstall-reconcile.sh +7 -7
- package/scripts/write-context-digest.sh +1 -1
- package/skills/j-brainstorm/SKILL.md +3 -4
- package/skills/j-btw/SKILL.md +3 -4
- package/skills/j-clearify/SKILL.md +5 -6
- package/skills/j-close-story/SKILL.md +11 -12
- package/skills/j-close-story/scripts/check-privatized.sh +4 -4
- package/skills/j-close-story/scripts/check-story-closeable.sh +11 -4
- package/skills/j-commit/SKILL.md +3 -4
- package/skills/j-continue/SKILL.md +5 -6
- package/skills/j-deep-dive/SKILL.md +3 -4
- package/skills/j-distribute/CONFIG_SCHEMA.md +82 -5
- package/skills/j-distribute/SKILL.md +3 -4
- package/skills/j-do/SKILL.md +100 -18
- package/skills/j-doc/SKILL.md +3 -4
- package/skills/j-doc-sync/SKILL.md +4 -4
- package/skills/j-dooo/SKILL.md +6 -15
- package/skills/j-error/SKILL.md +3 -4
- package/skills/j-evaluate/SKILL.md +3 -4
- package/skills/j-examplify/SKILL.md +3 -4
- package/skills/j-gitignore/SKILL.md +157 -0
- package/skills/j-gitignore/assets/jenga-paths.txt +50 -0
- package/skills/j-gitignore/scripts/_catalog.sh +105 -0
- package/skills/j-gitignore/scripts/audit-gitignore.sh +194 -0
- package/skills/j-gitignore/scripts/repair-gitignore.sh +226 -0
- package/skills/j-gitignore/scripts/untrack-jenga-files.sh +210 -0
- package/skills/j-help/SKILL.md +3 -4
- package/skills/j-idea/SKILL.md +80 -9
- package/skills/j-idea/assets/idea_template.md +1 -1
- package/skills/j-improve/SKILL.md +4 -5
- package/skills/j-init/SKILL.md +23 -14
- package/skills/j-init/assets/scope-thresholds_template.json +5 -2
- package/skills/j-init/scripts/apply-scaffold-visibility.sh +9 -7
- package/skills/j-init/scripts/init.sh +4 -4
- package/skills/j-jbp/SKILL.md +3 -4
- package/skills/j-lgtm/SKILL.md +3 -4
- package/skills/j-pi-plan/SKILL.md +3 -4
- package/skills/j-playbook/SKILL.md +1 -1
- package/skills/j-proceed/SKILL.md +3 -4
- package/skills/j-publish/SKILL.md +4 -5
- package/skills/j-publish/adapters/npm-ci.md +6 -1
- package/skills/j-publish/adapters/npm.md +1 -1
- package/skills/j-publish/scripts/generate_release_notes.sh +1 -1
- package/skills/j-publish/scripts/npm_stage_inspect.sh +61 -0
- package/skills/j-publish/scripts/run_gates.sh +1 -1
- package/skills/j-reconcile/SKILL.md +40 -7
- package/skills/j-reconcile/assets/report_format.md +11 -0
- package/skills/j-reconcile/scripts/detect-unlinked-code.sh +13 -13
- package/skills/j-reconcile-origin/SKILL.md +3 -4
- package/skills/j-redo/SKILL.md +4 -5
- package/skills/j-skillify/SKILL.md +3 -4
- package/skills/j-spinoff/SKILL.md +4 -5
- package/skills/j-status/SKILL.md +18 -4
- package/skills/j-todo/SKILL.md +44 -5
- package/skills/j-todo/scripts/argument-is-not-ranked-list.sh +92 -0
- package/skills/j-todo/scripts/argument-is-ranked-list.sh +78 -0
- package/skills/j-uncharted/SKILL.md +252 -13
- package/skills/j-uncharted/scripts/detect-dependencies.sh +80 -22
- package/skills/j-uncharted/scripts/detect-tests.sh +1 -1
- package/skills/j-uncharted/scripts/diff-since-baseline.sh +600 -0
- package/skills/j-uncharted/scripts/elicitation-state.sh +1 -1
- package/skills/j-uncharted/scripts/find-scan-baseline.sh +545 -0
- package/skills/j-uncharted/scripts/run-engine.sh +36 -2
- package/skills/j-uncharted/scripts/validate-proposed-items.sh +1 -1
- package/skills/j-uncharted/scripts/write-scan-record.sh +361 -0
- package/skills/j-wtf/SKILL.md +4 -5
- package/skills/jenga/SKILL.md +106 -11
- package/skills/jenga/playbooks/board-hygiene.json +32 -0
- package/skills/jenga/playbooks/schema.json +73 -6
- package/skills/jenga/playbooks/understand-then-commit.json +19 -0
- package/skills/jenga/scripts/load-nl-catalog.js +5 -2
- package/skills/jenga/scripts/load-nl-catalog.sh +1 -1
- package/skills/jenga/scripts/load-playbooks.sh +290 -5
- package/skills/jenga/scripts/match-playbook.sh +4 -4
- package/skills/jenga/scripts/run-playbook-step.sh +267 -1
- package/templates/SCRUM_BOARD_SCHEMA.md +14 -1
- package/templates/SKILL_TEMPLATE.md +12 -0
- package/templates/permission-levels/level-1-locked.json +1 -1
- package/templates/permission-levels/level-2-guarded.json +1 -1
- package/templates/permission-levels/level-3-standard.json +1 -1
- package/templates/permission-levels/level-4-elevated.json +2 -2
- package/templates/permission-levels/level-5-unrestricted.json +2 -2
- package/templates/playbook-types.json +40 -6
- package/project/app/ui/dist/assets/index-7fj-vllY.js +0 -104
- package/project/app/ui/dist/assets/index-CdK3Qrep.css +0 -1
- package/scripts/audit-twin-divergence.sh +0 -625
- package/scripts/generate-j-alias.sh +0 -333
- package/skills/j-dev-done/SKILL.md +0 -53
- package/skills/j-dev-done/scripts/classify-commit-outcome.sh +0 -114
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
# SIGNAL A IS BORROWED, NOT REBUILT
|
|
38
38
|
# ---------------------------------------------------------------------------
|
|
39
39
|
# The board-linkage question is answered by
|
|
40
|
-
# `skills/uncharted/scripts/resolve-segment-target.sh` (E40_S02_T01) through its
|
|
40
|
+
# `skills/j-uncharted/scripts/resolve-segment-target.sh` (E40_S02_T01) through its
|
|
41
41
|
# documented batch interface:
|
|
42
42
|
#
|
|
43
43
|
# git ls-files | resolve-segment-target.sh --paths-from -
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
#
|
|
71
71
|
# This is deliberate. `run-engine.sh` currently renders the out-of-repo
|
|
72
72
|
# `not_checked` case as `unlinked` in its understanding document, which asserts
|
|
73
|
-
# a verified absence that was never verified. `skills/uncharted/SKILL.md` names
|
|
73
|
+
# a verified absence that was never verified. `skills/j-uncharted/SKILL.md` names
|
|
74
74
|
# Step 1 (`resolve-segment-target.sh`) authoritative on linkage where the two
|
|
75
75
|
# disagree, so this script passes the resolver's status through unchanged and
|
|
76
76
|
# does not repeat that conflation.
|
|
@@ -104,8 +104,8 @@
|
|
|
104
104
|
# Classifying files and then reporting directories would assert about a
|
|
105
105
|
# directory something that was only ever verified about its contents. Because
|
|
106
106
|
# the resolver's match is a path-boundary test, a board item naming
|
|
107
|
-
# `skills/convert/` links THAT DIRECTORY without linking
|
|
108
|
-
# `skills/convert/convert_cli.py`. Both facts are true, and the directory-level
|
|
107
|
+
# `skills/j-convert/` links THAT DIRECTORY without linking
|
|
108
|
+
# `skills/j-convert/convert_cli.py`. Both facts are true, and the directory-level
|
|
109
109
|
# one is what decides whether a segment is worth investigating -- offering
|
|
110
110
|
# `/uncharted segment` there would duplicate a board item that already exists.
|
|
111
111
|
#
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
# MIRROR SPELLINGS. Per CLAUDE.md the canonical file lives in the root tree and
|
|
126
126
|
# `.agents/`, `.claude/` are generated build outputs -- but older board items
|
|
127
127
|
# were often written against the mirror path. E17_S05 owns `/reconcile-origin`
|
|
128
|
-
# and names it `.agents/skills/reconcile-origin/SKILL.md`, so a match on the
|
|
128
|
+
# and names it `.agents/skills/j-reconcile-origin/SKILL.md`, so a match on the
|
|
129
129
|
# root path alone misses a board item that plainly owns the directory. Each
|
|
130
130
|
# group directory is therefore asked about under its own name and under both
|
|
131
131
|
# mirror prefixes, and `directory_linkage.matched_as` records which spelling
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
# --board-dir <dir> Board directory to consult.
|
|
144
144
|
# Default: <repo-root>/project/board
|
|
145
145
|
# --resolver <path> Path to resolve-segment-target.sh.
|
|
146
|
-
# Default: ../../uncharted/scripts/resolve-segment-target.sh
|
|
146
|
+
# Default: ../../j-uncharted/scripts/resolve-segment-target.sh
|
|
147
147
|
# --exclude <glob> Additional exclusion, matched against the repo-relative
|
|
148
148
|
# path with shell-glob semantics. Repeatable.
|
|
149
149
|
# --limit N Cap on files listed per group. Default 10. 0 = unlimited.
|
|
@@ -187,14 +187,14 @@
|
|
|
187
187
|
# "not_checked_paths": N,
|
|
188
188
|
# "groups": N, "covered_groups": N },
|
|
189
189
|
# "groups": [
|
|
190
|
-
# { "directory": "skills/skillify",
|
|
190
|
+
# { "directory": "skills/j-skillify",
|
|
191
191
|
# "unlinked_count": N, // files keyed to THIS group
|
|
192
192
|
# "subtree_candidates": N, // all candidates under the directory
|
|
193
193
|
# "subtree_unlinked": N, // all unlinked under the directory
|
|
194
194
|
# "fully_unlinked": true,
|
|
195
195
|
# "directory_linkage": { "status": "unlinked", "reason": "...",
|
|
196
196
|
# "items": [], "match_count": 0,
|
|
197
|
-
# "matched_as": "skills/skillify" },
|
|
197
|
+
# "matched_as": "skills/j-skillify" },
|
|
198
198
|
# "files": ["..."], // capped by --limit
|
|
199
199
|
# "files_truncated": N }
|
|
200
200
|
# ],
|
|
@@ -292,10 +292,10 @@ REPO_ROOT=$(cd -- "$REPO_ROOT" && pwd -P)
|
|
|
292
292
|
[ -n "$BOARD_DIR" ] || BOARD_DIR="$REPO_ROOT/project/board"
|
|
293
293
|
|
|
294
294
|
# --- the borrowed linkage check -------------------------------------------------------------
|
|
295
|
-
[ -n "$RESOLVER" ] || RESOLVER="$SCRIPT_DIR/../../uncharted/scripts/resolve-segment-target.sh"
|
|
295
|
+
[ -n "$RESOLVER" ] || RESOLVER="$SCRIPT_DIR/../../j-uncharted/scripts/resolve-segment-target.sh"
|
|
296
296
|
[ -f "$RESOLVER" ] || die 4 "board-linkage checker not found: $RESOLVER
|
|
297
297
|
This script deliberately has no fallback implementation -- see the header. Restore
|
|
298
|
-
skills/uncharted/scripts/resolve-segment-target.sh or pass --resolver <path>."
|
|
298
|
+
skills/j-uncharted/scripts/resolve-segment-target.sh or pass --resolver <path>."
|
|
299
299
|
[ -x "$RESOLVER" ] || die 4 "board-linkage checker is not executable: $RESOLVER"
|
|
300
300
|
RESOLVER=$(cd -- "$(dirname -- "$RESOLVER")" && pwd -P)/$(basename -- "$RESOLVER")
|
|
301
301
|
|
|
@@ -572,8 +572,8 @@ for path, status in sorted(status_of.items()):
|
|
|
572
572
|
# --- second pass: is the GROUP DIRECTORY itself on the board? ---------------------------------
|
|
573
573
|
# Reporting a directory while only ever having checked the files inside it asserts an absence
|
|
574
574
|
# that was never verified -- the same error this script is careful to avoid for `not_checked`.
|
|
575
|
-
# The resolver's match is a path-boundary test, so a board item naming `skills/convert/` links
|
|
576
|
-
# that directory without linking `skills/convert/convert_cli.py`. Both facts are true and the
|
|
575
|
+
# The resolver's match is a path-boundary test, so a board item naming `skills/j-convert/` links
|
|
576
|
+
# that directory without linking `skills/j-convert/convert_cli.py`. Both facts are true and the
|
|
577
577
|
# directory-level one is the one that decides whether a segment is worth investigating.
|
|
578
578
|
#
|
|
579
579
|
# Same borrowed checker, same batch interface, one extra call. No new linkage logic -- the only
|
|
@@ -582,7 +582,7 @@ for path, status in sorted(status_of.items()):
|
|
|
582
582
|
# MIRROR SPELLINGS. Per CLAUDE.md the canonical file lives in the root tree and `.agents/` and
|
|
583
583
|
# `.claude/` are generated build outputs, but plenty of older board items were written against
|
|
584
584
|
# the mirror path -- E17_S05 owns `/reconcile-origin` and names it as
|
|
585
|
-
# `.agents/skills/reconcile-origin/SKILL.md`. A boundary match on the root path alone therefore
|
|
585
|
+
# `.agents/skills/j-reconcile-origin/SKILL.md`. A boundary match on the root path alone therefore
|
|
586
586
|
# misses a board item that plainly owns the directory. So each directory is asked about under its
|
|
587
587
|
# own name and under both mirror prefixes, and a hit on any spelling is board provenance. This
|
|
588
588
|
# adds path spellings to the QUESTION; it does not add a second answer to it.
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.reconcile-origin
|
|
3
|
-
description:
|
|
3
|
+
description: Sync the current (or specified) branch with origin by rebasing local commits on top of the latest upstream state.
|
|
4
4
|
keywords:
|
|
5
5
|
- "sync branch"
|
|
6
6
|
- "rebase origin"
|
|
7
7
|
- "reconcile origin"
|
|
8
8
|
- "pull rebase"
|
|
9
9
|
- j-reconcile-origin
|
|
10
|
-
- polyfill
|
|
11
10
|
examples:
|
|
12
11
|
- "sync my branch with origin"
|
|
13
12
|
- "rebase local commits on top of origin"
|
|
@@ -17,9 +16,9 @@ examples:
|
|
|
17
16
|
|
|
18
17
|
# Reconcile Origin
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
`skills/j-reconcile-origin/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-reconcile-origin/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/reconcile-origin/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
23
22
|
|
|
24
23
|
Use this skill to rebase local work on top of the latest `origin/<branch>` state without re-implementing git logic inline.
|
|
25
24
|
|
package/skills/j-redo/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.redo
|
|
3
|
-
description:
|
|
3
|
+
description: Redo parts or entire previous implementations identified by a commit SHA or an Epic/Story number (e.g. E01, E02_S03). Expects an identifier and a description of what to redo and why. Use when the user wants to revisit, rework, or rewrite previously completed work, including updating all affected documentation.
|
|
4
4
|
keywords:
|
|
5
5
|
- redo
|
|
6
6
|
- rework
|
|
@@ -8,7 +8,6 @@ keywords:
|
|
|
8
8
|
- revisit
|
|
9
9
|
- redo task
|
|
10
10
|
- j-redo
|
|
11
|
-
- polyfill
|
|
12
11
|
examples:
|
|
13
12
|
- "redo the login implementation"
|
|
14
13
|
- "rewrite story E02_S01"
|
|
@@ -19,9 +18,9 @@ metadata:
|
|
|
19
18
|
|
|
20
19
|
# Redo — Rework a Previous Implementation
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
`skills/j-redo/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-redo/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/redo/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
25
24
|
|
|
26
25
|
## Input Format
|
|
27
26
|
|
|
@@ -60,7 +59,7 @@ Compare the user's redo description against the original implementation to deter
|
|
|
60
59
|
Summarise scope findings to the user in a brief list before continuing.
|
|
61
60
|
|
|
62
61
|
### 3. Plan the redo
|
|
63
|
-
Populate `skills/todo/assets/todo_handoff_template.md` with the following pre-collected context:
|
|
62
|
+
Populate `skills/j-todo/assets/todo_handoff_template.md` with the following pre-collected context:
|
|
64
63
|
- **Mission title**: a short name for the redo work
|
|
65
64
|
- **Goal / objective**: the redo objective — what is changing and the desired outcome
|
|
66
65
|
- **Affected files or scope**: code, tests, and documentation files identified in step 2
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.skillify
|
|
3
|
-
description:
|
|
3
|
+
description: Refactor one or more existing skills into a cleaner, more maintainable structure — extracting hardcoded content into asset files, offloading deterministic steps into scripts, and reorganizing the skill body to reflect the leaner result. Use this whenever the user wants to clean up, improve, or restructure an existing skill, mentions that a skill has hardcoded content that could be templated, or asks to "skillify", "refactor", or "tidy up" a skill. Trigger even if the user just pastes a skill and says something like "can we make this better?".
|
|
4
4
|
keywords:
|
|
5
5
|
- j-skillify
|
|
6
|
-
- polyfill
|
|
7
6
|
---
|
|
8
7
|
|
|
9
8
|
# Skillify — Refactor a Skill into a Cleaner Structure
|
|
10
9
|
|
|
11
|
-
|
|
10
|
+
`skills/j-skillify/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-skillify/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/skillify/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
14
13
|
|
|
15
14
|
## What this skill does
|
|
16
15
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.spinoff
|
|
3
|
-
description:
|
|
3
|
+
description: Capture a diverging topic mid-conversation. Collects context and a mandatory origin, optionally runs /brainstorm for prerequisites, saves an /idea entry, and returns focus to the primary thread.
|
|
4
4
|
keywords:
|
|
5
5
|
- spinoff
|
|
6
6
|
- diverge
|
|
@@ -8,7 +8,6 @@ keywords:
|
|
|
8
8
|
- capture topic
|
|
9
9
|
- new thread
|
|
10
10
|
- j-spinoff
|
|
11
|
-
- polyfill
|
|
12
11
|
examples:
|
|
13
12
|
- "let's spinoff this idea"
|
|
14
13
|
- "capture this as a separate thread"
|
|
@@ -19,9 +18,9 @@ metadata:
|
|
|
19
18
|
|
|
20
19
|
# Spinoff — Capture a Diverging Topic
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
`skills/j-spinoff/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-spinoff/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/spinoff/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
25
24
|
|
|
26
25
|
## Instructions
|
|
27
26
|
|
|
@@ -44,7 +43,7 @@ This file is generated/synced by `scripts/generate-j-alias.sh spinoff` from `ski
|
|
|
44
43
|
|
|
45
44
|
4. **Run /brainstorm (if chosen)** — Invoke the `/brainstorm` skill, passing the diverging topic and collected context as the opening prompt. After `/brainstorm` completes, use the refined output as the idea description.
|
|
46
45
|
|
|
47
|
-
5. **Save via `/idea`** — Populate `skills/idea/assets/idea_handoff_template.md` with the context collected so far:
|
|
46
|
+
5. **Save via `/idea`** — Populate `skills/j-idea/assets/idea_handoff_template.md` with the context collected so far:
|
|
48
47
|
- **Mission title**: the diverging topic name (as confirmed in step 1)
|
|
49
48
|
- **Goal / objective**: what the diverging topic aims to achieve
|
|
50
49
|
- **Affected files or scope**: any files or modules identified during the conversation
|
package/skills/j-status/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.status
|
|
3
|
-
description:
|
|
3
|
+
description: Print a human-readable summary of the entire scrum board — all epics, stories, and tasks with their statuses — plus any open rapports and unprocessed queue triggers. Use when you want a quick overview of project state without reading raw files.
|
|
4
4
|
output_types: text
|
|
5
5
|
keywords:
|
|
6
6
|
- status
|
|
@@ -9,7 +9,6 @@ keywords:
|
|
|
9
9
|
- project state
|
|
10
10
|
- what's done
|
|
11
11
|
- j-status
|
|
12
|
-
- polyfill
|
|
13
12
|
examples:
|
|
14
13
|
- "show me the project status"
|
|
15
14
|
- "what's the state of the board?"
|
|
@@ -18,9 +17,9 @@ examples:
|
|
|
18
17
|
|
|
19
18
|
# Status — Board Overview
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
`skills/j-status/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-status/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/status/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
24
23
|
|
|
25
24
|
## Instructions
|
|
26
25
|
|
|
@@ -36,6 +35,21 @@ This file is generated/synced by `scripts/generate-j-alias.sh status` from `skil
|
|
|
36
35
|
|
|
37
36
|
6. **Check the queue** — If `project/queue/scrum_triggers.jsonl` is non-empty, note the number of pending triggers awaiting the scrum master.
|
|
38
37
|
|
|
38
|
+
6.5. **Run the deploy-reconcile pass** (`E51_S05`) before printing the summary — `/status` has no
|
|
39
|
+
`scripts/` directory of its own comparable to `/self-sync`'s, so invoke the shared pipeline
|
|
40
|
+
directly rather than adding a third skill-local wrapper script:
|
|
41
|
+
```
|
|
42
|
+
bash "$([ -f scripts/mark-deployed.sh ] && echo scripts/mark-deployed.sh || echo node_modules/@jenga-ai/agent/scripts/mark-deployed.sh)"
|
|
43
|
+
```
|
|
44
|
+
This defaults to invoking its own sibling `scripts/compute-deploy-reconcile.sh`, which
|
|
45
|
+
discovers any not-yet-reconciled `vX.Y.Z-stage`/`vX.Y.Z` tags on the public `jenga-npm` repo
|
|
46
|
+
(unauthenticated read — no credential required) and promotes matching `Publicized`/
|
|
47
|
+
`Deployed to Stage` tickets to `Deployed to Stage`/`Deployed to Prod` (writing
|
|
48
|
+
`date_deployed_prod` on a Prod promotion) by commit ancestry, before this skill re-scans the
|
|
49
|
+
board in steps 2-4 above. This step is **non-fatal**: a failure anywhere in the pipeline
|
|
50
|
+
(including an unreachable public repo) is logged as a warning only and never prevents `/status`
|
|
51
|
+
from printing whatever board state it already has, and never causes a non-zero exit.
|
|
52
|
+
|
|
39
53
|
7. **Print the summary** following the layout and icon conventions in `assets/output_format.md`.
|
|
40
54
|
|
|
41
55
|
8. If no epics exist, print: `No board items found. Run /pi-plan to define epics or /todo to add items.`
|
package/skills/j-todo/SKILL.md
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.todo
|
|
3
|
-
description:
|
|
3
|
+
description: Add missions to the project todo list (project/todo.md), optionally linking them to epics and stories. Loops until the user is done, then optionally executes the list.
|
|
4
|
+
output_types:
|
|
5
|
+
- when: argument-is-ranked-list
|
|
6
|
+
type: ranked_list
|
|
7
|
+
- when: argument-is-not-ranked-list
|
|
8
|
+
type: id_list
|
|
9
|
+
input_types: id_list
|
|
4
10
|
keywords:
|
|
5
11
|
- todo
|
|
6
12
|
- add task
|
|
@@ -8,7 +14,6 @@ keywords:
|
|
|
8
14
|
- backlog
|
|
9
15
|
- add to list
|
|
10
16
|
- j-todo
|
|
11
|
-
- polyfill
|
|
12
17
|
examples:
|
|
13
18
|
- "add this to the todo list"
|
|
14
19
|
- "queue this as a task"
|
|
@@ -19,9 +24,9 @@ metadata:
|
|
|
19
24
|
|
|
20
25
|
# Todo — Add Missions to the Todo List
|
|
21
26
|
|
|
22
|
-
|
|
27
|
+
`skills/j-todo/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-todo/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
23
28
|
|
|
24
|
-
|
|
29
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/todo/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
25
30
|
|
|
26
31
|
## `--trivial` Flag
|
|
27
32
|
|
|
@@ -29,12 +34,46 @@ This file is generated/synced by `scripts/generate-j-alias.sh todo` from `skills
|
|
|
29
34
|
|
|
30
35
|
When `--trivial` is present, the mission is written as a **fully-formed task board file immediately** (not just a raw `todo.md` line deferred to `/do`'s own breakdown pass) with `execution_scope: inline` forced unconditionally — no threshold computation is consulted for the scope value itself. See step 4.5 below for the mechanics.
|
|
31
36
|
|
|
32
|
-
**Human-only override.** `--trivial` is invoked by a human typing `/todo --trivial ...` — it is never applied by the scrum-master to itself during autonomous story/epic breakdown elsewhere (e.g. `/jenga`'s Phase 0.5, or `/do`'s own scrum-master decomposition step in `skills/do/SKILL.md` step 3). Those paths keep using the normal heuristic-only `execution_scope` assignment documented in `agents/scrum-master.md`'s Execution Scope Assignment section, unmodified by this flag.
|
|
37
|
+
**Human-only override.** `--trivial` is invoked by a human typing `/todo --trivial ...` — it is never applied by the scrum-master to itself during autonomous story/epic breakdown elsewhere (e.g. `/jenga`'s Phase 0.5, or `/do`'s own scrum-master decomposition step in `skills/j-do/SKILL.md` step 3). Those paths keep using the normal heuristic-only `execution_scope` assignment documented in `agents/scrum-master.md`'s Execution Scope Assignment section, unmodified by this flag.
|
|
33
38
|
|
|
34
39
|
**Fallback on failure is out of scope here.** If a `--trivial`-forced inline run fails the smoke-harness or shows scope creep at dispatch time, `/do`'s own `--trivial` handling (a separate task, E32_S14_T02) is responsible for falling back to the full `task` pipeline — this skill only ever writes the initial forced-inline task.
|
|
35
40
|
|
|
41
|
+
## `--ranked-list` Flag
|
|
42
|
+
|
|
43
|
+
**Syntax:** `/todo --ranked-list` — takes no other arguments.
|
|
44
|
+
|
|
45
|
+
**Non-interactive, one-shot, read-only.** `--ranked-list` is a distinct mode, not a modifier on a
|
|
46
|
+
normal `/todo` mission-add invocation. It calls the shared `scripts/render-ranked-list.sh` (built by
|
|
47
|
+
`E63_S01_T01`; see that script's own header comment for the full eligibility rule and its env-var
|
|
48
|
+
overrides — do not re-derive or restate the scan logic here) and prints its stdout **verbatim**, then
|
|
49
|
+
exits — this is exactly the same script and the same eligibility scan `/dooo`'s own step 2/3 already
|
|
50
|
+
uses (`skills/j-dooo/SKILL.md`), so `--ranked-list`'s output is byte-for-byte identical to `/dooo`'s
|
|
51
|
+
list for the same board/`todo.md` state. Do not append a trailing "Done" option or any interactive
|
|
52
|
+
prompt — that framing belongs to `/dooo`'s own UI layer on top of the script, not to the shared
|
|
53
|
+
script's output, and not to `--ranked-list` either.
|
|
54
|
+
|
|
55
|
+
**No mutation.** `--ranked-list` never writes `project/todo.md`, never writes a board file, and never
|
|
56
|
+
dispatches a task. It is a pure read/render, matching `scripts/render-ranked-list.sh`'s own
|
|
57
|
+
no-mutation contract.
|
|
58
|
+
|
|
59
|
+
**Takes precedence over mission text.** If the user somehow passes `--ranked-list` together with
|
|
60
|
+
mission text, treat `--ranked-list` as taking precedence and ignore the mission text — it has no
|
|
61
|
+
mission to attach to, so it cannot combine the way `--trivial` combines with an epic/story reference.
|
|
62
|
+
|
|
63
|
+
**Short-circuits the whole flow.** See step 0 below — when `--ranked-list` is passed, none of the
|
|
64
|
+
normal `/todo` steps 1-6 (the "where/what/goal" questions, mission classification, board writes, the
|
|
65
|
+
"add another" loop) are ever reached.
|
|
66
|
+
|
|
36
67
|
## Instructions
|
|
37
68
|
|
|
69
|
+
0. **If `--ranked-list` was passed, handle it now and stop — do not proceed to step 1:**
|
|
70
|
+
```
|
|
71
|
+
bash "$([ -f scripts/render-ranked-list.sh ] && echo scripts/render-ranked-list.sh || echo node_modules/@jenga-ai/agent/scripts/render-ranked-list.sh)"
|
|
72
|
+
```
|
|
73
|
+
Print the script's stdout verbatim as the response (no added framing, no "Done" option, no
|
|
74
|
+
follow-up question) and end the skill invocation here. Steps 1-6 below do not apply to
|
|
75
|
+
`--ranked-list` at all.
|
|
76
|
+
|
|
38
77
|
1. **Ensure `project/todo.md` exists** — If it doesn't exist, it will be auto-created by `todo_manager.sh` — no manual action needed.
|
|
39
78
|
|
|
40
79
|
2. **Ask the user about the mission:**
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ---------------------------------------------------------------------------
|
|
3
|
+
# skills/j-todo/scripts/argument-is-not-ranked-list.sh
|
|
4
|
+
#
|
|
5
|
+
# Classifier for the OTHER half of j-todo's conditional `output_types` declaration
|
|
6
|
+
# (E63_S01_T04, corrected). `output_types: id_list` was deliberately declared on j-todo by
|
|
7
|
+
# `E53_S11_T01` ("j-todo (none) -> id_list (emits board item ids)") -- /todo's normal
|
|
8
|
+
# mission-capture flow genuinely does produce a forwardable board-item id, and that claim is
|
|
9
|
+
# still true after E63_S01_T03 added --ranked-list. It must stay declared, not be silently
|
|
10
|
+
# dropped when the ranked_list branch is added alongside it.
|
|
11
|
+
#
|
|
12
|
+
# This script is the "when" for that id_list branch. It is the exact logical complement of
|
|
13
|
+
# `argument-is-ranked-list.sh` -- deliberately implemented as a thin delegate to that script
|
|
14
|
+
# rather than a second, independently-written check, so the two branches can never quietly
|
|
15
|
+
# drift apart on what "--ranked-list" means. There is exactly one place that decision is made
|
|
16
|
+
# (argument-is-ranked-list.sh); this script only inverts its verdict.
|
|
17
|
+
#
|
|
18
|
+
# Why not the built-in `argument_nonempty` predicate instead of a real script: `--ranked-list`
|
|
19
|
+
# is ALSO a non-empty argument, so `argument_nonempty -> id_list` would be a false claim for
|
|
20
|
+
# that one specific invocation shape (its actual output is ranked_list, never id_list). Using
|
|
21
|
+
# the built-in here would pass load-playbooks.sh's structural check trivially (no script to
|
|
22
|
+
# find), but it would misdescribe the one case this task exists to carve out -- exactly the
|
|
23
|
+
# honesty-over-breadth violation E53_S11 rejects. A dedicated classifier that excludes
|
|
24
|
+
# `--ranked-list` precisely is the honest choice.
|
|
25
|
+
#
|
|
26
|
+
# ---------------------------------------------------------------------------
|
|
27
|
+
# USAGE
|
|
28
|
+
# ---------------------------------------------------------------------------
|
|
29
|
+
# skills/j-todo/scripts/argument-is-not-ranked-list.sh "<raw /todo invocation argument>"
|
|
30
|
+
#
|
|
31
|
+
# ---------------------------------------------------------------------------
|
|
32
|
+
# OUTPUT CONTRACT
|
|
33
|
+
# ---------------------------------------------------------------------------
|
|
34
|
+
# stdout is always a single JSON object:
|
|
35
|
+
#
|
|
36
|
+
# {"classification": "normal"} -- exit 0 -- the argument is anything OTHER than exactly
|
|
37
|
+
# `--ranked-list` (empty, mission text, `--trivial ...`,
|
|
38
|
+
# etc.) -- /todo's normal mission-capture flow applies.
|
|
39
|
+
# {"classification": "ranked_list"} -- exit 1 -- the argument IS exactly `--ranked-list`; the
|
|
40
|
+
# complement branch (argument-is-ranked-list.sh) applies
|
|
41
|
+
# instead, not this one.
|
|
42
|
+
#
|
|
43
|
+
# ---------------------------------------------------------------------------
|
|
44
|
+
# EXIT CODES
|
|
45
|
+
# ---------------------------------------------------------------------------
|
|
46
|
+
# 0 "normal" classification (see above)
|
|
47
|
+
# 1 "ranked_list" classification (see above) -- a legitimate outcome, not an error
|
|
48
|
+
# 2 usage error (no argument given), or the delegate script is missing/unreadable, or the
|
|
49
|
+
# delegate exited with an exit code this script does not recognize
|
|
50
|
+
#
|
|
51
|
+
# ---------------------------------------------------------------------------
|
|
52
|
+
|
|
53
|
+
set -euo pipefail
|
|
54
|
+
|
|
55
|
+
if [ $# -lt 1 ]; then
|
|
56
|
+
echo 'Usage: argument-is-not-ranked-list.sh "<raw /todo invocation argument>"' >&2
|
|
57
|
+
exit 2
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
RAW_INPUT="$1"
|
|
61
|
+
|
|
62
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
63
|
+
RANKED_LIST_CLASSIFIER="$SCRIPT_DIR/argument-is-ranked-list.sh"
|
|
64
|
+
|
|
65
|
+
if [ ! -f "$RANKED_LIST_CLASSIFIER" ]; then
|
|
66
|
+
echo "Error: argument-is-ranked-list.sh not found at $RANKED_LIST_CLASSIFIER" >&2
|
|
67
|
+
exit 2
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
# Guard the capture explicitly so `set -e` doesn't abort this script on the delegate's own
|
|
71
|
+
# legitimate non-zero exit (1 == "normal" from the delegate's point of view).
|
|
72
|
+
set +e
|
|
73
|
+
bash "$RANKED_LIST_CLASSIFIER" "$RAW_INPUT" >/dev/null 2>&1
|
|
74
|
+
DELEGATE_EXIT=$?
|
|
75
|
+
set -e
|
|
76
|
+
|
|
77
|
+
case "$DELEGATE_EXIT" in
|
|
78
|
+
0)
|
|
79
|
+
# Delegate says "ranked_list" -- the complement is false.
|
|
80
|
+
echo '{"classification": "ranked_list"}'
|
|
81
|
+
exit 1
|
|
82
|
+
;;
|
|
83
|
+
1)
|
|
84
|
+
# Delegate says "normal" -- the complement is true.
|
|
85
|
+
echo '{"classification": "normal"}'
|
|
86
|
+
exit 0
|
|
87
|
+
;;
|
|
88
|
+
*)
|
|
89
|
+
echo "Error: argument-is-ranked-list.sh exited with unexpected status $DELEGATE_EXIT" >&2
|
|
90
|
+
exit 2
|
|
91
|
+
;;
|
|
92
|
+
esac
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ---------------------------------------------------------------------------
|
|
3
|
+
# skills/j-todo/scripts/argument-is-ranked-list.sh
|
|
4
|
+
#
|
|
5
|
+
# Classifier for `j-todo`'s conditional `output_types` declaration (E63_S01_T04). `/todo`'s normal
|
|
6
|
+
# behavior (adding a mission to the board) produces no forwardable output -- only the distinct
|
|
7
|
+
# `--ranked-list` invocation (E63_S01_T03) does, by printing `scripts/render-ranked-list.sh`'s
|
|
8
|
+
# `ranked_list`-typed output verbatim (see `skills/j-todo/SKILL.md`'s "--ranked-list Flag" section).
|
|
9
|
+
#
|
|
10
|
+
# Declaring `output_types: ranked_list` unconditionally would misdescribe every normal /todo
|
|
11
|
+
# invocation as a ranked_list producer, violating E53_S11's honesty-over-breadth policy. This script
|
|
12
|
+
# is the classifier `skills/j-todo/SKILL.md`'s `output_types` keys off of instead, per
|
|
13
|
+
# `docs/skill-authoring.md`'s conditional `{when, type}` form -- the same pattern `j.jenga` already
|
|
14
|
+
# uses for `detect-nl-intent.sh`.
|
|
15
|
+
#
|
|
16
|
+
# Neither built-in predicate (`argument_empty` / `argument_nonempty`) fits here: `--ranked-list` is a
|
|
17
|
+
# non-empty argument, but so is mission text and `--trivial ...` -- both of which still produce
|
|
18
|
+
# `/todo`'s normal (undeclared-type) output, not `ranked_list`. `argument_nonempty` alone cannot tell
|
|
19
|
+
# those apart, so this dedicated classifier exists to draw that one distinction.
|
|
20
|
+
#
|
|
21
|
+
# ---------------------------------------------------------------------------
|
|
22
|
+
# WHAT THIS SCRIPT IS FOR (read before assuming it gates runtime routing)
|
|
23
|
+
# ---------------------------------------------------------------------------
|
|
24
|
+
# `skills/jenga/scripts/load-playbooks.sh` only ever checks that a classifier-script `when` value
|
|
25
|
+
# resolves to an existing, executable file on disk under this skill's own `scripts/` directory -- it
|
|
26
|
+
# never runs this script to decide which `output_types` branch actually fires (see
|
|
27
|
+
# `docs/skill-authoring.md`'s "output_types" and "forward_from resolution" sections for the exact,
|
|
28
|
+
# narrow claim that load-time check does and does not make). This script exists so that structural
|
|
29
|
+
# check has a real file to find, and so the classification it names is genuinely correct if anything
|
|
30
|
+
# ever does execute it (e.g. a future runtime-verification path) -- not because anything wires its
|
|
31
|
+
# exit code into routing today. `skills/j-todo/SKILL.md`'s own step 0 short-circuit is what actually
|
|
32
|
+
# decides the `--ranked-list` branch at real invocation time; this script's job is narrower and
|
|
33
|
+
# purely descriptive.
|
|
34
|
+
#
|
|
35
|
+
# ---------------------------------------------------------------------------
|
|
36
|
+
# USAGE
|
|
37
|
+
# ---------------------------------------------------------------------------
|
|
38
|
+
# skills/j-todo/scripts/argument-is-ranked-list.sh "<raw /todo invocation argument>"
|
|
39
|
+
#
|
|
40
|
+
# ---------------------------------------------------------------------------
|
|
41
|
+
# OUTPUT CONTRACT
|
|
42
|
+
# ---------------------------------------------------------------------------
|
|
43
|
+
# stdout is always a single JSON object:
|
|
44
|
+
#
|
|
45
|
+
# {"classification": "ranked_list"} -- exit 0 -- the argument, trimmed, is exactly `--ranked-list`
|
|
46
|
+
# {"classification": "normal"} -- exit 1 -- anything else, including an empty argument,
|
|
47
|
+
# mission text, or `--trivial ...`
|
|
48
|
+
#
|
|
49
|
+
# ---------------------------------------------------------------------------
|
|
50
|
+
# EXIT CODES
|
|
51
|
+
# ---------------------------------------------------------------------------
|
|
52
|
+
# 0 "ranked_list" classification (see above)
|
|
53
|
+
# 1 "normal" classification (see above) -- a legitimate outcome, not an error
|
|
54
|
+
# 2 usage error (no argument given)
|
|
55
|
+
#
|
|
56
|
+
# ---------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
set -euo pipefail
|
|
59
|
+
|
|
60
|
+
if [ $# -lt 1 ]; then
|
|
61
|
+
echo 'Usage: argument-is-ranked-list.sh "<raw /todo invocation argument>"' >&2
|
|
62
|
+
exit 2
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
RAW_INPUT="$1"
|
|
66
|
+
|
|
67
|
+
# Trim leading/trailing whitespace only -- no other normalization. `--ranked-list` "takes no other
|
|
68
|
+
# arguments" per skills/j-todo/SKILL.md, so anything beyond the flag itself (e.g. trailing mission
|
|
69
|
+
# text accidentally combined with it) is deliberately NOT classified as ranked_list here.
|
|
70
|
+
TRIMMED="$(printf '%s' "$RAW_INPUT" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
|
|
71
|
+
|
|
72
|
+
if [ "$TRIMMED" = "--ranked-list" ]; then
|
|
73
|
+
echo '{"classification": "ranked_list"}'
|
|
74
|
+
exit 0
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
echo '{"classification": "normal"}'
|
|
78
|
+
exit 1
|