@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 CHANGED
@@ -1,6 +1,8 @@
1
1
  # claudestory
2
2
 
3
- Cross-session context persistence for AI coding assistants. Tracks tickets, issues, roadmap phases, blockers, and session handovers in a `.story/` directory that AI tools read and write natively.
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
- MIT
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.55";
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: opts.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.55";
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.55";
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
- language: string;
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.55";
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: opts.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.55";
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.55",
4
- "license": "UNLICENSED",
5
- "description": "Cross-session context persistence for AI coding projects. Tracks tickets, issues, roadmap, and handovers so every session builds on the last.",
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",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: story
3
- description: Cross-session context persistence for AI coding projects. Load project context, manage sessions, guide setup.
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:** Call `claudestory_autonomous_guide` with `action: "cancel"` to cleanly end the session.
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