@litfamily/litgrok 1.0.29 → 1.0.31
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/.grok/rules/00-litgrok.md +13 -0
- package/.grok/skills/lit-adhd/SKILL.md +10 -4
- package/.grok/skills/lit-adhd/scripts/lib/brief.mjs +4 -1
- package/.grok/skills/lit-adhd/scripts/lib/collect.mjs +14 -1
- package/.grok/skills/lit-adhd/scripts/lib/next-step.mjs +46 -5
- package/.grok/skills/lit-init/SKILL.md +4 -0
- package/.grok/skills/lit-typographic-motion/references/stage.md +50 -0
- package/.grok/skills/lit-typographic-motion/requirements-audio.txt +92 -89
- package/.grok/skills/lit-typographic-motion/scripts/lib/clips.mjs +119 -0
- package/.grok/skills/lit-typographic-motion/scripts/lib/constants.mjs +13 -0
- package/.grok/skills/lit-typographic-motion/scripts/lib/cover.mjs +1 -1
- package/.grok/skills/lit-typographic-motion/scripts/lib/stage-gate.mjs +1 -0
- package/.grok/skills/lit-typographic-motion/scripts/lib/stage-session.mjs +3 -0
- package/.grok/skills/lit-typographic-motion/scripts/lib/stage.mjs +13 -4
- package/.grok/skills/lit-typographic-motion/scripts/stage/stage-kit.js +44 -0
- package/.grok/skills/readme-studio/templates/remotion/package-lock.json +3 -3
- package/.grok/skills/readme-studio/templates/remotion/package.json +3 -0
- package/.grok-plugin/plugin.json +1 -1
- package/CHANGELOG.md +11 -0
- package/README.md +8 -8
- package/README_ko-KR.md +8 -8
- package/bin/ground-rule.mjs +573 -0
- package/bin/litgrok.mjs +42 -5
- package/docs/assets/readme/badge-version.svg +1 -1
- package/docs/reference.md +2 -2
- package/docs/reference_ko-KR.md +2 -2
- package/package.json +1 -1
- package/plugin.json +1 -1
|
@@ -7,6 +7,7 @@ import { extname, join, sep } from 'node:path';
|
|
|
7
7
|
import { STAGE } from './constants.mjs';
|
|
8
8
|
import { launchStage } from './chrome.mjs';
|
|
9
9
|
import { SKILL_ROOT } from './fonts.mjs';
|
|
10
|
+
import { clipsScript } from './clips.mjs';
|
|
10
11
|
|
|
11
12
|
export const CONTENT_TYPES = Object.freeze({
|
|
12
13
|
'.html': 'text/html; charset=utf-8', '.js': 'text/javascript; charset=utf-8', '.mjs': 'text/javascript; charset=utf-8', '.css': 'text/css; charset=utf-8',
|
|
@@ -78,6 +79,7 @@ export async function openStage({ executable, outDir, stageDir, width, height, f
|
|
|
78
79
|
const network = [];
|
|
79
80
|
const refused = [];
|
|
80
81
|
const served = new Set();
|
|
82
|
+
const clipsJs = clipsScript(stageDir);
|
|
81
83
|
const kit = existsSync(KIT_PATH) ? readFileSync(KIT_PATH) : Buffer.from('/* stage kit missing */');
|
|
82
84
|
const respond = (requestId, status, body, type) => browser.send('Fetch.fulfillRequest', {
|
|
83
85
|
requestId, responseCode: status,
|
|
@@ -95,6 +97,7 @@ export async function openStage({ executable, outDir, stageDir, width, height, f
|
|
|
95
97
|
return;
|
|
96
98
|
}
|
|
97
99
|
if (url.pathname === '/lit/stage-kit.js') { served.add('/lit/stage-kit.js'); await respond(requestId, 200, kit, CONTENT_TYPES['.js']); return; }
|
|
100
|
+
if (clipsJs && url.pathname === '/lit/clips.js') { served.add('/lit/clips.js'); await respond(requestId, 200, clipsJs, CONTENT_TYPES['.js']); return; }
|
|
98
101
|
if (url.pathname.startsWith('/lit/three/')) {
|
|
99
102
|
const resolved = resolveThree(url.pathname);
|
|
100
103
|
if (resolved.refused) { refused.push(resolved.refused); await respond(requestId, 403, 'refused'); return; }
|
|
@@ -6,6 +6,7 @@ import { createHash } from 'node:crypto';
|
|
|
6
6
|
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
7
7
|
import { extname, join, relative } from 'node:path';
|
|
8
8
|
import { BlockedError, DIRECTOR, EXIT, STAGE } from './constants.mjs';
|
|
9
|
+
import { scanClips } from './clips.mjs';
|
|
9
10
|
import { resolveChrome, stageArgs } from './chrome.mjs';
|
|
10
11
|
import { fontPath, fontState, PINS, resolveFontKey } from './fonts.mjs';
|
|
11
12
|
import { FlashDetector } from './flash.mjs';
|
|
@@ -67,17 +68,24 @@ export function rasterInfo(bytes, ext) {
|
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
// Static scan before any launch: forbidden elements (17), absolute or protocol-relative URLs and
|
|
70
|
-
// preconnect/prefetch links (19), raster limits, flipbooks and animated rasters (17).
|
|
71
|
-
|
|
71
|
+
// preconnect/prefetch links (19), raster limits, flipbooks and animated rasters (17). Frames of a clip
|
|
72
|
+
// declared in clips/clips.json are checked by scanClips instead; `clips: false` (cover mode) ignores the
|
|
73
|
+
// declaration, so a declared folder is held to the raster limits like any other.
|
|
74
|
+
export function scanStage(stageDir, { clips: allowClips = true } = {}) {
|
|
72
75
|
const contract = [];
|
|
73
76
|
const network = [];
|
|
74
77
|
const warnings = [];
|
|
75
|
-
if (!existsSync(join(stageDir, 'index.html'))) return { contract: ['stage/index.html is missing'], network, warnings, files: [], rasters: [] };
|
|
78
|
+
if (!existsSync(join(stageDir, 'index.html'))) return { contract: ['stage/index.html is missing'], network, warnings, files: [], rasters: [], clips: [] };
|
|
76
79
|
const files = walk(stageDir);
|
|
77
80
|
// A Blender plate and its preview stills are frames the runner wrote and plate.json lists by name
|
|
78
81
|
// and size; they are not page rasters. Anything not listed is held to the raster limits.
|
|
79
82
|
const plates = [readPlate(stageDir, 'plate'), readPlate(stageDir, 'plate-preview')].filter(Boolean);
|
|
80
83
|
const listed = new Set(plates.flatMap((p) => p.frames.map((f) => `${p.dir}/${String(f.name)}`)));
|
|
84
|
+
let clips = [];
|
|
85
|
+
if (allowClips) {
|
|
86
|
+
try { clips = scanClips(stageDir); } catch (error) { contract.push(error.message); }
|
|
87
|
+
for (const clip of clips) for (const rel of clip.frames) listed.add(rel);
|
|
88
|
+
}
|
|
81
89
|
const rasters = [];
|
|
82
90
|
for (const file of files) {
|
|
83
91
|
if (file.symlink) continue;
|
|
@@ -112,7 +120,7 @@ export function scanStage(stageDir) {
|
|
|
112
120
|
const bySize = new Map();
|
|
113
121
|
for (const r of rasters) { const key = `${r.width}x${r.height}`; bySize.set(key, (bySize.get(key) ?? 0) + 1); }
|
|
114
122
|
for (const [size, count] of bySize) if (count >= STAGE.flipbookCount) contract.push(`${count} rasters of one size (${size}) form a flipbook; rasters are textures and stills, never a frame sequence`);
|
|
115
|
-
return { contract, network, warnings, files: files.map((f) => f.rel), rasters };
|
|
123
|
+
return { contract, network, warnings, files: files.map((f) => f.rel), rasters, clips };
|
|
116
124
|
}
|
|
117
125
|
|
|
118
126
|
// ---- fonts -----------------------------------------------------------------------------------
|
|
@@ -424,6 +432,7 @@ export async function renderStage({ out, treatment, round = 1, stillsOnly = fals
|
|
|
424
432
|
schemaVersion: 1, path: 'stage', format: treatment.format, resolution: [width, height], fps, durationSec: totalFrames / fps, targetDurationSec: treatment.durationSec,
|
|
425
433
|
frames: totalFrames, seed, rung: masterRung, renderer: `${masterRenderer} on the ${masterRung} rung (stage path)`, softwareRenderer: masterRung === 'software' || isSoftwareRenderer(masterRenderer), chromeFlags: masterArgs.filter((arg) => !arg.startsWith('--user-data-dir') && !arg.startsWith('--window-size') && arg !== 'about:blank'), previewEncoder: preview.encoder,
|
|
426
434
|
sound: sound.summary, round, warnings,
|
|
435
|
+
clips: scan.clips.map((c) => ({ id: c.id, frames: c.count, fps: c.fps, width: c.width, height: c.height, bytes: c.bytes })),
|
|
427
436
|
};
|
|
428
437
|
const stills = writeStills(out, { plan, frames: kept, width, height, path: 'stage', round, mode: 'full', poster: { bytes: posterBytes, frame: posterFrame }, treatmentSha256 });
|
|
429
438
|
// The final render ships its storyboard too: the done-check wants the board viewed on the final set.
|
|
@@ -280,6 +280,49 @@
|
|
|
280
280
|
};
|
|
281
281
|
}
|
|
282
282
|
|
|
283
|
+
// A declared keyed clip (stage/clips/clips.json, served as window.LitClips by /lit/clips.js): one
|
|
284
|
+
// wrapper at `box` over the film, holding the clip's frame for t. The frame is a pure function of film
|
|
285
|
+
// time, floor((t - start) * fps) + 1 within from..to, so no <video> and no real clock is involved.
|
|
286
|
+
// Before `start` and after `to` the wrapper is hidden (null) unless `hold` keeps the last frame or
|
|
287
|
+
// `loop` wraps by frame index. The wrapper is what a page scales or fades; the <img> inside is
|
|
288
|
+
// replaced on a frame change, so the renderer waits for its decode before the capture.
|
|
289
|
+
function overlay(opts) {
|
|
290
|
+
var all = root.LitClips, parent = opts && opts.parent, id = opts && opts.id, box = opts && opts.box;
|
|
291
|
+
if (!all) throw new Error('LitStage.overlay: load <script src="/lit/clips.js"></script> before the page script; the stage declares no clips (clips/clips.json)');
|
|
292
|
+
var c = all[id];
|
|
293
|
+
if (!c) throw new Error('LitStage.overlay: no clip "' + id + '" in clips/clips.json (declared: ' + Object.keys(all).join(', ') + ')');
|
|
294
|
+
if (!parent || !box || !(box.w > 0) || !(box.h > 0)) throw new TypeError('LitStage.overlay: pass { parent, id, box: { x, y, w, h } }');
|
|
295
|
+
var doc = parent.ownerDocument || root.document;
|
|
296
|
+
var wrap = doc.createElement('div');
|
|
297
|
+
wrap.setAttribute('data-lit-clip', id);
|
|
298
|
+
var ws = wrap.style;
|
|
299
|
+
ws.position = 'absolute'; ws.left = box.x + 'px'; ws.top = box.y + 'px'; ws.width = box.w + 'px'; ws.height = box.h + 'px';
|
|
300
|
+
ws.display = 'none'; ws.pointerEvents = 'none';
|
|
301
|
+
parent.append(wrap);
|
|
302
|
+
var shown = 0, img = null;
|
|
303
|
+
return function (t, o) {
|
|
304
|
+
o = o || {};
|
|
305
|
+
var start = o.start == null ? 0 : o.start, from = o.from == null ? 1 : o.from, to = o.to == null ? c.count : o.to;
|
|
306
|
+
if (!(from >= 1 && to <= c.count && from <= to)) throw new RangeError('LitStage.overlay: from..to must lie within 1..' + c.count + ' (got ' + from + '..' + to + ')');
|
|
307
|
+
var n = to - from + 1, k = Math.floor((t - start) * c.fps + 1e-6);
|
|
308
|
+
var i = k < 0 ? 0 : k < n ? from + k : o.loop ? from + (k % n) : o.hold ? to : 0;
|
|
309
|
+
wrap.style.display = i ? 'block' : 'none';
|
|
310
|
+
if (!i) return null;
|
|
311
|
+
if (i !== shown) {
|
|
312
|
+
var next = doc.createElement('img');
|
|
313
|
+
next.src = c.src + '/frame_' + String(i).padStart(4, '0') + '.png';
|
|
314
|
+
next.alt = '';
|
|
315
|
+
var ns = next.style;
|
|
316
|
+
ns.display = 'block'; ns.width = '100%'; ns.height = '100%'; ns.objectFit = 'contain';
|
|
317
|
+
if (img) img.replaceWith(next);
|
|
318
|
+
else wrap.append(next);
|
|
319
|
+
img = next;
|
|
320
|
+
shown = i;
|
|
321
|
+
}
|
|
322
|
+
return wrap;
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
283
326
|
function rgb(hex) {
|
|
284
327
|
var h = String(hex).replace('#', '');
|
|
285
328
|
if (h.length === 3) h = h.split('').map(function (c) { return c + c; }).join('');
|
|
@@ -472,6 +515,7 @@
|
|
|
472
515
|
clip: clip,
|
|
473
516
|
circle: circle,
|
|
474
517
|
plate: plate,
|
|
518
|
+
overlay: overlay,
|
|
475
519
|
mix: mix,
|
|
476
520
|
rgb: rgb,
|
|
477
521
|
hex: hex,
|
|
@@ -3773,9 +3773,9 @@
|
|
|
3773
3773
|
"license": "ISC"
|
|
3774
3774
|
},
|
|
3775
3775
|
"node_modules/zod": {
|
|
3776
|
-
"version": "4.
|
|
3777
|
-
"resolved": "https://registry.npmjs.org/zod/-/zod-4.
|
|
3778
|
-
"integrity": "sha512-
|
|
3776
|
+
"version": "4.6.6",
|
|
3777
|
+
"resolved": "https://registry.npmjs.org/zod/-/zod-4.6.6.tgz",
|
|
3778
|
+
"integrity": "sha512-4UmzQUF5fxvfcYHlbjBmejU+w+hbDnWFx4aS8kBx7nPBHcO2SqPbpAG8snbdg+Xse4pRefR98hgjFgIMCI/UhA==",
|
|
3779
3779
|
"license": "MIT",
|
|
3780
3780
|
"funding": {
|
|
3781
3781
|
"url": "https://github.com/sponsors/colinhacks"
|
package/.grok-plugin/plugin.json
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 1.0.31 — 2026-11-01
|
|
6
|
+
|
|
7
|
+
- The motion skill's stage path can carry keyed overlay clips: real footage keyed on green screen outside the renderer into one RGBA PNG per frame, declared in `stage/clips/clips.json` (`id`, `dir`, `count`, `fps`). The page registers a clip once with `LitStage.overlay` and shows it from film time, so a cue is plain arithmetic and the flash audit, the determinism replay and the text checks still run on the final pixels. The scan holds clips to 12 per film, 360 frames each and 1500 in all, 40 MB each and 128 MB in all, 720 px on the long side and 30 fps, and refuses opaque or mixed-size frames with exit 17; an undeclared frame folder is still a flipbook, and cover mode takes no clips.
|
|
8
|
+
|
|
9
|
+
## 1.0.30 — 2026-10-31
|
|
10
|
+
|
|
11
|
+
- `lit-adhd` counts other work before it tells this session what to do. A paused frame here is not resumed, and this session's own run is not continued with `go`, while another session or a herdr agent is still working. A start-work approval is still offered. The session's own card does not show `lit continue` while that work runs.
|
|
12
|
+
- The user rule `~/.grok/rules/00-litgrok.md` now ends with a short ground-rules section: a prompt that starts with `lit` is LitGrok's activation word, plans live in `plans/`, the handoff lives in `.handoff/HANDOFF.md`, and a push, publish, tag or version bump waits for an explicit yes. `litgrok doctor` and `litgrok ground status` print whether that section is present and which version it is. `litgrok ground off` removes it and leaves it off; `litgrok ground on` restores it. `install --no-ground` skips it for that run. An approved lit-init can place the project copy with `litgrok ground project`, which writes `.grok/rules/10-litgrok-ground.md` and refuses a symlink, a non-directory path, or a file LitGrok does not own.
|
|
13
|
+
- Dependency alerts cleared: the audio runtime pins msgpack 1.2.3 (was 1.2.2) and the Remotion cover template pins zod 4.6.6 (was 4.5.4). The HyperFrames cover template still resolves zod 3.25.76 through its pinned browser-driver chain; that needs a HyperFrames upgrade, so it is left for a separate change.
|
|
14
|
+
- Releases are faster: the publish workflow no longer runs the test suite again. It checks with GitHub that CI already passed on the exact commit being released and stops if it did not. A publish from your own machine still runs the full suite first.
|
|
15
|
+
|
|
5
16
|
## 1.0.29 — 2026-10-28
|
|
6
17
|
|
|
7
18
|
- Releases are now built and published from GitHub Actions with npm trusted publishing, so each version carries a signed provenance statement that links the package to this repository and commit. Check it on the npm page (the green check by the version) or with `npm audit signatures`.
|
package/README.md
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
<p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
1
|
+
<p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/cover-motion-still.webp" /><source media="(prefers-reduced-motion: no-preference)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/cover-motion.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: seven armored robots power on one by one, the LitGrok robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
|
|
2
2
|
|
|
3
3
|
<h1 align="center">LitGrok</h1>
|
|
4
4
|
<p align="center"><strong>Keep the work lit.</strong></p>
|
|
5
5
|
|
|
6
6
|
LitGrok gives xAI's Grok Build the habit of planning before it edits, checking what it built, and leaving a handoff, so tomorrow's session starts where today's stopped. One npm command adds its skills, project rule and hooks to your project.
|
|
7
7
|
|
|
8
|
-
**[Full README on GitHub](https://github.com/wjgoarxiv/litgrok#readme)** · [Guide](https://github.com/wjgoarxiv/litgrok/blob/main/docs/guide.md) · [All skills](https://github.com/wjgoarxiv/litgrok/blob/main/docs/skills.md) · [한국어](https://github.com/wjgoarxiv/litgrok/blob/main/README_ko-KR.md) · [Install](#install-in-30-seconds) · [Reference](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
8
|
+
**[Full README on GitHub](https://github.com/wjgoarxiv/litgrok#readme)** · [Guide](https://github.com/wjgoarxiv/litgrok/blob/main/docs/guide.md) · [All skills](https://github.com/wjgoarxiv/litgrok/blob/main/docs/skills.md) · [한국어](https://github.com/wjgoarxiv/litgrok/blob/main/README_ko-KR.md) · [Install](#install-in-30-seconds) · [Reference](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/reference.md)
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
|
-
<a href="#install-in-30-seconds"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
12
|
-
<a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
11
|
+
<a href="#install-in-30-seconds"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/readme/badge-version.svg" alt="1.0.31" /></a>
|
|
12
|
+
<a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
|
-
<p align="center"><a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
15
|
+
<p align="center"><a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/reference.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/readme/lucide-book-open.svg" width="16" alt="" /> Docs</a> <a href="#install-in-30-seconds">Install</a> <a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/cover-motion.webp"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/readme/lucide-play.svg" width="16" alt="" /> Cover motion</a> <a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/readme/lucide-shield-check.svg" width="16" alt="" /> MIT</a></p>
|
|
16
16
|
|
|
17
17
|
Long Grok Build sessions get compacted, a new session starts without what the last one knew, and "done" often just means the model said so. LitGrok gives each session a routine to follow: a written plan before the first edit, checks against that plan, and a handoff file the next session can read. It ships 42 skills, 11 agents, one project rule, and twelve hook registrations. Grok Build still runs the session and chooses the model. It suits work that runs longer than one sitting, such as a feature spread over a few days or a report someone else will read.
|
|
18
18
|
|
|
@@ -24,7 +24,7 @@ You need Node.js and Grok Build. In an interactive terminal, from the project yo
|
|
|
24
24
|
npm exec --yes --package @litfamily/litgrok@latest -- litgrok install
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
The files land in `<project>/.grok/`. Add `--user` to install under `~/.grok/` instead, or use `--package @litfamily/litgrok@1.0.
|
|
27
|
+
The files land in `<project>/.grok/`. Add `--user` to install under `~/.grok/` instead, or use `--package @litfamily/litgrok@1.0.31` to pin this release. Add `--dry-run` to see every destination before anything is written.
|
|
28
28
|
|
|
29
29
|
Trying a local package instead? Put its real absolute path in a variable, then run these two lines separately:
|
|
30
30
|
|
|
@@ -73,7 +73,7 @@ Beyond code, `lit-pptx` makes slide decks and `lit-docx` makes reports and Word
|
|
|
73
73
|
|
|
74
74
|
## What changes after install
|
|
75
75
|
|
|
76
|
-
The installer copies the skills, agents, project rule, and hooks into `.grok/`. The twelve hook registrations in [`hooks/hooks.json`](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
76
|
+
The installer copies the skills, agents, project rule, and hooks into `.grok/`. The twelve hook registrations in [`hooks/hooks.json`](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/hooks/hooks.json) run only in a trusted Git root, and they log the order of events in `.grok/litgrok/session-ledger/`. Everything runs inside your Grok session, and nothing runs in the background; when the session ends, the work waits for the next one.
|
|
77
77
|
|
|
78
78
|
If you'd like a status row showing the active LitGrok skill, the model and how much context is used, add it with `install --user --status-line`. It writes `[ui.status_line]` into `~/.grok/config.toml` and backs up an existing file first. Once a prompt starts a workflow skill, the row also shows the workflow stage, the tool running now and the last test result. Add `--notify` for Grok's terminal notification when a turn finishes.
|
|
79
79
|
|
|
@@ -112,6 +112,6 @@ If the status row is missing, add it with `install --user --status-line`. Grok r
|
|
|
112
112
|
|
|
113
113
|
If LitGrok saves you some re-explaining, a [star on GitHub](https://github.com/wjgoarxiv/litgrok) helps other Grok Build users find it.
|
|
114
114
|
|
|
115
|
-
[Reference](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
115
|
+
[Reference](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/reference.md) · [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/CHANGELOG.md) · [Privacy](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/privacy.md) · [MIT license](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/LICENSE) · [Trademark policy](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/TRADEMARK.md)
|
|
116
116
|
|
|
117
117
|
The cover is brand motion made with the LitFamily motion skill: animated artwork, with no Grok session recorded in it.
|
package/README_ko-KR.md
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
<p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
1
|
+
<p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/cover-motion-still.webp" /><source media="(prefers-reduced-motion: no-preference)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/cover-motion.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/cover-motion.webp" width="100%" alt="LitFamily 모션 커버: 일곱 로봇 패널이 차례로 켜지고, LitGrok 로봇의 눈과 테두리가 빛난 뒤 LITFAMILY와 KEEP THE WORK LIT. 문구가 밝아지는 영상" /></picture></p>
|
|
2
2
|
|
|
3
3
|
<h1 align="center">LitGrok</h1>
|
|
4
4
|
<p align="center"><strong>Keep the work lit.</strong></p>
|
|
5
5
|
|
|
6
6
|
LitGrok은 xAI Grok Build가 코드를 고치기 전에 계획부터 세우고, 만든 결과를 확인하고, 인수인계 문서를 남기게 합니다. 그러면 내일 세션이 오늘 멈춘 자리에서 이어집니다. npm 명령 한 줄이면 스킬과 프로젝트 규칙, 훅이 프로젝트에 들어갑니다.
|
|
7
7
|
|
|
8
|
-
**[GitHub에서 README 전체 보기](https://github.com/wjgoarxiv/litgrok/blob/main/README_ko-KR.md)** · [안내서](https://github.com/wjgoarxiv/litgrok/blob/main/docs/guide_ko-KR.md) · [전체 스킬](https://github.com/wjgoarxiv/litgrok/blob/main/docs/skills_ko-KR.md) · [English](https://github.com/wjgoarxiv/litgrok#readme) · [설치](#30초-설치) · [상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
8
|
+
**[GitHub에서 README 전체 보기](https://github.com/wjgoarxiv/litgrok/blob/main/README_ko-KR.md)** · [안내서](https://github.com/wjgoarxiv/litgrok/blob/main/docs/guide_ko-KR.md) · [전체 스킬](https://github.com/wjgoarxiv/litgrok/blob/main/docs/skills_ko-KR.md) · [English](https://github.com/wjgoarxiv/litgrok#readme) · [설치](#30초-설치) · [상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/reference_ko-KR.md)
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
|
-
<a href="#30초-설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
12
|
-
<a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
11
|
+
<a href="#30초-설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/readme/badge-version.svg" alt="1.0.31" /></a>
|
|
12
|
+
<a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/readme/badge-license.svg" alt="MIT 라이선스" /></a>
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
|
-
<p align="center"><a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
15
|
+
<p align="center"><a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/reference_ko-KR.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/readme/lucide-book-open.svg" width="16" alt="" /> 상세 안내</a> <a href="#30초-설치">설치</a> <a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/cover-motion.webp"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/readme/lucide-play.svg" width="16" alt="" /> 커버 모션</a> <a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/assets/readme/lucide-shield-check.svg" width="16" alt="" /> MIT</a></p>
|
|
16
16
|
|
|
17
17
|
Grok Build 세션이 길어지면 대화가 압축되고, 새 세션은 앞 세션이 알던 내용을 모른 채 시작하며, "다 됐다"는 말도 모델이 그렇게 말했다는 뜻일 때가 많습니다. LitGrok은 세션마다 따라갈 순서를 줍니다. 첫 수정 전에 계획을 글로 남기고, 그 계획에 비추어 확인하고, 다음 세션이 읽을 인수인계 문서를 남깁니다. 스킬 42개, 에이전트 11개, 프로젝트 규칙 하나, 훅 등록 열두 개가 들어 있고, 세션 실행과 모델 선택은 계속 Grok Build가 맡습니다. 며칠에 걸쳐 만드는 기능이나 다른 사람이 읽을 보고서처럼, 한 번 앉은 자리에서 끝나지 않는 일에 잘 맞습니다.
|
|
18
18
|
|
|
@@ -24,7 +24,7 @@ Node.js와 Grok Build가 있으면 됩니다. 써 보고 싶은 프로젝트에
|
|
|
24
24
|
npm exec --yes --package @litfamily/litgrok@latest -- litgrok install
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
파일은 `<project>/.grok/`에 들어갑니다. `~/.grok/`에 설치하려면 `--user`를, 이 릴리스로 고정하려면 `--package @litfamily/litgrok@1.0.
|
|
27
|
+
파일은 `<project>/.grok/`에 들어갑니다. `~/.grok/`에 설치하려면 `--user`를, 이 릴리스로 고정하려면 `--package @litfamily/litgrok@1.0.31`을 쓰세요. `--dry-run`을 붙이면 파일을 쓰기 전에 들어갈 경로를 모두 보여 줍니다.
|
|
28
28
|
|
|
29
29
|
로컬 패키지로 써 보려면 실제 절대 경로를 변수에 넣고 두 줄을 따로 실행하세요.
|
|
30
30
|
|
|
@@ -73,7 +73,7 @@ npm exec --yes --package "$LITGROK_PACK" -- litgrok install
|
|
|
73
73
|
|
|
74
74
|
## 설치하면 달라지는 것
|
|
75
75
|
|
|
76
|
-
설치 프로그램이 스킬, 에이전트, 프로젝트 규칙, 훅을 `.grok/`에 복사합니다. [`hooks/hooks.json`](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
76
|
+
설치 프로그램이 스킬, 에이전트, 프로젝트 규칙, 훅을 `.grok/`에 복사합니다. [`hooks/hooks.json`](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/hooks/hooks.json)에 있는 훅 등록 열두 개는 신뢰한 Git 루트에서만 동작하고, `.grok/litgrok/session-ledger/`에 이벤트 순서를 남깁니다. 모든 작업은 Grok 세션 안에서 돌고 백그라운드 작업은 없습니다. 세션이 끝나면 다음 세션이 이어받을 때까지 그 자리에 멈춰 있습니다.
|
|
77
77
|
|
|
78
78
|
지금 어떤 LitGrok 스킬이 동작 중인지, 어떤 모델을 쓰는지, 컨텍스트를 얼마나 썼는지 보고 싶으면 `install --user --status-line`으로 상태 행을 켜세요. `~/.grok/config.toml`에 `[ui.status_line]`을 넣고, 파일이 이미 있으면 먼저 백업합니다. 프롬프트가 작업 흐름 스킬을 시작하면 지금 단계, 돌고 있는 도구, 마지막 테스트 결과도 함께 보입니다. 턴이 끝날 때 Grok의 터미널 알림을 받으려면 `--notify`를 붙이세요.
|
|
79
79
|
|
|
@@ -112,6 +112,6 @@ npm exec --yes --package @litfamily/litgrok@latest -- litgrok uninstall --user
|
|
|
112
112
|
|
|
113
113
|
LitGrok 덕분에 같은 설명을 덜 반복하게 됐다면, [GitHub 스타](https://github.com/wjgoarxiv/litgrok) 하나가 다른 Grok Build 사용자에게 이 프로젝트를 알리는 데 도움이 됩니다.
|
|
114
114
|
|
|
115
|
-
[상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.
|
|
115
|
+
[상세 안내](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/reference_ko-KR.md) · [변경 이력](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/CHANGELOG.md) · [개인정보](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/docs/privacy.md) · [MIT 라이선스](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/LICENSE) · [상표 정책](https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.31/TRADEMARK.md)
|
|
116
116
|
|
|
117
117
|
커버의 모션은 LitFamily 모션 스킬로 만든 브랜드 연출입니다. 그려서 움직인 그림이라 실제 Grok 세션을 녹화한 장면은 들어 있지 않습니다.
|