jhste-skills 0.3.4 → 0.3.5

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.5 - 2026-06-28
4
+
5
+ ### Added
6
+ - Added `jhste-long-running-work-loop`, a narrow orchestration skill for multi-session and long-running work that preserves goals, phases, approval boundaries, resume points, and durable-state routing without replacing code-quality, PRD, issue, triage, or handoff workflows.
7
+
8
+ ### Changed
9
+ - Updated smoke-test expected skill counts now that the bundled/core skill set includes the new long-running work loop skill.
10
+
11
+ ### Validation
12
+ - `npm test` passed.
13
+ - `jhste-skills guard --scope changed --format text --fail-on error` passed with 0 warnings/errors.
14
+
3
15
  ## 0.3.4 - 2026-06-26
4
16
 
5
17
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jhste-skills",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "description": "Installable engineering guardrails and workflow skills for AI coding agents.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -13,7 +13,7 @@ export function runConnectScenarios({ root, tmp, skillsDir }) {
13
13
  fs.mkdirSync(nonGitCwd, { recursive: true });
14
14
  run(process.execPath, [path.join(root, 'cli/install.mjs'), '--yes', '--skills-dir', nonGitCwdSkills, '--skip-deep-scan'], { cwd: nonGitCwd });
15
15
  if (fs.existsSync(path.join(nonGitCwd, '.jhste'))) fail('install outside git repo created .jhste');
16
- if (skillDirs(nonGitCwdSkills).length !== 20) fail('install outside git repo did not install 20 bundled skills');
16
+ if (skillDirs(nonGitCwdSkills).length !== 21) fail('install outside git repo did not install 21 bundled skills');
17
17
 
18
18
  const explicitNonGitRepo = path.join(tmp, 'explicit-non-git-repo');
19
19
  const explicitNonGitSkills = path.join(tmp, 'explicit-non-git-skills');
@@ -42,6 +42,6 @@ export function runConnectScenarios({ root, tmp, skillsDir }) {
42
42
  if (connectMissing.status !== 3) fail(`connect missing skills should exit 3, got ${connectMissing.status}`);
43
43
  if (fs.existsSync(path.join(connectMissingRepo, '.jhste'))) fail('connect missing skills created .jhste');
44
44
  run(process.execPath, [path.join(root, 'cli/connect.mjs'), '--mode', 'normal', '--yes', '--repo', connectMissingRepo, '--skills-dir', connectMissingSkills, '--skip-deep-scan', '--install-missing'], { cwd: connectMissingRepo });
45
- if (skillDirs(connectMissingSkills).length !== 20) fail('connect --install-missing did not install 20 bundled skills');
45
+ if (skillDirs(connectMissingSkills).length !== 21) fail('connect --install-missing did not install 21 bundled skills');
46
46
  if (!fs.existsSync(path.join(connectMissingRepo, '.jhste', 'profile.yaml'))) fail('connect --install-missing did not create profile');
47
47
  }
@@ -112,7 +112,7 @@ function runDefaultInstall(ctx) {
112
112
  const manifest = readManagedSkillsManifest(skillsDir);
113
113
  if (manifest.managed_by !== 'jhste-skills' || !manifest.skills?.['jhste-red-team-review']?.digest) fail('skills manifest missing managed skill digest');
114
114
  const defaultSkillDirs = skillDirs(skillsDir);
115
- if (defaultSkillDirs.length !== 20) fail(`default install should copy 20 bundled skills, got ${defaultSkillDirs.length}`);
115
+ if (defaultSkillDirs.length !== 21) fail(`default install should copy 21 bundled skills, got ${defaultSkillDirs.length}`);
116
116
  if (!defaultSkillDirs.includes('improve-codebase-architecture')) fail('default install should copy vendored workflow skills');
117
117
  }
118
118
 
@@ -268,7 +268,7 @@ function runSkillSetScenarios({ root, tmp }) {
268
268
  fs.writeFileSync(path.join(allRepo, 'AGENTS.md'), '# All skill repo\n');
269
269
  run(process.execPath, [path.join(root, 'cli/install.mjs'), '--yes', '--repo', allRepo, '--skills-dir', allSkillsDir, '--skip-deep-scan', '--skip-hooks', '--skill-set', 'all'], { cwd: allRepo });
270
270
  const allSkillDirs = skillDirs(allSkillsDir);
271
- if (allSkillDirs.length !== 20) fail(`--skill-set all should copy 20 skills, got ${allSkillDirs.length}`);
271
+ if (allSkillDirs.length !== 21) fail(`--skill-set all should copy 21 skills, got ${allSkillDirs.length}`);
272
272
  if (!allSkillDirs.includes('jhste-red-team-review') || !allSkillDirs.includes('improve-codebase-architecture')) fail('--skill-set all missing core or vendored skill');
273
273
  }
274
274
 
@@ -27,7 +27,7 @@ function runCustomAndMinimalScenarios({ root, tmp }) {
27
27
  fs.writeFileSync(path.join(minimalRepo, 'AGENTS.md'), '# Minimal repo\n');
28
28
  run(process.execPath, [path.join(root, 'cli/install.mjs'), '--mode', 'minimal', '--yes', '--repo', minimalRepo, '--skills-dir', minimalSkillsDir, '--skip-deep-scan'], { cwd: minimalRepo });
29
29
  const minimalSkillDirs = skillDirs(minimalSkillsDir);
30
- if (minimalSkillDirs.length !== 7) fail(`--mode minimal should copy 7 core skills, got ${minimalSkillDirs.length}`);
30
+ if (minimalSkillDirs.length !== 8) fail(`--mode minimal should copy 8 core skills, got ${minimalSkillDirs.length}`);
31
31
  if (fs.existsSync(path.join(minimalRepo, '.jhste'))) fail('--mode minimal created .jhste');
32
32
  if (fs.existsSync(path.join(minimalRepo, '.git', 'hooks', 'pre-commit'))) fail('--mode minimal created pre-commit hook');
33
33
  if (fs.readFileSync(path.join(minimalRepo, 'AGENTS.md'), 'utf8') !== '# Minimal repo\n') fail('--mode minimal modified AGENTS.md');
@@ -47,7 +47,7 @@ function runFullModeScenarios({ root, tmp }) {
47
47
  fs.writeFileSync(path.join(fullModeRepo, 'AGENTS.md'), '# Full mode repo\n');
48
48
  run(process.execPath, [path.join(root, 'cli/install.mjs'), '--mode', 'full', '--yes', '--repo', fullModeRepo, '--skills-dir', fullModeSkillsDir, '--skip-deep-scan'], { cwd: fullModeRepo });
49
49
  const fullModeSkillDirs = skillDirs(fullModeSkillsDir);
50
- if (fullModeSkillDirs.length !== 20) fail(`--mode full should copy 20 skills, got ${fullModeSkillDirs.length}`);
50
+ if (fullModeSkillDirs.length !== 21) fail(`--mode full should copy 21 skills, got ${fullModeSkillDirs.length}`);
51
51
  const fullPreCommit = path.join(fullModeRepo, '.git', 'hooks', 'pre-commit');
52
52
  const fullPrePush = path.join(fullModeRepo, '.git', 'hooks', 'pre-push');
53
53
  if (!fs.existsSync(fullPreCommit) || !fs.existsSync(fullPrePush)) fail('--mode full did not install pre-commit and pre-push');
@@ -0,0 +1,143 @@
1
+ ---
2
+ name: jhste-long-running-work-loop
3
+ description: "Coordinate multi-session or long-running work while preserving state, approval boundaries, and resume points. Use when work spans sessions, wait states, recurring reviews, multiple repos, or durable decisions; does not replace code-quality, PRD, issue, triage, or handoff skills."
4
+ ---
5
+
6
+ # jhste-long-running-work-loop
7
+
8
+ Use this skill to decide whether a task needs a durable work loop, then keep the loop small, reviewable, and safe. Repo-local instructions remain authoritative.
9
+
10
+ This is an orchestration skill. Do not reimplement code quality review, PRD writing, issue breakdown, triage, or handoff workflows. Route to the narrower skill when that is the actual task.
11
+
12
+ ## Scope
13
+
14
+ Use for work that is likely to lose important state across time, tools, repositories, or sessions:
15
+
16
+ - multi-session implementation or review work;
17
+ - recurring review/check-in loops;
18
+ - external waiting states such as CI, preview deploys, reviewer replies, approvals, vendor/API responses, or customer input;
19
+ - workflows spanning PRD, issues, implementation, review, and release notes;
20
+ - work that touches multiple repositories or external systems;
21
+ - hard-to-reverse design decisions that need a durable decision record;
22
+ - tasks where the next session or next agent must resume safely.
23
+
24
+ Skip for:
25
+
26
+ - simple Q&A;
27
+ - typo fixes;
28
+ - formatting-only work;
29
+ - small README edits;
30
+ - small single-file fixes that can finish in one session;
31
+ - direct requests that are only PRD drafting, issue breakdown, triage, or handoff;
32
+ - work where the changed code path can be handled by `jhste-engineering-groundwork`, guard, and `jhste-red-team-review` alone.
33
+
34
+ When skipping, use the narrower workflow. If useful, briefly note that a long-running loop is unnecessary.
35
+
36
+ ## Contract
37
+
38
+ 1. **Decide if this is actually long-running.**
39
+ If not, route to the smallest applicable skill or workflow.
40
+
41
+ 2. **Define the work loop before expanding scope.**
42
+ Capture only:
43
+ - current goal;
44
+ - current phase;
45
+ - definition of done;
46
+ - explicit out-of-scope items;
47
+ - open decisions;
48
+ - external blockers or wait states;
49
+ - approval boundaries;
50
+ - next checkpoint;
51
+ - required review gates.
52
+
53
+ 3. **Preserve context only when it will reduce future failure.**
54
+ Do not turn project docs into scratchpads. Do not persist raw thought, private reasoning, secrets, or noisy progress logs.
55
+
56
+ 4. **Choose the right durable surface.**
57
+ - Domain vocabulary or stable domain context -> `CONTEXT.md`.
58
+ - Hard-to-reverse design decision with real trade-offs -> ADR.
59
+ - Active work state, blockers, acceptance, and next action -> issue or PR notes.
60
+ - Next-session or next-agent continuation only -> `handoff`.
61
+ - Ephemeral, obvious, or soon-stale state -> do not persist.
62
+
63
+ 5. **Resume by verifying, not trusting.**
64
+ On resume, re-check the current repo, branch, issue/PR, CI, deployment, or external state before relying on old notes. Mark stale assumptions as not checked.
65
+
66
+ 6. **Respect approval boundaries.**
67
+ Proceed without asking for reading, searching, summarizing, planning, drafting, review notes, and issue candidates when repo-local instructions allow it.
68
+ Ask before send, push, merge, deploy, delete, publish, production data changes, secret exposure, cost-bearing actions, broad tracker edits, or destructive/irreversible changes.
69
+
70
+ 7. **Delegate to existing skills.**
71
+ - Before non-trivial code changes, use `jhste-engineering-groundwork`.
72
+ - After non-trivial code changes, run the configured guard when available and use `jhste-red-team-review`.
73
+ - For PRDs, use `to-prd`.
74
+ - For issue breakdown, use `to-issues`.
75
+ - For tracker triage, use `triage`.
76
+ - For next-agent/session summaries, use `handoff`.
77
+ - For domain glossary or ADR work, use `grill-with-docs` or the repo's domain-documentation workflow.
78
+
79
+ ## Minimal loop note
80
+
81
+ When a durable loop is warranted, keep the note compact:
82
+
83
+ ```md
84
+ ## Long-running work loop
85
+
86
+ Goal:
87
+ - ...
88
+
89
+ Current phase:
90
+ - ...
91
+
92
+ Definition of done:
93
+ - ...
94
+
95
+ Out of scope:
96
+ - ...
97
+
98
+ Open decisions:
99
+ - ...
100
+
101
+ External blockers / wait states:
102
+ - ...
103
+
104
+ Approval required before:
105
+ - ...
106
+
107
+ Durable state location:
108
+ - ...
109
+
110
+ Next checkpoint:
111
+ - ...
112
+
113
+ Review gates:
114
+ - ...
115
+ ```
116
+
117
+ Prefer referencing existing artifacts by path or URL over duplicating their contents.
118
+
119
+ ## Context storage rules
120
+
121
+ Unless repo-local docs define another role, treat `CONTEXT.md` as stable domain context, not a work log. Use it only for glossary or domain context that future agents need to understand the project correctly.
122
+
123
+ Create or update an ADR only when all are true:
124
+
125
+ 1. the decision is hard to reverse;
126
+ 2. future readers would wonder why it was chosen;
127
+ 3. there were real alternatives and trade-offs.
128
+
129
+ Use issue or PR notes for active work state because that state naturally expires when the work closes.
130
+
131
+ Use handoff for continuation context that helps the next session but does not deserve permanent repo documentation.
132
+
133
+ Record nothing when the information is trivial, already obvious from code/tests/diff, likely to go stale quickly, or not useful to future work.
134
+
135
+ ## Output style
136
+
137
+ Be brief. Report:
138
+
139
+ - whether the long-running loop is warranted;
140
+ - the chosen durable surface, if any;
141
+ - the next checkpoint;
142
+ - any action that requires approval;
143
+ - which narrower skill should handle the next concrete step.