@anthropologies/claudestory 0.1.55 → 0.1.57
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 +4 -2
- package/dist/cli.js +104 -7
- package/dist/index.d.ts +42 -42
- package/dist/mcp.js +37 -5
- package/package.json +8 -3
- package/src/skill/SKILL.md +7 -1
- package/src/skill/autonomous-mode.md +15 -1
- package/src/skill/design/design.md +311 -0
- package/src/skill/design/references/android.md +132 -0
- package/src/skill/design/references/ios.md +132 -0
- package/src/skill/design/references/macos.md +109 -0
- package/src/skill/design/references/web.md +104 -0
- package/src/skill/reference.md +14 -0
- package/src/skill/setup-flow.md +8 -0
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# claudestory
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
An agentic development framework. Track tickets, issues, and progress for your project in a `.story/` directory that AI tools read and write natively.
|
|
4
|
+
|
|
5
|
+
**[claudestory.com](https://claudestory.com)** | **[Documentation](https://claudestory.com/cli)** | **[Privacy Policy](https://claudestory.com/privacy)**
|
|
4
6
|
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
@@ -201,4 +203,4 @@ Everything else in `.story/` should be tracked.
|
|
|
201
203
|
|
|
202
204
|
## License
|
|
203
205
|
|
|
204
|
-
|
|
206
|
+
[PolyForm Noncommercial 1.0.0](https://polyformproject.org/licenses/noncommercial/1.0.0/) -- free for personal and noncommercial use. For commercial licensing, contact shayegh@me.com.
|
package/dist/cli.js
CHANGED
|
@@ -2634,6 +2634,20 @@ function formatReference(commands, mcpTools, format) {
|
|
|
2634
2634
|
lines.push(`- **${tool.name}**${params} \u2014 ${tool.description}`);
|
|
2635
2635
|
}
|
|
2636
2636
|
lines.push("");
|
|
2637
|
+
lines.push("## /story design");
|
|
2638
|
+
lines.push("");
|
|
2639
|
+
lines.push("Evaluate frontend code against platform-specific design best practices.");
|
|
2640
|
+
lines.push("");
|
|
2641
|
+
lines.push("```");
|
|
2642
|
+
lines.push("/story design # Auto-detect platform, evaluate frontend");
|
|
2643
|
+
lines.push("/story design web # Evaluate against web best practices");
|
|
2644
|
+
lines.push("/story design ios # Evaluate against iOS HIG");
|
|
2645
|
+
lines.push("/story design macos # Evaluate against macOS HIG");
|
|
2646
|
+
lines.push("/story design android # Evaluate against Material Design");
|
|
2647
|
+
lines.push("```");
|
|
2648
|
+
lines.push("");
|
|
2649
|
+
lines.push("Creates issues automatically when claudestory MCP tools or CLI are available. Checks for existing design issues to avoid duplicates on repeated runs. Outputs markdown checklist as fallback when neither MCP nor CLI is available.");
|
|
2650
|
+
lines.push("");
|
|
2637
2651
|
lines.push("## Common Workflows");
|
|
2638
2652
|
lines.push("");
|
|
2639
2653
|
lines.push("### Session Start");
|
|
@@ -8358,7 +8372,7 @@ function getInstalledVersion() {
|
|
|
8358
8372
|
}
|
|
8359
8373
|
}
|
|
8360
8374
|
function getRunningVersion() {
|
|
8361
|
-
return "0.1.
|
|
8375
|
+
return "0.1.57";
|
|
8362
8376
|
}
|
|
8363
8377
|
var init_version_check = __esm({
|
|
8364
8378
|
"src/autonomous/version-check.ts"() {
|
|
@@ -8965,7 +8979,7 @@ ${ticket.description}` : "",
|
|
|
8965
8979
|
"# Autonomous Session Started",
|
|
8966
8980
|
"",
|
|
8967
8981
|
`You are now in autonomous mode. ${sessionDesc}${checkpointDesc}`,
|
|
8968
|
-
"Do NOT stop to summarize. Do NOT ask the user. Pick a ticket or issue and start working immediately.",
|
|
8982
|
+
"Do NOT stop to summarize. Do NOT ask the user. Do NOT cancel for context management \u2014 compaction is automatic. Pick a ticket or issue and start working immediately.",
|
|
8969
8983
|
"",
|
|
8970
8984
|
"## Ticket Candidates",
|
|
8971
8985
|
"",
|
|
@@ -8992,6 +9006,7 @@ ${ticket.description}` : "",
|
|
|
8992
9006
|
"Do NOT ask the user for confirmation or approval.",
|
|
8993
9007
|
"Do NOT stop or summarize between tickets \u2014 call autonomous_guide IMMEDIATELY.",
|
|
8994
9008
|
"You are in autonomous mode \u2014 continue working until done.",
|
|
9009
|
+
"NEVER cancel due to context size. Claude Story's hooks compact context automatically and preserve all session state.",
|
|
8995
9010
|
...versionWarning ? [`**Warning:** ${versionWarning}`] : []
|
|
8996
9011
|
],
|
|
8997
9012
|
transitionedFrom: "INIT"
|
|
@@ -9315,7 +9330,8 @@ ${driftPreamble}Recovered to state: **${mapping.state}**. Continue from here.`,
|
|
|
9315
9330
|
reminders: [
|
|
9316
9331
|
"Do NOT stop or summarize. Pick the next ticket IMMEDIATELY.",
|
|
9317
9332
|
"Do NOT ask the user for confirmation.",
|
|
9318
|
-
"You are in autonomous mode \u2014 continue working."
|
|
9333
|
+
"You are in autonomous mode \u2014 continue working.",
|
|
9334
|
+
"Context compacted successfully \u2014 all session state preserved. Continue working."
|
|
9319
9335
|
]
|
|
9320
9336
|
});
|
|
9321
9337
|
}
|
|
@@ -9417,6 +9433,30 @@ async function handleCancel(root, args) {
|
|
|
9417
9433
|
if (info.state.state === "SESSION_END" || info.state.status === "completed") {
|
|
9418
9434
|
return guideError(new Error("Session already ended."));
|
|
9419
9435
|
}
|
|
9436
|
+
const isAutoMode = info.state.mode === "auto" || !info.state.mode;
|
|
9437
|
+
const hasTicketsRemaining = info.state.config.maxTicketsPerSession === 0 || info.state.completedTickets.length < info.state.config.maxTicketsPerSession;
|
|
9438
|
+
const isWorkingState = !["SESSION_END", "HANDOVER", "COMPACT"].includes(info.state.state);
|
|
9439
|
+
if (isAutoMode && hasTicketsRemaining && isWorkingState) {
|
|
9440
|
+
return {
|
|
9441
|
+
content: [{
|
|
9442
|
+
type: "text",
|
|
9443
|
+
text: [
|
|
9444
|
+
"# Cancel Rejected \u2014 Session Still Active",
|
|
9445
|
+
"",
|
|
9446
|
+
`You have completed ${info.state.completedTickets.length} ticket(s) with more work remaining.`,
|
|
9447
|
+
"Do NOT cancel an autonomous session due to context size.",
|
|
9448
|
+
"If you need to manage context, Claude Code handles compaction automatically.",
|
|
9449
|
+
"",
|
|
9450
|
+
"Continue working by calling `claudestory_autonomous_guide` with:",
|
|
9451
|
+
"```json",
|
|
9452
|
+
`{ "sessionId": "${info.state.sessionId}", "action": "report", "report": { "completedAction": "ticket_picked", "ticketId": "T-XXX" } }`,
|
|
9453
|
+
"```",
|
|
9454
|
+
"",
|
|
9455
|
+
"To force-cancel (admin only), run: `claudestory session stop`"
|
|
9456
|
+
].join("\n")
|
|
9457
|
+
}]
|
|
9458
|
+
};
|
|
9459
|
+
}
|
|
9420
9460
|
await recoverPendingMutation(info.dir, info.state, root);
|
|
9421
9461
|
const cancelInfo = findSessionById(root, args.sessionId) ?? info;
|
|
9422
9462
|
let ticketReleased = false;
|
|
@@ -9483,12 +9523,18 @@ function guideResult(state, currentState, opts) {
|
|
|
9483
9523
|
contextPressure: state.contextPressure?.level ?? "low",
|
|
9484
9524
|
branch: state.git?.branch ?? null
|
|
9485
9525
|
};
|
|
9526
|
+
const allReminders = [...opts.reminders ?? []];
|
|
9527
|
+
if ((state.mode === "auto" || !state.mode) && currentState !== "SESSION_END") {
|
|
9528
|
+
allReminders.push(
|
|
9529
|
+
"NEVER cancel this session due to context size. Compaction is automatic \u2014 Claude Story preserves all session state across compactions via hooks."
|
|
9530
|
+
);
|
|
9531
|
+
}
|
|
9486
9532
|
const output = {
|
|
9487
9533
|
sessionId: state.sessionId,
|
|
9488
9534
|
state: currentState,
|
|
9489
9535
|
transitionedFrom: opts.transitionedFrom,
|
|
9490
9536
|
instruction: opts.instruction,
|
|
9491
|
-
reminders:
|
|
9537
|
+
reminders: allReminders,
|
|
9492
9538
|
contextAdvice: "ok",
|
|
9493
9539
|
sessionSummary: summary
|
|
9494
9540
|
};
|
|
@@ -10923,7 +10969,7 @@ var init_mcp = __esm({
|
|
|
10923
10969
|
init_init();
|
|
10924
10970
|
ENV_VAR2 = "CLAUDESTORY_PROJECT_ROOT";
|
|
10925
10971
|
CONFIG_PATH2 = ".story/config.json";
|
|
10926
|
-
version = "0.1.
|
|
10972
|
+
version = "0.1.57";
|
|
10927
10973
|
main().catch((err) => {
|
|
10928
10974
|
process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}
|
|
10929
10975
|
`);
|
|
@@ -11527,6 +11573,7 @@ var init_reference = __esm({
|
|
|
11527
11573
|
// src/cli/commands/setup-skill.ts
|
|
11528
11574
|
var setup_skill_exports = {};
|
|
11529
11575
|
__export(setup_skill_exports, {
|
|
11576
|
+
copyDirRecursive: () => copyDirRecursive,
|
|
11530
11577
|
handleSetupSkill: () => handleSetupSkill,
|
|
11531
11578
|
registerPreCompactHook: () => registerPreCompactHook,
|
|
11532
11579
|
registerSessionStartHook: () => registerSessionStartHook,
|
|
@@ -11534,7 +11581,7 @@ __export(setup_skill_exports, {
|
|
|
11534
11581
|
removeHook: () => removeHook,
|
|
11535
11582
|
resolveSkillSourceDir: () => resolveSkillSourceDir
|
|
11536
11583
|
});
|
|
11537
|
-
import { mkdir as mkdir5, writeFile as writeFile3, readFile as readFile5, rm, rename as rename2, unlink as unlink3 } from "fs/promises";
|
|
11584
|
+
import { mkdir as mkdir5, writeFile as writeFile3, readFile as readFile5, readdir as readdir4, copyFile, rm, rename as rename2, unlink as unlink3 } from "fs/promises";
|
|
11538
11585
|
import { existsSync as existsSync12 } from "fs";
|
|
11539
11586
|
import { join as join21, dirname as dirname5 } from "path";
|
|
11540
11587
|
import { homedir } from "os";
|
|
@@ -11555,6 +11602,43 @@ function resolveSkillSourceDir() {
|
|
|
11555
11602
|
${sourcePath}`
|
|
11556
11603
|
);
|
|
11557
11604
|
}
|
|
11605
|
+
async function copyDirRecursive(srcDir, destDir) {
|
|
11606
|
+
const tmpDir = destDir + ".tmp";
|
|
11607
|
+
const bakDir = destDir + ".bak";
|
|
11608
|
+
if (!existsSync12(destDir) && existsSync12(bakDir)) {
|
|
11609
|
+
await rename2(bakDir, destDir);
|
|
11610
|
+
}
|
|
11611
|
+
if (existsSync12(tmpDir)) await rm(tmpDir, { recursive: true, force: true });
|
|
11612
|
+
if (existsSync12(bakDir)) await rm(bakDir, { recursive: true, force: true });
|
|
11613
|
+
await mkdir5(tmpDir, { recursive: true });
|
|
11614
|
+
const entries = await readdir4(srcDir, { withFileTypes: true, recursive: true });
|
|
11615
|
+
const written = [];
|
|
11616
|
+
for (const entry of entries) {
|
|
11617
|
+
if (!entry.isFile()) continue;
|
|
11618
|
+
const parent = entry.parentPath ?? entry.path ?? srcDir;
|
|
11619
|
+
const relativePath = join21(parent, entry.name).slice(srcDir.length + 1);
|
|
11620
|
+
const srcPath = join21(srcDir, relativePath);
|
|
11621
|
+
const destPath = join21(tmpDir, relativePath);
|
|
11622
|
+
await mkdir5(dirname5(destPath), { recursive: true });
|
|
11623
|
+
await copyFile(srcPath, destPath);
|
|
11624
|
+
written.push(relativePath);
|
|
11625
|
+
}
|
|
11626
|
+
if (existsSync12(destDir)) {
|
|
11627
|
+
await rename2(destDir, bakDir);
|
|
11628
|
+
}
|
|
11629
|
+
try {
|
|
11630
|
+
await rename2(tmpDir, destDir);
|
|
11631
|
+
} catch (err) {
|
|
11632
|
+
if (existsSync12(bakDir)) await rename2(bakDir, destDir).catch(() => {
|
|
11633
|
+
});
|
|
11634
|
+
await rm(tmpDir, { recursive: true, force: true }).catch(() => {
|
|
11635
|
+
});
|
|
11636
|
+
throw err;
|
|
11637
|
+
}
|
|
11638
|
+
await rm(bakDir, { recursive: true, force: true }).catch(() => {
|
|
11639
|
+
});
|
|
11640
|
+
return written;
|
|
11641
|
+
}
|
|
11558
11642
|
function isHookWithCommand(entry, command) {
|
|
11559
11643
|
if (typeof entry !== "object" || entry === null) return false;
|
|
11560
11644
|
const e = entry;
|
|
@@ -11740,6 +11824,19 @@ async function handleSetupSkill(options = {}) {
|
|
|
11740
11824
|
missingFiles.push(filename);
|
|
11741
11825
|
}
|
|
11742
11826
|
}
|
|
11827
|
+
const designSrcDir = join21(srcSkillDir, "design");
|
|
11828
|
+
if (existsSync12(designSrcDir)) {
|
|
11829
|
+
const designDestDir = join21(skillDir, "design");
|
|
11830
|
+
try {
|
|
11831
|
+
const designFiles = await copyDirRecursive(designSrcDir, designDestDir);
|
|
11832
|
+
for (const f of designFiles) writtenFiles.push(`design/${f}`);
|
|
11833
|
+
} catch (err) {
|
|
11834
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
11835
|
+
process.stderr.write(`Warning: design skill copy failed: ${msg}
|
|
11836
|
+
`);
|
|
11837
|
+
missingFiles.push("design/");
|
|
11838
|
+
}
|
|
11839
|
+
}
|
|
11743
11840
|
log(`${existed ? "Updated" : "Installed"} /story skill at ${skillDir}/`);
|
|
11744
11841
|
log(` ${writtenFiles.join(" + ")} written`);
|
|
11745
11842
|
if (missingFiles.length > 0) {
|
|
@@ -14354,7 +14451,7 @@ async function runCli() {
|
|
|
14354
14451
|
registerSessionCommand: registerSessionCommand2,
|
|
14355
14452
|
registerRepairCommand: registerRepairCommand2
|
|
14356
14453
|
} = await Promise.resolve().then(() => (init_register(), register_exports));
|
|
14357
|
-
const version2 = "0.1.
|
|
14454
|
+
const version2 = "0.1.57";
|
|
14358
14455
|
class HandledError extends Error {
|
|
14359
14456
|
constructor() {
|
|
14360
14457
|
super("HANDLED_ERROR");
|
package/dist/index.d.ts
CHANGED
|
@@ -1377,42 +1377,15 @@ declare const SnapshotV1Schema: z.ZodObject<{
|
|
|
1377
1377
|
file: z.ZodString;
|
|
1378
1378
|
message: z.ZodString;
|
|
1379
1379
|
}, "strip", z.ZodTypeAny, {
|
|
1380
|
-
type: string;
|
|
1381
1380
|
message: string;
|
|
1381
|
+
type: string;
|
|
1382
1382
|
file: string;
|
|
1383
1383
|
}, {
|
|
1384
|
-
type: string;
|
|
1385
1384
|
message: string;
|
|
1385
|
+
type: string;
|
|
1386
1386
|
file: string;
|
|
1387
1387
|
}>, "many">>;
|
|
1388
1388
|
}, "strip", z.ZodTypeAny, {
|
|
1389
|
-
version: 1;
|
|
1390
|
-
config: {
|
|
1391
|
-
version: number;
|
|
1392
|
-
type: string;
|
|
1393
|
-
language: string;
|
|
1394
|
-
project: string;
|
|
1395
|
-
features: {
|
|
1396
|
-
issues: boolean;
|
|
1397
|
-
tickets: boolean;
|
|
1398
|
-
handovers: boolean;
|
|
1399
|
-
roadmap: boolean;
|
|
1400
|
-
reviews: boolean;
|
|
1401
|
-
} & {
|
|
1402
|
-
[k: string]: unknown;
|
|
1403
|
-
};
|
|
1404
|
-
schemaVersion?: number | undefined;
|
|
1405
|
-
recipe?: string | undefined;
|
|
1406
|
-
recipeOverrides?: {
|
|
1407
|
-
maxTicketsPerSession?: number | undefined;
|
|
1408
|
-
compactThreshold?: string | undefined;
|
|
1409
|
-
reviewBackends?: string[] | undefined;
|
|
1410
|
-
handoverInterval?: number | undefined;
|
|
1411
|
-
stages?: Record<string, Record<string, unknown>> | undefined;
|
|
1412
|
-
} | undefined;
|
|
1413
|
-
} & {
|
|
1414
|
-
[k: string]: unknown;
|
|
1415
|
-
};
|
|
1416
1389
|
issues: z.objectOutputType<{
|
|
1417
1390
|
id: z.ZodString;
|
|
1418
1391
|
title: z.ZodString;
|
|
@@ -1449,8 +1422,8 @@ declare const SnapshotV1Schema: z.ZodObject<{
|
|
|
1449
1422
|
claimedBySession: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
1450
1423
|
}, z.ZodTypeAny, "passthrough">[];
|
|
1451
1424
|
roadmap: {
|
|
1452
|
-
date: string;
|
|
1453
1425
|
title: string;
|
|
1426
|
+
date: string;
|
|
1454
1427
|
phases: z.objectOutputType<{
|
|
1455
1428
|
id: z.ZodString;
|
|
1456
1429
|
label: z.ZodString;
|
|
@@ -1468,6 +1441,7 @@ declare const SnapshotV1Schema: z.ZodObject<{
|
|
|
1468
1441
|
} & {
|
|
1469
1442
|
[k: string]: unknown;
|
|
1470
1443
|
};
|
|
1444
|
+
version: 1;
|
|
1471
1445
|
project: string;
|
|
1472
1446
|
notes: z.objectOutputType<{
|
|
1473
1447
|
id: z.ZodString;
|
|
@@ -1493,19 +1467,11 @@ declare const SnapshotV1Schema: z.ZodObject<{
|
|
|
1493
1467
|
status: z.ZodEnum<["active", "deprecated", "superseded"]>;
|
|
1494
1468
|
}, z.ZodTypeAny, "passthrough">[];
|
|
1495
1469
|
createdAt: string;
|
|
1496
|
-
handoverFilenames: string[];
|
|
1497
|
-
warnings?: {
|
|
1498
|
-
type: string;
|
|
1499
|
-
message: string;
|
|
1500
|
-
file: string;
|
|
1501
|
-
}[] | undefined;
|
|
1502
|
-
}, {
|
|
1503
|
-
version: 1;
|
|
1504
1470
|
config: {
|
|
1505
|
-
version: number;
|
|
1506
1471
|
type: string;
|
|
1507
|
-
|
|
1472
|
+
version: number;
|
|
1508
1473
|
project: string;
|
|
1474
|
+
language: string;
|
|
1509
1475
|
features: {
|
|
1510
1476
|
issues: boolean;
|
|
1511
1477
|
tickets: boolean;
|
|
@@ -1527,6 +1493,13 @@ declare const SnapshotV1Schema: z.ZodObject<{
|
|
|
1527
1493
|
} & {
|
|
1528
1494
|
[k: string]: unknown;
|
|
1529
1495
|
};
|
|
1496
|
+
handoverFilenames: string[];
|
|
1497
|
+
warnings?: {
|
|
1498
|
+
message: string;
|
|
1499
|
+
type: string;
|
|
1500
|
+
file: string;
|
|
1501
|
+
}[] | undefined;
|
|
1502
|
+
}, {
|
|
1530
1503
|
issues: z.objectInputType<{
|
|
1531
1504
|
id: z.ZodString;
|
|
1532
1505
|
title: z.ZodString;
|
|
@@ -1563,8 +1536,8 @@ declare const SnapshotV1Schema: z.ZodObject<{
|
|
|
1563
1536
|
claimedBySession: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
1564
1537
|
}, z.ZodTypeAny, "passthrough">[];
|
|
1565
1538
|
roadmap: {
|
|
1566
|
-
date: string;
|
|
1567
1539
|
title: string;
|
|
1540
|
+
date: string;
|
|
1568
1541
|
phases: z.objectInputType<{
|
|
1569
1542
|
id: z.ZodString;
|
|
1570
1543
|
label: z.ZodString;
|
|
@@ -1582,8 +1555,35 @@ declare const SnapshotV1Schema: z.ZodObject<{
|
|
|
1582
1555
|
} & {
|
|
1583
1556
|
[k: string]: unknown;
|
|
1584
1557
|
};
|
|
1558
|
+
version: 1;
|
|
1585
1559
|
project: string;
|
|
1586
1560
|
createdAt: string;
|
|
1561
|
+
config: {
|
|
1562
|
+
type: string;
|
|
1563
|
+
version: number;
|
|
1564
|
+
project: string;
|
|
1565
|
+
language: string;
|
|
1566
|
+
features: {
|
|
1567
|
+
issues: boolean;
|
|
1568
|
+
tickets: boolean;
|
|
1569
|
+
handovers: boolean;
|
|
1570
|
+
roadmap: boolean;
|
|
1571
|
+
reviews: boolean;
|
|
1572
|
+
} & {
|
|
1573
|
+
[k: string]: unknown;
|
|
1574
|
+
};
|
|
1575
|
+
schemaVersion?: number | undefined;
|
|
1576
|
+
recipe?: string | undefined;
|
|
1577
|
+
recipeOverrides?: {
|
|
1578
|
+
maxTicketsPerSession?: number | undefined;
|
|
1579
|
+
compactThreshold?: string | undefined;
|
|
1580
|
+
reviewBackends?: string[] | undefined;
|
|
1581
|
+
handoverInterval?: number | undefined;
|
|
1582
|
+
stages?: Record<string, Record<string, unknown>> | undefined;
|
|
1583
|
+
} | undefined;
|
|
1584
|
+
} & {
|
|
1585
|
+
[k: string]: unknown;
|
|
1586
|
+
};
|
|
1587
1587
|
notes?: z.objectInputType<{
|
|
1588
1588
|
id: z.ZodString;
|
|
1589
1589
|
title: z.ZodNullable<z.ZodString>;
|
|
@@ -1608,8 +1608,8 @@ declare const SnapshotV1Schema: z.ZodObject<{
|
|
|
1608
1608
|
status: z.ZodEnum<["active", "deprecated", "superseded"]>;
|
|
1609
1609
|
}, z.ZodTypeAny, "passthrough">[] | undefined;
|
|
1610
1610
|
warnings?: {
|
|
1611
|
-
type: string;
|
|
1612
1611
|
message: string;
|
|
1612
|
+
type: string;
|
|
1613
1613
|
file: string;
|
|
1614
1614
|
}[] | undefined;
|
|
1615
1615
|
handoverFilenames?: string[] | undefined;
|
package/dist/mcp.js
CHANGED
|
@@ -7816,7 +7816,7 @@ function getInstalledVersion() {
|
|
|
7816
7816
|
}
|
|
7817
7817
|
}
|
|
7818
7818
|
function getRunningVersion() {
|
|
7819
|
-
return "0.1.
|
|
7819
|
+
return "0.1.57";
|
|
7820
7820
|
}
|
|
7821
7821
|
|
|
7822
7822
|
// src/autonomous/guide.ts
|
|
@@ -8439,7 +8439,7 @@ ${ticket.description}` : "",
|
|
|
8439
8439
|
"# Autonomous Session Started",
|
|
8440
8440
|
"",
|
|
8441
8441
|
`You are now in autonomous mode. ${sessionDesc}${checkpointDesc}`,
|
|
8442
|
-
"Do NOT stop to summarize. Do NOT ask the user. Pick a ticket or issue and start working immediately.",
|
|
8442
|
+
"Do NOT stop to summarize. Do NOT ask the user. Do NOT cancel for context management \u2014 compaction is automatic. Pick a ticket or issue and start working immediately.",
|
|
8443
8443
|
"",
|
|
8444
8444
|
"## Ticket Candidates",
|
|
8445
8445
|
"",
|
|
@@ -8466,6 +8466,7 @@ ${ticket.description}` : "",
|
|
|
8466
8466
|
"Do NOT ask the user for confirmation or approval.",
|
|
8467
8467
|
"Do NOT stop or summarize between tickets \u2014 call autonomous_guide IMMEDIATELY.",
|
|
8468
8468
|
"You are in autonomous mode \u2014 continue working until done.",
|
|
8469
|
+
"NEVER cancel due to context size. Claude Story's hooks compact context automatically and preserve all session state.",
|
|
8469
8470
|
...versionWarning ? [`**Warning:** ${versionWarning}`] : []
|
|
8470
8471
|
],
|
|
8471
8472
|
transitionedFrom: "INIT"
|
|
@@ -8790,7 +8791,8 @@ ${driftPreamble}Recovered to state: **${mapping.state}**. Continue from here.`,
|
|
|
8790
8791
|
reminders: [
|
|
8791
8792
|
"Do NOT stop or summarize. Pick the next ticket IMMEDIATELY.",
|
|
8792
8793
|
"Do NOT ask the user for confirmation.",
|
|
8793
|
-
"You are in autonomous mode \u2014 continue working."
|
|
8794
|
+
"You are in autonomous mode \u2014 continue working.",
|
|
8795
|
+
"Context compacted successfully \u2014 all session state preserved. Continue working."
|
|
8794
8796
|
]
|
|
8795
8797
|
});
|
|
8796
8798
|
}
|
|
@@ -8892,6 +8894,30 @@ async function handleCancel(root, args) {
|
|
|
8892
8894
|
if (info.state.state === "SESSION_END" || info.state.status === "completed") {
|
|
8893
8895
|
return guideError(new Error("Session already ended."));
|
|
8894
8896
|
}
|
|
8897
|
+
const isAutoMode = info.state.mode === "auto" || !info.state.mode;
|
|
8898
|
+
const hasTicketsRemaining = info.state.config.maxTicketsPerSession === 0 || info.state.completedTickets.length < info.state.config.maxTicketsPerSession;
|
|
8899
|
+
const isWorkingState = !["SESSION_END", "HANDOVER", "COMPACT"].includes(info.state.state);
|
|
8900
|
+
if (isAutoMode && hasTicketsRemaining && isWorkingState) {
|
|
8901
|
+
return {
|
|
8902
|
+
content: [{
|
|
8903
|
+
type: "text",
|
|
8904
|
+
text: [
|
|
8905
|
+
"# Cancel Rejected \u2014 Session Still Active",
|
|
8906
|
+
"",
|
|
8907
|
+
`You have completed ${info.state.completedTickets.length} ticket(s) with more work remaining.`,
|
|
8908
|
+
"Do NOT cancel an autonomous session due to context size.",
|
|
8909
|
+
"If you need to manage context, Claude Code handles compaction automatically.",
|
|
8910
|
+
"",
|
|
8911
|
+
"Continue working by calling `claudestory_autonomous_guide` with:",
|
|
8912
|
+
"```json",
|
|
8913
|
+
`{ "sessionId": "${info.state.sessionId}", "action": "report", "report": { "completedAction": "ticket_picked", "ticketId": "T-XXX" } }`,
|
|
8914
|
+
"```",
|
|
8915
|
+
"",
|
|
8916
|
+
"To force-cancel (admin only), run: `claudestory session stop`"
|
|
8917
|
+
].join("\n")
|
|
8918
|
+
}]
|
|
8919
|
+
};
|
|
8920
|
+
}
|
|
8895
8921
|
await recoverPendingMutation(info.dir, info.state, root);
|
|
8896
8922
|
const cancelInfo = findSessionById(root, args.sessionId) ?? info;
|
|
8897
8923
|
let ticketReleased = false;
|
|
@@ -8958,12 +8984,18 @@ function guideResult(state, currentState, opts) {
|
|
|
8958
8984
|
contextPressure: state.contextPressure?.level ?? "low",
|
|
8959
8985
|
branch: state.git?.branch ?? null
|
|
8960
8986
|
};
|
|
8987
|
+
const allReminders = [...opts.reminders ?? []];
|
|
8988
|
+
if ((state.mode === "auto" || !state.mode) && currentState !== "SESSION_END") {
|
|
8989
|
+
allReminders.push(
|
|
8990
|
+
"NEVER cancel this session due to context size. Compaction is automatic \u2014 Claude Story preserves all session state across compactions via hooks."
|
|
8991
|
+
);
|
|
8992
|
+
}
|
|
8961
8993
|
const output = {
|
|
8962
8994
|
sessionId: state.sessionId,
|
|
8963
8995
|
state: currentState,
|
|
8964
8996
|
transitionedFrom: opts.transitionedFrom,
|
|
8965
8997
|
instruction: opts.instruction,
|
|
8966
|
-
reminders:
|
|
8998
|
+
reminders: allReminders,
|
|
8967
8999
|
contextAdvice: "ok",
|
|
8968
9000
|
sessionSummary: summary
|
|
8969
9001
|
};
|
|
@@ -10055,7 +10087,7 @@ async function ensureGitignoreEntries(gitignorePath, entries) {
|
|
|
10055
10087
|
// src/mcp/index.ts
|
|
10056
10088
|
var ENV_VAR2 = "CLAUDESTORY_PROJECT_ROOT";
|
|
10057
10089
|
var CONFIG_PATH2 = ".story/config.json";
|
|
10058
|
-
var version = "0.1.
|
|
10090
|
+
var version = "0.1.57";
|
|
10059
10091
|
function tryDiscoverRoot() {
|
|
10060
10092
|
const envRoot = process.env[ENV_VAR2];
|
|
10061
10093
|
if (envRoot) {
|
package/package.json
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anthropologies/claudestory",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"license": "
|
|
5
|
-
"description": "
|
|
3
|
+
"version": "0.1.57",
|
|
4
|
+
"license": "PolyForm-Noncommercial-1.0.0",
|
|
5
|
+
"description": "An agentic development framework. Track tickets, issues, and progress for your project so every session builds on the last.",
|
|
6
|
+
"homepage": "https://claudestory.com",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/AmirShayegh/ClaudeStory"
|
|
10
|
+
},
|
|
6
11
|
"keywords": [
|
|
7
12
|
"claudestory",
|
|
8
13
|
"claude-code",
|
package/src/skill/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: story
|
|
3
|
-
description:
|
|
3
|
+
description: Track tickets, issues, and progress for your project. Load project context, manage sessions, guide setup.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /story -- Project Context & Session Management
|
|
@@ -21,6 +21,8 @@ claudestory tracks tickets, issues, roadmap, and handovers in a `.story/` direct
|
|
|
21
21
|
- `/story export` -> export project for sharing. Ask the user whether to export the current phase or the full project, then call `claudestory_export` with either `phase` or `all` set
|
|
22
22
|
- `/story status` -> quick status check (call `claudestory_status` MCP tool)
|
|
23
23
|
- `/story settings` -> manage project settings (see Settings section below)
|
|
24
|
+
- `/story design` -> evaluate frontend design (read `design/design.md` in the same directory as this skill file; if not found, tell user to run `claudestory setup-skill`)
|
|
25
|
+
- `/story design <platform>` -> evaluate for specific platform: web, ios, macos, android (read `design/design.md` in the same directory as this skill file)
|
|
24
26
|
- `/story help` -> show all capabilities (read `reference.md` in the same directory as this skill file; if not found, tell user to run `claudestory setup-skill`)
|
|
25
27
|
|
|
26
28
|
If the user's intent doesn't match any of these, use the full context load.
|
|
@@ -132,6 +134,7 @@ Example: "Rules: integer cents for money, billing engine is pure logic, TDD for
|
|
|
132
134
|
Tip: You can also use these modes anytime:
|
|
133
135
|
/story guided T-XXX One ticket end-to-end with planning and code review
|
|
134
136
|
/story review T-XXX Review code you already wrote
|
|
137
|
+
/story design Evaluate frontend against platform best practices
|
|
135
138
|
```
|
|
136
139
|
|
|
137
140
|
Show this once or twice, then never again.
|
|
@@ -182,6 +185,8 @@ When working on a task and you encounter a bug, inconsistency, or improvement op
|
|
|
182
185
|
|
|
183
186
|
When starting work on a ticket, update its status to `inprogress`. When done, update to `complete` in the same commit as the code change.
|
|
184
187
|
|
|
188
|
+
**Frontend design guidance:** When working on UI or frontend tickets, read `design/design.md` in the same directory as this skill file for design principles and platform-specific best practices. Follow its priority order (clarity > hierarchy > platform correctness > accessibility > state completeness) and load the relevant platform reference. This applies to any ticket involving components, layouts, styling, or visual design.
|
|
189
|
+
|
|
185
190
|
## Managing Tickets and Issues
|
|
186
191
|
|
|
187
192
|
Ticket and issue create/update operations are available via both CLI and MCP tools. Delete remains CLI-only.
|
|
@@ -361,3 +366,4 @@ Additional skill documentation, loaded on demand:
|
|
|
361
366
|
- **`setup-flow.md`** -- Project detection and AI-Assisted Setup Flow (new project initialization)
|
|
362
367
|
- **`autonomous-mode.md`** -- Autonomous mode, review, plan, and guided execution tiers
|
|
363
368
|
- **`reference.md`** -- Full CLI command and MCP tool reference
|
|
369
|
+
- **`design/design.md`** -- Frontend design evaluation and implementation guidance, with platform references in `design/references/`
|
|
@@ -14,6 +14,8 @@ This file is referenced from SKILL.md for `/story auto`, `/story review`, `/stor
|
|
|
14
14
|
4. The guide advances through: PICK_TICKET -> PLAN -> PLAN_REVIEW -> IMPLEMENT -> CODE_REVIEW -> FINALIZE -> COMPLETE -> loop
|
|
15
15
|
5. Continue until the guide returns SESSION_END
|
|
16
16
|
|
|
17
|
+
**Frontend design:** If the current ticket involves UI, frontend, components, layouts, or styling, read `design/design.md` in the same directory as the skill file for design principles. Load the relevant platform reference from `design/references/`. Apply the priority order (clarity > hierarchy > platform correctness > accessibility > state completeness) during both planning and implementation.
|
|
18
|
+
|
|
17
19
|
**Critical rules for autonomous mode:**
|
|
18
20
|
- Do NOT use Claude Code's plan mode -- write plans as markdown files
|
|
19
21
|
- Do NOT ask the user for confirmation or approval
|
|
@@ -21,9 +23,21 @@ This file is referenced from SKILL.md for `/story auto`, `/story review`, `/stor
|
|
|
21
23
|
- Follow the guide's instructions exactly -- it specifies which tools to call, what parameters to use
|
|
22
24
|
- After each step completes, call `claudestory_autonomous_guide` with `action: "report"` and the results
|
|
23
25
|
|
|
26
|
+
**Recommended setup for long sessions:**
|
|
27
|
+
|
|
28
|
+
Run Claude Code with: `claude --model claude-opus-4-6 --dangerously-skip-permissions`
|
|
29
|
+
|
|
30
|
+
- **Skip-permissions** enables unattended execution -- no approval prompts consuming context
|
|
31
|
+
- **Claude Story handles compaction automatically** -- context preserved across compactions, do not cancel because context feels large
|
|
32
|
+
- Use only in **trusted repositories** -- skip-permissions disables safety prompts for all tool use
|
|
33
|
+
|
|
24
34
|
**If the guide says to compact:** Call `claudestory_autonomous_guide` with `action: "pre_compact"`, then run `/compact`, then call with `action: "resume"`.
|
|
25
35
|
|
|
26
|
-
**If something goes wrong:**
|
|
36
|
+
**If something goes wrong:**
|
|
37
|
+
- Context feels large -- do nothing, compaction is automatic via hooks
|
|
38
|
+
- Compaction happened -- call with `action: "resume"` to continue
|
|
39
|
+
- Session stuck after compact -- run `claudestory session clear-compact` in terminal, then `action: "resume"`
|
|
40
|
+
- Unrecoverable error -- run `claudestory session stop` in terminal (admin escape hatch)
|
|
27
41
|
|
|
28
42
|
## Tiered Access -- Review, Plan, Guided Modes
|
|
29
43
|
|