@chinhae/atw-cli 0.3.5 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +188 -15
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +25 -1
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/commands/init.d.ts +3 -0
  6. package/dist/commands/init.d.ts.map +1 -1
  7. package/dist/commands/init.js +154 -17
  8. package/dist/commands/init.js.map +1 -1
  9. package/dist/commands/mode.d.ts +21 -0
  10. package/dist/commands/mode.d.ts.map +1 -0
  11. package/dist/commands/mode.js +401 -0
  12. package/dist/commands/mode.js.map +1 -0
  13. package/dist/commands/update.d.ts +7 -0
  14. package/dist/commands/update.d.ts.map +1 -1
  15. package/dist/commands/update.js +20 -13
  16. package/dist/commands/update.js.map +1 -1
  17. package/dist/commands/workflow.d.ts +17 -0
  18. package/dist/commands/workflow.d.ts.map +1 -1
  19. package/dist/commands/workflow.js +9 -3
  20. package/dist/commands/workflow.js.map +1 -1
  21. package/dist/configurators/claude.d.ts +3 -2
  22. package/dist/configurators/claude.d.ts.map +1 -1
  23. package/dist/configurators/claude.js +3 -3
  24. package/dist/configurators/claude.js.map +1 -1
  25. package/dist/configurators/codex.d.ts +4 -3
  26. package/dist/configurators/codex.d.ts.map +1 -1
  27. package/dist/configurators/codex.js +10 -10
  28. package/dist/configurators/codex.js.map +1 -1
  29. package/dist/configurators/index.d.ts +9 -3
  30. package/dist/configurators/index.d.ts.map +1 -1
  31. package/dist/configurators/index.js +95 -17
  32. package/dist/configurators/index.js.map +1 -1
  33. package/dist/configurators/shared.d.ts +13 -0
  34. package/dist/configurators/shared.d.ts.map +1 -1
  35. package/dist/configurators/shared.js +25 -0
  36. package/dist/configurators/shared.js.map +1 -1
  37. package/dist/configurators/workflow.d.ts +15 -1
  38. package/dist/configurators/workflow.d.ts.map +1 -1
  39. package/dist/configurators/workflow.js +23 -5
  40. package/dist/configurators/workflow.js.map +1 -1
  41. package/dist/configurators/zcode.d.ts +1 -1
  42. package/dist/configurators/zcode.d.ts.map +1 -1
  43. package/dist/configurators/zcode.js +2 -2
  44. package/dist/configurators/zcode.js.map +1 -1
  45. package/dist/constants/paths.d.ts +4 -0
  46. package/dist/constants/paths.d.ts.map +1 -1
  47. package/dist/constants/paths.js +4 -0
  48. package/dist/constants/paths.js.map +1 -1
  49. package/dist/migrations/manifests/0.3.6.json +9 -0
  50. package/dist/migrations/manifests/0.4.0.json +9 -0
  51. package/dist/templates/atw/index.d.ts +10 -1
  52. package/dist/templates/atw/index.d.ts.map +1 -1
  53. package/dist/templates/atw/index.js +11 -1
  54. package/dist/templates/atw/index.js.map +1 -1
  55. package/dist/templates/atw/scripts/add_session.py +34 -13
  56. package/dist/templates/atw/scripts/common/active_task.py +2 -2
  57. package/dist/templates/atw/scripts/common/config.py +13 -0
  58. package/dist/templates/atw/scripts/common/developer.py +15 -4
  59. package/dist/templates/atw/scripts/common/noob_mode.py +35 -15
  60. package/dist/templates/atw/scripts/common/packages_context.py +16 -3
  61. package/dist/templates/atw/scripts/common/session_context.py +77 -19
  62. package/dist/templates/atw/scripts/common/task_store.py +78 -27
  63. package/dist/templates/atw/scripts/noob_mode.py +16 -4
  64. package/dist/templates/atw/scripts/task.py +99 -38
  65. package/dist/templates/atw/workflow-general.md +554 -0
  66. package/dist/templates/atw/workflow.md +3 -3
  67. package/dist/templates/codex/hooks/session-start.py +69 -18
  68. package/dist/templates/common/bundled-skills/atw-noob-mode/SKILL.md +16 -9
  69. package/dist/templates/common/commands/start.md +43 -0
  70. package/dist/templates/copilot/hooks/session-start.py +69 -18
  71. package/dist/templates/dsh/DSH.md +43 -0
  72. package/dist/templates/markdown/agents.md +11 -0
  73. package/dist/templates/markdown/index.d.ts +9 -0
  74. package/dist/templates/markdown/index.d.ts.map +1 -1
  75. package/dist/templates/markdown/index.js +14 -1
  76. package/dist/templates/markdown/index.js.map +1 -1
  77. package/dist/templates/markdown/spec/conventions.md.txt +13 -0
  78. package/dist/templates/opencode/lib/atw-context.js +19 -0
  79. package/dist/templates/opencode/lib/session-utils.js +79 -24
  80. package/dist/templates/opencode/plugins/inject-workflow-state.js +18 -8
  81. package/dist/templates/pi/extensions/atw/index.ts.txt +20 -9
  82. package/dist/templates/shared-hooks/inject-shell-session-context.py +3 -3
  83. package/dist/templates/shared-hooks/inject-workflow-state.py +21 -2
  84. package/dist/templates/shared-hooks/session-start.py +70 -22
  85. package/dist/templates/snow/SNOW.md +30 -0
  86. package/dist/templates/snow/hooks/write-atw-context.py +64 -0
  87. package/dist/utils/manifest-prune.d.ts +2 -1
  88. package/dist/utils/manifest-prune.d.ts.map +1 -1
  89. package/dist/utils/manifest-prune.js +10 -7
  90. package/dist/utils/manifest-prune.js.map +1 -1
  91. package/dist/utils/optional-skills.d.ts.map +1 -1
  92. package/dist/utils/optional-skills.js +2 -1
  93. package/dist/utils/optional-skills.js.map +1 -1
  94. package/dist/utils/project-mode.d.ts +30 -0
  95. package/dist/utils/project-mode.d.ts.map +1 -0
  96. package/dist/utils/project-mode.js +86 -0
  97. package/dist/utils/project-mode.js.map +1 -0
  98. package/dist/utils/workflow-resolver.d.ts +9 -5
  99. package/dist/utils/workflow-resolver.d.ts.map +1 -1
  100. package/dist/utils/workflow-resolver.js +25 -11
  101. package/dist/utils/workflow-resolver.js.map +1 -1
  102. package/package.json +3 -3
@@ -15,5 +15,5 @@
15
15
  * The ZCode file set — written at init and diffed by `atw update`.
16
16
  */
17
17
  export declare function collectZcodeTemplates(): Map<string, string>;
18
- export declare function configureZcode(cwd: string): Promise<void>;
18
+ export declare function configureZcode(cwd: string, files: Map<string, string>): Promise<void>;
19
19
  //# sourceMappingURL=zcode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"zcode.d.ts","sourceRoot":"","sources":["../../src/configurators/zcode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAqC3D;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D"}
1
+ {"version":3,"file":"zcode.d.ts","sourceRoot":"","sources":["../../src/configurators/zcode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAqC3D;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACzB,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -45,7 +45,7 @@ export function collectZcodeTemplates() {
45
45
  files.set(".zcode/config.json", resolvePlaceholders(getHooksConfig().content));
46
46
  return files;
47
47
  }
48
- export async function configureZcode(cwd) {
49
- await writeTemplateMap(cwd, collectZcodeTemplates());
48
+ export async function configureZcode(cwd, files) {
49
+ await writeTemplateMap(cwd, files);
50
50
  }
51
51
  //# sourceMappingURL=zcode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zcode.js","sourceRoot":"","sources":["../../src/configurators/zcode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,6EAA6E;AAC7E,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,iEAAiE;IACjE,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,qBAAqB,CACrD,eAAe,EACf,aAAa,CAAC,GAAG,CAAC,EAClB,oBAAoB,CAAC,GAAG,CAAC,CAC1B,EAAE,CAAC;QACF,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,qCAAqC;IACrC,KAAK,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,IAAI,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,0EAA0E;IAC1E,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,EAAE,CAAC;QACnC,KAAK,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,0CAA0C;IAC1C,yEAAyE;IACzE,KAAK,MAAM,IAAI,IAAI,+BAA+B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,KAAK,CAAC,GAAG,CAAC,GAAG,eAAe,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,GAAG,CACP,oBAAoB,EACpB,mBAAmB,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAC9C,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,gBAAgB,CAAC,GAAG,EAAE,qBAAqB,EAAE,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"zcode.js","sourceRoot":"","sources":["../../src/configurators/zcode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,6EAA6E;AAC7E,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,iEAAiE;IACjE,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,qBAAqB,CACrD,eAAe,EACf,aAAa,CAAC,GAAG,CAAC,EAClB,oBAAoB,CAAC,GAAG,CAAC,CAC1B,EAAE,CAAC;QACF,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,qCAAqC;IACrC,KAAK,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,IAAI,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,0EAA0E;IAC1E,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,EAAE,CAAC;QACnC,KAAK,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,0CAA0C;IAC1C,yEAAyE;IACzE,KAAK,MAAM,IAAI,IAAI,+BAA+B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,KAAK,CAAC,GAAG,CAAC,GAAG,eAAe,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,GAAG,CACP,oBAAoB,EACpB,mBAAmB,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAC9C,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,KAA0B;IAE1B,MAAM,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC"}
@@ -33,6 +33,8 @@ export declare const FILE_NAMES: {
33
33
  readonly PRD: "prd.md";
34
34
  /** Workflow guide */
35
35
  readonly WORKFLOW_GUIDE: "workflow.md";
36
+ /** general 项目的约定文件(在 spec/ 下,平铺) */
37
+ readonly CONVENTIONS: "conventions.md";
36
38
  /** Journal file prefix */
37
39
  readonly JOURNAL_PREFIX: "journal-";
38
40
  };
@@ -55,6 +57,8 @@ export declare const PATHS: {
55
57
  readonly CURRENT_TASK_FILE: ".atw/.current-task";
56
58
  /** .atw/workflow.md */
57
59
  readonly WORKFLOW_GUIDE_FILE: ".atw/workflow.md";
60
+ /** .atw/spec/conventions.md */
61
+ readonly CONVENTIONS_FILE: ".atw/spec/conventions.md";
58
62
  };
59
63
  /**
60
64
  * Get developer's workspace directory path
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/constants/paths.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,eAAO,MAAM,SAAS;IACpB,8BAA8B;;IAE9B,+DAA+D;;IAE/D,2DAA2D;;IAE3D,uCAAuC;;IAEvC,8CAA8C;;IAE9C,sCAAsC;;IAEtC,sDAAsD;;CAE9C,CAAC;AAGX,eAAO,MAAM,UAAU;IACrB,mCAAmC;;IAEnC,8BAA8B;;IAE9B,2BAA2B;;IAE3B,oBAAoB;;IAEpB,4BAA4B;;IAE5B,qBAAqB;;IAErB,0BAA0B;;CAElB,CAAC;AAGX,eAAO,MAAM,KAAK;IAChB,YAAY;;IAEZ,sBAAsB;;IAEtB,kBAAkB;;IAElB,iBAAiB;;IAEjB,oBAAoB;;IAEpB,mBAAmB;;IAEnB,sBAAsB;;IAEtB,yBAAyB;;IAEzB,uBAAuB;;CAEf,CAAC;AAEX;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/constants/paths.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,eAAO,MAAM,SAAS;IACpB,8BAA8B;;IAE9B,+DAA+D;;IAE/D,2DAA2D;;IAE3D,uCAAuC;;IAEvC,8CAA8C;;IAE9C,sCAAsC;;IAEtC,sDAAsD;;CAE9C,CAAC;AAGX,eAAO,MAAM,UAAU;IACrB,mCAAmC;;IAEnC,8BAA8B;;IAE9B,2BAA2B;;IAE3B,oBAAoB;;IAEpB,4BAA4B;;IAE5B,qBAAqB;;IAErB,oCAAoC;;IAEpC,0BAA0B;;CAElB,CAAC;AAGX,eAAO,MAAM,KAAK;IAChB,YAAY;;IAEZ,sBAAsB;;IAEtB,kBAAkB;;IAElB,iBAAiB;;IAEjB,oBAAoB;;IAEpB,mBAAmB;;IAEnB,sBAAsB;;IAEtB,yBAAyB;;IAEzB,uBAAuB;;IAEvB,+BAA+B;;CAEvB,CAAC;AAEX;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -35,6 +35,8 @@ export const FILE_NAMES = {
35
35
  PRD: "prd.md",
36
36
  /** Workflow guide */
37
37
  WORKFLOW_GUIDE: "workflow.md",
38
+ /** general 项目的约定文件(在 spec/ 下,平铺) */
39
+ CONVENTIONS: "conventions.md",
38
40
  /** Journal file prefix */
39
41
  JOURNAL_PREFIX: "journal-",
40
42
  };
@@ -58,6 +60,8 @@ export const PATHS = {
58
60
  CURRENT_TASK_FILE: `${DIR_NAMES.WORKFLOW}/${FILE_NAMES.CURRENT_TASK}`,
59
61
  /** .atw/workflow.md */
60
62
  WORKFLOW_GUIDE_FILE: `${DIR_NAMES.WORKFLOW}/${FILE_NAMES.WORKFLOW_GUIDE}`,
63
+ /** .atw/spec/conventions.md */
64
+ CONVENTIONS_FILE: `${DIR_NAMES.WORKFLOW}/${DIR_NAMES.SPEC}/${FILE_NAMES.CONVENTIONS}`,
61
65
  };
62
66
  /**
63
67
  * Get developer's workspace directory path
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/constants/paths.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,mCAAmC;AACnC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM;IAChB,+DAA+D;IAC/D,SAAS,EAAE,WAAW;IACtB,2DAA2D;IAC3D,KAAK,EAAE,OAAO;IACd,uCAAuC;IACvC,OAAO,EAAE,SAAS;IAClB,8CAA8C;IAC9C,IAAI,EAAE,MAAM;IACZ,sCAAsC;IACtC,OAAO,EAAE,SAAS;IAClB,sDAAsD;IACtD,MAAM,EAAE,QAAQ;CACR,CAAC;AAEX,aAAa;AACb,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,mCAAmC;IACnC,MAAM,EAAE,WAAW;IACnB,8BAA8B;IAC9B,SAAS,EAAE,YAAY;IACvB,2BAA2B;IAC3B,YAAY,EAAE,eAAe;IAC7B,oBAAoB;IACpB,SAAS,EAAE,WAAW;IACtB,4BAA4B;IAC5B,GAAG,EAAE,QAAQ;IACb,qBAAqB;IACrB,cAAc,EAAE,aAAa;IAC7B,0BAA0B;IAC1B,cAAc,EAAE,UAAU;CAClB,CAAC;AAEX,+CAA+C;AAC/C,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,YAAY;IACZ,QAAQ,EAAE,SAAS,CAAC,QAAQ;IAC5B,sBAAsB;IACtB,SAAS,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE;IACzD,kBAAkB;IAClB,KAAK,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,KAAK,EAAE;IACjD,iBAAiB;IACjB,IAAI,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE;IAC/C,oBAAoB;IACpB,OAAO,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,OAAO,EAAE;IACrD,mBAAmB;IACnB,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE;IACnD,sBAAsB;IACtB,cAAc,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE;IAC/D,yBAAyB;IACzB,iBAAiB,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,UAAU,CAAC,YAAY,EAAE;IACrE,uBAAuB;IACvB,mBAAmB,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,UAAU,CAAC,cAAc,EAAE;CACjE,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,GAAG,KAAK,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,GAAG,KAAK,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/constants/paths.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,mCAAmC;AACnC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM;IAChB,+DAA+D;IAC/D,SAAS,EAAE,WAAW;IACtB,2DAA2D;IAC3D,KAAK,EAAE,OAAO;IACd,uCAAuC;IACvC,OAAO,EAAE,SAAS;IAClB,8CAA8C;IAC9C,IAAI,EAAE,MAAM;IACZ,sCAAsC;IACtC,OAAO,EAAE,SAAS;IAClB,sDAAsD;IACtD,MAAM,EAAE,QAAQ;CACR,CAAC;AAEX,aAAa;AACb,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,mCAAmC;IACnC,MAAM,EAAE,WAAW;IACnB,8BAA8B;IAC9B,SAAS,EAAE,YAAY;IACvB,2BAA2B;IAC3B,YAAY,EAAE,eAAe;IAC7B,oBAAoB;IACpB,SAAS,EAAE,WAAW;IACtB,4BAA4B;IAC5B,GAAG,EAAE,QAAQ;IACb,qBAAqB;IACrB,cAAc,EAAE,aAAa;IAC7B,oCAAoC;IACpC,WAAW,EAAE,gBAAgB;IAC7B,0BAA0B;IAC1B,cAAc,EAAE,UAAU;CAClB,CAAC;AAEX,+CAA+C;AAC/C,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,YAAY;IACZ,QAAQ,EAAE,SAAS,CAAC,QAAQ;IAC5B,sBAAsB;IACtB,SAAS,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE;IACzD,kBAAkB;IAClB,KAAK,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,KAAK,EAAE;IACjD,iBAAiB;IACjB,IAAI,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE;IAC/C,oBAAoB;IACpB,OAAO,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,OAAO,EAAE;IACrD,mBAAmB;IACnB,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE;IACnD,sBAAsB;IACtB,cAAc,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE;IAC/D,yBAAyB;IACzB,iBAAiB,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,UAAU,CAAC,YAAY,EAAE;IACrE,uBAAuB;IACvB,mBAAmB,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,UAAU,CAAC,cAAc,EAAE;IACzE,+BAA+B;IAC/B,gBAAgB,EAAE,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,IAAI,UAAU,CAAC,WAAW,EAAE;CAC7E,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,GAAG,KAAK,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,GAAG,KAAK,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": "0.3.6",
3
+ "description": "Noob mode now holds when only the per-turn reminder is in context: the reminder sends the AI to the full rules and outranks another skill's wording.",
4
+ "breaking": false,
5
+ "recommendMigrate": false,
6
+ "changelog": "atw-noob-mode and workflow.md. With noob mode on, a session that ran a question round from another skill replied in engineer's terms and the project's glossary words. The per-turn reminder was a five-line summary, the skill holding the full rules was never loaded unless the user ran it, and the rule that another skill's format does not excuse its wording was only in the skill. The reminder in workflow.md's [workflow-state:noob_mode] block now tells the AI to load the full rules when their text is not in the conversation, and says that another skill's question list, table or report keeps its shape while every word in it that reaches the user follows noob mode, the project's own glossary words included. The skill gains an 'Already on' case, so loading it for the rules runs no script and announces nothing. Saying back the usual name (0.3.5) is narrowed: the line leaves the per-turn reminder, and the skill limits it to an everyday working name the user could type next time, given in the sentence that opens the reply — never a textbook category, never added afterwards as an item of its own. The skill also says its rules are not a form: they are never used as headings or a checklist, and when the user points out that the AI slipped out of noob mode, it says so in one sentence and gives the unreadable reply again in plain words instead of reporting on itself.",
7
+ "migrations": [],
8
+ "notes": "No migration required and no files added, deleted or renamed. Two templates changed: .atw/workflow.md (the [workflow-state:noob_mode] block: its first line, and one line replaced) and the atw-noob-mode skill. They update as Template updated where the project left them untouched; where a project edited them locally, atw update asks before replacing — keep the edit and noob mode stays as it was for that project. A workflow.md without a noob_mode block still gets the built-in one-line reminder, which is unchanged. Nothing changes for a developer who has noob mode off."
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": "0.4.0",
3
+ "description": "A second project mode, general, for work that is not code: writing, research, organizing material, planning. atw init --mode chooses it and atw mode shows or switches it. A project set up before modes existed is a dev project and needs no change.",
4
+ "breaking": false,
5
+ "recommendMigrate": false,
6
+ "changelog": "Project mode. A project is now in one of two modes, recorded as a top-level mode: line in .atw/config.yaml and shared by everyone working in it. dev is the workflow ATW always had and stays the default; a config with no mode: line is dev. general is for work that is not code. The mode decides three things at once: which workflow the AI follows, which skills and sub-agents are installed, and whether noob mode is on for a user who never chose. general mode: its own built-in workflow (talk it through, write down what was agreed, do it, check it) with two stops instead of four — confirming what was written down, and accepting the result. The AI creates the task record itself, writes what will be done, what will not be done and what counts as done into prd.md, checks the result against it item by item, then archives and writes the session journal; the user never types a command to move the work along. Six skills install instead of 28 (atw-interview, atw-research, atw-session-insight, atw-noob-mode, atw-askme, atw-handoff), with no /atw-continue or /atw-finish-work, no sub-agents, no tickets and no .atw/spec/ tree by package and layer. One flat file, .atw/spec/conventions.md, is handed to the AI at the start of every session. A general project works in an ordinary folder that is not a git repository. New in the CLI: atw init asks 'What is this project mainly for?' in a terminal and takes --mode <dev|general> to answer it up front; with --yes or without a terminal the project is dev unless --mode says otherwise. --template and --registry are refused in a general project, and atw init --mode does not switch a project that is already set up. atw mode prints the current mode; atw mode <dev|general> lists what it will delete, add and replace file by file, names the files it keeps because they were edited, and asks before touching anything (-y, --yes skips the question; -f, --force replaces an edited .atw/workflow.md). atw update and atw uninstall follow the project's mode, and atw workflow's native entry is the workflow that comes with the mode. Noob mode has three states: on, off, or never chose. On and off are the user's own choice and always win; a user who never chose gets the project default — on in a general project, off in a dev one. Switching off is now written to .atw/.developer as noob_mode=off instead of removing the line, so neither the default nor a later change of project mode turns it back on, and noob_mode.py status adds a Source: line saying whether the answer is the user's own setting or the project default. Scripts: task.py gains resume <task>, which makes a task the session's current task and leaves its status and record as they are (the general workflow uses it to pick up unfinished work; task.py start still means begin the work). In a folder without git, the session context no longer prints a raw git error or made-up git state, and task.py create no longer warns about a default branch.",
7
+ "migrations": [],
8
+ "notes": "No migration required. A project set up on an earlier version stays a dev project: atw update writes no mode: line into .atw/config.yaml and adds, deletes or renames no files. Templates that changed for a dev project: ten scripts under .atw/scripts/ (task.py, add_session.py, noob_mode.py and seven under common/), .atw/workflow.md (one paragraph, on how noob mode is switched), the atw-noob-mode skill, and each platform's session hooks, plugin or extension. They update as Template updated where the project left them untouched; where a project edited them locally, atw update asks before replacing. One behaviour reaches dev projects: switching noob mode off now writes noob_mode=off to .atw/.developer instead of removing the line. A developer who never switched it on stays off. To use general mode in a project that is already set up, run atw mode general; it lists every file it will delete, add or replace and asks first."
9
+ }
@@ -13,11 +13,13 @@
13
13
  * ├── agents/ # Channel runtime agent definitions
14
14
  * │ └── *.md # Loaded by `atw channel spawn --agent <name>`
15
15
  * ├── scripts-shell-archive/ # Archived shell scripts (for reference)
16
- * ├── workflow.md # Workflow guide
16
+ * ├── workflow.md # Workflow guide (dev mode)
17
+ * ├── workflow-general.md # Workflow guide (general mode)
17
18
  * ├── config.yaml # ATW configuration
18
19
  * ├── gitignore.txt # .gitignore content
19
20
  * └── gitattributes.txt # project-root .gitattributes content
20
21
  */
22
+ import type { ProjectMode } from "../../utils/project-mode.js";
21
23
  export declare const scriptsInit: string;
22
24
  export declare const commonInit: string;
23
25
  export declare const commonPaths: string;
@@ -51,11 +53,18 @@ export declare const ticketsScript: string;
51
53
  export declare const githubSyncScript: string;
52
54
  export declare const linearSyncHookScript: string;
53
55
  export declare const workflowMdTemplate: string;
56
+ export declare const generalWorkflowMdTemplate: string;
54
57
  export declare const configYamlTemplate: string;
55
58
  export declare const gitignoreTemplate: string;
56
59
  export declare const gitattributesTemplate: string;
57
60
  export declare const implementAgentTemplate: string;
58
61
  export declare const reviewAgentTemplate: string;
62
+ /**
63
+ * 某个项目模式自带的内置流程,即该模式下 `.atw/workflow.md` 的 ATW 原版内容。
64
+ *
65
+ * 初始化、升级和流程切换命令里的内置流程都从这里取,所以三处给出的是同一份。
66
+ */
67
+ export declare function bundledWorkflowFor(mode: ProjectMode): string;
59
68
  /**
60
69
  * Get all script templates as a map of relative path to content
61
70
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/atw/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAcH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAG/D,eAAO,MAAM,UAAU,QAA6C,CAAC;AACrE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,QAAQ,QAAuC,CAAC;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,iBAAiB,QAAiD,CAAC;AAChF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,cAAc,QAA8C,CAAC;AAG1E,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAC7E,eAAO,MAAM,cAAc,QAAuC,CAAC;AACnE,eAAO,MAAM,UAAU,QAAkC,CAAC;AAC1D,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,aAAa,QAAqC,CAAC;AAChE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAGF,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAgC,CAAC;AAC/D,eAAO,MAAM,qBAAqB,QAAoC,CAAC;AAMvE,eAAO,MAAM,sBAAsB,QAA4C,CAAC;AAChF,eAAO,MAAM,mBAAmB,QAAmC,CAAC;AAEpE;;GAEG;AACH,wBAAgB,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoDnD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAKlD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/atw/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAU/D,eAAO,MAAM,WAAW,QAAsC,CAAC;AAG/D,eAAO,MAAM,UAAU,QAA6C,CAAC;AACrE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,QAAQ,QAAuC,CAAC;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,iBAAiB,QAAiD,CAAC;AAChF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,cAAc,QAA8C,CAAC;AAG1E,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAC7E,eAAO,MAAM,cAAc,QAAuC,CAAC;AACnE,eAAO,MAAM,UAAU,QAAkC,CAAC;AAC1D,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,aAAa,QAAqC,CAAC;AAChE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAGF,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,yBAAyB,QAAsC,CAAC;AAC7E,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAgC,CAAC;AAC/D,eAAO,MAAM,qBAAqB,QAAoC,CAAC;AAMvE,eAAO,MAAM,sBAAsB,QAA4C,CAAC;AAChF,eAAO,MAAM,mBAAmB,QAAmC,CAAC;AAEpE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoDnD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAKlD"}
@@ -13,7 +13,8 @@
13
13
  * ├── agents/ # Channel runtime agent definitions
14
14
  * │ └── *.md # Loaded by `atw channel spawn --agent <name>`
15
15
  * ├── scripts-shell-archive/ # Archived shell scripts (for reference)
16
- * ├── workflow.md # Workflow guide
16
+ * ├── workflow.md # Workflow guide (dev mode)
17
+ * ├── workflow-general.md # Workflow guide (general mode)
17
18
  * ├── config.yaml # ATW configuration
18
19
  * ├── gitignore.txt # .gitignore content
19
20
  * └── gitattributes.txt # project-root .gitattributes content
@@ -63,6 +64,7 @@ export const githubSyncScript = readTemplate("scripts/github_sync.py");
63
64
  export const linearSyncHookScript = readTemplate("scripts/hooks/linear_sync.py");
64
65
  // Configuration files
65
66
  export const workflowMdTemplate = readTemplate("workflow.md");
67
+ export const generalWorkflowMdTemplate = readTemplate("workflow-general.md");
66
68
  export const configYamlTemplate = readTemplate("config.yaml");
67
69
  export const gitignoreTemplate = readTemplate("gitignore.txt");
68
70
  export const gitattributesTemplate = readTemplate("gitattributes.txt");
@@ -72,6 +74,14 @@ export const gitattributesTemplate = readTemplate("gitattributes.txt");
72
74
  // and refreshed by `atw update`.
73
75
  export const implementAgentTemplate = readTemplate("agents/implement-agent.md");
74
76
  export const reviewAgentTemplate = readTemplate("agents/review.md");
77
+ /**
78
+ * 某个项目模式自带的内置流程,即该模式下 `.atw/workflow.md` 的 ATW 原版内容。
79
+ *
80
+ * 初始化、升级和流程切换命令里的内置流程都从这里取,所以三处给出的是同一份。
81
+ */
82
+ export function bundledWorkflowFor(mode) {
83
+ return mode === "general" ? generalWorkflowMdTemplate : workflowMdTemplate;
84
+ }
75
85
  /**
76
86
  * Get all script templates as a map of relative path to content
77
87
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/atw/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,SAAS,YAAY,CAAC,YAAoB;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAE/D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,4BAA4B,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,6BAA6B,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC,sBAAsB,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,gCAAgC,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAC9C,mCAAmC,CACpC,CAAC;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAC/C,oCAAoC,CACrC,CAAC;AACF,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,kCAAkC,CACnC,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,6BAA6B,CAAC,CAAC;AAE1E,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC,2BAA2B,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,sBAAsB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAC9C,8BAA8B,CAC/B,CAAC;AAEF,sBAAsB;AACtB,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAEvE,+CAA+C;AAC/C,4EAA4E;AAC5E,yEAAyE;AACzE,iCAAiC;AACjC,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC,2BAA2B,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAExC,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,oBAAoB,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,qBAAqB,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,mBAAmB,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;IAEnD,OAAO;IACP,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAChD,6EAA6E;IAC7E,8EAA8E;IAC9E,4EAA4E;IAC5E,oEAAoE;IACpE,0EAA0E;IAC1E,6EAA6E;IAC7E,oCAAoC;IACpC,2EAA2E;IAC3E,qEAAqE;IACrE,6CAA6C;IAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,oBAAoB,CAAC,CAAC;IAE1D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/atw/index.ts"],"names":[],"mappings":"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"}
@@ -75,6 +75,7 @@ from common.tasks import load_task
75
75
  from common.types import TaskInfo
76
76
  from common.config import (
77
77
  get_packages,
78
+ get_project_mode,
78
79
  get_session_auto_commit,
79
80
  get_session_commit_message,
80
81
  get_max_journal_lines,
@@ -903,8 +904,13 @@ def generate_session_content(
903
904
  extra_content: str | None = None,
904
905
  tests: list[str] | None = None,
905
906
  next_steps: list[str] | None = None,
907
+ general: bool = False,
906
908
  ) -> str:
907
- """Generate session content."""
909
+ """Generate session content.
910
+
911
+ ``general``: the entry is for a general project, whose user reads the
912
+ journal themselves — it carries neither the branch nor the commit table.
913
+ """
908
914
  if evidence:
909
915
  commit_table = """| Hash | Message |
910
916
  |------|---------|"""
@@ -914,7 +920,8 @@ def generate_session_content(
914
920
  commit_table = "(No commits - planning session)"
915
921
 
916
922
  package_line = f"\n**Package**: {package}" if package else ""
917
- branch_line = f"\n**Branch**: `{branch}`" if branch else ""
923
+ branch_line = f"\n**Branch**: `{branch}`" if branch and not general else ""
924
+ commits_section = "" if general else f"\n\n### Git Commits\n\n{commit_table}"
918
925
 
919
926
  main_changes_section = _render_main_changes(changes or [], extra_content)
920
927
  testing_section = _render_bullet_section("Testing", tests or [], bullet_prefix="- [OK] ")
@@ -930,11 +937,7 @@ def generate_session_content(
930
937
 
931
938
  ### Summary
932
939
 
933
- {summary}{main_changes_section}
934
-
935
- ### Git Commits
936
-
937
- {commit_table}{testing_section}
940
+ {summary}{main_changes_section}{commits_section}{testing_section}
938
941
 
939
942
  ### Status
940
943
 
@@ -958,9 +961,20 @@ def update_index(
958
961
  active_file: str,
959
962
  today: str,
960
963
  branch: str | None = None,
964
+ general: bool = False,
961
965
  ) -> bool:
962
966
  """Update index.md with new session info."""
963
967
  commit_display = format_commit_display(evidence)
968
+ # The session-history table follows the project's mode: the user of a
969
+ # general project reads it themselves, so no commit or branch columns.
970
+ if general:
971
+ history_header = "| # | Date | Title |"
972
+ history_separator = "|---|------|-------|"
973
+ history_row = f"| {new_session} | {today} | {title} |"
974
+ else:
975
+ history_header = "| # | Date | Title | Commits | Branch |"
976
+ history_separator = "|---|------|-------|---------|--------|"
977
+ history_row = f"| {new_session} | {today} | {title} | {commit_display} | `{branch or '-'}` |"
964
978
 
965
979
  # Get file number from active_file name
966
980
  match = re.search(r"(\d+)", active_file)
@@ -1033,22 +1047,26 @@ def update_index(
1033
1047
  continue
1034
1048
 
1035
1049
  if in_session_history:
1036
- # Migrate old 4/6-column headers to 5-column Branch-only history.
1050
+ # Migrate old 4/6-column headers to 5-column Branch-only history,
1051
+ # and either mode's header to the other's after `atw mode`.
1037
1052
  if re.match(
1038
1053
  r"^\|\s*#\s*\|\s*Date\s*\|\s*Title\s*\|\s*Commits\s*\|\s*Branch\s*\|\s*Base Branch\s*\|\s*$",
1039
1054
  line,
1040
1055
  ):
1041
- new_lines.append("| # | Date | Title | Commits | Branch |")
1056
+ new_lines.append(history_header)
1042
1057
  continue
1043
1058
  if re.match(r"^\|\s*#\s*\|\s*Date\s*\|\s*Title\s*\|\s*Commits\s*\|\s*Branch\s*\|\s*$", line):
1044
- new_lines.append("| # | Date | Title | Commits | Branch |")
1059
+ new_lines.append(history_header)
1045
1060
  continue
1046
1061
  if re.match(r"^\|\s*#\s*\|\s*Date\s*\|\s*Title\s*\|\s*Commits\s*\|\s*$", line):
1047
- new_lines.append("| # | Date | Title | Commits | Branch |")
1062
+ new_lines.append(history_header)
1063
+ continue
1064
+ if re.match(r"^\|\s*#\s*\|\s*Date\s*\|\s*Title\s*\|\s*$", line):
1065
+ new_lines.append(history_header)
1048
1066
  continue
1049
1067
  if re.match(r"^\|[-| ]+\|\s*$", line) and not header_written:
1050
- new_lines.append("|---|------|-------|---------|--------|")
1051
- new_lines.append(f"| {new_session} | {today} | {title} | {commit_display} | `{branch or '-'}` |")
1068
+ new_lines.append(history_separator)
1069
+ new_lines.append(history_row)
1052
1070
  header_written = True
1053
1071
  continue
1054
1072
  new_lines.append(line)
@@ -1200,6 +1218,7 @@ def add_session(
1200
1218
  ) -> int:
1201
1219
  """Add a new session, resuming an interrupted one instead of duplicating it."""
1202
1220
  repo_root = get_repo_root()
1221
+ general = get_project_mode(repo_root) == "general"
1203
1222
  warn_if_parallel_worktree(repo_root)
1204
1223
  ensure_developer(repo_root)
1205
1224
 
@@ -1314,6 +1333,7 @@ def add_session(
1314
1333
  new_session, title, evidence, summary, today, marker, package, branch,
1315
1334
  changes=changes, extra_content=extra_content, tests=tests,
1316
1335
  next_steps=next_steps,
1336
+ general=general,
1317
1337
  )
1318
1338
  content_lines = len(session_content.splitlines())
1319
1339
 
@@ -1398,6 +1418,7 @@ def add_session(
1398
1418
  active_file,
1399
1419
  today,
1400
1420
  branch,
1421
+ general,
1401
1422
  ):
1402
1423
  print(
1403
1424
  f"[BLOCKED] Checkpoint: session {new_session} is in "
@@ -33,7 +33,7 @@ DIR_SHELL_TICKETS = "shell-tickets"
33
33
  # platform that works today.
34
34
  DIR_LEGACY_CURSOR_SHELL_TICKETS = "cursor-shell"
35
35
  SHELL_TICKET_TTL_SECONDS = 30
36
- TASK_SESSION_COMMANDS = {"start", "current", "finish"}
36
+ TASK_SESSION_COMMANDS = {"start", "resume", "current", "finish"}
37
37
 
38
38
  _SESSION_KEYS = ("session_id", "sessionId", "sessionID")
39
39
  _CONVERSATION_KEYS = ("conversation_id", "conversationId", "conversationID")
@@ -424,7 +424,7 @@ def _pending_ticket_matches_args(ticket: dict[str, Any], repo_root: Path) -> boo
424
424
  continue
425
425
  if _string_value(subcommand.get("name")) != command_name:
426
426
  continue
427
- if command_name != "start":
427
+ if command_name not in ("start", "resume"):
428
428
  return True
429
429
  task_ref = args[1] if len(args) > 1 else None
430
430
  if _task_refs_match(_string_value(subcommand.get("task_ref")), task_ref, repo_root):
@@ -23,6 +23,8 @@ DEFAULT_SESSION_COMMIT_MESSAGE = "chore: record journal"
23
23
  DEFAULT_MAX_JOURNAL_LINES = 2000
24
24
  DEFAULT_SESSION_AUTO_COMMIT = True
25
25
  DEFAULT_CODEX_DISPATCH_MODE = "auto"
26
+ DEFAULT_PROJECT_MODE = "dev"
27
+ PROJECT_MODES = ("dev", "general")
26
28
 
27
29
  CONFIG_FILE = "config.yaml"
28
30
 
@@ -137,6 +139,17 @@ def get_session_auto_commit(repo_root: Path | None = None) -> bool:
137
139
  )
138
140
 
139
141
 
142
+ def get_project_mode(repo_root: Path | None = None) -> str:
143
+ """The project's mode: ``dev`` or ``general``.
144
+
145
+ A committed, project-wide ``mode:`` key. A config without it — every
146
+ project older than modes — is ``dev``, and so is any value that is not a
147
+ known mode. No warning for those: hooks read this on every turn.
148
+ """
149
+ mode = _load_config(repo_root).get("mode")
150
+ return mode if mode in PROJECT_MODES else DEFAULT_PROJECT_MODE
151
+
152
+
140
153
  def get_codex_dispatch_mode(repo_root: Path | None = None) -> str:
141
154
  """Return Codex dispatch mode.
142
155
 
@@ -14,6 +14,7 @@ import sys
14
14
  from datetime import datetime
15
15
  from pathlib import Path
16
16
 
17
+ from .config import get_project_mode
17
18
  from .paths import (
18
19
  DEVELOPER_HINT,
19
20
  DIR_WORKFLOW,
@@ -74,13 +75,17 @@ def init_developer(name: str, repo_root: Path | None = None) -> bool:
74
75
  print(f"Error: Failed to create workspace directory: {e}", file=sys.stderr)
75
76
  return False
76
77
 
78
+ # The user of a general project reads the journal and its index themselves:
79
+ # no development, commit or branch wording in them.
80
+ general = get_project_mode(repo_root) == "general"
81
+
77
82
  # Create initial journal file
78
83
  journal_file = workspace_dir / f"{FILE_JOURNAL_PREFIX}1.md"
79
84
  if not journal_file.exists():
80
85
  today = datetime.now().strftime("%Y-%m-%d")
81
86
  journal_content = f"""# Journal - {name} (Part 1)
82
87
 
83
- > AI development session journal
88
+ > {"Session journal" if general else "AI development session journal"}
84
89
  > Started: {today}
85
90
 
86
91
  ---
@@ -95,9 +100,16 @@ def init_developer(name: str, repo_root: Path | None = None) -> bool:
95
100
  # Create index.md with markers for auto-update
96
101
  index_file = workspace_dir / "index.md"
97
102
  if not index_file.exists():
103
+ if general:
104
+ history_header = "| # | Date | Title |\n|---|------|-------|"
105
+ else:
106
+ history_header = (
107
+ "| # | Date | Title | Commits | Branch |\n"
108
+ "|---|------|-------|---------|--------|"
109
+ )
98
110
  index_content = f"""# Workspace Index - {name}
99
111
 
100
- > Journal tracking for AI development sessions.
112
+ > Journal tracking for AI {"" if general else "development "}sessions.
101
113
 
102
114
  ---
103
115
 
@@ -124,8 +136,7 @@ def init_developer(name: str, repo_root: Path | None = None) -> bool:
124
136
  ## Session History
125
137
 
126
138
  <!-- @@@auto:session-history -->
127
- | # | Date | Title | Commits | Branch |
128
- |---|------|-------|---------|--------|
139
+ {history_header}
129
140
  <!-- @@@/auto:session-history -->
130
141
 
131
142
  ---
@@ -1,14 +1,20 @@
1
1
  """Noob mode — a per-developer switch for plain-language replies.
2
2
 
3
- A non-technical user turns it on once (the `atw-noob-mode` skill runs
4
- `noob_mode.py on`). From then on the hooks that already speak to the AI at
5
- session start and on every turn append a short reminder, so the mode holds
6
- across long conversations, compaction and new sessions instead of fading the
7
- way a skill loaded once does.
8
-
9
- The switch is a `noob_mode=on` line in `.atw/.developer`. That file is
10
- gitignored and personal by design, so one developer's choice never reaches a
11
- teammate, and no new ignore rule is needed in existing projects.
3
+ While it is on, the hooks that already speak to the AI at session start and
4
+ on every turn append a short reminder, so the mode holds across long
5
+ conversations, compaction and new sessions instead of fading the way a skill
6
+ loaded once does.
7
+
8
+ Each developer is in one of three states. `noob_mode=on` or `noob_mode=off`
9
+ in `.atw/.developer` is a choice they made (the `atw-noob-mode` skill runs
10
+ `noob_mode.py on|off`) and always wins. No such line means they never chose,
11
+ and the project mode's default applies: on in a `general` project, off in a
12
+ `dev` one. A file written before the off line existed reads the same way —
13
+ an on line is a choice, no line is none.
14
+
15
+ `.atw/.developer` is gitignored and personal by design, so one developer's
16
+ choice never reaches a teammate, survives a change of project mode, and needs
17
+ no new ignore rule in existing projects.
12
18
 
13
19
  The reminder text itself lives in workflow.md, in a
14
20
  `[workflow-state:noob_mode]` block next to the per-status breadcrumbs — the
@@ -20,6 +26,7 @@ from __future__ import annotations
20
26
  import re
21
27
  from pathlib import Path
22
28
 
29
+ from .config import get_project_mode
23
30
  from .git import main_worktree_root
24
31
  from .paths import DIR_WORKFLOW, FILE_DEVELOPER
25
32
 
@@ -54,15 +61,27 @@ def _developer_file(repo_root: Path) -> Path | None:
54
61
  return inherited if inherited.is_file() else None
55
62
 
56
63
 
57
- def is_noob_mode_on(repo_root: Path) -> bool:
64
+ def noob_mode_choice(repo_root: Path) -> bool | None:
65
+ """What this developer said: True (on), False (off), or None — never chose."""
58
66
  dev_file = _developer_file(repo_root)
59
67
  if dev_file is None:
60
- return False
68
+ return None
61
69
  try:
62
70
  match = _FIELD_RE.search(dev_file.read_text(encoding="utf-8"))
63
71
  except OSError:
64
- return False
65
- return match is not None and match.group(1).strip() == "on"
72
+ return None
73
+ if match is None:
74
+ return None
75
+ return match.group(1).strip() == "on"
76
+
77
+
78
+ def is_noob_mode_on(repo_root: Path) -> bool:
79
+ """The one place that decides. The developer's own choice wins; without
80
+ one, the project mode's default applies — on for `general`, off for `dev`."""
81
+ choice = noob_mode_choice(repo_root)
82
+ if choice is not None:
83
+ return choice
84
+ return get_project_mode(repo_root) == "general"
66
85
 
67
86
 
68
87
  def set_noob_mode(repo_root: Path, on: bool) -> bool:
@@ -79,8 +98,9 @@ def set_noob_mode(repo_root: Path, on: bool) -> bool:
79
98
  for line in dev_file.read_text(encoding="utf-8").splitlines()
80
99
  if not line.startswith(f"{FIELD}=")
81
100
  ]
82
- if on:
83
- lines.append(f"{FIELD}=on")
101
+ # Off is written down, not erased: a missing line means "never chose",
102
+ # and that follows the project default.
103
+ lines.append(f"{FIELD}={'on' if on else 'off'}")
84
104
  dev_file.write_text("\n".join(lines) + "\n", encoding="utf-8")
85
105
  return True
86
106
 
@@ -13,7 +13,13 @@ from __future__ import annotations
13
13
 
14
14
  from pathlib import Path
15
15
 
16
- from .config import _is_true_config_value, get_default_package, get_packages, get_spec_scope
16
+ from .config import (
17
+ _is_true_config_value,
18
+ get_default_package,
19
+ get_packages,
20
+ get_project_mode,
21
+ get_spec_scope,
22
+ )
17
23
  from .paths import (
18
24
  DIR_SPEC,
19
25
  DIR_WORKFLOW,
@@ -126,13 +132,16 @@ def get_packages_section(repo_root: Path) -> str:
126
132
  """Build the PACKAGES section for text output."""
127
133
  spec_dir = repo_root / DIR_WORKFLOW / DIR_SPEC
128
134
  pkg_info = get_packages_info(repo_root)
135
+ # A general project has no per-package, per-layer guidelines; whatever a
136
+ # switch from dev left under spec/ is not listed.
137
+ show_layers = get_project_mode(repo_root) != "general"
129
138
 
130
139
  lines: list[str] = []
131
140
  lines.append("## PACKAGES")
132
141
 
133
142
  if not pkg_info:
134
143
  lines.append("(single-repo mode)")
135
- layers = _scan_spec_layers(spec_dir)
144
+ layers = _scan_spec_layers(spec_dir) if show_layers else []
136
145
  if layers:
137
146
  lines.append(f"Spec layers: {', '.join(layers)}")
138
147
  return "\n".join(lines)
@@ -140,7 +149,11 @@ def get_packages_section(repo_root: Path) -> str:
140
149
  default_pkg = get_default_package(repo_root)
141
150
 
142
151
  for pkg in pkg_info:
143
- layers_str = f" [{', '.join(pkg['specLayers'])}]" if pkg["specLayers"] else ""
152
+ layers_str = (
153
+ f" [{', '.join(pkg['specLayers'])}]"
154
+ if show_layers and pkg["specLayers"]
155
+ else ""
156
+ )
144
157
  submodule_tag = " (submodule)" if pkg["isSubmodule"] else ""
145
158
  git_repo_tag = " (git repo)" if pkg["isGitRepo"] else ""
146
159
  default_tag = " *" if pkg["default"] else ""