@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.
- package/README.md +188 -15
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +25 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +154 -17
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mode.d.ts +21 -0
- package/dist/commands/mode.d.ts.map +1 -0
- package/dist/commands/mode.js +401 -0
- package/dist/commands/mode.js.map +1 -0
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +20 -13
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/workflow.d.ts +17 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +9 -3
- package/dist/commands/workflow.js.map +1 -1
- package/dist/configurators/claude.d.ts +3 -2
- package/dist/configurators/claude.d.ts.map +1 -1
- package/dist/configurators/claude.js +3 -3
- package/dist/configurators/claude.js.map +1 -1
- package/dist/configurators/codex.d.ts +4 -3
- package/dist/configurators/codex.d.ts.map +1 -1
- package/dist/configurators/codex.js +10 -10
- package/dist/configurators/codex.js.map +1 -1
- package/dist/configurators/index.d.ts +9 -3
- package/dist/configurators/index.d.ts.map +1 -1
- package/dist/configurators/index.js +95 -17
- package/dist/configurators/index.js.map +1 -1
- package/dist/configurators/shared.d.ts +13 -0
- package/dist/configurators/shared.d.ts.map +1 -1
- package/dist/configurators/shared.js +25 -0
- package/dist/configurators/shared.js.map +1 -1
- package/dist/configurators/workflow.d.ts +15 -1
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +23 -5
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/configurators/zcode.d.ts +1 -1
- package/dist/configurators/zcode.d.ts.map +1 -1
- package/dist/configurators/zcode.js +2 -2
- package/dist/configurators/zcode.js.map +1 -1
- package/dist/constants/paths.d.ts +4 -0
- package/dist/constants/paths.d.ts.map +1 -1
- package/dist/constants/paths.js +4 -0
- package/dist/constants/paths.js.map +1 -1
- package/dist/migrations/manifests/0.3.6.json +9 -0
- package/dist/migrations/manifests/0.4.0.json +9 -0
- package/dist/templates/atw/index.d.ts +10 -1
- package/dist/templates/atw/index.d.ts.map +1 -1
- package/dist/templates/atw/index.js +11 -1
- package/dist/templates/atw/index.js.map +1 -1
- package/dist/templates/atw/scripts/add_session.py +34 -13
- package/dist/templates/atw/scripts/common/active_task.py +2 -2
- package/dist/templates/atw/scripts/common/config.py +13 -0
- package/dist/templates/atw/scripts/common/developer.py +15 -4
- package/dist/templates/atw/scripts/common/noob_mode.py +35 -15
- package/dist/templates/atw/scripts/common/packages_context.py +16 -3
- package/dist/templates/atw/scripts/common/session_context.py +77 -19
- package/dist/templates/atw/scripts/common/task_store.py +78 -27
- package/dist/templates/atw/scripts/noob_mode.py +16 -4
- package/dist/templates/atw/scripts/task.py +99 -38
- package/dist/templates/atw/workflow-general.md +554 -0
- package/dist/templates/atw/workflow.md +3 -3
- package/dist/templates/codex/hooks/session-start.py +69 -18
- package/dist/templates/common/bundled-skills/atw-noob-mode/SKILL.md +16 -9
- package/dist/templates/common/commands/start.md +43 -0
- package/dist/templates/copilot/hooks/session-start.py +69 -18
- package/dist/templates/dsh/DSH.md +43 -0
- package/dist/templates/markdown/agents.md +11 -0
- package/dist/templates/markdown/index.d.ts +9 -0
- package/dist/templates/markdown/index.d.ts.map +1 -1
- package/dist/templates/markdown/index.js +14 -1
- package/dist/templates/markdown/index.js.map +1 -1
- package/dist/templates/markdown/spec/conventions.md.txt +13 -0
- package/dist/templates/opencode/lib/atw-context.js +19 -0
- package/dist/templates/opencode/lib/session-utils.js +79 -24
- package/dist/templates/opencode/plugins/inject-workflow-state.js +18 -8
- package/dist/templates/pi/extensions/atw/index.ts.txt +20 -9
- package/dist/templates/shared-hooks/inject-shell-session-context.py +3 -3
- package/dist/templates/shared-hooks/inject-workflow-state.py +21 -2
- package/dist/templates/shared-hooks/session-start.py +70 -22
- package/dist/templates/snow/SNOW.md +30 -0
- package/dist/templates/snow/hooks/write-atw-context.py +64 -0
- package/dist/utils/manifest-prune.d.ts +2 -1
- package/dist/utils/manifest-prune.d.ts.map +1 -1
- package/dist/utils/manifest-prune.js +10 -7
- package/dist/utils/manifest-prune.js.map +1 -1
- package/dist/utils/optional-skills.d.ts.map +1 -1
- package/dist/utils/optional-skills.js +2 -1
- package/dist/utils/optional-skills.js.map +1 -1
- package/dist/utils/project-mode.d.ts +30 -0
- package/dist/utils/project-mode.d.ts.map +1 -0
- package/dist/utils/project-mode.js +86 -0
- package/dist/utils/project-mode.js.map +1 -0
- package/dist/utils/workflow-resolver.d.ts +9 -5
- package/dist/utils/workflow-resolver.d.ts.map +1 -1
- package/dist/utils/workflow-resolver.js +25 -11
- package/dist/utils/workflow-resolver.js.map +1 -1
- 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,
|
|
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,
|
|
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,
|
|
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;;
|
|
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"}
|
package/dist/constants/paths.js
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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
|
|
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
|
|
65
|
-
|
|
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
|
-
|
|
83
|
-
|
|
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
|
|
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 =
|
|
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 ""
|